aboutsummaryrefslogtreecommitdiffstats
path: root/util/charset
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/charset
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/charset')
-rw-r--r--util/charset/benchmark/to_lower/main.cpp61
-rw-r--r--util/charset/benchmark/to_lower/metrics/main.py5
-rw-r--r--util/charset/benchmark/to_lower/metrics/ya.make21
-rw-r--r--util/charset/benchmark/to_lower/ya.make11
-rw-r--r--util/charset/benchmark/utf8_to_wide/main.cpp161
-rw-r--r--util/charset/benchmark/utf8_to_wide/metrics/main.py5
-rw-r--r--util/charset/benchmark/utf8_to_wide/metrics/ya.make21
-rw-r--r--util/charset/benchmark/utf8_to_wide/ya.make9
-rw-r--r--util/charset/benchmark/ya.make12
-rw-r--r--util/charset/generated/unidata.cpp7538
-rw-r--r--util/charset/recode_result.cpp1
-rw-r--r--util/charset/recode_result.h9
-rw-r--r--util/charset/unicode_table.cpp1
-rw-r--r--util/charset/unicode_table.h123
-rw-r--r--util/charset/unidata.cpp1
-rw-r--r--util/charset/unidata.h421
-rw-r--r--util/charset/ut/utf8/invalid_UTF8.binbin0 -> 419640 bytes
-rw-r--r--util/charset/ut/utf8/test1.txt505
-rw-r--r--util/charset/ut/ya.make17
-rw-r--r--util/charset/utf8.cpp170
-rw-r--r--util/charset/utf8.h388
-rw-r--r--util/charset/utf8_ut.cpp126
-rw-r--r--util/charset/wide.cpp626
-rw-r--r--util/charset/wide.h843
-rw-r--r--util/charset/wide_specific.h22
-rw-r--r--util/charset/wide_sse41.cpp247
-rw-r--r--util/charset/wide_ut.cpp1742
-rw-r--r--util/charset/ya.make35
28 files changed, 13121 insertions, 0 deletions
diff --git a/util/charset/benchmark/to_lower/main.cpp b/util/charset/benchmark/to_lower/main.cpp
new file mode 100644
index 0000000000..e95fdc2371
--- /dev/null
+++ b/util/charset/benchmark/to_lower/main.cpp
@@ -0,0 +1,61 @@
+#include <library/cpp/testing/benchmark/bench.h>
+
+#include <util/charset/wide.h>
+#include <util/generic/singleton.h>
+#include <util/generic/vector.h>
+#include <util/generic/string.h>
+
+static const auto ShortAscii = UTF8ToWide("hELlo");
+static const auto LongAscii = UTF8ToWide(
+ "The first plane, plane 0, the Basic Multilingual Plane (BMP) contains characters for almost "
+ "all modern languages, and a large number of symbols. A primary objective for the BMP is to "
+ "support the unification of prior character sets as well as characters for writing. Most of "
+ "the assigned code points in the BMP are used to encode Chinese, Japanese, and Korean (CJK) "
+ "characters.");
+
+static const auto ShortRussian = UTF8ToWide("пРИвет");
+static const auto LongRussian = UTF8ToWide(
+ "Плоскость 0 (Основная многоязычная плоскость, англ. Basic Multilingual Plane, BMP) отведена "
+ "для символов практически всех современных письменностей и большого числа специальных символов. "
+ "Большая часть таблицы занята китайско-японскими иероглифами и своеобразными корейскими"
+ "буквами. В Юникоде 10.0 в этой плоскости представлены следующие блоки");
+
+#define DEFINE_INPLACE_BENCH(s) \
+ Y_CPU_BENCHMARK(s##CopyDetach, iface) { \
+ for (size_t i = 0, iEnd = iface.Iterations(); i < iEnd; ++i) { \
+ NBench::Clobber(); \
+ auto copy = s; \
+ NBench::Escape(copy.Detach()); \
+ NBench::Clobber(); \
+ } \
+ } \
+ \
+ Y_CPU_BENCHMARK(s##Inplace, iface) { \
+ for (size_t i = 0, iEnd = iface.Iterations(); i < iEnd; ++i) { \
+ NBench::Clobber(); \
+ auto copy = s; \
+ ToLower(copy); \
+ NBench::Escape(copy.data()); \
+ NBench::Clobber(); \
+ } \
+ }
+
+#define DEFINE_RET_BENCH(s) \
+ Y_CPU_BENCHMARK(s##Ret, iface) { \
+ for (size_t i = 0, iEnd = iface.Iterations(); i < iEnd; ++i) { \
+ NBench::Clobber(); \
+ const auto res = ToLowerRet(TWtringBuf{s}); \
+ NBench::Escape(res.data()); \
+ NBench::Clobber(); \
+ } \
+ }
+
+DEFINE_INPLACE_BENCH(ShortAscii)
+DEFINE_INPLACE_BENCH(LongAscii)
+DEFINE_INPLACE_BENCH(ShortRussian)
+DEFINE_INPLACE_BENCH(LongRussian)
+
+DEFINE_RET_BENCH(ShortAscii)
+DEFINE_RET_BENCH(LongAscii)
+DEFINE_RET_BENCH(ShortRussian)
+DEFINE_RET_BENCH(LongRussian)
diff --git a/util/charset/benchmark/to_lower/metrics/main.py b/util/charset/benchmark/to_lower/metrics/main.py
new file mode 100644
index 0000000000..e7495d432b
--- /dev/null
+++ b/util/charset/benchmark/to_lower/metrics/main.py
@@ -0,0 +1,5 @@
+import yatest.common as yc
+
+
+def test_export_metrics(metrics):
+ metrics.set_benchmark(yc.execute_benchmark('util/charset/benchmark/to_lower/to_lower'))
diff --git a/util/charset/benchmark/to_lower/metrics/ya.make b/util/charset/benchmark/to_lower/metrics/ya.make
new file mode 100644
index 0000000000..5bb3461a8d
--- /dev/null
+++ b/util/charset/benchmark/to_lower/metrics/ya.make
@@ -0,0 +1,21 @@
+OWNER(
+ agorodilov
+ g:util
+)
+SUBSCRIBER(g:util-subscribers)
+
+PY2TEST()
+
+SIZE(LARGE)
+
+TAG(
+ ya:force_sandbox
+ sb:intel_e5_2660v1
+ ya:fat
+)
+
+TEST_SRCS(main.py)
+
+DEPENDS(util/charset/benchmark/to_lower)
+
+END()
diff --git a/util/charset/benchmark/to_lower/ya.make b/util/charset/benchmark/to_lower/ya.make
new file mode 100644
index 0000000000..74c47e6de5
--- /dev/null
+++ b/util/charset/benchmark/to_lower/ya.make
@@ -0,0 +1,11 @@
+OWNER(yazevnul)
+
+Y_BENCHMARK()
+
+ALLOCATOR(B)
+
+SRCS(
+ main.cpp
+)
+
+END()
diff --git a/util/charset/benchmark/utf8_to_wide/main.cpp b/util/charset/benchmark/utf8_to_wide/main.cpp
new file mode 100644
index 0000000000..09fa567fe5
--- /dev/null
+++ b/util/charset/benchmark/utf8_to_wide/main.cpp
@@ -0,0 +1,161 @@
+#include <library/cpp/testing/benchmark/bench.h>
+
+#include <util/random/fast.h>
+#include <util/random/random.h>
+#include <util/generic/singleton.h>
+#include <util/generic/vector.h>
+#include <util/charset/wide.h>
+
+#include <cmath>
+
+namespace {
+ template <size_t N>
+ struct TRandomAsciiString: public TVector<char> {
+ inline TRandomAsciiString() {
+ reserve(N);
+ for (size_t i = 0; i < N; ++i) {
+ push_back(RandomNumber<char>(127));
+ }
+ }
+ };
+
+ template <size_t N>
+ struct TRandomRuString: public TVector<char> {
+ inline TRandomRuString() {
+ TVector<unsigned char> data(N * 2);
+ unsigned char* textEnd = data.begin();
+ for (size_t i = 0; i < N; ++i) {
+ size_t runeLen;
+ WriteUTF8Char(RandomNumber<ui32>(0x7FF) + 1, runeLen, textEnd);
+ textEnd += runeLen;
+ }
+ assign(reinterpret_cast<const char*>(data.begin()), reinterpret_cast<const char*>(textEnd));
+ }
+ };
+
+ using RAS1 = TRandomAsciiString<1>;
+ using RAS10 = TRandomAsciiString<10>;
+ using RAS50 = TRandomAsciiString<50>;
+ using RAS1000 = TRandomAsciiString<1000>;
+ using RAS1000000 = TRandomAsciiString<1000000>;
+
+ using RRS1 = TRandomRuString<1>;
+ using RRS10 = TRandomRuString<10>;
+ using RRS1000 = TRandomRuString<1000>;
+ using RRS1000000 = TRandomRuString<1000000>;
+}
+
+#ifdef _sse2_
+ #define IS_ASCII_BENCHMARK(length) \
+ Y_CPU_BENCHMARK(IsStringASCII##length, iface) { \
+ const auto& data = *Singleton<RAS##length>(); \
+ for (size_t x = 0; x < iface.Iterations(); ++x) { \
+ Y_DO_NOT_OPTIMIZE_AWAY(::NDetail::DoIsStringASCII(data.begin(), data.end())); \
+ } \
+ } \
+ Y_CPU_BENCHMARK(IsStringASCIISlow##length, iface) { \
+ const auto& data = *Singleton<RAS##length>(); \
+ for (size_t x = 0; x < iface.Iterations(); ++x) { \
+ Y_DO_NOT_OPTIMIZE_AWAY(::NDetail::DoIsStringASCIISlow(data.begin(), data.end())); \
+ } \
+ } \
+ Y_CPU_BENCHMARK(IsStringASCIISSE##length, iface) { \
+ const auto& data = *Singleton<RAS##length>(); \
+ for (size_t x = 0; x < iface.Iterations(); ++x) { \
+ Y_DO_NOT_OPTIMIZE_AWAY(::NDetail::DoIsStringASCIISSE(reinterpret_cast<const unsigned char*>(data.begin()), reinterpret_cast<const unsigned char*>(data.end()))); \
+ } \
+ }
+#else //no sse
+ #define IS_ASCII_BENCHMARK(length) \
+ Y_CPU_BENCHMARK(IsStringASCIIScalar##length, iface) { \
+ const auto& data = *Singleton<RAS##length>(); \
+ for (size_t x = 0; x < iface.Iterations(); ++x) { \
+ Y_DO_NOT_OPTIMIZE_AWAY(::NDetail::DoIsStringASCII(data.begin(), data.end())); \
+ } \
+ } \
+ Y_CPU_BENCHMARK(IsStringASCIISlow##length, iface) { \
+ const auto& data = *Singleton<RAS##length>(); \
+ for (size_t x = 0; x < iface.Iterations(); ++x) { \
+ Y_DO_NOT_OPTIMIZE_AWAY(::NDetail::DoIsStringASCIISlow(data.begin(), data.end())); \
+ } \
+ }
+#endif
+
+IS_ASCII_BENCHMARK(1);
+IS_ASCII_BENCHMARK(10);
+IS_ASCII_BENCHMARK(50);
+IS_ASCII_BENCHMARK(1000);
+IS_ASCII_BENCHMARK(1000000);
+
+template <bool robust, typename TCharType>
+inline size_t UTF8ToWideImplScalar(const char* text, size_t len, TCharType* dest, size_t& written) {
+ const unsigned char* cur = reinterpret_cast<const unsigned char*>(text);
+ const unsigned char* last = cur + len;
+ TCharType* p = dest;
+
+ ::NDetail::UTF8ToWideImplScalar<robust>(cur, last, p);
+ written = p - dest;
+ return cur - reinterpret_cast<const unsigned char*>(text);
+}
+
+template <bool robust, typename TCharType>
+inline size_t UTF8ToWideImplSSE(const char* text, size_t len, TCharType* dest, size_t& written) {
+ return UTF8ToWideImpl(text, len, dest, written);
+}
+
+static wchar16 WBUF_UTF16[10000000];
+static wchar32 WBUF_UTF32[10000000];
+
+#define UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(impl, length, to) \
+ Y_CPU_BENCHMARK(UTF8ToWideASCII##impl##length##to, iface) { \
+ const auto& data = *Singleton<RAS##length>(); \
+ for (size_t x = 0; x < iface.Iterations(); ++x) { \
+ size_t written = 0; \
+ Y_DO_NOT_OPTIMIZE_AWAY(UTF8ToWideImpl##impl<false>(data.begin(), data.size(), WBUF_##to, written)); \
+ } \
+ }
+
+#define UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(impl, length, to) \
+ Y_CPU_BENCHMARK(UTF8ToWideRU##impl##length##to, iface) { \
+ const auto& data = *Singleton<RRS##length>(); \
+ for (size_t x = 0; x < iface.Iterations(); ++x) { \
+ size_t written = 0; \
+ Y_DO_NOT_OPTIMIZE_AWAY(UTF8ToWideImpl##impl<false>(data.begin(), data.size(), WBUF_##to, written)); \
+ } \
+ }
+
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 10, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 10, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1000, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1000, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1000000, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1000000, UTF16);
+
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 10, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 10, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1000, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1000, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1000000, UTF16);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1000000, UTF16);
+
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 10, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 10, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1000, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1000, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1000000, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1000000, UTF32);
+
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 10, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 10, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1000, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1000, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1000000, UTF32);
+UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1000000, UTF32);
diff --git a/util/charset/benchmark/utf8_to_wide/metrics/main.py b/util/charset/benchmark/utf8_to_wide/metrics/main.py
new file mode 100644
index 0000000000..ffbd8f68fd
--- /dev/null
+++ b/util/charset/benchmark/utf8_to_wide/metrics/main.py
@@ -0,0 +1,5 @@
+import yatest.common as yc
+
+
+def test_export_metrics(metrics):
+ metrics.set_benchmark(yc.execute_benchmark('util/charset/benchmark/utf8_to_wide/utf8_to_wide'))
diff --git a/util/charset/benchmark/utf8_to_wide/metrics/ya.make b/util/charset/benchmark/utf8_to_wide/metrics/ya.make
new file mode 100644
index 0000000000..c406e25bee
--- /dev/null
+++ b/util/charset/benchmark/utf8_to_wide/metrics/ya.make
@@ -0,0 +1,21 @@
+OWNER(
+ agorodilov
+ g:util
+)
+SUBSCRIBER(g:util-subscribers)
+
+PY2TEST()
+
+SIZE(LARGE)
+
+TAG(
+ ya:force_sandbox
+ sb:intel_e5_2660v1
+ ya:fat
+)
+
+TEST_SRCS(main.py)
+
+DEPENDS(util/charset/benchmark/utf8_to_wide)
+
+END()
diff --git a/util/charset/benchmark/utf8_to_wide/ya.make b/util/charset/benchmark/utf8_to_wide/ya.make
new file mode 100644
index 0000000000..4631fd7c41
--- /dev/null
+++ b/util/charset/benchmark/utf8_to_wide/ya.make
@@ -0,0 +1,9 @@
+Y_BENCHMARK()
+
+OWNER(agorodilov)
+
+SRCS(
+ main.cpp
+)
+
+END()
diff --git a/util/charset/benchmark/ya.make b/util/charset/benchmark/ya.make
new file mode 100644
index 0000000000..de3e04ef22
--- /dev/null
+++ b/util/charset/benchmark/ya.make
@@ -0,0 +1,12 @@
+OWNER(
+ agorodilov
+ g:util
+)
+SUBSCRIBER(g:util-subscribers)
+
+RECURSE(
+ to_lower
+ to_lower/metrics
+ utf8_to_wide
+ utf8_to_wide/metrics
+)
diff --git a/util/charset/generated/unidata.cpp b/util/charset/generated/unidata.cpp
new file mode 100644
index 0000000000..6f5adbbc0a
--- /dev/null
+++ b/util/charset/generated/unidata.cpp
@@ -0,0 +1,7538 @@
+#include <util/charset/unidata.h>
+
+namespace { namespace NUnidataTableGenerated {
+ using TV = const NUnicode::NPrivate::TUnidataTable::TStored;
+
+ static const TV V[] = {
+#undef V0
+#define V0 (*(V + 0))
+ {0xF018, 0, 0, 0, 0},
+#undef V1
+#define V1 (*(V + 1))
+ {0x9F019, 0, 0, 0, 0},
+#undef V2
+#define V2 (*(V + 2))
+ {0x8F019, 0, 0, 0, 0},
+#undef V3
+#define V3 (*(V + 3))
+ {0x8F01A, 0, 0, 0, 0},
+#undef V4
+#define V4 (*(V + 4))
+ {0x9F01A, 0, 0, 0, 0},
+#undef V5
+#define V5 (*(V + 5))
+ {0xAF014, 0, 0, 0, 0},
+#undef V6
+#define V6 (*(V + 6))
+ {0xBF02C, 0, 0, 0, 0},
+#undef V7
+#define V7 (*(V + 7))
+ {0xBF02B, 0, 0, 0, 0},
+#undef V8
+#define V8 (*(V + 8))
+ {0x5F02A, 0, 0, 0, 0},
+#undef V9
+#define V9 (*(V + 9))
+ {0x5F031, 0, 0, 0, 0},
+#undef V10
+#define V10 (*(V + 10))
+ {0xBF02A, 0, 0, 0, 0},
+#undef V11
+#define V11 (*(V + 11))
+ {0xBF038, 0, 0, 0, 0},
+#undef V12
+#define V12 (*(V + 12))
+ {0xBF023, 0, 0, 0, 0},
+#undef V13
+#define V13 (*(V + 13))
+ {0xBF025, 0, 0, 0, 0},
+#undef V14
+#define V14 (*(V + 14))
+ {0x4F02F, 0, 0, 0, 0},
+#undef V15
+#define V15 (*(V + 15))
+ {0x7F02C, 0, 0, 0, 0},
+#undef V16
+#define V16 (*(V + 16))
+ {0x4F022, 0, 0, 0, 0},
+#undef V17
+#define V17 (*(V + 17))
+ {0x7F02A, 0, 0, 0, 0},
+#undef V18
+#define V18 (*(V + 18))
+ {0x3F0D0, 0, 0, 0, 0},
+#undef V19
+#define V19 (*(V + 19))
+ {0x43F0D0, 0, 0, 0, 0},
+#undef V20
+#define V20 (*(V + 20))
+ {0x83F0D0, 0, 0, 0, 0},
+#undef V21
+#define V21 (*(V + 21))
+ {0xC3F0D0, 0, 0, 0, 0},
+#undef V22
+#define V22 (*(V + 22))
+ {0x103F0D0, 0, 0, 0, 0},
+#undef V23
+#define V23 (*(V + 23))
+ {0x143F0D0, 0, 0, 0, 0},
+#undef V24
+#define V24 (*(V + 24))
+ {0x183F0D0, 0, 0, 0, 0},
+#undef V25
+#define V25 (*(V + 25))
+ {0x1C3F0D0, 0, 0, 0, 0},
+#undef V26
+#define V26 (*(V + 26))
+ {0x203F0D0, 0, 0, 0, 0},
+#undef V27
+#define V27 (*(V + 27))
+ {0x243F0D0, 0, 0, 0, 0},
+#undef V28
+#define V28 (*(V + 28))
+ {0xBF02F, 0, 0, 0, 0},
+#undef V29
+#define V29 (*(V + 29))
+ {0x1F041, 32, 0, 0, 0},
+#undef V30
+#define V30 (*(V + 30))
+ {0x1F001, 32, 0, 0, 0},
+#undef V31
+#define V31 (*(V + 31))
+ {0xBF032, 0, 0, 0, 0},
+#undef V32
+#define V32 (*(V + 32))
+ {0xBF029, 0, 0, 0, 0},
+#undef V33
+#define V33 (*(V + 33))
+ {0x1F042, 0, -32, -32, 0},
+#undef V34
+#define V34 (*(V + 34))
+ {0x1F002, 0, -32, -32, 0},
+#undef V35
+#define V35 (*(V + 35))
+ {0x8F018, 0, 0, 0, 0},
+#undef V36
+#define V36 (*(V + 36))
+ {0x73514, 0, 0, 0, 0},
+#undef V37
+#define V37 (*(V + 37))
+ {0xBF033, 0, 0, 0, 0},
+#undef V38
+#define V38 (*(V + 38))
+ {0xB3432, 0, 0, 0, 0},
+#undef V39
+#define V39 (*(V + 39))
+ {0x13406, 0, 0, 0, 0},
+#undef V40
+#define V40 (*(V + 40))
+ {0xBF027, 0, 0, 0, 0},
+#undef V41
+#define V41 (*(V + 41))
+ {0xF01B, 0, 0, 0, 0},
+#undef V42
+#define V42 (*(V + 42))
+ {0x5F033, 0, 0, 0, 0},
+#undef V43
+#define V43 (*(V + 43))
+ {0x5F02F, 0, 0, 0, 0},
+#undef V44
+#define V44 (*(V + 44))
+ {0x833493, 0, 0, 0, 0},
+#undef V45
+#define V45 (*(V + 45))
+ {0xC33493, 0, 0, 0, 0},
+#undef V46
+#define V46 (*(V + 46))
+ {0x13402, 0, 743, 743, 0},
+#undef V47
+#define V47 (*(V + 47))
+ {0xBF02D, 0, 0, 0, 0},
+#undef V48
+#define V48 (*(V + 48))
+ {0x433493, 0, 0, 0, 0},
+#undef V49
+#define V49 (*(V + 49))
+ {0xBF028, 0, 0, 0, 0},
+#undef V50
+#define V50 (*(V + 50))
+ {0xB3413, 0, 0, 0, 0},
+#undef V51
+#define V51 (*(V + 51))
+ {0x1A801, 32, 0, 0, 0},
+#undef V52
+#define V52 (*(V + 52))
+ {0x1F002, 0, 0, 0, 0},
+#undef V53
+#define V53 (*(V + 53))
+ {0x1A802, 0, -32, -32, 0},
+#undef V54
+#define V54 (*(V + 54))
+ {0x1A802, 0, 121, 121, 0},
+#undef V55
+#define V55 (*(V + 55))
+ {0x1A801, 1, 0, 0, 0},
+#undef V56
+#define V56 (*(V + 56))
+ {0x1A802, 0, -1, -1, 0},
+#undef V57
+#define V57 (*(V + 57))
+ {0x1F001, 1, 0, 0, 0},
+#undef V58
+#define V58 (*(V + 58))
+ {0x1F002, 0, -1, -1, 0},
+#undef V59
+#define V59 (*(V + 59))
+ {0x1A801, -199, 0, 0, 0},
+#undef V60
+#define V60 (*(V + 60))
+ {0x1F002, 0, -232, -232, 0},
+#undef V61
+#define V61 (*(V + 61))
+ {0x13401, 1, 0, 0, 0},
+#undef V62
+#define V62 (*(V + 62))
+ {0x13402, 0, -1, -1, 0},
+#undef V63
+#define V63 (*(V + 63))
+ {0x13402, 0, 0, 0, 0},
+#undef V64
+#define V64 (*(V + 64))
+ {0x1A801, -121, 0, 0, 0},
+#undef V65
+#define V65 (*(V + 65))
+ {0x13402, 0, -300, -300, 0},
+#undef V66
+#define V66 (*(V + 66))
+ {0x1F002, 0, 195, 195, 0},
+#undef V67
+#define V67 (*(V + 67))
+ {0x1F001, 210, 0, 0, 0},
+#undef V68
+#define V68 (*(V + 68))
+ {0x1F001, 206, 0, 0, 0},
+#undef V69
+#define V69 (*(V + 69))
+ {0x1F001, 205, 0, 0, 0},
+#undef V70
+#define V70 (*(V + 70))
+ {0x1F001, 79, 0, 0, 0},
+#undef V71
+#define V71 (*(V + 71))
+ {0x1F001, 202, 0, 0, 0},
+#undef V72
+#define V72 (*(V + 72))
+ {0x1F001, 203, 0, 0, 0},
+#undef V73
+#define V73 (*(V + 73))
+ {0x1F001, 207, 0, 0, 0},
+#undef V74
+#define V74 (*(V + 74))
+ {0x1F002, 0, 97, 97, 0},
+#undef V75
+#define V75 (*(V + 75))
+ {0x1F001, 211, 0, 0, 0},
+#undef V76
+#define V76 (*(V + 76))
+ {0x1F001, 209, 0, 0, 0},
+#undef V77
+#define V77 (*(V + 77))
+ {0x1F002, 0, 163, 163, 0},
+#undef V78
+#define V78 (*(V + 78))
+ {0x1F001, 213, 0, 0, 0},
+#undef V79
+#define V79 (*(V + 79))
+ {0x1F002, 0, 130, 130, 0},
+#undef V80
+#define V80 (*(V + 80))
+ {0x1F001, 214, 0, 0, 0},
+#undef V81
+#define V81 (*(V + 81))
+ {0x1F001, 218, 0, 0, 0},
+#undef V82
+#define V82 (*(V + 82))
+ {0x1F001, 217, 0, 0, 0},
+#undef V83
+#define V83 (*(V + 83))
+ {0x1F001, 219, 0, 0, 0},
+#undef V84
+#define V84 (*(V + 84))
+ {0x1F006, 0, 0, 0, 0},
+#undef V85
+#define V85 (*(V + 85))
+ {0x1F002, 0, 56, 56, 0},
+#undef V86
+#define V86 (*(V + 86))
+ {0x13401, 2, 0, 1, 0},
+#undef V87
+#define V87 (*(V + 87))
+ {0x13403, 1, -1, 0, 0},
+#undef V88
+#define V88 (*(V + 88))
+ {0x13402, 0, -2, -1, 0},
+#undef V89
+#define V89 (*(V + 89))
+ {0x1F002, 0, -79, -79, 0},
+#undef V90
+#define V90 (*(V + 90))
+ {0x1A802, 0, 0, 0, 0},
+#undef V91
+#define V91 (*(V + 91))
+ {0x1F001, -97, 0, 0, 0},
+#undef V92
+#define V92 (*(V + 92))
+ {0x1F001, -56, 0, 0, 0},
+#undef V93
+#define V93 (*(V + 93))
+ {0x1F001, -130, 0, 0, 0},
+#undef V94
+#define V94 (*(V + 94))
+ {0x1F001, 10795, 0, 0, 0},
+#undef V95
+#define V95 (*(V + 95))
+ {0x1F001, -163, 0, 0, 0},
+#undef V96
+#define V96 (*(V + 96))
+ {0x1F001, 10792, 0, 0, 0},
+#undef V97
+#define V97 (*(V + 97))
+ {0x1F002, 0, 10815, 10815, 0},
+#undef V98
+#define V98 (*(V + 98))
+ {0x1F001, -195, 0, 0, 0},
+#undef V99
+#define V99 (*(V + 99))
+ {0x1F001, 69, 0, 0, 0},
+#undef V100
+#define V100 (*(V + 100))
+ {0x1F001, 71, 0, 0, 0},
+#undef V101
+#define V101 (*(V + 101))
+ {0x1F002, 0, 10783, 10783, 0},
+#undef V102
+#define V102 (*(V + 102))
+ {0x1F002, 0, 10780, 10780, 0},
+#undef V103
+#define V103 (*(V + 103))
+ {0x1F002, 0, 10782, 10782, 0},
+#undef V104
+#define V104 (*(V + 104))
+ {0x1F002, 0, -210, -210, 0},
+#undef V105
+#define V105 (*(V + 105))
+ {0x1F002, 0, -206, -206, 0},
+#undef V106
+#define V106 (*(V + 106))
+ {0x1F002, 0, -205, -205, 0},
+#undef V107
+#define V107 (*(V + 107))
+ {0x1F002, 0, -202, -202, 0},
+#undef V108
+#define V108 (*(V + 108))
+ {0x1F002, 0, -203, -203, 0},
+#undef V109
+#define V109 (*(V + 109))
+ {0x1F002, 0, 42319, 42319, 0},
+#undef V110
+#define V110 (*(V + 110))
+ {0x1F002, 0, 42315, 42315, 0},
+#undef V111
+#define V111 (*(V + 111))
+ {0x1F002, 0, -207, -207, 0},
+#undef V112
+#define V112 (*(V + 112))
+ {0x1F002, 0, 42280, 42280, 0},
+#undef V113
+#define V113 (*(V + 113))
+ {0x1F002, 0, 42308, 42308, 0},
+#undef V114
+#define V114 (*(V + 114))
+ {0x1F002, 0, -209, -209, 0},
+#undef V115
+#define V115 (*(V + 115))
+ {0x1F002, 0, -211, -211, 0},
+#undef V116
+#define V116 (*(V + 116))
+ {0x1F002, 0, 10743, 10743, 0},
+#undef V117
+#define V117 (*(V + 117))
+ {0x1F002, 0, 42305, 42305, 0},
+#undef V118
+#define V118 (*(V + 118))
+ {0x1F002, 0, 10749, 10749, 0},
+#undef V119
+#define V119 (*(V + 119))
+ {0x1F002, 0, -213, -213, 0},
+#undef V120
+#define V120 (*(V + 120))
+ {0x1F002, 0, -214, -214, 0},
+#undef V121
+#define V121 (*(V + 121))
+ {0x1F002, 0, 10727, 10727, 0},
+#undef V122
+#define V122 (*(V + 122))
+ {0x1F002, 0, -218, -218, 0},
+#undef V123
+#define V123 (*(V + 123))
+ {0x1F002, 0, 42282, 42282, 0},
+#undef V124
+#define V124 (*(V + 124))
+ {0x1F002, 0, -69, -69, 0},
+#undef V125
+#define V125 (*(V + 125))
+ {0x1F002, 0, -217, -217, 0},
+#undef V126
+#define V126 (*(V + 126))
+ {0x1F002, 0, -71, -71, 0},
+#undef V127
+#define V127 (*(V + 127))
+ {0x1F002, 0, -219, -219, 0},
+#undef V128
+#define V128 (*(V + 128))
+ {0x1F002, 0, 42261, 42261, 0},
+#undef V129
+#define V129 (*(V + 129))
+ {0x1F002, 0, 42258, 42258, 0},
+#undef V130
+#define V130 (*(V + 130))
+ {0x13405, 0, 0, 0, 0},
+#undef V131
+#define V131 (*(V + 131))
+ {0xBF005, 0, 0, 0, 0},
+#undef V132
+#define V132 (*(V + 132))
+ {0x1F005, 0, 0, 0, 0},
+#undef V133
+#define V133 (*(V + 133))
+ {0xBF004, 0, 0, 0, 0},
+#undef V134
+#define V134 (*(V + 134))
+ {0x1F004, 0, 0, 0, 0},
+#undef V135
+#define V135 (*(V + 135))
+ {0x500D, 0, 0, 0, 230},
+#undef V136
+#define V136 (*(V + 136))
+ {0xF00D, 0, 0, 0, 230},
+#undef V137
+#define V137 (*(V + 137))
+ {0xF00D, 0, 0, 0, 232},
+#undef V138
+#define V138 (*(V + 138))
+ {0xF00D, 0, 0, 0, 220},
+#undef V139
+#define V139 (*(V + 139))
+ {0x500D, 0, 0, 0, 216},
+#undef V140
+#define V140 (*(V + 140))
+ {0xF00D, 0, 0, 0, 202},
+#undef V141
+#define V141 (*(V + 141))
+ {0x500D, 0, 0, 0, 220},
+#undef V142
+#define V142 (*(V + 142))
+ {0x500D, 0, 0, 0, 202},
+#undef V143
+#define V143 (*(V + 143))
+ {0xF00D, 0, 0, 0, 1},
+#undef V144
+#define V144 (*(V + 144))
+ {0x500D, 0, 0, 0, 1},
+#undef V145
+#define V145 (*(V + 145))
+ {0x80D, 0, 0, 0, 230},
+#undef V146
+#define V146 (*(V + 146))
+ {0x500D, 0, 84, 84, 240},
+#undef V147
+#define V147 (*(V + 147))
+ {0xF00D, 0, 0, 0, 0},
+#undef V148
+#define V148 (*(V + 148))
+ {0xF00D, 0, 0, 0, 233},
+#undef V149
+#define V149 (*(V + 149))
+ {0xF00D, 0, 0, 0, 234},
+#undef V150
+#define V150 (*(V + 150))
+ {0xB0804, 0, 0, 0, 0},
+#undef V151
+#define V151 (*(V + 151))
+ {0xF000, 0, 0, 0, 0},
+#undef V152
+#define V152 (*(V + 152))
+ {0x13404, 0, 0, 0, 0},
+#undef V153
+#define V153 (*(V + 153))
+ {0xB082C, 0, 0, 0, 0},
+#undef V154
+#define V154 (*(V + 154))
+ {0x1F001, 116, 0, 0, 0},
+#undef V155
+#define V155 (*(V + 155))
+ {0xB2832, 0, 0, 0, 0},
+#undef V156
+#define V156 (*(V + 156))
+ {0x1A801, 38, 0, 0, 0},
+#undef V157
+#define V157 (*(V + 157))
+ {0x1A801, 37, 0, 0, 0},
+#undef V158
+#define V158 (*(V + 158))
+ {0x1A801, 64, 0, 0, 0},
+#undef V159
+#define V159 (*(V + 159))
+ {0x1A801, 63, 0, 0, 0},
+#undef V160
+#define V160 (*(V + 160))
+ {0x1A802, 0, -38, -38, 0},
+#undef V161
+#define V161 (*(V + 161))
+ {0x1A802, 0, -37, -37, 0},
+#undef V162
+#define V162 (*(V + 162))
+ {0x1F002, 0, -31, -31, 0},
+#undef V163
+#define V163 (*(V + 163))
+ {0x1A802, 0, -64, -64, 0},
+#undef V164
+#define V164 (*(V + 164))
+ {0x1A802, 0, -63, -63, 0},
+#undef V165
+#define V165 (*(V + 165))
+ {0x1F001, 8, 0, 0, 0},
+#undef V166
+#define V166 (*(V + 166))
+ {0x13402, 0, -62, -62, 0},
+#undef V167
+#define V167 (*(V + 167))
+ {0x13402, 0, -57, -57, 0},
+#undef V168
+#define V168 (*(V + 168))
+ {0x13401, 0, 0, 0, 0},
+#undef V169
+#define V169 (*(V + 169))
+ {0x12801, 0, 0, 0, 0},
+#undef V170
+#define V170 (*(V + 170))
+ {0x13402, 0, -47, -47, 0},
+#undef V171
+#define V171 (*(V + 171))
+ {0x13402, 0, -54, -54, 0},
+#undef V172
+#define V172 (*(V + 172))
+ {0x1F002, 0, -8, -8, 0},
+#undef V173
+#define V173 (*(V + 173))
+ {0x13402, 0, -86, -86, 0},
+#undef V174
+#define V174 (*(V + 174))
+ {0x13402, 0, -80, -80, 0},
+#undef V175
+#define V175 (*(V + 175))
+ {0x13402, 0, 7, 7, 0},
+#undef V176
+#define V176 (*(V + 176))
+ {0x1F002, 0, -116, -116, 0},
+#undef V177
+#define V177 (*(V + 177))
+ {0x13401, -60, 0, 0, 0},
+#undef V178
+#define V178 (*(V + 178))
+ {0x13402, 0, -96, -96, 0},
+#undef V179
+#define V179 (*(V + 179))
+ {0x13401, -7, 0, 0, 0},
+#undef V180
+#define V180 (*(V + 180))
+ {0x1A801, 80, 0, 0, 0},
+#undef V181
+#define V181 (*(V + 181))
+ {0x1F001, 80, 0, 0, 0},
+#undef V182
+#define V182 (*(V + 182))
+ {0x1A802, 0, -80, -80, 0},
+#undef V183
+#define V183 (*(V + 183))
+ {0x1F002, 0, -80, -80, 0},
+#undef V184
+#define V184 (*(V + 184))
+ {0x1F033, 0, 0, 0, 0},
+#undef V185
+#define V185 (*(V + 185))
+ {0xF00E, 0, 0, 0, 0},
+#undef V186
+#define V186 (*(V + 186))
+ {0x1F001, 15, 0, 0, 0},
+#undef V187
+#define V187 (*(V + 187))
+ {0x1F002, 0, -15, -15, 0},
+#undef V188
+#define V188 (*(V + 188))
+ {0x1F001, 48, 0, 0, 0},
+#undef V189
+#define V189 (*(V + 189))
+ {0x1F02A, 0, 0, 0, 0},
+#undef V190
+#define V190 (*(V + 190))
+ {0x1F002, 0, -48, -48, 0},
+#undef V191
+#define V191 (*(V + 191))
+ {0x1F02C, 0, 0, 0, 0},
+#undef V192
+#define V192 (*(V + 192))
+ {0xBF022, 0, 0, 0, 0},
+#undef V193
+#define V193 (*(V + 193))
+ {0xF00D, 0, 0, 0, 222},
+#undef V194
+#define V194 (*(V + 194))
+ {0xF00D, 0, 0, 0, 228},
+#undef V195
+#define V195 (*(V + 195))
+ {0xF00D, 0, 0, 0, 10},
+#undef V196
+#define V196 (*(V + 196))
+ {0xF00D, 0, 0, 0, 11},
+#undef V197
+#define V197 (*(V + 197))
+ {0xF00D, 0, 0, 0, 12},
+#undef V198
+#define V198 (*(V + 198))
+ {0xF00D, 0, 0, 0, 13},
+#undef V199
+#define V199 (*(V + 199))
+ {0xF00D, 0, 0, 0, 14},
+#undef V200
+#define V200 (*(V + 200))
+ {0xF00D, 0, 0, 0, 15},
+#undef V201
+#define V201 (*(V + 201))
+ {0xF00D, 0, 0, 0, 16},
+#undef V202
+#define V202 (*(V + 202))
+ {0xF00D, 0, 0, 0, 17},
+#undef V203
+#define V203 (*(V + 203))
+ {0xF00D, 0, 0, 0, 18},
+#undef V204
+#define V204 (*(V + 204))
+ {0xF00D, 0, 0, 0, 19},
+#undef V205
+#define V205 (*(V + 205))
+ {0xF00D, 0, 0, 0, 20},
+#undef V206
+#define V206 (*(V + 206))
+ {0xF00D, 0, 0, 0, 21},
+#undef V207
+#define V207 (*(V + 207))
+ {0xF00D, 0, 0, 0, 22},
+#undef V208
+#define V208 (*(V + 208))
+ {0x2F021, 0, 0, 0, 0},
+#undef V209
+#define V209 (*(V + 209))
+ {0xF00D, 0, 0, 0, 23},
+#undef V210
+#define V210 (*(V + 210))
+ {0x2F02A, 0, 0, 0, 0},
+#undef V211
+#define V211 (*(V + 211))
+ {0xF00D, 0, 0, 0, 24},
+#undef V212
+#define V212 (*(V + 212))
+ {0xF00D, 0, 0, 0, 25},
+#undef V213
+#define V213 (*(V + 213))
+ {0x2F006, 0, 0, 0, 0},
+#undef V214
+#define V214 (*(V + 214))
+ {0x6F01B, 0, 0, 0, 0},
+#undef V215
+#define V215 (*(V + 215))
+ {0xF02F, 0, 0, 0, 0},
+#undef V216
+#define V216 (*(V + 216))
+ {0xF031, 0, 0, 0, 0},
+#undef V217
+#define V217 (*(V + 217))
+ {0xF02A, 0, 0, 0, 0},
+#undef V218
+#define V218 (*(V + 218))
+ {0xF00D, 0, 0, 0, 30},
+#undef V219
+#define V219 (*(V + 219))
+ {0xF00D, 0, 0, 0, 31},
+#undef V220
+#define V220 (*(V + 220))
+ {0xF00D, 0, 0, 0, 32},
+#undef V221
+#define V221 (*(V + 221))
+ {0xF02C, 0, 0, 0, 0},
+#undef V222
+#define V222 (*(V + 222))
+ {0xF006, 0, 0, 0, 0},
+#undef V223
+#define V223 (*(V + 223))
+ {0xA806, 0, 0, 0, 0},
+#undef V224
+#define V224 (*(V + 224))
+ {0xF004, 0, 0, 0, 0},
+#undef V225
+#define V225 (*(V + 225))
+ {0xF00D, 0, 0, 0, 27},
+#undef V226
+#define V226 (*(V + 226))
+ {0xF00D, 0, 0, 0, 28},
+#undef V227
+#define V227 (*(V + 227))
+ {0xF00D, 0, 0, 0, 29},
+#undef V228
+#define V228 (*(V + 228))
+ {0xF00D, 0, 0, 0, 33},
+#undef V229
+#define V229 (*(V + 229))
+ {0xF00D, 0, 0, 0, 34},
+#undef V230
+#define V230 (*(V + 230))
+ {0x6F090, 0, 0, 0, 0},
+#undef V231
+#define V231 (*(V + 231))
+ {0x46F090, 0, 0, 0, 0},
+#undef V232
+#define V232 (*(V + 232))
+ {0x86F090, 0, 0, 0, 0},
+#undef V233
+#define V233 (*(V + 233))
+ {0xC6F090, 0, 0, 0, 0},
+#undef V234
+#define V234 (*(V + 234))
+ {0x106F090, 0, 0, 0, 0},
+#undef V235
+#define V235 (*(V + 235))
+ {0x146F090, 0, 0, 0, 0},
+#undef V236
+#define V236 (*(V + 236))
+ {0x186F090, 0, 0, 0, 0},
+#undef V237
+#define V237 (*(V + 237))
+ {0x1C6F090, 0, 0, 0, 0},
+#undef V238
+#define V238 (*(V + 238))
+ {0x206F090, 0, 0, 0, 0},
+#undef V239
+#define V239 (*(V + 239))
+ {0x246F090, 0, 0, 0, 0},
+#undef V240
+#define V240 (*(V + 240))
+ {0x6F02A, 0, 0, 0, 0},
+#undef V241
+#define V241 (*(V + 241))
+ {0xF00D, 0, 0, 0, 35},
+#undef V242
+#define V242 (*(V + 242))
+ {0x3406, 0, 0, 0, 0},
+#undef V243
+#define V243 (*(V + 243))
+ {0xF005, 0, 0, 0, 0},
+#undef V244
+#define V244 (*(V + 244))
+ {0x3F090, 0, 0, 0, 0},
+#undef V245
+#define V245 (*(V + 245))
+ {0x43F090, 0, 0, 0, 0},
+#undef V246
+#define V246 (*(V + 246))
+ {0x83F090, 0, 0, 0, 0},
+#undef V247
+#define V247 (*(V + 247))
+ {0xC3F090, 0, 0, 0, 0},
+#undef V248
+#define V248 (*(V + 248))
+ {0x103F090, 0, 0, 0, 0},
+#undef V249
+#define V249 (*(V + 249))
+ {0x143F090, 0, 0, 0, 0},
+#undef V250
+#define V250 (*(V + 250))
+ {0x183F090, 0, 0, 0, 0},
+#undef V251
+#define V251 (*(V + 251))
+ {0x1C3F090, 0, 0, 0, 0},
+#undef V252
+#define V252 (*(V + 252))
+ {0x203F090, 0, 0, 0, 0},
+#undef V253
+#define V253 (*(V + 253))
+ {0x243F090, 0, 0, 0, 0},
+#undef V254
+#define V254 (*(V + 254))
+ {0xF033, 0, 0, 0, 0},
+#undef V255
+#define V255 (*(V + 255))
+ {0xF00D, 0, 0, 0, 36},
+#undef V256
+#define V256 (*(V + 256))
+ {0x2F090, 0, 0, 0, 0},
+#undef V257
+#define V257 (*(V + 257))
+ {0x42F090, 0, 0, 0, 0},
+#undef V258
+#define V258 (*(V + 258))
+ {0x82F090, 0, 0, 0, 0},
+#undef V259
+#define V259 (*(V + 259))
+ {0xC2F090, 0, 0, 0, 0},
+#undef V260
+#define V260 (*(V + 260))
+ {0x102F090, 0, 0, 0, 0},
+#undef V261
+#define V261 (*(V + 261))
+ {0x142F090, 0, 0, 0, 0},
+#undef V262
+#define V262 (*(V + 262))
+ {0x182F090, 0, 0, 0, 0},
+#undef V263
+#define V263 (*(V + 263))
+ {0x1C2F090, 0, 0, 0, 0},
+#undef V264
+#define V264 (*(V + 264))
+ {0x202F090, 0, 0, 0, 0},
+#undef V265
+#define V265 (*(V + 265))
+ {0x242F090, 0, 0, 0, 0},
+#undef V266
+#define V266 (*(V + 266))
+ {0x2F004, 0, 0, 0, 0},
+#undef V267
+#define V267 (*(V + 267))
+ {0x2F005, 0, 0, 0, 0},
+#undef V268
+#define V268 (*(V + 268))
+ {0x1F00F, 0, 0, 0, 0},
+#undef V269
+#define V269 (*(V + 269))
+ {0x1A806, 0, 0, 0, 0},
+#undef V270
+#define V270 (*(V + 270))
+ {0x500D, 0, 0, 0, 7},
+#undef V271
+#define V271 (*(V + 271))
+ {0xF00D, 0, 0, 0, 9},
+#undef V272
+#define V272 (*(V + 272))
+ {0x10806, 0, 0, 0, 0},
+#undef V273
+#define V273 (*(V + 273))
+ {0x1F090, 0, 0, 0, 0},
+#undef V274
+#define V274 (*(V + 274))
+ {0x41F090, 0, 0, 0, 0},
+#undef V275
+#define V275 (*(V + 275))
+ {0x81F090, 0, 0, 0, 0},
+#undef V276
+#define V276 (*(V + 276))
+ {0xC1F090, 0, 0, 0, 0},
+#undef V277
+#define V277 (*(V + 277))
+ {0x101F090, 0, 0, 0, 0},
+#undef V278
+#define V278 (*(V + 278))
+ {0x141F090, 0, 0, 0, 0},
+#undef V279
+#define V279 (*(V + 279))
+ {0x181F090, 0, 0, 0, 0},
+#undef V280
+#define V280 (*(V + 280))
+ {0x1C1F090, 0, 0, 0, 0},
+#undef V281
+#define V281 (*(V + 281))
+ {0x201F090, 0, 0, 0, 0},
+#undef V282
+#define V282 (*(V + 282))
+ {0x241F090, 0, 0, 0, 0},
+#undef V283
+#define V283 (*(V + 283))
+ {0xF00D, 0, 0, 0, 7},
+#undef V284
+#define V284 (*(V + 284))
+ {0x1500F, 0, 0, 0, 0},
+#undef V285
+#define V285 (*(V + 285))
+ {0x1A80F, 0, 0, 0, 0},
+#undef V286
+#define V286 (*(V + 286))
+ {0x1F013, 0, 0, 0, 0},
+#undef V287
+#define V287 (*(V + 287))
+ {0x500D, 0, 0, 0, 0},
+#undef V288
+#define V288 (*(V + 288))
+ {0xA80D, 0, 0, 0, 0},
+#undef V289
+#define V289 (*(V + 289))
+ {0xF00D, 0, 0, 0, 84},
+#undef V290
+#define V290 (*(V + 290))
+ {0x500D, 0, 0, 0, 91},
+#undef V291
+#define V291 (*(V + 291))
+ {0xBF013, 0, 0, 0, 0},
+#undef V292
+#define V292 (*(V + 292))
+ {0x1F00D, 0, 0, 0, 0},
+#undef V293
+#define V293 (*(V + 293))
+ {0x500D, 0, 0, 0, 9},
+#undef V294
+#define V294 (*(V + 294))
+ {0xF00D, 0, 0, 0, 103},
+#undef V295
+#define V295 (*(V + 295))
+ {0xF00D, 0, 0, 0, 107},
+#undef V296
+#define V296 (*(V + 296))
+ {0xF00D, 0, 0, 0, 118},
+#undef V297
+#define V297 (*(V + 297))
+ {0xF00D, 0, 0, 0, 122},
+#undef V298
+#define V298 (*(V + 298))
+ {0x1342A, 0, 0, 0, 0},
+#undef V299
+#define V299 (*(V + 299))
+ {0xF00D, 0, 0, 0, 216},
+#undef V300
+#define V300 (*(V + 300))
+ {0xF00D, 0, 0, 0, 129},
+#undef V301
+#define V301 (*(V + 301))
+ {0xF00D, 0, 0, 0, 130},
+#undef V302
+#define V302 (*(V + 302))
+ {0x80D, 0, 0, 0, 0},
+#undef V303
+#define V303 (*(V + 303))
+ {0xF00D, 0, 0, 0, 132},
+#undef V304
+#define V304 (*(V + 304))
+ {0x340D, 0, 0, 0, 0},
+#undef V305
+#define V305 (*(V + 305))
+ {0x1F001, 7264, 0, 0, 0},
+#undef V306
+#define V306 (*(V + 306))
+ {0x1F00A, 0, 0, 0, 0},
+#undef V307
+#define V307 (*(V + 307))
+ {0x1F00B, 0, 0, 0, 0},
+#undef V308
+#define V308 (*(V + 308))
+ {0x1500B, 0, 0, 0, 0},
+#undef V309
+#define V309 (*(V + 309))
+ {0x1500C, 0, 0, 0, 0},
+#undef V310
+#define V310 (*(V + 310))
+ {0x1F00C, 0, 0, 0, 0},
+#undef V311
+#define V311 (*(V + 311))
+ {0x41F093, 0, 0, 0, 0},
+#undef V312
+#define V312 (*(V + 312))
+ {0x81F093, 0, 0, 0, 0},
+#undef V313
+#define V313 (*(V + 313))
+ {0xC1F093, 0, 0, 0, 0},
+#undef V314
+#define V314 (*(V + 314))
+ {0x101F093, 0, 0, 0, 0},
+#undef V315
+#define V315 (*(V + 315))
+ {0x141F093, 0, 0, 0, 0},
+#undef V316
+#define V316 (*(V + 316))
+ {0x181F093, 0, 0, 0, 0},
+#undef V317
+#define V317 (*(V + 317))
+ {0x1C1F093, 0, 0, 0, 0},
+#undef V318
+#define V318 (*(V + 318))
+ {0x201F093, 0, 0, 0, 0},
+#undef V319
+#define V319 (*(V + 319))
+ {0x241F093, 0, 0, 0, 0},
+#undef V320
+#define V320 (*(V + 320))
+ {0x1F001, 38864, 0, 0, 0},
+#undef V321
+#define V321 (*(V + 321))
+ {0x1F011, 0, 0, 0, 0},
+#undef V322
+#define V322 (*(V + 322))
+ {0x1F00F, 0, 0, 0, 9},
+#undef V323
+#define V323 (*(V + 323))
+ {0x1F002, 0, -6254, -6254, 0},
+#undef V324
+#define V324 (*(V + 324))
+ {0x1F002, 0, -6253, -6253, 0},
+#undef V325
+#define V325 (*(V + 325))
+ {0x1F002, 0, -6244, -6244, 0},
+#undef V326
+#define V326 (*(V + 326))
+ {0x1F002, 0, -6242, -6242, 0},
+#undef V327
+#define V327 (*(V + 327))
+ {0x1F002, 0, -6243, -6243, 0},
+#undef V328
+#define V328 (*(V + 328))
+ {0x1F002, 0, -6236, -6236, 0},
+#undef V329
+#define V329 (*(V + 329))
+ {0x1F002, 0, -6181, -6181, 0},
+#undef V330
+#define V330 (*(V + 330))
+ {0x1F002, 0, 35266, 35266, 0},
+#undef V331
+#define V331 (*(V + 331))
+ {0x1F002, 0, 35332, 35332, 0},
+#undef V332
+#define V332 (*(V + 332))
+ {0x1F002, 0, 3814, 3814, 0},
+#undef V333
+#define V333 (*(V + 333))
+ {0xF00D, 0, 0, 0, 214},
+#undef V334
+#define V334 (*(V + 334))
+ {0x12802, 0, -59, -59, 0},
+#undef V335
+#define V335 (*(V + 335))
+ {0x1F001, -7615, 0, 0, 0},
+#undef V336
+#define V336 (*(V + 336))
+ {0x1A802, 0, 8, 8, 0},
+#undef V337
+#define V337 (*(V + 337))
+ {0x1A801, -8, 0, 0, 0},
+#undef V338
+#define V338 (*(V + 338))
+ {0x1A802, 0, 74, 74, 0},
+#undef V339
+#define V339 (*(V + 339))
+ {0x10802, 0, 74, 74, 0},
+#undef V340
+#define V340 (*(V + 340))
+ {0x1A802, 0, 86, 86, 0},
+#undef V341
+#define V341 (*(V + 341))
+ {0x10802, 0, 86, 86, 0},
+#undef V342
+#define V342 (*(V + 342))
+ {0x1A802, 0, 100, 100, 0},
+#undef V343
+#define V343 (*(V + 343))
+ {0x10802, 0, 100, 100, 0},
+#undef V344
+#define V344 (*(V + 344))
+ {0x1A802, 0, 128, 128, 0},
+#undef V345
+#define V345 (*(V + 345))
+ {0x10802, 0, 128, 128, 0},
+#undef V346
+#define V346 (*(V + 346))
+ {0x1A802, 0, 112, 112, 0},
+#undef V347
+#define V347 (*(V + 347))
+ {0x10802, 0, 112, 112, 0},
+#undef V348
+#define V348 (*(V + 348))
+ {0x1A802, 0, 126, 126, 0},
+#undef V349
+#define V349 (*(V + 349))
+ {0x10802, 0, 126, 126, 0},
+#undef V350
+#define V350 (*(V + 350))
+ {0x1A803, -8, 0, 0, 0},
+#undef V351
+#define V351 (*(V + 351))
+ {0x1A802, 0, 9, 9, 0},
+#undef V352
+#define V352 (*(V + 352))
+ {0x1A801, -74, 0, 0, 0},
+#undef V353
+#define V353 (*(V + 353))
+ {0x10801, -74, 0, 0, 0},
+#undef V354
+#define V354 (*(V + 354))
+ {0x1A803, -9, 0, 0, 0},
+#undef V355
+#define V355 (*(V + 355))
+ {0x10802, 0, -7205, -7205, 0},
+#undef V356
+#define V356 (*(V + 356))
+ {0x1A801, -86, 0, 0, 0},
+#undef V357
+#define V357 (*(V + 357))
+ {0x10801, -86, 0, 0, 0},
+#undef V358
+#define V358 (*(V + 358))
+ {0x10802, 0, 0, 0, 0},
+#undef V359
+#define V359 (*(V + 359))
+ {0x1A801, -100, 0, 0, 0},
+#undef V360
+#define V360 (*(V + 360))
+ {0x10801, -100, 0, 0, 0},
+#undef V361
+#define V361 (*(V + 361))
+ {0x1A802, 0, 7, 7, 0},
+#undef V362
+#define V362 (*(V + 362))
+ {0x1A801, -112, 0, 0, 0},
+#undef V363
+#define V363 (*(V + 363))
+ {0x10801, -112, 0, 0, 0},
+#undef V364
+#define V364 (*(V + 364))
+ {0x1A801, -7, 0, 0, 0},
+#undef V365
+#define V365 (*(V + 365))
+ {0xB0832, 0, 0, 0, 0},
+#undef V366
+#define V366 (*(V + 366))
+ {0x1A801, -128, 0, 0, 0},
+#undef V367
+#define V367 (*(V + 367))
+ {0x10801, -128, 0, 0, 0},
+#undef V368
+#define V368 (*(V + 368))
+ {0x1A801, -126, 0, 0, 0},
+#undef V369
+#define V369 (*(V + 369))
+ {0x10801, -126, 0, 0, 0},
+#undef V370
+#define V370 (*(V + 370))
+ {0xA0814, 0, 0, 0, 0},
+#undef V371
+#define V371 (*(V + 371))
+ {0xA3414, 0, 0, 0, 0},
+#undef V372
+#define V372 (*(V + 372))
+ {0xF015, 0, 0, 0, 0},
+#undef V373
+#define V373 (*(V + 373))
+ {0xF01C, 0, 0, 0, 0},
+#undef V374
+#define V374 (*(V + 374))
+ {0x1F01D, 0, 0, 0, 0},
+#undef V375
+#define V375 (*(V + 375))
+ {0x2F01D, 0, 0, 0, 0},
+#undef V376
+#define V376 (*(V + 376))
+ {0xB3522, 0, 0, 0, 0},
+#undef V377
+#define V377 (*(V + 377))
+ {0xBF021, 0, 0, 0, 0},
+#undef V378
+#define V378 (*(V + 378))
+ {0xB342A, 0, 0, 0, 0},
+#undef V379
+#define V379 (*(V + 379))
+ {0xBF036, 0, 0, 0, 0},
+#undef V380
+#define V380 (*(V + 380))
+ {0xBF037, 0, 0, 0, 0},
+#undef V381
+#define V381 (*(V + 381))
+ {0xBF034, 0, 0, 0, 0},
+#undef V382
+#define V382 (*(V + 382))
+ {0xBF024, 0, 0, 0, 0},
+#undef V383
+#define V383 (*(V + 383))
+ {0xB342C, 0, 0, 0, 0},
+#undef V384
+#define V384 (*(V + 384))
+ {0xAF016, 0, 0, 0, 0},
+#undef V385
+#define V385 (*(V + 385))
+ {0x8F017, 0, 0, 0, 0},
+#undef V386
+#define V386 (*(V + 386))
+ {0xF01D, 0, 0, 0, 0},
+#undef V387
+#define V387 (*(V + 387))
+ {0x5F038, 0, 0, 0, 0},
+#undef V388
+#define V388 (*(V + 388))
+ {0x5342B, 0, 0, 0, 0},
+#undef V389
+#define V389 (*(V + 389))
+ {0xB342B, 0, 0, 0, 0},
+#undef V390
+#define V390 (*(V + 390))
+ {0x7F02F, 0, 0, 0, 0},
+#undef V391
+#define V391 (*(V + 391))
+ {0x33493, 0, 0, 0, 0},
+#undef V392
+#define V392 (*(V + 392))
+ {0x1033493, 0, 0, 0, 0},
+#undef V393
+#define V393 (*(V + 393))
+ {0x1433493, 0, 0, 0, 0},
+#undef V394
+#define V394 (*(V + 394))
+ {0x1833493, 0, 0, 0, 0},
+#undef V395
+#define V395 (*(V + 395))
+ {0x1C33493, 0, 0, 0, 0},
+#undef V396
+#define V396 (*(V + 396))
+ {0x2033493, 0, 0, 0, 0},
+#undef V397
+#define V397 (*(V + 397))
+ {0x2433493, 0, 0, 0, 0},
+#undef V398
+#define V398 (*(V + 398))
+ {0x4342F, 0, 0, 0, 0},
+#undef V399
+#define V399 (*(V + 399))
+ {0x43430, 0, 0, 0, 0},
+#undef V400
+#define V400 (*(V + 400))
+ {0xB342F, 0, 0, 0, 0},
+#undef V401
+#define V401 (*(V + 401))
+ {0xB3423, 0, 0, 0, 0},
+#undef V402
+#define V402 (*(V + 402))
+ {0xB3425, 0, 0, 0, 0},
+#undef V403
+#define V403 (*(V + 403))
+ {0x53431, 0, 0, 0, 0},
+#undef V404
+#define V404 (*(V + 404))
+ {0xB3433, 0, 0, 0, 0},
+#undef V405
+#define V405 (*(V + 405))
+ {0x10801, -7517, 0, 0, 0},
+#undef V406
+#define V406 (*(V + 406))
+ {0x10801, -8383, 0, 0, 0},
+#undef V407
+#define V407 (*(V + 407))
+ {0x10801, -8262, 0, 0, 0},
+#undef V408
+#define V408 (*(V + 408))
+ {0x1F001, 28, 0, 0, 0},
+#undef V409
+#define V409 (*(V + 409))
+ {0x1F002, 0, -28, -28, 0},
+#undef V410
+#define V410 (*(V + 410))
+ {0x13411, 16, 0, 0, 0},
+#undef V411
+#define V411 (*(V + 411))
+ {0x13411, 0, -16, -16, 0},
+#undef V412
+#define V412 (*(V + 412))
+ {0xBA82F, 0, 0, 0, 0},
+#undef V413
+#define V413 (*(V + 413))
+ {0xBA833, 0, 0, 0, 0},
+#undef V414
+#define V414 (*(V + 414))
+ {0x4F030, 0, 0, 0, 0},
+#undef V415
+#define V415 (*(V + 415))
+ {0xB0823, 0, 0, 0, 0},
+#undef V416
+#define V416 (*(V + 416))
+ {0xB0825, 0, 0, 0, 0},
+#undef V417
+#define V417 (*(V + 417))
+ {0x4B3493, 0, 0, 0, 0},
+#undef V418
+#define V418 (*(V + 418))
+ {0x8B3493, 0, 0, 0, 0},
+#undef V419
+#define V419 (*(V + 419))
+ {0xCB3493, 0, 0, 0, 0},
+#undef V420
+#define V420 (*(V + 420))
+ {0x10B3493, 0, 0, 0, 0},
+#undef V421
+#define V421 (*(V + 421))
+ {0x14B3493, 0, 0, 0, 0},
+#undef V422
+#define V422 (*(V + 422))
+ {0x18B3493, 0, 0, 0, 0},
+#undef V423
+#define V423 (*(V + 423))
+ {0x1CB3493, 0, 0, 0, 0},
+#undef V424
+#define V424 (*(V + 424))
+ {0x20B3493, 0, 0, 0, 0},
+#undef V425
+#define V425 (*(V + 425))
+ {0x24B3493, 0, 0, 0, 0},
+#undef V426
+#define V426 (*(V + 426))
+ {0x33413, 0, 0, 0, 0},
+#undef V427
+#define V427 (*(V + 427))
+ {0x13433, 0, 0, 0, 0},
+#undef V428
+#define V428 (*(V + 428))
+ {0x13433, 26, 0, 0, 0},
+#undef V429
+#define V429 (*(V + 429))
+ {0x13433, 0, -26, -26, 0},
+#undef V430
+#define V430 (*(V + 430))
+ {0xB3493, 0, 0, 0, 0},
+#undef V431
+#define V431 (*(V + 431))
+ {0x4BF093, 0, 0, 0, 0},
+#undef V432
+#define V432 (*(V + 432))
+ {0x8BF093, 0, 0, 0, 0},
+#undef V433
+#define V433 (*(V + 433))
+ {0xCBF093, 0, 0, 0, 0},
+#undef V434
+#define V434 (*(V + 434))
+ {0x10BF093, 0, 0, 0, 0},
+#undef V435
+#define V435 (*(V + 435))
+ {0x14BF093, 0, 0, 0, 0},
+#undef V436
+#define V436 (*(V + 436))
+ {0x18BF093, 0, 0, 0, 0},
+#undef V437
+#define V437 (*(V + 437))
+ {0x1CBF093, 0, 0, 0, 0},
+#undef V438
+#define V438 (*(V + 438))
+ {0x20BF093, 0, 0, 0, 0},
+#undef V439
+#define V439 (*(V + 439))
+ {0x24BF093, 0, 0, 0, 0},
+#undef V440
+#define V440 (*(V + 440))
+ {0xBF093, 0, 0, 0, 0},
+#undef V441
+#define V441 (*(V + 441))
+ {0xBF026, 0, 0, 0, 0},
+#undef V442
+#define V442 (*(V + 442))
+ {0xB082F, 0, 0, 0, 0},
+#undef V443
+#define V443 (*(V + 443))
+ {0x1F001, -10743, 0, 0, 0},
+#undef V444
+#define V444 (*(V + 444))
+ {0x1F001, -3814, 0, 0, 0},
+#undef V445
+#define V445 (*(V + 445))
+ {0x1F001, -10727, 0, 0, 0},
+#undef V446
+#define V446 (*(V + 446))
+ {0x1F002, 0, -10795, -10795, 0},
+#undef V447
+#define V447 (*(V + 447))
+ {0x1F002, 0, -10792, -10792, 0},
+#undef V448
+#define V448 (*(V + 448))
+ {0x1F001, -10780, 0, 0, 0},
+#undef V449
+#define V449 (*(V + 449))
+ {0x1F001, -10749, 0, 0, 0},
+#undef V450
+#define V450 (*(V + 450))
+ {0x1F001, -10783, 0, 0, 0},
+#undef V451
+#define V451 (*(V + 451))
+ {0x1F001, -10782, 0, 0, 0},
+#undef V452
+#define V452 (*(V + 452))
+ {0x1F001, -10815, 0, 0, 0},
+#undef V453
+#define V453 (*(V + 453))
+ {0x1F002, 0, -7264, -7264, 0},
+#undef V454
+#define V454 (*(V + 454))
+ {0x1F007, 0, 0, 0, 0},
+#undef V455
+#define V455 (*(V + 455))
+ {0x1F012, 0, 0, 0, 0},
+#undef V456
+#define V456 (*(V + 456))
+ {0xF00D, 0, 0, 0, 218},
+#undef V457
+#define V457 (*(V + 457))
+ {0x1F00F, 0, 0, 0, 224},
+#undef V458
+#define V458 (*(V + 458))
+ {0x13412, 0, 0, 0, 0},
+#undef V459
+#define V459 (*(V + 459))
+ {0x1F009, 0, 0, 0, 0},
+#undef V460
+#define V460 (*(V + 460))
+ {0x1A809, 0, 0, 0, 0},
+#undef V461
+#define V461 (*(V + 461))
+ {0x500D, 0, 0, 0, 8},
+#undef V462
+#define V462 (*(V + 462))
+ {0x1A804, 0, 0, 0, 0},
+#undef V463
+#define V463 (*(V + 463))
+ {0x13409, 0, 0, 0, 0},
+#undef V464
+#define V464 (*(V + 464))
+ {0x1F008, 0, 0, 0, 0},
+#undef V465
+#define V465 (*(V + 465))
+ {0x1A808, 0, 0, 0, 0},
+#undef V466
+#define V466 (*(V + 466))
+ {0xBF02E, 0, 0, 0, 0},
+#undef V467
+#define V467 (*(V + 467))
+ {0x13408, 0, 0, 0, 0},
+#undef V468
+#define V468 (*(V + 468))
+ {0x13413, 0, 0, 0, 0},
+#undef V469
+#define V469 (*(V + 469))
+ {0x1F001, -35332, 0, 0, 0},
+#undef V470
+#define V470 (*(V + 470))
+ {0x1F032, 0, 0, 0, 0},
+#undef V471
+#define V471 (*(V + 471))
+ {0x1F001, -42280, 0, 0, 0},
+#undef V472
+#define V472 (*(V + 472))
+ {0x1F001, -42308, 0, 0, 0},
+#undef V473
+#define V473 (*(V + 473))
+ {0x1F001, -42319, 0, 0, 0},
+#undef V474
+#define V474 (*(V + 474))
+ {0x1F001, -42315, 0, 0, 0},
+#undef V475
+#define V475 (*(V + 475))
+ {0x1F001, -42305, 0, 0, 0},
+#undef V476
+#define V476 (*(V + 476))
+ {0x1F001, -42258, 0, 0, 0},
+#undef V477
+#define V477 (*(V + 477))
+ {0x1F001, -42282, 0, 0, 0},
+#undef V478
+#define V478 (*(V + 478))
+ {0x1F001, -42261, 0, 0, 0},
+#undef V479
+#define V479 (*(V + 479))
+ {0x1F001, 928, 0, 0, 0},
+#undef V480
+#define V480 (*(V + 480))
+ {0x1F002, 0, -928, -928, 0},
+#undef V481
+#define V481 (*(V + 481))
+ {0x1F002, 0, -38864, -38864, 0},
+#undef V482
+#define V482 (*(V + 482))
+ {0x1F020, 0, 0, 0, 0},
+#undef V483
+#define V483 (*(V + 483))
+ {0x1F220, 0, 0, 0, 0},
+#undef V484
+#define V484 (*(V + 484))
+ {0x1F01F, 0, 0, 0, 0},
+#undef V485
+#define V485 (*(V + 485))
+ {0x1F200, 0, 0, 0, 0},
+#undef V486
+#define V486 (*(V + 486))
+ {0x10807, 0, 0, 0, 0},
+#undef V487
+#define V487 (*(V + 487))
+ {0x20806, 0, 0, 0, 0},
+#undef V488
+#define V488 (*(V + 488))
+ {0xF00D, 0, 0, 0, 26},
+#undef V489
+#define V489 (*(V + 489))
+ {0x23406, 0, 0, 0, 0},
+#undef V490
+#define V490 (*(V + 490))
+ {0xF032, 0, 0, 0, 0},
+#undef V491
+#define V491 (*(V + 491))
+ {0x3431, 0, 0, 0, 0},
+#undef V492
+#define V492 (*(V + 492))
+ {0xB3421, 0, 0, 0, 0},
+#undef V493
+#define V493 (*(V + 493))
+ {0xB3429, 0, 0, 0, 0},
+#undef V494
+#define V494 (*(V + 494))
+ {0xB3424, 0, 0, 0, 0},
+#undef V495
+#define V495 (*(V + 495))
+ {0xB3426, 0, 0, 0, 0},
+#undef V496
+#define V496 (*(V + 496))
+ {0x7342C, 0, 0, 0, 0},
+#undef V497
+#define V497 (*(V + 497))
+ {0x5342A, 0, 0, 0, 0},
+#undef V498
+#define V498 (*(V + 498))
+ {0x43422, 0, 0, 0, 0},
+#undef V499
+#define V499 (*(V + 499))
+ {0xF11E, 0, 0, 0, 0},
+#undef V500
+#define V500 (*(V + 500))
+ {0xB3438, 0, 0, 0, 0},
+#undef V501
+#define V501 (*(V + 501))
+ {0x7342A, 0, 0, 0, 0},
+#undef V502
+#define V502 (*(V + 502))
+ {0x33490, 0, 0, 0, 0},
+#undef V503
+#define V503 (*(V + 503))
+ {0x433490, 0, 0, 0, 0},
+#undef V504
+#define V504 (*(V + 504))
+ {0x833490, 0, 0, 0, 0},
+#undef V505
+#define V505 (*(V + 505))
+ {0xC33490, 0, 0, 0, 0},
+#undef V506
+#define V506 (*(V + 506))
+ {0x1033490, 0, 0, 0, 0},
+#undef V507
+#define V507 (*(V + 507))
+ {0x1433490, 0, 0, 0, 0},
+#undef V508
+#define V508 (*(V + 508))
+ {0x1833490, 0, 0, 0, 0},
+#undef V509
+#define V509 (*(V + 509))
+ {0x1C33490, 0, 0, 0, 0},
+#undef V510
+#define V510 (*(V + 510))
+ {0x2033490, 0, 0, 0, 0},
+#undef V511
+#define V511 (*(V + 511))
+ {0x2433490, 0, 0, 0, 0},
+#undef V512
+#define V512 (*(V + 512))
+ {0x13401, 32, 0, 0, 0},
+#undef V513
+#define V513 (*(V + 513))
+ {0x13402, 0, -32, -32, 0},
+#undef V514
+#define V514 (*(V + 514))
+ {0xB342E, 0, 0, 0, 0},
+#undef V515
+#define V515 (*(V + 515))
+ {0xBF01B, 0, 0, 0, 0},
+#undef V516
+#define V516 (*(V + 516))
+ {0xBF011, 0, 0, 0, 0},
+#undef V517
+#define V517 (*(V + 517))
+ {0x3F013, 0, 0, 0, 0},
+#undef V518
+#define V518 (*(V + 518))
+ {0x1F001, 40, 0, 0, 0},
+#undef V519
+#define V519 (*(V + 519))
+ {0x1F002, 0, -40, -40, 0},
+#undef V520
+#define V520 (*(V + 520))
+ {0x2F013, 0, 0, 0, 0},
+#undef V521
+#define V521 (*(V + 521))
+ {0x2F033, 0, 0, 0, 0},
+#undef V522
+#define V522 (*(V + 522))
+ {0x42F093, 0, 0, 0, 0},
+#undef V523
+#define V523 (*(V + 523))
+ {0x82F093, 0, 0, 0, 0},
+#undef V524
+#define V524 (*(V + 524))
+ {0xC2F093, 0, 0, 0, 0},
+#undef V525
+#define V525 (*(V + 525))
+ {0x102F093, 0, 0, 0, 0},
+#undef V526
+#define V526 (*(V + 526))
+ {0x2F02C, 0, 0, 0, 0},
+#undef V527
+#define V527 (*(V + 527))
+ {0x2F001, 64, 0, 0, 0},
+#undef V528
+#define V528 (*(V + 528))
+ {0x2F002, 0, -64, -64, 0},
+#undef V529
+#define V529 (*(V + 529))
+ {0x46F093, 0, 0, 0, 0},
+#undef V530
+#define V530 (*(V + 530))
+ {0x86F093, 0, 0, 0, 0},
+#undef V531
+#define V531 (*(V + 531))
+ {0xC6F093, 0, 0, 0, 0},
+#undef V532
+#define V532 (*(V + 532))
+ {0x106F093, 0, 0, 0, 0},
+#undef V533
+#define V533 (*(V + 533))
+ {0x146F093, 0, 0, 0, 0},
+#undef V534
+#define V534 (*(V + 534))
+ {0x186F093, 0, 0, 0, 0},
+#undef V535
+#define V535 (*(V + 535))
+ {0x1C6F093, 0, 0, 0, 0},
+#undef V536
+#define V536 (*(V + 536))
+ {0x206F093, 0, 0, 0, 0},
+#undef V537
+#define V537 (*(V + 537))
+ {0x246F093, 0, 0, 0, 0},
+#undef V538
+#define V538 (*(V + 538))
+ {0x6F013, 0, 0, 0, 0},
+#undef V539
+#define V539 (*(V + 539))
+ {0x1F01B, 0, 0, 0, 0},
+#undef V540
+#define V540 (*(V + 540))
+ {0x1F00D, 0, 0, 0, 9},
+#undef V541
+#define V541 (*(V + 541))
+ {0x10833, 0, 0, 0, 0},
+#undef V542
+#define V542 (*(V + 542))
+ {0x1F00F, 0, 0, 0, 216},
+#undef V543
+#define V543 (*(V + 543))
+ {0x1F00F, 0, 0, 0, 226},
+#undef V544
+#define V544 (*(V + 544))
+ {0x1342F, 0, 0, 0, 0},
+#undef V545
+#define V545 (*(V + 545))
+ {0x2F001, 34, 0, 0, 0},
+#undef V546
+#define V546 (*(V + 546))
+ {0x2F002, 0, -34, -34, 0},
+ };
+
+ static const NUnicode::NPrivate::TUnidataTable::TValuePtr P[][32] = {
+ {
+ &V0, &V0, &V0, &V0, &V0, &V0, &V0, &V0,
+ &V0, &V1, &V2, &V1, &V2, &V2, &V0, &V0,
+ &V0, &V0, &V0, &V0, &V0, &V0, &V0, &V0,
+ &V0, &V0, &V0, &V0, &V3, &V3, &V3, &V4,
+ }, // P[0]
+ {
+ &V5, &V6, &V7, &V8, &V9, &V8, &V10, &V11,
+ &V12, &V13, &V10, &V14, &V15, &V16, &V15, &V17,
+ &V18, &V19, &V20, &V21, &V22, &V23, &V24, &V25,
+ &V26, &V27, &V15, &V6, &V28, &V28, &V28, &V6,
+ }, // P[1]
+ {
+ &V10, &V29, &V29, &V29, &V29, &V29, &V29, &V30,
+ &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ &V30, &V30, &V30, &V12, &V10, &V13, &V31, &V32,
+ }, // P[2]
+ {
+ &V31, &V33, &V33, &V33, &V33, &V33, &V33, &V34,
+ &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ &V34, &V34, &V34, &V12, &V28, &V13, &V28, &V0,
+ }, // P[3]
+ {
+ &V0, &V0, &V0, &V0, &V0, &V35, &V0, &V0,
+ &V0, &V0, &V0, &V0, &V0, &V0, &V0, &V0,
+ &V0, &V0, &V0, &V0, &V0, &V0, &V0, &V0,
+ &V0, &V0, &V0, &V0, &V0, &V0, &V0, &V0,
+ }, // P[4]
+ {
+ &V36, &V10, &V9, &V9, &V9, &V9, &V37, &V10,
+ &V38, &V37, &V39, &V40, &V28, &V41, &V37, &V38,
+ &V42, &V43, &V44, &V45, &V38, &V46, &V10, &V47,
+ &V38, &V48, &V39, &V49, &V50, &V50, &V50, &V10,
+ }, // P[5]
+ {
+ &V51, &V51, &V51, &V51, &V51, &V51, &V30, &V51,
+ &V51, &V51, &V51, &V51, &V51, &V51, &V51, &V51,
+ &V30, &V51, &V51, &V51, &V51, &V51, &V51, &V28,
+ &V30, &V51, &V51, &V51, &V51, &V51, &V30, &V52,
+ }, // P[6]
+ {
+ &V53, &V53, &V53, &V53, &V53, &V53, &V34, &V53,
+ &V53, &V53, &V53, &V53, &V53, &V53, &V53, &V53,
+ &V34, &V53, &V53, &V53, &V53, &V53, &V53, &V28,
+ &V34, &V53, &V53, &V53, &V53, &V53, &V34, &V54,
+ }, // P[7]
+ {
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V57, &V58, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ }, // P[8]
+ {
+ &V55, &V56, &V55, &V56, &V55, &V56, &V57, &V58,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V59, &V60, &V61, &V62, &V55, &V56, &V55, &V56,
+ &V52, &V55, &V56, &V55, &V56, &V55, &V56, &V61,
+ }, // P[9]
+ {
+ &V62, &V57, &V58, &V55, &V56, &V55, &V56, &V55,
+ &V56, &V63, &V57, &V58, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V57, &V58, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ }, // P[10]
+ {
+ &V55, &V56, &V55, &V56, &V55, &V56, &V57, &V58,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V64, &V55, &V56, &V55, &V56, &V55, &V56, &V65,
+ }, // P[11]
+ {
+ &V66, &V67, &V57, &V58, &V57, &V58, &V68, &V57,
+ &V58, &V69, &V69, &V57, &V58, &V52, &V70, &V71,
+ &V72, &V57, &V58, &V69, &V73, &V74, &V75, &V76,
+ &V57, &V58, &V77, &V52, &V75, &V78, &V79, &V80,
+ }, // P[12]
+ {
+ &V55, &V56, &V57, &V58, &V57, &V58, &V81, &V57,
+ &V58, &V81, &V52, &V52, &V57, &V58, &V81, &V55,
+ &V56, &V82, &V82, &V57, &V58, &V57, &V58, &V83,
+ &V57, &V58, &V52, &V84, &V57, &V58, &V52, &V85,
+ }, // P[13]
+ {
+ &V84, &V84, &V84, &V84, &V86, &V87, &V88, &V86,
+ &V87, &V88, &V86, &V87, &V88, &V55, &V56, &V55,
+ &V56, &V55, &V56, &V55, &V56, &V55, &V56, &V55,
+ &V56, &V55, &V56, &V55, &V56, &V89, &V55, &V56,
+ }, // P[14]
+ {
+ &V55, &V56, &V55, &V56, &V57, &V58, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V90, &V86, &V87, &V88, &V55, &V56, &V91, &V92,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ }, // P[15]
+ {
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V57, &V58, &V55, &V56,
+ }, // P[16]
+ {
+ &V93, &V52, &V57, &V58, &V57, &V58, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V94, &V57, &V58, &V95, &V96, &V97,
+ }, // P[17]
+ {
+ &V97, &V57, &V58, &V98, &V99, &V100, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V101, &V102, &V103, &V104, &V105, &V52, &V106, &V106,
+ &V52, &V107, &V52, &V108, &V109, &V52, &V52, &V52,
+ }, // P[18]
+ {
+ &V106, &V110, &V52, &V111, &V52, &V112, &V113, &V52,
+ &V114, &V115, &V113, &V116, &V117, &V52, &V52, &V115,
+ &V52, &V118, &V119, &V52, &V52, &V120, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V121, &V52, &V52,
+ }, // P[19]
+ {
+ &V122, &V52, &V52, &V122, &V52, &V52, &V52, &V123,
+ &V122, &V124, &V125, &V125, &V126, &V52, &V52, &V52,
+ &V52, &V52, &V127, &V52, &V84, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V128, &V129, &V52,
+ }, // P[20]
+ {
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ &V130, &V131, &V131, &V132, &V132, &V132, &V132, &V132,
+ }, // P[21]
+ {
+ &V132, &V132, &V31, &V31, &V31, &V31, &V131, &V133,
+ &V131, &V131, &V131, &V131, &V131, &V131, &V131, &V131,
+ &V134, &V134, &V31, &V31, &V31, &V31, &V31, &V31,
+ &V38, &V38, &V38, &V38, &V38, &V38, &V31, &V31,
+ }, // P[22]
+ {
+ &V130, &V130, &V130, &V130, &V130, &V31, &V31, &V31,
+ &V31, &V31, &V31, &V31, &V131, &V31, &V132, &V31,
+ &V31, &V31, &V31, &V31, &V31, &V31, &V31, &V31,
+ &V31, &V31, &V31, &V31, &V31, &V31, &V31, &V31,
+ }, // P[23]
+ {
+ &V135, &V135, &V135, &V135, &V135, &V136, &V135, &V135,
+ &V135, &V135, &V135, &V135, &V135, &V136, &V136, &V135,
+ &V136, &V135, &V136, &V135, &V135, &V137, &V138, &V138,
+ &V138, &V138, &V137, &V139, &V138, &V138, &V138, &V138,
+ }, // P[24]
+ {
+ &V138, &V140, &V140, &V141, &V141, &V141, &V141, &V142,
+ &V142, &V138, &V138, &V138, &V138, &V141, &V141, &V138,
+ &V141, &V141, &V138, &V138, &V143, &V143, &V143, &V143,
+ &V144, &V138, &V138, &V138, &V138, &V136, &V136, &V136,
+ }, // P[25]
+ {
+ &V145, &V145, &V135, &V145, &V145, &V146, &V136, &V138,
+ &V138, &V138, &V136, &V136, &V136, &V138, &V138, &V147,
+ &V136, &V136, &V136, &V138, &V138, &V138, &V138, &V136,
+ &V137, &V138, &V138, &V136, &V148, &V149, &V149, &V148,
+ }, // P[26]
+ {
+ &V149, &V149, &V148, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V57, &V58, &V57, &V58, &V150, &V31, &V57, &V58,
+ &V151, &V151, &V152, &V79, &V79, &V79, &V153, &V154,
+ }, // P[27]
+ {
+ &V151, &V151, &V151, &V151, &V38, &V155, &V156, &V153,
+ &V157, &V157, &V157, &V151, &V158, &V151, &V159, &V159,
+ &V90, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ }, // P[28]
+ {
+ &V30, &V30, &V151, &V30, &V30, &V30, &V30, &V30,
+ &V30, &V30, &V51, &V51, &V160, &V161, &V161, &V161,
+ &V90, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ }, // P[29]
+ {
+ &V34, &V34, &V162, &V34, &V34, &V34, &V34, &V34,
+ &V34, &V34, &V53, &V53, &V163, &V164, &V164, &V165,
+ &V166, &V167, &V168, &V169, &V169, &V170, &V171, &V172,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ }, // P[30]
+ {
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V173, &V174, &V175, &V176, &V177, &V178, &V28, &V57,
+ &V58, &V179, &V57, &V58, &V52, &V93, &V93, &V93,
+ }, // P[31]
+ {
+ &V180, &V180, &V181, &V180, &V181, &V181, &V181, &V180,
+ &V181, &V181, &V181, &V181, &V180, &V180, &V180, &V181,
+ &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ &V30, &V51, &V30, &V30, &V30, &V30, &V30, &V30,
+ }, // P[32]
+ {
+ &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ &V34, &V53, &V34, &V34, &V34, &V34, &V34, &V34,
+ }, // P[33]
+ {
+ &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ &V182, &V182, &V183, &V182, &V183, &V183, &V183, &V182,
+ &V183, &V183, &V183, &V183, &V182, &V182, &V182, &V183,
+ }, // P[34]
+ {
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V55, &V56,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ }, // P[35]
+ {
+ &V57, &V58, &V184, &V136, &V136, &V136, &V136, &V136,
+ &V185, &V185, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ }, // P[36]
+ {
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ }, // P[37]
+ {
+ &V186, &V55, &V56, &V57, &V58, &V57, &V58, &V57,
+ &V58, &V57, &V58, &V57, &V58, &V57, &V58, &V187,
+ &V55, &V56, &V55, &V56, &V57, &V58, &V55, &V56,
+ &V57, &V58, &V55, &V56, &V55, &V56, &V55, &V56,
+ }, // P[38]
+ {
+ &V57, &V58, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V57, &V58, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V57, &V58,
+ &V55, &V56, &V57, &V58, &V57, &V58, &V57, &V58,
+ }, // P[39]
+ {
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V151, &V188, &V188, &V188, &V188, &V188, &V188, &V188,
+ &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188,
+ }, // P[40]
+ {
+ &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188,
+ &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188,
+ &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V151,
+ &V151, &V132, &V189, &V189, &V189, &V189, &V189, &V189,
+ }, // P[41]
+ {
+ &V151, &V190, &V190, &V190, &V190, &V190, &V190, &V190,
+ &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190,
+ &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190,
+ &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190,
+ }, // P[42]
+ {
+ &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V63,
+ &V151, &V191, &V192, &V151, &V151, &V37, &V37, &V9,
+ &V151, &V138, &V136, &V136, &V136, &V136, &V138, &V136,
+ &V136, &V136, &V193, &V138, &V136, &V136, &V136, &V136,
+ }, // P[43]
+ {
+ &V136, &V136, &V138, &V138, &V138, &V138, &V138, &V138,
+ &V136, &V136, &V138, &V136, &V136, &V193, &V194, &V136,
+ &V195, &V196, &V197, &V198, &V199, &V200, &V201, &V202,
+ &V203, &V204, &V204, &V205, &V206, &V207, &V208, &V209,
+ }, // P[44]
+ {
+ &V210, &V211, &V212, &V210, &V136, &V138, &V210, &V203,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ }, // P[45]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V151, &V151, &V151, &V151, &V151,
+ &V213, &V213, &V213, &V210, &V210, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[46]
+ {
+ &V214, &V214, &V214, &V214, &V214, &V214, &V28, &V28,
+ &V215, &V8, &V8, &V216, &V15, &V217, &V37, &V37,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V218, &V219, &V220, &V221, &V41, &V151, &V217, &V221,
+ }, // P[47]
+ {
+ &V222, &V222, &V223, &V223, &V223, &V223, &V223, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ }, // P[48]
+ {
+ &V224, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V225, &V226, &V227, &V218, &V219,
+ &V220, &V228, &V229, &V135, &V135, &V141, &V138, &V136,
+ &V136, &V136, &V136, &V136, &V138, &V136, &V136, &V138,
+ }, // P[49]
+ {
+ &V230, &V231, &V232, &V233, &V234, &V235, &V236, &V237,
+ &V238, &V239, &V8, &V240, &V240, &V217, &V222, &V222,
+ &V241, &V222, &V222, &V222, &V222, &V242, &V242, &V242,
+ &V242, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ }, // P[50]
+ {
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ }, // P[51]
+ {
+ &V223, &V222, &V223, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V223, &V221, &V222, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V214, &V37, &V136,
+ }, // P[52]
+ {
+ &V136, &V136, &V136, &V138, &V136, &V243, &V243, &V136,
+ &V136, &V37, &V138, &V136, &V136, &V138, &V222, &V222,
+ &V244, &V245, &V246, &V247, &V248, &V249, &V250, &V251,
+ &V252, &V253, &V222, &V222, &V222, &V254, &V254, &V222,
+ }, // P[53]
+ {
+ &V217, &V221, &V221, &V221, &V221, &V221, &V221, &V221,
+ &V221, &V221, &V217, &V217, &V217, &V217, &V151, &V41,
+ &V222, &V255, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ }, // P[54]
+ {
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V136, &V138, &V136, &V136, &V138, &V136, &V136, &V138,
+ &V138, &V138, &V136, &V138, &V138, &V136, &V138, &V136,
+ }, // P[55]
+ {
+ &V136, &V136, &V138, &V136, &V138, &V136, &V138, &V136,
+ &V138, &V136, &V136, &V151, &V151, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ }, // P[56]
+ {
+ &V222, &V222, &V222, &V222, &V222, &V222, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V222, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[57]
+ {
+ &V256, &V257, &V258, &V259, &V260, &V261, &V262, &V263,
+ &V264, &V265, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ }, // P[58]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V138, &V136, &V266, &V266, &V37, &V10,
+ &V6, &V6, &V266, &V151, &V151, &V151, &V151, &V151,
+ }, // P[59]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V136, &V136,
+ &V136, &V136, &V267, &V136, &V136, &V136, &V136, &V136,
+ }, // P[60]
+ {
+ &V136, &V136, &V136, &V136, &V267, &V136, &V136, &V136,
+ &V267, &V136, &V136, &V136, &V136, &V136, &V151, &V151,
+ &V210, &V210, &V210, &V210, &V210, &V210, &V210, &V210,
+ &V210, &V210, &V210, &V210, &V210, &V210, &V210, &V151,
+ }, // P[61]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V138, &V138, &V138, &V151, &V151, &V210, &V151,
+ }, // P[62]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[63]
+ {
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V151, &V222, &V222,
+ &V222, &V222, &V222, &V222, &V222, &V222, &V151, &V151,
+ }, // P[64]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ }, // P[65]
+ {
+ &V136, &V136, &V214, &V138, &V136, &V136, &V138, &V136,
+ &V136, &V138, &V136, &V136, &V136, &V138, &V138, &V138,
+ &V225, &V226, &V227, &V136, &V136, &V136, &V138, &V136,
+ &V136, &V138, &V138, &V136, &V136, &V136, &V136, &V136,
+ }, // P[66]
+ {
+ &V147, &V147, &V147, &V268, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[67]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V269, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V269, &V84, &V84, &V269, &V84, &V84, &V84,
+ &V84, &V84, &V147, &V268, &V270, &V84, &V268, &V268,
+ }, // P[68]
+ {
+ &V268, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V268, &V268, &V268, &V268, &V271, &V268, &V268,
+ &V84, &V136, &V138, &V136, &V136, &V147, &V147, &V147,
+ &V272, &V272, &V272, &V272, &V272, &V272, &V272, &V272,
+ }, // P[69]
+ {
+ &V84, &V84, &V147, &V147, &V191, &V191, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V189, &V134, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[70]
+ {
+ &V84, &V147, &V268, &V268, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V84,
+ &V84, &V151, &V151, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[71]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V151, &V151, &V151, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V283, &V84, &V284, &V268,
+ }, // P[72]
+ {
+ &V268, &V147, &V147, &V147, &V147, &V151, &V151, &V268,
+ &V268, &V151, &V151, &V285, &V285, &V271, &V84, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V284,
+ &V151, &V151, &V151, &V151, &V272, &V272, &V151, &V272,
+ }, // P[73]
+ {
+ &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V84, &V84, &V9, &V9, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V184, &V9, &V151, &V151, &V151, &V151,
+ }, // P[74]
+ {
+ &V151, &V147, &V147, &V268, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V151, &V151, &V151, &V151, &V84,
+ &V84, &V151, &V151, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[75]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V272, &V151, &V84, &V272, &V151,
+ &V84, &V84, &V151, &V151, &V283, &V151, &V268, &V268,
+ }, // P[76]
+ {
+ &V268, &V147, &V147, &V151, &V151, &V151, &V151, &V147,
+ &V147, &V151, &V151, &V147, &V147, &V271, &V151, &V151,
+ &V151, &V147, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V272, &V272, &V272, &V84, &V151, &V272, &V151,
+ }, // P[77]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V147, &V147, &V84, &V84, &V84, &V147, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[78]
+ {
+ &V151, &V147, &V147, &V268, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V84,
+ &V84, &V84, &V151, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[79]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V283, &V84, &V268, &V268,
+ }, // P[80]
+ {
+ &V268, &V147, &V147, &V147, &V147, &V147, &V151, &V147,
+ &V147, &V268, &V151, &V268, &V268, &V271, &V151, &V151,
+ &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[81]
+ {
+ &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V189, &V9, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V84, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[82]
+ {
+ &V151, &V147, &V268, &V268, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V84,
+ &V84, &V151, &V151, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[83]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V283, &V84, &V284, &V147,
+ }, // P[84]
+ {
+ &V268, &V147, &V147, &V147, &V147, &V151, &V151, &V268,
+ &V285, &V151, &V151, &V285, &V285, &V271, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V287, &V284,
+ &V151, &V151, &V151, &V151, &V272, &V272, &V151, &V84,
+ }, // P[85]
+ {
+ &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V184, &V84, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[86]
+ {
+ &V151, &V151, &V147, &V84, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V151, &V151, &V151, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V269, &V84, &V151, &V151,
+ &V151, &V84, &V84, &V151, &V84, &V151, &V84, &V84,
+ }, // P[87]
+ {
+ &V151, &V151, &V151, &V84, &V84, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V151, &V151, &V151, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V151, &V151, &V284, &V268,
+ }, // P[88]
+ {
+ &V147, &V268, &V268, &V151, &V151, &V151, &V268, &V268,
+ &V268, &V151, &V285, &V285, &V285, &V271, &V151, &V151,
+ &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V284,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[89]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V286, &V286, &V286, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V9, &V37, &V151, &V151, &V151, &V151, &V151,
+ }, // P[90]
+ {
+ &V147, &V268, &V268, &V268, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[91]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V151, &V84, &V147, &V147,
+ }, // P[92]
+ {
+ &V147, &V268, &V268, &V268, &V268, &V151, &V147, &V147,
+ &V288, &V151, &V147, &V147, &V147, &V271, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V289, &V290, &V151,
+ &V84, &V84, &V84, &V151, &V151, &V151, &V151, &V151,
+ }, // P[93]
+ {
+ &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V291, &V291, &V291, &V291, &V291, &V291, &V291, &V184,
+ }, // P[94]
+ {
+ &V84, &V147, &V268, &V268, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[95]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V283, &V84, &V268, &V292,
+ }, // P[96]
+ {
+ &V285, &V268, &V284, &V268, &V268, &V151, &V292, &V285,
+ &V285, &V151, &V285, &V285, &V147, &V271, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V284, &V284, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V84, &V151,
+ }, // P[97]
+ {
+ &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V151, &V84, &V84, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[98]
+ {
+ &V151, &V147, &V268, &V268, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[99]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V151, &V151, &V84, &V284, &V268,
+ }, // P[100]
+ {
+ &V268, &V147, &V147, &V147, &V147, &V151, &V268, &V268,
+ &V268, &V151, &V285, &V285, &V285, &V271, &V84, &V184,
+ &V151, &V151, &V151, &V151, &V84, &V84, &V84, &V284,
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V84,
+ }, // P[101]
+ {
+ &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V184, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[102]
+ {
+ &V151, &V151, &V268, &V268, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V151, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[103]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V151, &V84, &V151, &V151,
+ }, // P[104]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V151, &V151, &V293, &V151, &V151, &V151, &V151, &V284,
+ &V268, &V268, &V147, &V147, &V147, &V151, &V147, &V151,
+ &V268, &V268, &V285, &V268, &V285, &V285, &V285, &V284,
+ }, // P[105]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V151, &V151, &V268, &V268, &V189, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[106]
+ {
+ &V151, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[107]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V147, &V84, &V39, &V147, &V147, &V147, &V147,
+ &V294, &V294, &V271, &V151, &V151, &V151, &V151, &V9,
+ }, // P[108]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V134, &V147,
+ &V295, &V295, &V295, &V295, &V147, &V147, &V147, &V189,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V189, &V189, &V151, &V151, &V151, &V151,
+ }, // P[109]
+ {
+ &V151, &V84, &V84, &V151, &V84, &V151, &V151, &V84,
+ &V84, &V151, &V84, &V151, &V151, &V84, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V84, &V84, &V84, &V84,
+ &V151, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[110]
+ {
+ &V151, &V84, &V84, &V84, &V151, &V84, &V151, &V84,
+ &V151, &V151, &V84, &V84, &V151, &V84, &V84, &V84,
+ &V84, &V147, &V84, &V39, &V147, &V147, &V147, &V147,
+ &V296, &V296, &V151, &V147, &V147, &V84, &V151, &V151,
+ }, // P[111]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V151, &V134, &V151,
+ &V297, &V297, &V297, &V297, &V147, &V147, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V39, &V39, &V84, &V84,
+ }, // P[112]
+ {
+ &V84, &V184, &V184, &V184, &V189, &V189, &V189, &V189,
+ &V189, &V189, &V189, &V189, &V298, &V189, &V189, &V189,
+ &V189, &V189, &V189, &V184, &V189, &V184, &V184, &V184,
+ &V138, &V138, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[113]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V286, &V184, &V138, &V184, &V138,
+ &V184, &V299, &V12, &V13, &V12, &V13, &V268, &V268,
+ }, // P[114]
+ {
+ &V84, &V84, &V84, &V272, &V84, &V84, &V84, &V84,
+ &V151, &V84, &V84, &V84, &V84, &V272, &V84, &V84,
+ &V84, &V84, &V272, &V84, &V84, &V84, &V84, &V272,
+ &V84, &V84, &V84, &V84, &V272, &V84, &V84, &V84,
+ }, // P[115]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V272, &V84, &V84, &V84, &V151, &V151, &V151,
+ &V151, &V300, &V301, &V302, &V303, &V302, &V302, &V304,
+ &V302, &V304, &V301, &V301, &V301, &V301, &V147, &V268,
+ }, // P[116]
+ {
+ &V301, &V302, &V136, &V136, &V271, &V189, &V136, &V136,
+ &V84, &V84, &V84, &V84, &V84, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V302, &V147, &V147, &V147, &V147,
+ &V151, &V147, &V147, &V147, &V147, &V302, &V147, &V147,
+ }, // P[117]
+ {
+ &V147, &V147, &V302, &V147, &V147, &V147, &V147, &V302,
+ &V147, &V147, &V147, &V147, &V302, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V302, &V147, &V147, &V147, &V151, &V184, &V184,
+ }, // P[118]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V138, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V151, &V184, &V184,
+ &V189, &V189, &V189, &V189, &V189, &V184, &V184, &V184,
+ &V184, &V189, &V189, &V151, &V151, &V151, &V151, &V151,
+ }, // P[119]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[120]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V269, &V84,
+ &V84, &V84, &V84, &V268, &V268, &V147, &V287, &V147,
+ &V147, &V268, &V147, &V147, &V147, &V147, &V147, &V283,
+ &V268, &V271, &V271, &V268, &V268, &V147, &V147, &V84,
+ }, // P[121]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V189, &V189, &V189, &V189, &V189, &V189,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V268, &V268,
+ &V147, &V147, &V84, &V84, &V84, &V84, &V147, &V147,
+ }, // P[122]
+ {
+ &V147, &V84, &V268, &V268, &V268, &V84, &V84, &V268,
+ &V268, &V268, &V268, &V268, &V268, &V268, &V84, &V84,
+ &V84, &V147, &V147, &V147, &V147, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[123]
+ {
+ &V84, &V84, &V147, &V268, &V268, &V147, &V147, &V268,
+ &V268, &V268, &V268, &V268, &V268, &V138, &V84, &V268,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V268, &V268, &V268, &V147, &V184, &V184,
+ }, // P[124]
+ {
+ &V305, &V305, &V305, &V305, &V305, &V305, &V305, &V305,
+ &V305, &V305, &V305, &V305, &V305, &V305, &V305, &V305,
+ &V305, &V305, &V305, &V305, &V305, &V305, &V305, &V305,
+ &V305, &V305, &V305, &V305, &V305, &V305, &V305, &V305,
+ }, // P[125]
+ {
+ &V305, &V305, &V305, &V305, &V305, &V305, &V151, &V305,
+ &V151, &V151, &V151, &V151, &V151, &V305, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[126]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V189, &V130, &V84, &V84, &V84,
+ }, // P[127]
+ {
+ &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306,
+ &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306,
+ &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306,
+ &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306,
+ }, // P[128]
+ {
+ &V307, &V308, &V308, &V308, &V308, &V308, &V308, &V308,
+ &V308, &V308, &V308, &V308, &V308, &V308, &V308, &V308,
+ &V308, &V308, &V308, &V308, &V308, &V308, &V307, &V307,
+ &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307,
+ }, // P[129]
+ {
+ &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307,
+ &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307,
+ &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307,
+ &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307,
+ }, // P[130]
+ {
+ &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307,
+ &V309, &V309, &V309, &V309, &V309, &V309, &V309, &V309,
+ &V309, &V309, &V309, &V309, &V309, &V309, &V309, &V309,
+ &V309, &V309, &V309, &V309, &V309, &V309, &V309, &V309,
+ }, // P[131]
+ {
+ &V309, &V309, &V309, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ }, // P[132]
+ {
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ }, // P[133]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151,
+ }, // P[134]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[135]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ }, // P[136]
+ {
+ &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[137]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[138]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V151, &V151, &V136, &V136, &V136,
+ }, // P[139]
+ {
+ &V189, &V189, &V191, &V191, &V191, &V191, &V191, &V191,
+ &V189, &V311, &V312, &V313, &V314, &V315, &V316, &V317,
+ &V318, &V319, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V286, &V286, &V151, &V151, &V151,
+ }, // P[140]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[141]
+ {
+ &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320,
+ &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320,
+ &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320,
+ &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320,
+ }, // P[142]
+ {
+ &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320,
+ &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320,
+ &V165, &V165, &V165, &V165, &V165, &V165, &V151, &V151,
+ &V172, &V172, &V172, &V172, &V172, &V172, &V151, &V151,
+ }, // P[143]
+ {
+ &V192, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[144]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V189, &V191, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[145]
+ {
+ &V5, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V12, &V13, &V151, &V151, &V151,
+ }, // P[146]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V189, &V189, &V189, &V321, &V321,
+ &V321, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[147]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V84, &V84,
+ &V84, &V84, &V147, &V147, &V271, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[148]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V147, &V147, &V271, &V189, &V189, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[149]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V147, &V147, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[150]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V84, &V84,
+ &V84, &V151, &V147, &V147, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[151]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V147, &V147, &V268, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V268, &V268,
+ }, // P[152]
+ {
+ &V268, &V268, &V268, &V268, &V268, &V268, &V147, &V268,
+ &V268, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V271, &V147, &V189, &V189, &V189, &V134,
+ &V189, &V189, &V189, &V9, &V84, &V136, &V151, &V151,
+ }, // P[153]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V291, &V291, &V291, &V291, &V291, &V291, &V291, &V291,
+ &V291, &V291, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[154]
+ {
+ &V10, &V6, &V6, &V6, &V6, &V10, &V192, &V10,
+ &V6, &V6, &V10, &V147, &V147, &V147, &V41, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[155]
+ {
+ &V84, &V84, &V84, &V132, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[156]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[157]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V147, &V147, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[158]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V194, &V84, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[159]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[160]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ }, // P[161]
+ {
+ &V147, &V147, &V147, &V268, &V268, &V268, &V268, &V147,
+ &V147, &V268, &V268, &V268, &V151, &V151, &V151, &V151,
+ &V268, &V268, &V147, &V268, &V268, &V268, &V268, &V268,
+ &V268, &V193, &V136, &V138, &V151, &V151, &V151, &V151,
+ }, // P[162]
+ {
+ &V37, &V151, &V151, &V151, &V6, &V6, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[163]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[164]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[165]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V311, &V151, &V151, &V151, &V37, &V37,
+ }, // P[166]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[167]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V136,
+ &V138, &V268, &V268, &V147, &V151, &V151, &V189, &V189,
+ }, // P[168]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V268, &V147, &V268,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V151,
+ }, // P[169]
+ {
+ &V271, &V268, &V147, &V268, &V268, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V268, &V268, &V268,
+ &V268, &V268, &V268, &V147, &V147, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V151, &V151, &V138,
+ }, // P[170]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[171]
+ {
+ &V189, &V189, &V189, &V189, &V189, &V189, &V189, &V134,
+ &V189, &V189, &V189, &V189, &V189, &V189, &V151, &V151,
+ &V136, &V136, &V136, &V136, &V136, &V138, &V138, &V138,
+ &V138, &V138, &V138, &V136, &V136, &V138, &V185, &V151,
+ }, // P[172]
+ {
+ &V147, &V147, &V147, &V147, &V268, &V84, &V269, &V84,
+ &V269, &V84, &V269, &V84, &V269, &V84, &V269, &V84,
+ &V84, &V84, &V269, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[173]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V283, &V284, &V147, &V147,
+ &V147, &V147, &V147, &V285, &V147, &V285, &V268, &V268,
+ }, // P[174]
+ {
+ &V285, &V285, &V147, &V285, &V322, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V151, &V151, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V189, &V189, &V189, &V189, &V189, &V189,
+ }, // P[175]
+ {
+ &V189, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V136, &V138, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V151, &V151, &V151,
+ }, // P[176]
+ {
+ &V147, &V147, &V268, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[177]
+ {
+ &V84, &V268, &V147, &V147, &V147, &V147, &V268, &V268,
+ &V147, &V147, &V322, &V271, &V147, &V147, &V84, &V84,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[178]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V283, &V268,
+ &V147, &V147, &V268, &V268, &V268, &V147, &V268, &V147,
+ &V147, &V147, &V322, &V322, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V189, &V189, &V189, &V189,
+ }, // P[179]
+ {
+ &V84, &V84, &V84, &V84, &V268, &V268, &V268, &V268,
+ &V268, &V268, &V268, &V268, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V268, &V268, &V147, &V283,
+ &V151, &V151, &V151, &V189, &V189, &V189, &V189, &V189,
+ }, // P[180]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V84, &V84, &V84,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[181]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V134, &V134, &V134, &V134, &V134, &V134, &V189, &V189,
+ }, // P[182]
+ {
+ &V323, &V324, &V325, &V326, &V326, &V327, &V328, &V329,
+ &V330, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[183]
+ {
+ &V189, &V189, &V189, &V189, &V189, &V189, &V189, &V189,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V136, &V136, &V136, &V189, &V143, &V138, &V138, &V138,
+ &V138, &V138, &V136, &V136, &V138, &V138, &V138, &V138,
+ }, // P[184]
+ {
+ &V136, &V268, &V143, &V143, &V143, &V143, &V143, &V143,
+ &V143, &V84, &V84, &V84, &V84, &V138, &V84, &V84,
+ &V84, &V84, &V268, &V268, &V136, &V84, &V84, &V151,
+ &V136, &V136, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[185]
+ {
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ }, // P[186]
+ {
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V130, &V130, &V130, &V132,
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ &V130, &V130, &V130, &V132, &V130, &V130, &V130, &V130,
+ }, // P[187]
+ {
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ &V130, &V130, &V130, &V130, &V130, &V130, &V132, &V130,
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ }, // P[188]
+ {
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ &V130, &V130, &V130, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V130, &V331, &V52, &V52, &V52, &V332, &V52, &V52,
+ }, // P[189]
+ {
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V130, &V130, &V130, &V130, &V130,
+ }, // P[190]
+ {
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ }, // P[191]
+ {
+ &V136, &V136, &V138, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V138, &V136, &V136, &V149, &V333, &V138,
+ &V140, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ }, // P[192]
+ {
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V151, &V151,
+ &V151, &V151, &V151, &V136, &V148, &V138, &V136, &V138,
+ }, // P[193]
+ {
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ }, // P[194]
+ {
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V90, &V90,
+ &V90, &V90, &V63, &V334, &V52, &V52, &V335, &V52,
+ }, // P[195]
+ {
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56,
+ &V55, &V56, &V57, &V58, &V57, &V58, &V57, &V58,
+ }, // P[196]
+ {
+ &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336,
+ &V337, &V337, &V337, &V337, &V337, &V337, &V337, &V337,
+ &V336, &V336, &V336, &V336, &V336, &V336, &V151, &V151,
+ &V337, &V337, &V337, &V337, &V337, &V337, &V151, &V151,
+ }, // P[197]
+ {
+ &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336,
+ &V337, &V337, &V337, &V337, &V337, &V337, &V337, &V337,
+ &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336,
+ &V337, &V337, &V337, &V337, &V337, &V337, &V337, &V337,
+ }, // P[198]
+ {
+ &V336, &V336, &V336, &V336, &V336, &V336, &V151, &V151,
+ &V337, &V337, &V337, &V337, &V337, &V337, &V151, &V151,
+ &V90, &V336, &V90, &V336, &V90, &V336, &V90, &V336,
+ &V151, &V337, &V151, &V337, &V151, &V337, &V151, &V337,
+ }, // P[199]
+ {
+ &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336,
+ &V337, &V337, &V337, &V337, &V337, &V337, &V337, &V337,
+ &V338, &V339, &V340, &V341, &V340, &V341, &V342, &V343,
+ &V344, &V345, &V346, &V347, &V348, &V349, &V151, &V151,
+ }, // P[200]
+ {
+ &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336,
+ &V350, &V350, &V350, &V350, &V350, &V350, &V350, &V350,
+ &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336,
+ &V350, &V350, &V350, &V350, &V350, &V350, &V350, &V350,
+ }, // P[201]
+ {
+ &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336,
+ &V350, &V350, &V350, &V350, &V350, &V350, &V350, &V350,
+ &V336, &V336, &V90, &V351, &V90, &V151, &V90, &V90,
+ &V337, &V337, &V352, &V353, &V354, &V38, &V355, &V38,
+ }, // P[202]
+ {
+ &V38, &V155, &V90, &V351, &V90, &V151, &V90, &V90,
+ &V356, &V357, &V356, &V357, &V354, &V155, &V155, &V155,
+ &V336, &V336, &V90, &V358, &V151, &V151, &V90, &V90,
+ &V337, &V337, &V359, &V360, &V151, &V155, &V155, &V155,
+ }, // P[203]
+ {
+ &V336, &V336, &V90, &V358, &V90, &V361, &V90, &V90,
+ &V337, &V337, &V362, &V363, &V364, &V155, &V365, &V365,
+ &V151, &V151, &V90, &V351, &V90, &V151, &V90, &V90,
+ &V366, &V367, &V368, &V369, &V354, &V365, &V38, &V151,
+ }, // P[204]
+ {
+ &V370, &V370, &V371, &V371, &V371, &V371, &V371, &V371,
+ &V371, &V371, &V371, &V372, &V373, &V373, &V374, &V375,
+ &V192, &V376, &V377, &V377, &V377, &V377, &V10, &V378,
+ &V379, &V380, &V381, &V379, &V40, &V49, &V382, &V40,
+ }, // P[205]
+ {
+ &V10, &V10, &V10, &V10, &V378, &V378, &V383, &V10,
+ &V384, &V385, &V386, &V386, &V386, &V386, &V386, &V36,
+ &V8, &V8, &V387, &V388, &V388, &V11, &V389, &V389,
+ &V10, &V40, &V49, &V10, &V383, &V6, &V378, &V32,
+ }, // P[206]
+ {
+ &V32, &V10, &V10, &V10, &V390, &V12, &V13, &V383,
+ &V383, &V383, &V10, &V10, &V10, &V10, &V10, &V6,
+ &V10, &V10, &V28, &V10, &V32, &V10, &V10, &V389,
+ &V10, &V10, &V10, &V10, &V10, &V10, &V10, &V371,
+ }, // P[207]
+ {
+ &V373, &V41, &V41, &V41, &V41, &V151, &V386, &V386,
+ &V41, &V386, &V41, &V41, &V41, &V41, &V41, &V41,
+ &V391, &V130, &V151, &V151, &V392, &V393, &V394, &V395,
+ &V396, &V397, &V398, &V399, &V400, &V401, &V402, &V130,
+ }, // P[208]
+ {
+ &V391, &V48, &V44, &V45, &V392, &V393, &V394, &V395,
+ &V396, &V397, &V398, &V399, &V400, &V401, &V402, &V151,
+ &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130,
+ &V130, &V130, &V130, &V130, &V130, &V151, &V151, &V151,
+ }, // P[209]
+ {
+ &V9, &V9, &V9, &V9, &V9, &V9, &V9, &V9,
+ &V403, &V9, &V9, &V9, &V9, &V9, &V9, &V9,
+ &V9, &V9, &V9, &V9, &V9, &V9, &V9, &V9,
+ &V9, &V9, &V9, &V9, &V9, &V9, &V9, &V151,
+ }, // P[210]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V136, &V136, &V143, &V143, &V136, &V136, &V136, &V136,
+ &V143, &V143, &V143, &V136, &V136, &V185, &V185, &V185,
+ }, // P[211]
+ {
+ &V185, &V136, &V185, &V185, &V185, &V143, &V143, &V136,
+ &V138, &V136, &V143, &V143, &V138, &V138, &V138, &V138,
+ &V136, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[212]
+ {
+ &V404, &V404, &V168, &V404, &V37, &V404, &V404, &V168,
+ &V37, &V404, &V63, &V168, &V168, &V168, &V63, &V63,
+ &V168, &V168, &V168, &V63, &V37, &V168, &V404, &V37,
+ &V28, &V168, &V168, &V168, &V168, &V168, &V37, &V37,
+ }, // P[213]
+ {
+ &V404, &V404, &V404, &V37, &V168, &V37, &V405, &V37,
+ &V168, &V37, &V406, &V407, &V168, &V168, &V42, &V63,
+ &V168, &V168, &V408, &V168, &V63, &V39, &V39, &V39,
+ &V39, &V63, &V37, &V404, &V63, &V63, &V168, &V168,
+ }, // P[214]
+ {
+ &V400, &V28, &V28, &V28, &V28, &V168, &V63, &V63,
+ &V63, &V63, &V37, &V28, &V37, &V37, &V409, &V184,
+ &V50, &V50, &V50, &V50, &V50, &V50, &V50, &V50,
+ &V50, &V50, &V50, &V50, &V50, &V50, &V50, &V50,
+ }, // P[215]
+ {
+ &V410, &V410, &V410, &V410, &V410, &V410, &V410, &V410,
+ &V410, &V410, &V410, &V410, &V410, &V410, &V410, &V410,
+ &V411, &V411, &V411, &V411, &V411, &V411, &V411, &V411,
+ &V411, &V411, &V411, &V411, &V411, &V411, &V411, &V411,
+ }, // P[216]
+ {
+ &V321, &V321, &V321, &V57, &V58, &V321, &V321, &V321,
+ &V321, &V50, &V37, &V37, &V151, &V151, &V151, &V151,
+ &V28, &V28, &V28, &V28, &V28, &V37, &V37, &V37,
+ &V37, &V37, &V412, &V412, &V37, &V37, &V37, &V37,
+ }, // P[217]
+ {
+ &V28, &V37, &V37, &V28, &V37, &V37, &V28, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V412, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[218]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V413, &V412, &V412,
+ &V37, &V37, &V28, &V37, &V28, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[219]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[220]
+ {
+ &V28, &V28, &V28, &V28, &V412, &V28, &V28, &V28,
+ &V28, &V412, &V28, &V28, &V412, &V28, &V28, &V28,
+ &V28, &V28, &V414, &V43, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[221]
+ {
+ &V28, &V28, &V28, &V28, &V412, &V28, &V412, &V28,
+ &V28, &V28, &V28, &V28, &V400, &V400, &V28, &V400,
+ &V400, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[222]
+ {
+ &V28, &V412, &V28, &V28, &V412, &V28, &V28, &V412,
+ &V28, &V412, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[223]
+ {
+ &V412, &V28, &V412, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V412, &V412, &V412,
+ &V412, &V412, &V28, &V28, &V412, &V412, &V28, &V28,
+ &V412, &V412, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[224]
+ {
+ &V412, &V412, &V28, &V28, &V412, &V412, &V28, &V28,
+ &V412, &V412, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[225]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V412, &V412, &V412, &V412,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[226]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[227]
+ {
+ &V412, &V412, &V412, &V412, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V412, &V412, &V412, &V412, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[228]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V12, &V13, &V12, &V13, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[229]
+ {
+ &V28, &V28, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V415, &V416, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[230]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[231]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V37, &V28, &V37, &V37, &V37,
+ }, // P[232]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V184, &V37, &V37,
+ &V37, &V37, &V37, &V28, &V28, &V28, &V28, &V28,
+ }, // P[233]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[234]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V28, &V28, &V28, &V28,
+ }, // P[235]
+ {
+ &V28, &V28, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151,
+ }, // P[236]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[237]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[238]
+ {
+ &V417, &V418, &V419, &V420, &V421, &V422, &V423, &V424,
+ &V425, &V50, &V50, &V50, &V50, &V50, &V50, &V50,
+ &V50, &V50, &V50, &V50, &V417, &V418, &V419, &V420,
+ &V421, &V422, &V423, &V424, &V425, &V50, &V50, &V50,
+ }, // P[239]
+ {
+ &V50, &V50, &V50, &V50, &V50, &V50, &V50, &V50,
+ &V48, &V44, &V45, &V392, &V393, &V394, &V395, &V396,
+ &V397, &V426, &V426, &V426, &V426, &V426, &V426, &V426,
+ &V426, &V426, &V426, &V426, &V427, &V427, &V427, &V427,
+ }, // P[240]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V428, &V428,
+ &V428, &V428, &V428, &V428, &V428, &V428, &V428, &V428,
+ }, // P[241]
+ {
+ &V428, &V428, &V428, &V428, &V428, &V428, &V428, &V428,
+ &V428, &V428, &V428, &V428, &V428, &V428, &V428, &V428,
+ &V429, &V429, &V429, &V429, &V429, &V429, &V429, &V429,
+ &V429, &V429, &V429, &V429, &V429, &V429, &V429, &V429,
+ }, // P[242]
+ {
+ &V429, &V429, &V429, &V429, &V429, &V429, &V429, &V429,
+ &V429, &V429, &V430, &V291, &V291, &V291, &V291, &V291,
+ &V291, &V291, &V291, &V291, &V291, &V431, &V432, &V433,
+ &V434, &V435, &V436, &V437, &V438, &V439, &V291, &V440,
+ }, // P[243]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V28,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[244]
+ {
+ &V37, &V28, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[245]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[246]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V28,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[247]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V184, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[248]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V12, &V13, &V12, &V13, &V12, &V13, &V382, &V441,
+ &V12, &V13, &V12, &V13, &V12, &V13, &V431, &V432,
+ &V433, &V434, &V435, &V436, &V437, &V438, &V439, &V291,
+ }, // P[249]
+ {
+ &V431, &V432, &V433, &V434, &V435, &V436, &V437, &V438,
+ &V439, &V291, &V431, &V432, &V433, &V434, &V435, &V436,
+ &V437, &V438, &V439, &V291, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[250]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V12, &V13, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[251]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V28, &V12, &V13,
+ &V12, &V13, &V12, &V13, &V12, &V13, &V12, &V13,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[252]
+ {
+ &V28, &V28, &V28, &V12, &V13, &V12, &V13, &V12,
+ &V13, &V12, &V13, &V12, &V13, &V12, &V13, &V12,
+ &V13, &V12, &V13, &V12, &V13, &V12, &V13, &V12,
+ &V13, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[253]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V12, &V13, &V12, &V13, &V28, &V28, &V28, &V28,
+ }, // P[254]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V12, &V13, &V28, &V28,
+ }, // P[255]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V400, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[256]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V400, &V400, &V400, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[257]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V442, &V28, &V28, &V28,
+ }, // P[258]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28,
+ }, // P[259]
+ {
+ &V28, &V28, &V28, &V28, &V28, &V37, &V37, &V28,
+ &V28, &V28, &V28, &V28, &V28, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[260]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V151, &V151, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[261]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V151, &V151,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[262]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V151, &V151, &V151, &V37, &V37, &V37,
+ }, // P[263]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V151, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[264]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V37, &V37, &V37, &V37,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[265]
+ {
+ &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188,
+ &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188,
+ &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188,
+ &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188,
+ }, // P[266]
+ {
+ &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188,
+ &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V151,
+ &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190,
+ &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190,
+ }, // P[267]
+ {
+ &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190,
+ &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190,
+ &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190,
+ &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V151,
+ }, // P[268]
+ {
+ &V57, &V58, &V443, &V444, &V445, &V446, &V447, &V57,
+ &V58, &V57, &V58, &V57, &V58, &V448, &V449, &V450,
+ &V451, &V52, &V57, &V58, &V52, &V57, &V58, &V52,
+ &V52, &V52, &V52, &V52, &V130, &V130, &V452, &V452,
+ }, // P[269]
+ {
+ &V57, &V58, &V57, &V58, &V52, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V57, &V58, &V57, &V58, &V136,
+ &V136, &V136, &V57, &V58, &V151, &V151, &V151, &V151,
+ &V151, &V6, &V6, &V6, &V10, &V291, &V6, &V10,
+ }, // P[270]
+ {
+ &V453, &V453, &V453, &V453, &V453, &V453, &V453, &V453,
+ &V453, &V453, &V453, &V453, &V453, &V453, &V453, &V453,
+ &V453, &V453, &V453, &V453, &V453, &V453, &V453, &V453,
+ &V453, &V453, &V453, &V453, &V453, &V453, &V453, &V453,
+ }, // P[271]
+ {
+ &V453, &V453, &V453, &V453, &V453, &V453, &V151, &V453,
+ &V151, &V151, &V151, &V151, &V151, &V453, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[272]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V130,
+ &V189, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V271,
+ }, // P[273]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[274]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ }, // P[275]
+ {
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ }, // P[276]
+ {
+ &V10, &V10, &V40, &V49, &V40, &V49, &V10, &V10,
+ &V10, &V40, &V49, &V10, &V40, &V49, &V10, &V10,
+ &V10, &V10, &V10, &V10, &V10, &V10, &V10, &V192,
+ &V10, &V10, &V192, &V10, &V40, &V49, &V10, &V10,
+ }, // P[277]
+ {
+ &V40, &V49, &V12, &V13, &V12, &V13, &V12, &V13,
+ &V12, &V13, &V10, &V10, &V10, &V10, &V6, &V133,
+ &V10, &V47, &V6, &V10, &V6, &V6, &V10, &V10,
+ &V10, &V10, &V377, &V377, &V6, &V10, &V10, &V10,
+ }, // P[278]
+ {
+ &V192, &V6, &V382, &V10, &V10, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[279]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V151, &V37, &V37, &V37, &V37, &V404,
+ }, // P[280]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V404, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[281]
+ {
+ &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404,
+ &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404,
+ &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404,
+ &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404,
+ }, // P[282]
+ {
+ &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404,
+ &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404,
+ &V404, &V404, &V404, &V404, &V404, &V404, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[283]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151,
+ }, // P[284]
+ {
+ &V371, &V6, &V6, &V10, &V37, &V134, &V454, &V455,
+ &V12, &V13, &V12, &V13, &V382, &V441, &V382, &V441,
+ &V12, &V13, &V37, &V37, &V12, &V13, &V12, &V13,
+ &V12, &V13, &V12, &V13, &V377, &V382, &V441, &V441,
+ }, // P[285]
+ {
+ &V37, &V455, &V455, &V455, &V455, &V455, &V455, &V455,
+ &V455, &V455, &V456, &V194, &V137, &V193, &V457, &V457,
+ &V377, &V134, &V134, &V134, &V134, &V134, &V404, &V37,
+ &V458, &V458, &V458, &V134, &V84, &V10, &V37, &V37,
+ }, // P[286]
+ {
+ &V151, &V459, &V459, &V459, &V459, &V459, &V459, &V459,
+ &V459, &V459, &V459, &V459, &V460, &V459, &V460, &V459,
+ &V460, &V459, &V460, &V459, &V460, &V459, &V460, &V459,
+ &V460, &V459, &V460, &V459, &V460, &V459, &V460, &V459,
+ }, // P[287]
+ {
+ &V460, &V459, &V460, &V459, &V459, &V460, &V459, &V460,
+ &V459, &V460, &V459, &V459, &V459, &V459, &V459, &V459,
+ &V460, &V460, &V459, &V460, &V460, &V459, &V460, &V460,
+ &V459, &V460, &V460, &V459, &V460, &V460, &V459, &V459,
+ }, // P[288]
+ {
+ &V459, &V459, &V459, &V459, &V459, &V459, &V459, &V459,
+ &V459, &V459, &V459, &V459, &V459, &V459, &V459, &V459,
+ &V459, &V459, &V459, &V459, &V460, &V459, &V459, &V151,
+ &V151, &V461, &V461, &V38, &V38, &V134, &V462, &V463,
+ }, // P[289]
+ {
+ &V192, &V464, &V464, &V464, &V464, &V464, &V464, &V464,
+ &V464, &V464, &V464, &V464, &V465, &V464, &V465, &V464,
+ &V465, &V464, &V465, &V464, &V465, &V464, &V465, &V464,
+ &V465, &V464, &V465, &V464, &V465, &V464, &V465, &V464,
+ }, // P[290]
+ {
+ &V465, &V464, &V465, &V464, &V464, &V465, &V464, &V465,
+ &V464, &V465, &V464, &V464, &V464, &V464, &V464, &V464,
+ &V465, &V465, &V464, &V465, &V465, &V464, &V465, &V465,
+ &V464, &V465, &V465, &V464, &V465, &V465, &V464, &V464,
+ }, // P[291]
+ {
+ &V464, &V464, &V464, &V464, &V464, &V464, &V464, &V464,
+ &V464, &V464, &V464, &V464, &V464, &V464, &V464, &V464,
+ &V464, &V464, &V464, &V464, &V465, &V464, &V464, &V465,
+ &V465, &V465, &V465, &V466, &V134, &V134, &V462, &V467,
+ }, // P[292]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[293]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151,
+ &V151, &V39, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39,
+ }, // P[294]
+ {
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39,
+ }, // P[295]
+ {
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V151,
+ &V184, &V184, &V468, &V468, &V468, &V468, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ }, // P[296]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V151, &V151, &V151, &V151, &V151,
+ }, // P[297]
+ {
+ &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V464, &V464, &V464, &V464, &V464, &V464, &V464, &V464,
+ &V464, &V464, &V464, &V464, &V464, &V464, &V464, &V464,
+ }, // P[298]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V404, &V404, &V151,
+ }, // P[299]
+ {
+ &V468, &V468, &V468, &V468, &V468, &V468, &V468, &V468,
+ &V468, &V468, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ }, // P[300]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V404, &V50, &V50, &V50, &V50, &V50, &V50, &V50,
+ &V50, &V50, &V50, &V50, &V50, &V50, &V50, &V50,
+ }, // P[301]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V404, &V404, &V404, &V184,
+ }, // P[302]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V50, &V50, &V50, &V50, &V50, &V50, &V50,
+ &V50, &V50, &V50, &V50, &V50, &V50, &V50, &V50,
+ }, // P[303]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V404, &V404, &V404, &V404,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ }, // P[304]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V151,
+ }, // P[305]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ }, // P[306]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V404,
+ &V404, &V404, &V404, &V427, &V427, &V427, &V427, &V427,
+ }, // P[307]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V404, &V404,
+ }, // P[308]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V404,
+ }, // P[309]
+ {
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ }, // P[310]
+ {
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[311]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V134, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[312]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V151,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[313]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[314]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V132, &V132, &V132, &V132, &V132, &V132, &V191, &V191,
+ }, // P[315]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V134, &V6, &V6, &V6,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[316]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V84, &V84, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[317]
+ {
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V84, &V136,
+ &V185, &V185, &V185, &V10, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V10, &V133,
+ }, // P[318]
+ {
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V130, &V130, &V136, &V136,
+ }, // P[319]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V321, &V321,
+ &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321,
+ &V136, &V136, &V189, &V191, &V191, &V191, &V191, &V191,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[320]
+ {
+ &V31, &V31, &V31, &V31, &V31, &V31, &V31, &V31,
+ &V31, &V31, &V31, &V31, &V31, &V31, &V31, &V31,
+ &V31, &V31, &V31, &V31, &V31, &V31, &V31, &V131,
+ &V131, &V131, &V131, &V131, &V131, &V131, &V131, &V131,
+ }, // P[321]
+ {
+ &V31, &V31, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V52, &V52, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ }, // P[322]
+ {
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V130, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V57, &V58, &V57, &V58, &V469, &V57, &V58,
+ }, // P[323]
+ {
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V131, &V470, &V470, &V57, &V58, &V471, &V52, &V84,
+ &V57, &V58, &V57, &V58, &V52, &V52, &V57, &V58,
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ }, // P[324]
+ {
+ &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58,
+ &V57, &V58, &V472, &V473, &V474, &V475, &V472, &V151,
+ &V476, &V477, &V478, &V479, &V57, &V58, &V57, &V58,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[325]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V84,
+ &V130, &V130, &V52, &V84, &V84, &V84, &V84, &V84,
+ }, // P[326]
+ {
+ &V84, &V84, &V147, &V84, &V84, &V84, &V271, &V84,
+ &V84, &V84, &V84, &V147, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[327]
+ {
+ &V84, &V84, &V84, &V268, &V268, &V147, &V147, &V268,
+ &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151,
+ &V286, &V286, &V286, &V286, &V286, &V286, &V184, &V184,
+ &V9, &V42, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[328]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V10, &V10, &V10, &V10,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[329]
+ {
+ &V268, &V268, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[330]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V268, &V268, &V268, &V268,
+ &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V268,
+ }, // P[331]
+ {
+ &V268, &V268, &V268, &V268, &V271, &V147, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V191, &V191,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[332]
+ {
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V189, &V189, &V189, &V84, &V189, &V84, &V151, &V151,
+ }, // P[333]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[334]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V147, &V147,
+ &V147, &V147, &V147, &V138, &V138, &V138, &V189, &V189,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[335]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V268, &V322, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V189,
+ }, // P[336]
+ {
+ &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306,
+ &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306,
+ &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306,
+ &V306, &V306, &V306, &V306, &V306, &V151, &V151, &V151,
+ }, // P[337]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V283, &V268, &V268, &V147, &V147,
+ &V147, &V147, &V268, &V268, &V147, &V268, &V268, &V268,
+ }, // P[338]
+ {
+ &V322, &V189, &V189, &V189, &V189, &V189, &V189, &V189,
+ &V189, &V189, &V189, &V189, &V189, &V189, &V151, &V134,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V189, &V189,
+ }, // P[339]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V147, &V132, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V84, &V84, &V84, &V84, &V84, &V151,
+ }, // P[340]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V147, &V147, &V147, &V147, &V147, &V147, &V268,
+ &V268, &V147, &V147, &V268, &V268, &V147, &V147, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[341]
+ {
+ &V84, &V84, &V84, &V147, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V147, &V268, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V189, &V191, &V191, &V191,
+ }, // P[342]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V132, &V84, &V84, &V84, &V84, &V84, &V84, &V184,
+ &V184, &V184, &V84, &V268, &V147, &V268, &V84, &V84,
+ }, // P[343]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V136, &V84, &V136, &V136, &V138, &V84, &V84, &V136,
+ &V136, &V84, &V84, &V84, &V84, &V84, &V136, &V136,
+ }, // P[344]
+ {
+ &V84, &V136, &V84, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V84, &V84, &V134, &V189, &V189,
+ }, // P[345]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V268, &V147, &V147, &V268, &V268,
+ &V189, &V189, &V84, &V134, &V134, &V268, &V271, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[346]
+ {
+ &V151, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V151, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V151, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[347]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ }, // P[348]
+ {
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V480, &V52, &V52, &V52, &V52,
+ &V52, &V52, &V52, &V470, &V130, &V130, &V130, &V130,
+ }, // P[349]
+ {
+ &V52, &V52, &V52, &V52, &V52, &V52, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481,
+ &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481,
+ }, // P[350]
+ {
+ &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481,
+ &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481,
+ &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481,
+ &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481,
+ }, // P[351]
+ {
+ &V84, &V84, &V84, &V268, &V268, &V147, &V268, &V268,
+ &V147, &V268, &V268, &V189, &V268, &V271, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[352]
+ {
+ &V269, &V269, &V269, &V269, &V269, &V269, &V269, &V269,
+ &V269, &V269, &V269, &V269, &V269, &V269, &V269, &V269,
+ &V269, &V269, &V269, &V269, &V269, &V269, &V269, &V269,
+ &V269, &V269, &V269, &V269, &V269, &V269, &V269, &V269,
+ }, // P[353]
+ {
+ &V269, &V269, &V269, &V269, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307,
+ &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307,
+ }, // P[354]
+ {
+ &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V151,
+ &V151, &V151, &V151, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ }, // P[355]
+ {
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310,
+ &V310, &V310, &V310, &V310, &V151, &V151, &V151, &V151,
+ }, // P[356]
+ {
+ &V482, &V482, &V482, &V482, &V482, &V482, &V482, &V482,
+ &V482, &V482, &V482, &V482, &V482, &V482, &V482, &V482,
+ &V482, &V482, &V482, &V482, &V482, &V482, &V482, &V482,
+ &V482, &V482, &V482, &V482, &V482, &V482, &V482, &V482,
+ }, // P[357]
+ {
+ &V483, &V483, &V483, &V483, &V483, &V483, &V483, &V483,
+ &V483, &V483, &V483, &V483, &V483, &V483, &V483, &V483,
+ &V483, &V483, &V483, &V483, &V483, &V483, &V483, &V483,
+ &V483, &V483, &V483, &V483, &V483, &V483, &V483, &V483,
+ }, // P[358]
+ {
+ &V484, &V484, &V484, &V484, &V484, &V484, &V484, &V484,
+ &V484, &V484, &V484, &V484, &V484, &V484, &V484, &V484,
+ &V484, &V484, &V484, &V484, &V484, &V484, &V484, &V484,
+ &V484, &V484, &V484, &V484, &V484, &V484, &V484, &V484,
+ }, // P[359]
+ {
+ &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485,
+ &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485,
+ &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485,
+ &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485,
+ }, // P[360]
+ {
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ }, // P[361]
+ {
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V454, &V454,
+ &V486, &V454, &V486, &V454, &V454, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V454,
+ }, // P[362]
+ {
+ &V486, &V454, &V486, &V454, &V454, &V486, &V486, &V454,
+ &V454, &V454, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ }, // P[363]
+ {
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V151, &V151,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ }, // P[364]
+ {
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[365]
+ {
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V63, &V63, &V63, &V63, &V63,
+ &V151, &V151, &V151, &V151, &V151, &V487, &V488, &V487,
+ }, // P[366]
+ {
+ &V489, &V489, &V489, &V489, &V489, &V489, &V489, &V489,
+ &V489, &V398, &V487, &V487, &V487, &V487, &V487, &V487,
+ &V487, &V487, &V487, &V487, &V487, &V487, &V487, &V151,
+ &V487, &V487, &V487, &V487, &V487, &V151, &V487, &V151,
+ }, // P[367]
+ {
+ &V487, &V487, &V151, &V487, &V487, &V151, &V487, &V487,
+ &V487, &V487, &V487, &V487, &V487, &V487, &V487, &V489,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ }, // P[368]
+ {
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ }, // P[369]
+ {
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V490, &V490, &V490, &V490, &V490, &V490,
+ &V490, &V490, &V490, &V490, &V490, &V490, &V490, &V490,
+ }, // P[370]
+ {
+ &V490, &V490, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ }, // P[371]
+ {
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V13, &V12,
+ }, // P[372]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ }, // P[373]
+ {
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V151, &V151, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ }, // P[374]
+ {
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[375]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V491, &V37, &V151, &V151,
+ }, // P[376]
+ {
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V383, &V383, &V383, &V383, &V383, &V383, &V383, &V401,
+ &V402, &V383, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[377]
+ {
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V138,
+ &V138, &V138, &V138, &V138, &V138, &V138, &V136, &V136,
+ &V378, &V492, &V492, &V493, &V493, &V401, &V402, &V401,
+ &V402, &V401, &V402, &V401, &V402, &V401, &V402, &V401,
+ }, // P[378]
+ {
+ &V402, &V494, &V495, &V494, &V495, &V10, &V10, &V401,
+ &V402, &V378, &V378, &V378, &V378, &V493, &V493, &V493,
+ &V496, &V383, &V496, &V151, &V383, &V496, &V383, &V383,
+ &V492, &V401, &V402, &V401, &V402, &V401, &V402, &V497,
+ }, // P[379]
+ {
+ &V378, &V378, &V398, &V498, &V400, &V400, &V400, &V151,
+ &V378, &V403, &V497, &V378, &V151, &V151, &V151, &V151,
+ &V242, &V242, &V242, &V222, &V242, &V151, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ }, // P[380]
+ {
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V151, &V151, &V499,
+ }, // P[381]
+ {
+ &V151, &V383, &V389, &V497, &V403, &V497, &V378, &V500,
+ &V401, &V402, &V378, &V398, &V496, &V498, &V496, &V501,
+ &V502, &V503, &V504, &V505, &V506, &V507, &V508, &V509,
+ &V510, &V511, &V496, &V383, &V400, &V400, &V400, &V383,
+ }, // P[382]
+ {
+ &V378, &V512, &V512, &V512, &V512, &V512, &V512, &V512,
+ &V512, &V512, &V512, &V512, &V512, &V512, &V512, &V512,
+ &V512, &V512, &V512, &V512, &V512, &V512, &V512, &V512,
+ &V512, &V512, &V512, &V401, &V378, &V402, &V38, &V493,
+ }, // P[383]
+ {
+ &V38, &V513, &V513, &V513, &V513, &V513, &V513, &V513,
+ &V513, &V513, &V513, &V513, &V513, &V513, &V513, &V513,
+ &V513, &V513, &V513, &V513, &V513, &V513, &V513, &V513,
+ &V513, &V513, &V513, &V401, &V400, &V402, &V400, &V401,
+ }, // P[384]
+ {
+ &V402, &V383, &V494, &V495, &V383, &V514, &V467, &V467,
+ &V467, &V467, &V467, &V467, &V467, &V467, &V467, &V467,
+ &V152, &V467, &V467, &V467, &V467, &V467, &V467, &V467,
+ &V467, &V467, &V467, &V467, &V467, &V467, &V467, &V467,
+ }, // P[385]
+ {
+ &V467, &V467, &V467, &V467, &V467, &V467, &V467, &V467,
+ &V467, &V467, &V467, &V467, &V467, &V467, &V467, &V467,
+ &V467, &V467, &V467, &V467, &V467, &V467, &V467, &V467,
+ &V467, &V467, &V467, &V467, &V467, &V467, &V152, &V152,
+ }, // P[386]
+ {
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V151,
+ }, // P[387]
+ {
+ &V151, &V151, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V151, &V151, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V151, &V151, &V39, &V39, &V39, &V39, &V39, &V39,
+ &V151, &V151, &V39, &V39, &V39, &V151, &V151, &V151,
+ }, // P[388]
+ {
+ &V403, &V403, &V400, &V38, &V404, &V403, &V403, &V151,
+ &V404, &V400, &V400, &V400, &V400, &V404, &V404, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V515, &V515, &V515, &V37, &V37, &V151, &V151,
+ }, // P[389]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[390]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V151, &V84, &V84, &V151, &V84,
+ }, // P[391]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151,
+ }, // P[392]
+ {
+ &V189, &V10, &V189, &V151, &V151, &V151, &V151, &V286,
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ }, // P[393]
+ {
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V286, &V151, &V151, &V151, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[394]
+ {
+ &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516,
+ &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516,
+ &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516,
+ &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516,
+ }, // P[395]
+ {
+ &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516,
+ &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516,
+ &V516, &V516, &V516, &V516, &V516, &V291, &V291, &V291,
+ &V291, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[396]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V291, &V291, &V37, &V184, &V184, &V151,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151,
+ }, // P[397]
+ {
+ &V37, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[398]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[399]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V138, &V151, &V151,
+ }, // P[400]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V151,
+ }, // P[401]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[402]
+ {
+ &V138, &V517, &V517, &V517, &V517, &V517, &V517, &V517,
+ &V517, &V517, &V517, &V517, &V517, &V517, &V517, &V517,
+ &V517, &V517, &V517, &V517, &V517, &V517, &V517, &V517,
+ &V517, &V517, &V517, &V517, &V151, &V151, &V151, &V151,
+ }, // P[403]
+ {
+ &V286, &V286, &V286, &V286, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[404]
+ {
+ &V84, &V321, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V321, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[405]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V136, &V136,
+ &V136, &V136, &V136, &V151, &V151, &V151, &V151, &V151,
+ }, // P[406]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V189,
+ }, // P[407]
+ {
+ &V84, &V84, &V84, &V84, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V189, &V321, &V321, &V321, &V321, &V321, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[408]
+ {
+ &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518,
+ &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518,
+ &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518,
+ &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518,
+ }, // P[409]
+ {
+ &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518,
+ &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519,
+ &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519,
+ &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519,
+ }, // P[410]
+ {
+ &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519,
+ &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[411]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151,
+ }, // P[412]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518,
+ &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518,
+ }, // P[413]
+ {
+ &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518,
+ &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518,
+ &V518, &V518, &V518, &V518, &V151, &V151, &V151, &V151,
+ &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519,
+ }, // P[414]
+ {
+ &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519,
+ &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519,
+ &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519,
+ &V519, &V519, &V519, &V519, &V151, &V151, &V151, &V151,
+ }, // P[415]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[416]
+ {
+ &V84, &V84, &V84, &V84, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V189,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[417]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[418]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V151, &V151,
+ &V213, &V151, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ }, // P[419]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V151, &V213,
+ &V213, &V151, &V151, &V151, &V213, &V151, &V151, &V213,
+ }, // P[420]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V151, &V210,
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ }, // P[421]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V521,
+ &V521, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ }, // P[422]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V151,
+ }, // P[423]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V520,
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[424]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V151, &V213, &V213, &V151, &V151,
+ &V151, &V151, &V151, &V520, &V520, &V520, &V520, &V520,
+ }, // P[425]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V520, &V520,
+ &V520, &V520, &V520, &V520, &V151, &V151, &V151, &V10,
+ }, // P[426]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V151, &V151, &V151, &V151, &V151, &V210,
+ }, // P[427]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ }, // P[428]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V151, &V151, &V151, &V151, &V520, &V520, &V213, &V213,
+ }, // P[429]
+ {
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ &V151, &V151, &V520, &V520, &V520, &V520, &V520, &V520,
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ }, // P[430]
+ {
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ }, // P[431]
+ {
+ &V213, &V147, &V147, &V147, &V151, &V147, &V147, &V151,
+ &V151, &V151, &V151, &V151, &V147, &V138, &V147, &V136,
+ &V213, &V213, &V213, &V213, &V151, &V213, &V213, &V213,
+ &V151, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ }, // P[432]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V151, &V151, &V151, &V151,
+ &V136, &V143, &V138, &V151, &V151, &V151, &V151, &V271,
+ }, // P[433]
+ {
+ &V522, &V523, &V524, &V525, &V520, &V520, &V520, &V520,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V210, &V210, &V210, &V210, &V210, &V210, &V526, &V526,
+ &V210, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[434]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V520, &V520, &V210,
+ }, // P[435]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V520, &V520, &V520,
+ }, // P[436]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V521, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ }, // P[437]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V136, &V138, &V151,
+ &V151, &V151, &V151, &V520, &V520, &V520, &V520, &V520,
+ &V210, &V210, &V210, &V210, &V210, &V210, &V210, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[438]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V151, &V151,
+ &V151, &V10, &V10, &V10, &V10, &V10, &V10, &V10,
+ }, // P[439]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V151, &V151,
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ }, // P[440]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V151, &V151, &V151, &V151, &V151,
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ }, // P[441]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V213, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V210, &V210, &V210, &V210, &V151, &V151, &V151,
+ }, // P[442]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[443]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213,
+ &V213, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[444]
+ {
+ &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527,
+ &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527,
+ &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527,
+ &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527,
+ }, // P[445]
+ {
+ &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527,
+ &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527,
+ &V527, &V527, &V527, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[446]
+ {
+ &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528,
+ &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528,
+ &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528,
+ &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528,
+ }, // P[447]
+ {
+ &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528,
+ &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528,
+ &V528, &V528, &V528, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V520, &V520, &V520, &V520, &V520, &V520,
+ }, // P[448]
+ {
+ &V529, &V530, &V531, &V532, &V533, &V534, &V535, &V536,
+ &V537, &V538, &V538, &V538, &V538, &V538, &V538, &V538,
+ &V538, &V538, &V538, &V538, &V538, &V538, &V538, &V538,
+ &V538, &V538, &V538, &V538, &V538, &V538, &V538, &V151,
+ }, // P[449]
+ {
+ &V268, &V147, &V268, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[450]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ }, // P[451]
+ {
+ &V147, &V147, &V147, &V147, &V147, &V147, &V271, &V191,
+ &V191, &V189, &V189, &V189, &V189, &V189, &V151, &V151,
+ &V151, &V151, &V431, &V432, &V433, &V434, &V435, &V436,
+ &V437, &V438, &V439, &V291, &V291, &V291, &V291, &V291,
+ }, // P[452]
+ {
+ &V291, &V291, &V291, &V291, &V291, &V291, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V271,
+ }, // P[453]
+ {
+ &V147, &V147, &V268, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V269, &V84, &V269, &V84, &V84, &V84,
+ }, // P[454]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V269, &V84, &V84, &V84, &V84,
+ &V268, &V268, &V268, &V147, &V147, &V147, &V147, &V268,
+ &V268, &V271, &V270, &V189, &V189, &V539, &V189, &V189,
+ }, // P[455]
+ {
+ &V191, &V191, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[456]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[457]
+ {
+ &V136, &V136, &V136, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[458]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V287,
+ &V147, &V147, &V147, &V147, &V268, &V147, &V288, &V288,
+ &V147, &V147, &V147, &V271, &V271, &V151, &V273, &V274,
+ &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282,
+ }, // P[459]
+ {
+ &V189, &V191, &V191, &V191, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[460]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V283, &V189, &V189, &V84, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[461]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V268, &V268, &V268, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V268,
+ }, // P[462]
+ {
+ &V322, &V84, &V84, &V84, &V84, &V191, &V191, &V189,
+ &V189, &V189, &V283, &V147, &V147, &V189, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V84, &V189, &V84, &V189, &V189, &V189,
+ }, // P[463]
+ {
+ &V151, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V286, &V286, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[464]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[465]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V268, &V268, &V268, &V147,
+ &V147, &V147, &V268, &V268, &V147, &V322, &V283, &V147,
+ &V191, &V191, &V189, &V189, &V189, &V189, &V147, &V151,
+ }, // P[466]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V84,
+ }, // P[467]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V189, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[468]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V147,
+ }, // P[469]
+ {
+ &V268, &V268, &V268, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V283, &V271, &V151, &V151, &V151, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[470]
+ {
+ &V147, &V147, &V268, &V268, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V84,
+ &V84, &V151, &V151, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[471]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V151, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V283, &V84, &V284, &V268,
+ }, // P[472]
+ {
+ &V147, &V268, &V268, &V268, &V268, &V151, &V151, &V268,
+ &V268, &V151, &V151, &V285, &V285, &V322, &V151, &V151,
+ &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V284,
+ &V151, &V151, &V151, &V151, &V151, &V84, &V84, &V84,
+ }, // P[473]
+ {
+ &V84, &V84, &V268, &V268, &V151, &V151, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V151, &V151, &V151,
+ &V136, &V136, &V136, &V136, &V136, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[474]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V268, &V268, &V268,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ }, // P[475]
+ {
+ &V268, &V268, &V271, &V147, &V147, &V268, &V283, &V84,
+ &V84, &V84, &V84, &V191, &V191, &V191, &V189, &V189,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V189, &V151, &V189, &V151, &V151,
+ }, // P[476]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V284, &V268, &V268, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V268, &V287, &V285, &V285, &V284, &V285, &V147,
+ }, // P[477]
+ {
+ &V147, &V268, &V271, &V283, &V84, &V84, &V189, &V84,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[478]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V284,
+ &V268, &V268, &V147, &V147, &V147, &V147, &V151, &V151,
+ &V268, &V268, &V285, &V285, &V147, &V147, &V268, &V271,
+ }, // P[479]
+ {
+ &V283, &V189, &V191, &V191, &V189, &V189, &V189, &V189,
+ &V189, &V189, &V189, &V189, &V189, &V189, &V189, &V189,
+ &V189, &V189, &V189, &V189, &V189, &V189, &V189, &V189,
+ &V84, &V84, &V84, &V84, &V147, &V147, &V151, &V151,
+ }, // P[480]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V268, &V268, &V268, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V268, &V268, &V147, &V268, &V271,
+ }, // P[481]
+ {
+ &V147, &V191, &V191, &V189, &V84, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[482]
+ {
+ &V10, &V10, &V10, &V10, &V10, &V10, &V10, &V10,
+ &V10, &V10, &V10, &V10, &V10, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[483]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V147, &V268, &V147, &V268, &V268,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V322, &V283,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[484]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[485]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V151, &V147, &V147, &V147,
+ }, // P[486]
+ {
+ &V268, &V268, &V147, &V147, &V147, &V147, &V268, &V147,
+ &V147, &V147, &V147, &V271, &V151, &V151, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V286, &V286, &V189, &V189, &V189, &V184,
+ }, // P[487]
+ {
+ &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30,
+ }, // P[488]
+ {
+ &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34,
+ }, // P[489]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V84,
+ }, // P[490]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[491]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[492]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V268,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V151,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V268, &V540,
+ }, // P[493]
+ {
+ &V84, &V191, &V191, &V189, &V189, &V189, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V286, &V286, &V286, &V286, &V286, &V286,
+ }, // P[494]
+ {
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V286, &V286, &V151, &V151, &V151,
+ &V189, &V189, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[495]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V151, &V151, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ }, // P[496]
+ {
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V151, &V268, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V268, &V147, &V147, &V268, &V147, &V147, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[497]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[498]
+ {
+ &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321,
+ &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321,
+ &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321,
+ &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321,
+ }, // P[499]
+ {
+ &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321,
+ &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V151,
+ &V189, &V191, &V191, &V189, &V189, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[500]
+ {
+ &V84, &V84, &V84, &V84, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[501]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[502]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[503]
+ {
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V151, &V151, &V151, &V191, &V191,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[504]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ }, // P[505]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151,
+ &V143, &V143, &V143, &V143, &V143, &V191, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[506]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V189,
+ &V189, &V189, &V189, &V189, &V184, &V184, &V184, &V184,
+ }, // P[507]
+ {
+ &V134, &V134, &V134, &V134, &V189, &V184, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280,
+ &V281, &V282, &V151, &V286, &V286, &V286, &V286, &V286,
+ }, // P[508]
+ {
+ &V286, &V286, &V151, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V151, &V151, &V151, &V151, &V151, &V84, &V84, &V84,
+ }, // P[509]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[510]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V268, &V268, &V268, &V268, &V268, &V268, &V268,
+ &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V268,
+ }, // P[511]
+ {
+ &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V268,
+ &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V268,
+ &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V268,
+ &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V151,
+ }, // P[512]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V147,
+ &V147, &V147, &V147, &V132, &V132, &V132, &V132, &V132,
+ &V132, &V132, &V132, &V132, &V132, &V132, &V132, &V132,
+ }, // P[513]
+ {
+ &V134, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[514]
+ {
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[515]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[516]
+ {
+ &V464, &V459, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[517]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V151,
+ }, // P[518]
+ {
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84,
+ &V84, &V84, &V151, &V151, &V184, &V147, &V143, &V191,
+ }, // P[519]
+ {
+ &V41, &V41, &V41, &V41, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[520]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[521]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V151,
+ &V151, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[522]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V541, &V541,
+ }, // P[523]
+ {
+ &V541, &V541, &V541, &V541, &V541, &V542, &V542, &V143,
+ &V143, &V143, &V184, &V184, &V184, &V543, &V542, &V542,
+ &V542, &V542, &V542, &V41, &V41, &V41, &V41, &V41,
+ &V41, &V41, &V41, &V138, &V138, &V138, &V138, &V138,
+ }, // P[524]
+ {
+ &V138, &V138, &V138, &V184, &V184, &V136, &V136, &V136,
+ &V136, &V136, &V138, &V138, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[525]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V136, &V136, &V136, &V136, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V541, &V541, &V541, &V541, &V541,
+ }, // P[526]
+ {
+ &V541, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[527]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[528]
+ {
+ &V37, &V37, &V136, &V136, &V136, &V37, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[529]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[530]
+ {
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286,
+ &V286, &V286, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[531]
+ {
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V63, &V63, &V63, &V63, &V63, &V63,
+ }, // P[532]
+ {
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ }, // P[533]
+ {
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V151, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ }, // P[534]
+ {
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ }, // P[535]
+ {
+ &V168, &V168, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V168, &V151, &V168, &V168,
+ }, // P[536]
+ {
+ &V151, &V151, &V168, &V151, &V151, &V168, &V168, &V151,
+ &V151, &V168, &V168, &V168, &V168, &V151, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V63, &V63,
+ &V63, &V63, &V151, &V63, &V151, &V63, &V63, &V63,
+ }, // P[537]
+ {
+ &V63, &V63, &V63, &V63, &V151, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ }, // P[538]
+ {
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ }, // P[539]
+ {
+ &V63, &V63, &V63, &V63, &V168, &V168, &V151, &V168,
+ &V168, &V168, &V168, &V151, &V151, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V151, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V151, &V63, &V63,
+ }, // P[540]
+ {
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V168, &V168, &V151, &V168, &V168, &V168, &V168, &V151,
+ }, // P[541]
+ {
+ &V168, &V168, &V168, &V168, &V168, &V151, &V168, &V151,
+ &V151, &V151, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V151, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ }, // P[542]
+ {
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ }, // P[543]
+ {
+ &V168, &V168, &V168, &V168, &V168, &V168, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ }, // P[544]
+ {
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ }, // P[545]
+ {
+ &V168, &V168, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V168, &V168, &V168, &V168,
+ }, // P[546]
+ {
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ }, // P[547]
+ {
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ }, // P[548]
+ {
+ &V63, &V63, &V63, &V63, &V63, &V63, &V151, &V151,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ }, // P[549]
+ {
+ &V168, &V544, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V400, &V63, &V63, &V63, &V63,
+ }, // P[550]
+ {
+ &V63, &V63, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V544, &V63, &V63, &V63, &V63,
+ }, // P[551]
+ {
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V400, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V168, &V168, &V168, &V168,
+ }, // P[552]
+ {
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V544, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ }, // P[553]
+ {
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V400,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ }, // P[554]
+ {
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V544,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ }, // P[555]
+ {
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V400, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ }, // P[556]
+ {
+ &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168,
+ &V168, &V544, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63,
+ }, // P[557]
+ {
+ &V63, &V63, &V63, &V400, &V63, &V63, &V63, &V63,
+ &V63, &V63, &V168, &V63, &V151, &V151, &V502, &V503,
+ &V504, &V505, &V506, &V507, &V508, &V509, &V510, &V511,
+ &V502, &V503, &V504, &V505, &V506, &V507, &V508, &V509,
+ }, // P[558]
+ {
+ &V510, &V511, &V502, &V503, &V504, &V505, &V506, &V507,
+ &V508, &V509, &V510, &V511, &V502, &V503, &V504, &V505,
+ &V506, &V507, &V508, &V509, &V510, &V511, &V502, &V503,
+ &V504, &V505, &V506, &V507, &V508, &V509, &V510, &V511,
+ }, // P[559]
+ {
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ }, // P[560]
+ {
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V184,
+ &V184, &V184, &V184, &V147, &V147, &V147, &V147, &V147,
+ }, // P[561]
+ {
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V147, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[562]
+ {
+ &V184, &V184, &V184, &V184, &V147, &V184, &V184, &V191,
+ &V191, &V191, &V191, &V189, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V147, &V147, &V147, &V147, &V147,
+ }, // P[563]
+ {
+ &V151, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[564]
+ {
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V151,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136,
+ &V136, &V151, &V151, &V136, &V136, &V136, &V136, &V136,
+ }, // P[565]
+ {
+ &V136, &V136, &V151, &V136, &V136, &V151, &V136, &V136,
+ &V136, &V136, &V136, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[566]
+ {
+ &V213, &V213, &V213, &V213, &V213, &V151, &V151, &V520,
+ &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520,
+ &V138, &V138, &V138, &V138, &V138, &V138, &V138, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[567]
+ {
+ &V545, &V545, &V545, &V545, &V545, &V545, &V545, &V545,
+ &V545, &V545, &V545, &V545, &V545, &V545, &V545, &V545,
+ &V545, &V545, &V545, &V545, &V545, &V545, &V545, &V545,
+ &V545, &V545, &V545, &V545, &V545, &V545, &V545, &V545,
+ }, // P[568]
+ {
+ &V545, &V545, &V546, &V546, &V546, &V546, &V546, &V546,
+ &V546, &V546, &V546, &V546, &V546, &V546, &V546, &V546,
+ &V546, &V546, &V546, &V546, &V546, &V546, &V546, &V546,
+ &V546, &V546, &V546, &V546, &V546, &V546, &V546, &V546,
+ }, // P[569]
+ {
+ &V546, &V546, &V546, &V546, &V136, &V136, &V136, &V136,
+ &V136, &V136, &V283, &V151, &V151, &V151, &V151, &V151,
+ &V256, &V257, &V258, &V259, &V260, &V261, &V262, &V263,
+ &V264, &V265, &V151, &V151, &V151, &V151, &V526, &V526,
+ }, // P[570]
+ {
+ &V242, &V242, &V242, &V242, &V151, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ }, // P[571]
+ {
+ &V151, &V242, &V242, &V151, &V242, &V151, &V151, &V242,
+ &V151, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V151, &V242, &V242, &V242, &V242,
+ &V151, &V242, &V151, &V242, &V151, &V151, &V151, &V151,
+ }, // P[572]
+ {
+ &V151, &V151, &V242, &V151, &V151, &V151, &V151, &V242,
+ &V151, &V242, &V151, &V242, &V151, &V242, &V242, &V242,
+ &V151, &V242, &V242, &V151, &V242, &V151, &V151, &V242,
+ &V151, &V242, &V151, &V242, &V151, &V242, &V151, &V242,
+ }, // P[573]
+ {
+ &V151, &V242, &V242, &V151, &V242, &V151, &V151, &V242,
+ &V242, &V242, &V242, &V151, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V151, &V242, &V242, &V242, &V242,
+ &V151, &V242, &V242, &V242, &V242, &V151, &V242, &V151,
+ }, // P[574]
+ {
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V151, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V151, &V151, &V151, &V151,
+ }, // P[575]
+ {
+ &V151, &V242, &V242, &V242, &V151, &V242, &V242, &V242,
+ &V242, &V242, &V151, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242,
+ &V242, &V242, &V242, &V242, &V151, &V151, &V151, &V151,
+ }, // P[576]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V28, &V28, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[577]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[578]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[579]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151,
+ &V151, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[580]
+ {
+ &V151, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V151, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[581]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[582]
+ {
+ &V391, &V391, &V48, &V44, &V45, &V392, &V393, &V394,
+ &V395, &V396, &V397, &V291, &V291, &V151, &V151, &V151,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ }, // P[583]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V151,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ }, // P[584]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[585]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V404, &V404, &V151, &V151, &V151, &V151,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[586]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V427, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[587]
+ {
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[588]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184,
+ }, // P[589]
+ {
+ &V427, &V427, &V427, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ }, // P[590]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V427, &V427, &V427, &V151, &V151, &V151, &V151,
+ }, // P[591]
+ {
+ &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427,
+ &V427, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V427, &V427, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[592]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V31, &V31, &V31, &V31, &V31,
+ }, // P[593]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[594]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V151, &V151, &V151,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[595]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[596]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[597]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ }, // P[598]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[599]
+ {
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151,
+ }, // P[600]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V37, &V151, &V151, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151,
+ }, // P[601]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151,
+ }, // P[602]
+ {
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37,
+ &V37, &V37, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[603]
+ {
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[604]
+ {
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[605]
+ {
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454,
+ &V454, &V454, &V454, &V454, &V454, &V454, &V151, &V151,
+ }, // P[606]
+ {
+ &V454, &V454, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[607]
+ {
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486,
+ &V486, &V486, &V486, &V486, &V486, &V486, &V151, &V151,
+ }, // P[608]
+ {
+ &V151, &V41, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[609]
+ {
+ &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41,
+ &V386, &V386, &V41, &V41, &V41, &V41, &V41, &V41,
+ &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41,
+ &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41,
+ }, // P[610]
+ {
+ &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41,
+ &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41,
+ &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41,
+ &V41, &V41, &V41, &V386, &V41, &V386, &V41, &V41,
+ }, // P[611]
+ {
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151,
+ }, // P[612]
+ {
+ &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485,
+ &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485,
+ &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485,
+ &V485, &V485, &V485, &V485, &V485, &V485, &V151, &V151,
+ }, // P[613]
+ {
+ &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485,
+ &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485,
+ &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485,
+ &V485, &V485, &V485, &V485, &V485, &V485,
+ }, // P[614]
+ }; // static const NUnicode::NPrivate::TUnidataTable::TValuePtr P[][32]
+
+ static const NUnicode::NPrivate::TUnidataTable::TValuePtr* const Indexes[] = {
+ P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7], P[8], P[9], P[10], P[11], P[12], P[13], P[14], P[15],
+ P[16], P[17], P[18], P[19], P[20], P[21], P[22], P[23], P[24], P[25], P[26], P[27], P[28], P[29], P[30], P[31],
+ P[32], P[33], P[34], P[35], P[36], P[37], P[38], P[39], P[37], P[40], P[41], P[42], P[43], P[44], P[45], P[46],
+ P[47], P[48], P[49], P[50], P[51], P[51], P[52], P[53], P[54], P[55], P[56], P[51], P[51], P[57], P[58], P[59],
+ P[60], P[61], P[62], P[63], P[63], P[64], P[65], P[66], P[67], P[68], P[69], P[70], P[71], P[72], P[73], P[74],
+ P[75], P[76], P[77], P[78], P[79], P[80], P[81], P[82], P[83], P[84], P[85], P[86], P[87], P[88], P[89], P[90],
+ P[91], P[92], P[93], P[94], P[95], P[96], P[97], P[98], P[99], P[100], P[101], P[102], P[103], P[104], P[105], P[106],
+ P[107], P[108], P[109], P[63], P[110], P[111], P[112], P[63], P[113], P[114], P[115], P[116], P[117], P[118], P[119], P[63],
+ P[120], P[121], P[122], P[123], P[124], P[125], P[126], P[127], P[128], P[128], P[128], P[129], P[130], P[131], P[132], P[133],
+ P[120], P[120], P[134], P[120], P[135], P[136], P[137], P[120], P[138], P[120], P[139], P[140], P[141], P[142], P[142], P[143],
+ P[144], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120],
+ P[120], P[120], P[120], P[145], P[146], P[120], P[120], P[147], P[148], P[149], P[150], P[151], P[120], P[152], P[153], P[154],
+ P[155], P[120], P[156], P[157], P[158], P[159], P[120], P[160], P[161], P[162], P[163], P[164], P[120], P[165], P[166], P[167],
+ P[168], P[120], P[169], P[170], P[171], P[172], P[63], P[63], P[173], P[174], P[175], P[176], P[177], P[178], P[120], P[179],
+ P[120], P[180], P[181], P[182], P[183], P[63], P[184], P[185], P[186], P[187], P[188], P[189], P[190], P[191], P[192], P[193],
+ P[194], P[194], P[194], P[194], P[195], P[194], P[194], P[196], P[197], P[198], P[199], P[200], P[201], P[202], P[203], P[204],
+ P[205], P[206], P[207], P[208], P[209], P[210], P[211], P[212], P[213], P[214], P[215], P[216], P[217], P[218], P[219], P[220],
+ P[221], P[222], P[223], P[224], P[225], P[226], P[227], P[228], P[229], P[230], P[231], P[232], P[233], P[234], P[235], P[236],
+ P[167], P[237], P[238], P[239], P[240], P[241], P[242], P[243], P[167], P[167], P[167], P[167], P[167], P[244], P[245], P[246],
+ P[167], P[167], P[167], P[247], P[167], P[248], P[167], P[167], P[167], P[167], P[167], P[249], P[250], P[167], P[251], P[252],
+ P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[227], P[227], P[227], P[227], P[253], P[227], P[254], P[255],
+ P[256], P[227], P[227], P[257], P[227], P[227], P[258], P[227], P[167], P[259], P[260], P[261], P[262], P[263], P[264], P[265],
+ P[266], P[267], P[268], P[269], P[37], P[37], P[37], P[270], P[271], P[272], P[120], P[273], P[274], P[275], P[275], P[276],
+ P[277], P[278], P[279], P[63], P[280], P[167], P[167], P[281], P[282], P[282], P[282], P[282], P[282], P[282], P[283], P[284],
+ P[285], P[286], P[287], P[288], P[289], P[290], P[291], P[292], P[293], P[294], P[295], P[295], P[296], P[297], P[167], P[298],
+ P[299], P[300], P[301], P[302], P[300], P[303], P[304], P[305], P[306], P[306], P[306], P[307], P[306], P[306], P[308], P[309],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[311], P[167], P[167],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[311], P[63],
+ P[312], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120],
+ P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120],
+ P[120], P[120], P[120], P[120], P[313], P[167], P[314], P[315], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120],
+ P[316], P[317], P[37], P[318], P[319], P[120], P[120], P[320], P[321], P[322], P[37], P[323], P[324], P[325], P[63], P[326],
+ P[327], P[328], P[120], P[329], P[330], P[331], P[332], P[333], P[334], P[335], P[336], P[337], P[67], P[338], P[339], P[340],
+ P[120], P[341], P[342], P[343], P[120], P[344], P[345], P[346], P[347], P[348], P[349], P[350], P[351], P[351], P[120], P[352],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353],
+ P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[354], P[355], P[356],
+ P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357],
+ P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[358], P[358], P[358], P[358],
+ P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359],
+ P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361],
+ P[362], P[363], P[361], P[364], P[361], P[361], P[365], P[63], P[366], P[367], P[368], P[369], P[369], P[370], P[371], P[369],
+ P[369], P[369], P[369], P[369], P[369], P[369], P[369], P[369], P[369], P[372], P[373], P[369], P[374], P[369], P[375], P[376],
+ P[377], P[378], P[379], P[380], P[369], P[369], P[369], P[381], P[382], P[383], P[384], P[385], P[386], P[387], P[388], P[389],
+ P[390], P[391], P[392], P[63], P[120], P[120], P[120], P[297], P[393], P[394], P[395], P[396], P[397], P[398], P[399], P[400],
+ P[63], P[63], P[63], P[63], P[401], P[120], P[402], P[403], P[120], P[404], P[405], P[406], P[407], P[120], P[408], P[63],
+ P[409], P[410], P[411], P[120], P[412], P[413], P[414], P[415], P[120], P[416], P[120], P[417], P[63], P[63], P[63], P[63],
+ P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[274], P[160], P[418], P[63], P[63], P[63], P[63],
+ P[419], P[420], P[421], P[422], P[423], P[424], P[63], P[425], P[426], P[427], P[63], P[63], P[428], P[429], P[430], P[431],
+ P[432], P[433], P[434], P[435], P[436], P[63], P[437], P[438], P[428], P[439], P[440], P[441], P[442], P[443], P[63], P[63],
+ P[428], P[428], P[444], P[63], P[445], P[446], P[447], P[448], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[449], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[450], P[451], P[452], P[453], P[454], P[455], P[456], P[457], P[458], P[459], P[460], P[461], P[177], P[462], P[463], P[464],
+ P[465], P[466], P[63], P[63], P[467], P[468], P[469], P[470], P[471], P[472], P[473], P[474], P[63], P[63], P[63], P[63],
+ P[120], P[475], P[476], P[63], P[120], P[477], P[478], P[63], P[63], P[63], P[63], P[63], P[120], P[479], P[480], P[63],
+ P[120], P[481], P[482], P[483], P[120], P[484], P[485], P[63], P[486], P[487], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[488], P[489], P[490], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[120], P[491], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[492], P[493], P[494], P[495], P[496], P[497], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120],
+ P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[498], P[63], P[63], P[63],
+ P[499], P[499], P[499], P[500], P[120], P[120], P[120], P[120], P[120], P[120], P[501], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120],
+ P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120],
+ P[120], P[502], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120],
+ P[120], P[120], P[503], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120],
+ P[120], P[491], P[161], P[504], P[63], P[63], P[505], P[506], P[120], P[507], P[508], P[509], P[510], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[120], P[120], P[511], P[512], P[513], P[63], P[63], P[514],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[515],
+ P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120],
+ P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[516], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[517], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[120], P[120], P[120], P[518], P[519], P[520], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[521], P[231], P[522], P[523], P[524], P[525], P[526], P[527], P[528],
+ P[167], P[167], P[529], P[63], P[63], P[63], P[63], P[63], P[167], P[167], P[530], P[531], P[63], P[63], P[63], P[63],
+ P[532], P[533], P[534], P[535], P[536], P[537], P[538], P[539], P[540], P[541], P[542], P[543], P[544], P[532], P[533], P[545],
+ P[535], P[546], P[547], P[548], P[539], P[549], P[550], P[551], P[552], P[553], P[554], P[555], P[556], P[557], P[558], P[559],
+ P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231],
+ P[560], P[561], P[560], P[562], P[563], P[564], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[565], P[566], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[428], P[428], P[428], P[428], P[428], P[428], P[567], P[63], P[568], P[569], P[570], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[571], P[572], P[573], P[574], P[575], P[576], P[63], P[577], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[167], P[578], P[167], P[167], P[579], P[580], P[581], P[582], P[583], P[584], P[585], P[586], P[587], P[588], P[63], P[589],
+ P[590], P[591], P[592], P[63], P[63], P[63], P[63], P[63], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[593],
+ P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167],
+ P[167], P[167], P[167], P[167], P[167], P[167], P[594], P[595], P[167], P[167], P[167], P[579], P[167], P[167], P[596], P[63],
+ P[578], P[167], P[597], P[167], P[598], P[599], P[63], P[63], P[600], P[601], P[602], P[63], P[603], P[63], P[398], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[604], P[63], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[605], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[606], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310],
+ P[310], P[310], P[310], P[310], P[310], P[607], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361],
+ P[608], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[609], P[610], P[611], P[611], P[63], P[63], P[63], P[63], P[560], P[560], P[560], P[560], P[560], P[560], P[560], P[612],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[613],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360],
+ P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[614],
+ }; // static const NUnicode::NPrivate::TUnidataTable::TValuePtr* const Indexes[]
+
+ static const size_t Size = 1114110;
+}} // namespace NUnidataTableGenerated
+
+namespace NUnicode {
+ namespace NPrivate {
+ const NUnicode::NPrivate::TUnidataTable& UnidataTable() {
+ static const NUnicode::NPrivate::TUnidataTable data(NUnidataTableGenerated::Indexes, NUnidataTableGenerated::Size);
+ return data;
+ }
+ } // namespace NPrivate
+} // namespace NUnicode
+namespace NUnicode {
+ namespace NPrivate {
+ const size_t DEFAULT_KEY = 0xE001;
+ static_assert(NUnidataTableGenerated::Size > DEFAULT_KEY, "table size should be greater then default key");
+ }
+}
diff --git a/util/charset/recode_result.cpp b/util/charset/recode_result.cpp
new file mode 100644
index 0000000000..23638027bb
--- /dev/null
+++ b/util/charset/recode_result.cpp
@@ -0,0 +1 @@
+#include "recode_result.h"
diff --git a/util/charset/recode_result.h b/util/charset/recode_result.h
new file mode 100644
index 0000000000..2c7366e7b2
--- /dev/null
+++ b/util/charset/recode_result.h
@@ -0,0 +1,9 @@
+#pragma once
+
+enum RECODE_RESULT {
+ RECODE_OK,
+ RECODE_EOINPUT,
+ RECODE_EOOUTPUT,
+ RECODE_BROKENSYMBOL,
+ RECODE_ERROR,
+};
diff --git a/util/charset/unicode_table.cpp b/util/charset/unicode_table.cpp
new file mode 100644
index 0000000000..574c50d9ec
--- /dev/null
+++ b/util/charset/unicode_table.cpp
@@ -0,0 +1 @@
+#include "unicode_table.h"
diff --git a/util/charset/unicode_table.h b/util/charset/unicode_table.h
new file mode 100644
index 0000000000..9e171b2583
--- /dev/null
+++ b/util/charset/unicode_table.h
@@ -0,0 +1,123 @@
+#pragma once
+
+#include <util/system/yassert.h>
+#include <util/system/defaults.h>
+#include <util/generic/typetraits.h>
+
+namespace NUnicodeTable {
+ template <class Value>
+ struct TValueSelector;
+
+ template <class Value>
+ struct TValueSelector {
+ using TStored = const Value;
+ using TValueRef = const Value&;
+ using TValuePtr = const Value*;
+
+ static inline TValueRef Get(TValuePtr val) {
+ return *val;
+ }
+ };
+
+ template <class Value>
+ struct TValueSelector<const Value*> {
+ using TStored = const Value[];
+ using TValueRef = const Value*;
+ using TValuePtr = const Value*;
+
+ static inline TValueRef Get(TValuePtr val) {
+ return val;
+ }
+ };
+
+ template <class Value>
+ struct TValues {
+ using TSelector = TValueSelector<Value>;
+
+ using TStored = typename TSelector::TStored;
+ using TValueRef = typename TSelector::TValueRef;
+ using TValuePtr = typename TSelector::TValuePtr;
+
+ using TData = const TValuePtr*;
+
+ static inline TValuePtr Get(TData table, size_t index) {
+ static_assert(std::is_pointer<TData>::value, "expect std::is_pointer<TData>::value");
+ return table[index];
+ }
+
+ static inline TValueRef Get(TValuePtr val) {
+ return TSelector::Get(val);
+ }
+ };
+
+ template <int Shift, class TChild>
+ struct TSubtable {
+ using TStored = typename TChild::TStored;
+ using TValueRef = typename TChild::TValueRef;
+ using TValuePtr = typename TChild::TValuePtr;
+ using TData = const typename TChild::TData*;
+
+ static inline TValuePtr Get(TData table, size_t key) {
+ static_assert(std::is_pointer<TData>::value, "expect std::is_pointer<TData>::value");
+ return TChild::Get(table[key >> Shift], key & ((1 << Shift) - 1));
+ }
+
+ static inline TValueRef Get(TValuePtr val) {
+ return TChild::Get(val);
+ }
+ };
+
+ template <class T>
+ class TTable {
+ private:
+ using TImpl = T;
+ using TData = typename TImpl::TData;
+
+ const TData Data;
+ const size_t MSize;
+
+ public:
+ using TStored = typename TImpl::TStored;
+ using TValueRef = typename TImpl::TValueRef;
+ using TValuePtr = typename TImpl::TValuePtr;
+
+ private:
+ inline TValueRef GetImpl(size_t key) const {
+ TValuePtr val = TImpl::Get(Data, key);
+
+ return TImpl::Get(val);
+ }
+
+ inline TValueRef Get(size_t key) const {
+ return GetImpl(key);
+ }
+
+ public:
+ TTable(TData data, size_t size)
+ : Data(data)
+ , MSize(size)
+ {
+ static_assert(std::is_pointer<TData>::value, "expect std::is_pointer<TData>::value");
+ }
+
+ inline TValueRef Get(size_t key, TValueRef value) const {
+ if (key >= Size())
+ return value;
+
+ return GetImpl(key);
+ }
+
+ inline TValueRef Get(size_t key, size_t defaultKey) const {
+ if (key >= Size())
+ return Get(defaultKey);
+
+ return GetImpl(key);
+ }
+
+ inline size_t Size() const {
+ return MSize;
+ }
+ };
+
+ const size_t UNICODE_TABLE_SHIFT = 5;
+}
diff --git a/util/charset/unidata.cpp b/util/charset/unidata.cpp
new file mode 100644
index 0000000000..db4dc126ab
--- /dev/null
+++ b/util/charset/unidata.cpp
@@ -0,0 +1 @@
+#include "unidata.h"
diff --git a/util/charset/unidata.h b/util/charset/unidata.h
new file mode 100644
index 0000000000..400d314186
--- /dev/null
+++ b/util/charset/unidata.h
@@ -0,0 +1,421 @@
+#pragma once
+
+#include "unicode_table.h"
+
+#include <util/system/defaults.h> // wchar32, ui64, ULL()
+
+enum WC_TYPE { // TODO move no NUnicode
+ Lu_UPPER = 1, // 'Ъ'
+ Ll_LOWER = 2, // 'ъ'
+ Lt_TITLE = 3, // 'Ъ'
+ Lm_EXTENDER = 4, // '-'
+ Lm_LETTER = 5, // 'ъ'
+ Lo_OTHER = 6, // '?'
+ Lo_IDEOGRAPH = 7, // '?'
+ Lo_KATAKANA = 8, // '?'
+ Lo_HIRAGANA = 9, // '?'
+ Lo_LEADING = 10, // '?'
+ Lo_VOWEL = 11, // '?'
+ Lo_TRAILING = 12, // '?'
+
+ Mn_NONSPACING = 13, // '`'
+ Me_ENCLOSING = 14, // '`'
+ Mc_SPACING = 15, // '`'
+
+ Nd_DIGIT = 16, // '9' // convert to digit
+ Nl_LETTER = 17, // 'X' // X,V,C,L,I ...
+ Nl_IDEOGRAPH = 18, // '?'
+ No_OTHER = 19, // '9'
+
+ Zs_SPACE = 20, // ' ' [\40\240] SPACE ... NO-BREAK SPACE (00A0)
+ Zs_ZWSPACE = 21, // ' ' // nothing ?
+ Zl_LINE = 22, // '\n'
+ Zp_PARAGRAPH = 23, // '\n'
+
+ Cc_ASCII = 24, // '\x1A' // can not happen
+ Cc_SPACE = 25, // '\x1A' // can not happen
+ Cc_SEPARATOR = 26, // '\x1A' // can not happen
+
+ Cf_FORMAT = 27, // '\x1A' // nothing ?
+ Cf_JOIN = 28, // '\x1A' // nothing ?
+ Cf_BIDI = 29, // '\x1A' // nothing ?
+ Cf_ZWNBSP = 30, // '\x1A' // nothing ?
+
+ Cn_UNASSIGNED = 0, // '?'
+ Co_PRIVATE = 0, // '?'
+ Cs_LOW = 31, // '?'
+ Cs_HIGH = 32, // '?'
+
+ Pd_DASH = 33, // '-'
+ Pd_HYPHEN = 34, // '-' [-] HYPHEN-MINUS
+ Ps_START = 35, // '(' [([{] LEFT PARENTHESIS ... LEFT CURLY BRACKET
+ Ps_QUOTE = 36, // '"'
+ Pe_END = 37, // ')' [)]}] RIGHT PARENTHESIS ... RIGHT CURLY BRACKET
+ Pe_QUOTE = 38, // '"'
+ Pi_QUOTE = 39, // '"'
+ Pf_QUOTE = 40, // '"'
+ Pc_CONNECTOR = 41, // '_' [_] LOW LINE
+ Po_OTHER = 42, // '*' [#%&*/@\] NUMBER SIGN ... REVERSE SOLIDUS
+ Po_QUOTE = 43, // '"' ["] QUOTATION MARK
+ Po_TERMINAL = 44, // '.' [!,.:;?] EXCLAMATION MARK ... QUESTION MARK
+ Po_EXTENDER = 45, // '-' [№] MIDDLE DOT (00B7)
+ Po_HYPHEN = 46, // '-'
+
+ Sm_MATH = 47, // '=' [+<=>|~] PLUS SIGN ... TILDE
+ Sm_MINUS = 48, // '-'
+ Sc_CURRENCY = 49, // '$' [$] DOLLAR SIGN
+ Sk_MODIFIER = 50, // '`' [^`] CIRCUMFLEX ACCENT ... GRAVE ACCENT
+ So_OTHER = 51, // '°' [°] DEGREE SIGN (00B0)
+
+ Ps_SINGLE_QUOTE = 52, // '\'' ['] OPENING SINGLE QUOTE
+ Pe_SINGLE_QUOTE = 53, // '\'' ['] CLOSING SINGLE QUOTE
+ Pi_SINGLE_QUOTE = 54, // '\'' ['] INITIAL SINGLE QUOTE
+ Pf_SINGLE_QUOTE = 55, // '\'' ['] FINAL SINGLE QUOTE
+ Po_SINGLE_QUOTE = 56, // '\'' ['] APOSTROPHE and PRIME
+
+ CCL_NUM = 57,
+ CCL_MASK = 0x3F,
+
+ IS_ASCII_XDIGIT = 1 << 6,
+ IS_DIGIT = 1 << 7,
+ IS_NONBREAK = 1 << 8,
+
+ IS_PRIVATE = 1 << 9,
+
+ IS_COMPAT = 1 << 10,
+ IS_CANON = 1 << 11,
+
+ NFD_QC = 1 << 12,
+ NFC_QC = 1 << 13,
+ NFKD_QC = 1 << 14,
+ NFKC_QC = 1 << 15,
+
+ BIDI_OFFSET = 16,
+ SVAL_OFFSET = 22,
+};
+
+const size_t DEFCHAR_BUF = 58; // CCL_NUM + 1
+
+#define SHIFT(i) (ULL(1) << (i))
+
+namespace NUnicode {
+ using TCombining = ui8;
+
+ namespace NPrivate {
+ struct TProperty {
+ ui32 Info;
+ i32 Lower;
+ i32 Upper;
+ i32 Title;
+ TCombining Combining;
+ };
+
+ extern const size_t DEFAULT_KEY;
+
+ using TUnidataTable = NUnicodeTable::TTable<NUnicodeTable::TSubtable<NUnicodeTable::UNICODE_TABLE_SHIFT, NUnicodeTable::TValues<TProperty>>>;
+ const TUnidataTable& UnidataTable();
+
+ inline const TProperty& CharProperty(wchar32 ch) {
+ return UnidataTable().Get(ch, DEFAULT_KEY);
+ }
+
+ inline ui32 CharInfo(wchar32 ch) {
+ return CharProperty(ch).Info;
+ }
+
+ inline bool IsBidi(wchar32 ch, ui32 type) {
+ return ((NUnicode::NPrivate::CharInfo(ch) >> BIDI_OFFSET) & 15) == type;
+ }
+ }
+
+ inline size_t UnicodeInstancesLimit() {
+ return NPrivate::UnidataTable().Size();
+ }
+
+ inline TCombining DecompositionCombining(wchar32 ch) {
+ return NPrivate::CharProperty(ch).Combining;
+ }
+
+ inline WC_TYPE CharType(wchar32 ch) {
+ return (WC_TYPE)(NUnicode::NPrivate::CharInfo(ch) & CCL_MASK);
+ }
+ inline bool CharHasType(wchar32 ch, ui64 type_bits) {
+ return (SHIFT(NUnicode::CharType(ch)) & type_bits) != 0;
+ }
+}
+
+// all usefull properties
+
+inline bool IsComposed(wchar32 ch) {
+ return NUnicode::NPrivate::CharInfo(ch) & (IS_COMPAT | IS_CANON);
+}
+inline bool IsCanonComposed(wchar32 ch) {
+ return NUnicode::NPrivate::CharInfo(ch) & IS_CANON;
+}
+inline bool IsCompatComposed(wchar32 ch) {
+ return NUnicode::NPrivate::CharInfo(ch) & IS_COMPAT;
+}
+
+inline bool IsWhitespace(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Cc_SPACE) | SHIFT(Zs_SPACE) | SHIFT(Zs_ZWSPACE) | SHIFT(Zl_LINE) | SHIFT(Zp_PARAGRAPH));
+}
+inline bool IsAsciiCntrl(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Cc_ASCII) | SHIFT(Cc_SPACE) | SHIFT(Cc_SEPARATOR));
+}
+inline bool IsBidiCntrl(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Cf_BIDI));
+}
+inline bool IsJoinCntrl(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Cf_JOIN));
+}
+inline bool IsFormatCntrl(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Cf_FORMAT));
+}
+inline bool IsIgnorableCntrl(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Cf_FORMAT) | SHIFT(Cf_JOIN) | SHIFT(Cf_BIDI) | SHIFT(Cf_ZWNBSP));
+}
+inline bool IsCntrl(wchar32 ch) {
+ return NUnicode::CharHasType(ch,
+ SHIFT(Cf_FORMAT) | SHIFT(Cf_JOIN) | SHIFT(Cf_BIDI) | SHIFT(Cf_ZWNBSP) |
+ SHIFT(Cc_ASCII) | SHIFT(Cc_SPACE) | SHIFT(Cc_SEPARATOR));
+}
+inline bool IsZerowidth(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Cf_FORMAT) | SHIFT(Cf_JOIN) | SHIFT(Cf_BIDI) | SHIFT(Cf_ZWNBSP) | SHIFT(Zs_ZWSPACE));
+}
+inline bool IsLineSep(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Zl_LINE));
+}
+inline bool IsParaSep(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Zp_PARAGRAPH));
+}
+inline bool IsDash(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Pd_DASH) | SHIFT(Pd_HYPHEN) | SHIFT(Sm_MINUS));
+}
+inline bool IsHyphen(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Pd_HYPHEN) | SHIFT(Po_HYPHEN));
+}
+inline bool IsQuotation(wchar32 ch) {
+ return NUnicode::CharHasType(ch,
+ SHIFT(Po_QUOTE) | SHIFT(Ps_QUOTE) | SHIFT(Pe_QUOTE) | SHIFT(Pi_QUOTE) |
+ SHIFT(Pf_QUOTE) | SHIFT(Po_SINGLE_QUOTE) | SHIFT(Ps_SINGLE_QUOTE) |
+ SHIFT(Pe_SINGLE_QUOTE) | SHIFT(Pi_SINGLE_QUOTE) | SHIFT(Pf_SINGLE_QUOTE));
+}
+
+inline bool IsSingleQuotation(wchar32 ch) {
+ return NUnicode::CharHasType(ch,
+ SHIFT(Po_SINGLE_QUOTE) | SHIFT(Ps_SINGLE_QUOTE) | SHIFT(Pe_SINGLE_QUOTE) |
+ SHIFT(Pi_SINGLE_QUOTE) | SHIFT(Pf_SINGLE_QUOTE));
+}
+
+inline bool IsTerminal(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Po_TERMINAL));
+}
+inline bool IsPairedPunct(wchar32 ch) {
+ return NUnicode::CharHasType(ch,
+ SHIFT(Ps_START) | SHIFT(Pe_END) | SHIFT(Ps_QUOTE) | SHIFT(Pe_QUOTE) |
+ SHIFT(Pi_QUOTE) | SHIFT(Pf_QUOTE) | SHIFT(Ps_SINGLE_QUOTE) |
+ SHIFT(Pe_SINGLE_QUOTE) | SHIFT(Pi_SINGLE_QUOTE) | SHIFT(Pf_SINGLE_QUOTE));
+}
+inline bool IsLeftPunct(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Ps_START) | SHIFT(Ps_QUOTE) | SHIFT(Ps_SINGLE_QUOTE));
+}
+inline bool IsRightPunct(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Pe_END) | SHIFT(Pe_QUOTE) | SHIFT(Pe_SINGLE_QUOTE));
+}
+inline bool IsCombining(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Mc_SPACING) | SHIFT(Mn_NONSPACING) | SHIFT(Me_ENCLOSING));
+}
+inline bool IsNonspacing(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Mn_NONSPACING) | SHIFT(Me_ENCLOSING));
+}
+inline bool IsAlphabetic(wchar32 ch) {
+ return NUnicode::CharHasType(ch,
+ SHIFT(Lu_UPPER) | SHIFT(Ll_LOWER) | SHIFT(Lt_TITLE) | SHIFT(Lm_EXTENDER) | SHIFT(Lm_LETTER) | SHIFT(Lo_OTHER) | SHIFT(Nl_LETTER));
+}
+inline bool IsIdeographic(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Lo_IDEOGRAPH) | SHIFT(Nl_IDEOGRAPH));
+}
+inline bool IsKatakana(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Lo_KATAKANA));
+}
+inline bool IsHiragana(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Lo_HIRAGANA));
+}
+inline bool IsHangulLeading(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Lo_LEADING));
+}
+inline bool IsHangulVowel(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Lo_VOWEL));
+}
+inline bool IsHangulTrailing(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Lo_TRAILING));
+}
+inline bool IsHexdigit(wchar32 ch) {
+ return NUnicode::NPrivate::CharInfo(ch) & IS_ASCII_XDIGIT;
+}
+inline bool IsDecdigit(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Nd_DIGIT));
+}
+inline bool IsNumeric(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Nd_DIGIT) | SHIFT(Nl_LETTER) | SHIFT(Nl_IDEOGRAPH) | SHIFT(No_OTHER));
+}
+inline bool IsCurrency(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Sc_CURRENCY));
+}
+inline bool IsMath(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Sm_MATH));
+}
+inline bool IsSymbol(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Sm_MATH) | SHIFT(Sm_MINUS) | SHIFT(Sc_CURRENCY) | SHIFT(Sk_MODIFIER) | SHIFT(So_OTHER));
+}
+inline bool IsLowSurrogate(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Cs_LOW));
+}
+inline bool IsHighSurrogate(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Cs_HIGH));
+}
+inline bool IsNonbreak(wchar32 ch) {
+ return NUnicode::NPrivate::CharInfo(ch) & IS_NONBREAK;
+}
+inline bool IsPrivate(wchar32 ch) {
+ return (NUnicode::NPrivate::CharInfo(ch) & IS_PRIVATE) && !NUnicode::CharHasType(ch, SHIFT(Cs_HIGH));
+}
+inline bool IsUnassigned(wchar32 ch) {
+ return (NUnicode::CharType(ch) == 0) && !(NUnicode::NPrivate::CharInfo(ch) & IS_PRIVATE);
+}
+inline bool IsPrivateHighSurrogate(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Cs_HIGH)) && (NUnicode::NPrivate::CharInfo(ch) & IS_PRIVATE);
+}
+
+// transformations
+
+inline wchar32 ToLower(wchar32 ch) {
+ return static_cast<wchar32>(ch + NUnicode::NPrivate::CharProperty(ch).Lower);
+}
+inline wchar32 ToUpper(wchar32 ch) {
+ return static_cast<wchar32>(ch + NUnicode::NPrivate::CharProperty(ch).Upper);
+}
+inline wchar32 ToTitle(wchar32 ch) {
+ return static_cast<wchar32>(ch + NUnicode::NPrivate::CharProperty(ch).Title);
+}
+
+inline int ToDigit(wchar32 ch) {
+ ui32 i = NUnicode::NPrivate::CharInfo(ch);
+ return (i & IS_DIGIT) ? static_cast<int>(i >> SVAL_OFFSET) : -1;
+}
+
+// BIDI properties
+
+inline bool IsBidiLeft(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 1);
+}
+inline bool IsBidiRight(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 2);
+}
+inline bool IsBidiEuronum(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 3);
+}
+inline bool IsBidiEurosep(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 4);
+}
+inline bool IsBidiEuroterm(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 5);
+}
+inline bool IsBidiArabnum(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 6);
+}
+inline bool IsBidiCommsep(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 7);
+}
+inline bool IsBidiBlocksep(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 8);
+}
+inline bool IsBidiSegmsep(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 9);
+}
+inline bool IsBidiSpace(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 10);
+}
+inline bool IsBidiNeutral(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 11);
+}
+inline bool IsBidiNotappl(wchar32 ch) {
+ return NUnicode::NPrivate::IsBidi(ch, 0);
+}
+
+inline bool IsSpace(wchar32 ch) {
+ return IsWhitespace(ch);
+}
+inline bool IsLower(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Ll_LOWER));
+}
+inline bool IsUpper(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Lu_UPPER));
+}
+inline bool IsTitle(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Lt_TITLE));
+}
+inline bool IsAlpha(wchar32 ch) {
+ return NUnicode::CharHasType(ch,
+ SHIFT(Lu_UPPER) | SHIFT(Ll_LOWER) | SHIFT(Lt_TITLE) | SHIFT(Lm_LETTER) | SHIFT(Lm_EXTENDER) |
+ SHIFT(Lo_OTHER) | SHIFT(Lo_IDEOGRAPH) | SHIFT(Lo_KATAKANA) | SHIFT(Lo_HIRAGANA) |
+ SHIFT(Lo_LEADING) | SHIFT(Lo_VOWEL) | SHIFT(Lo_TRAILING));
+}
+inline bool IsAlnum(wchar32 ch) {
+ return NUnicode::CharHasType(ch,
+ SHIFT(Lu_UPPER) | SHIFT(Ll_LOWER) | SHIFT(Lt_TITLE) | SHIFT(Lm_LETTER) | SHIFT(Lm_EXTENDER) |
+ SHIFT(Lo_OTHER) | SHIFT(Lo_IDEOGRAPH) | SHIFT(Lo_KATAKANA) | SHIFT(Lo_HIRAGANA) |
+ SHIFT(Lo_LEADING) | SHIFT(Lo_VOWEL) | SHIFT(Lo_TRAILING) |
+ SHIFT(Nd_DIGIT) | SHIFT(Nl_LETTER) | SHIFT(Nl_IDEOGRAPH) | SHIFT(No_OTHER));
+}
+inline bool IsPunct(wchar32 ch) {
+ return NUnicode::CharHasType(ch,
+ SHIFT(Pd_DASH) |
+ SHIFT(Pd_HYPHEN) | SHIFT(Ps_START) | SHIFT(Ps_QUOTE) | SHIFT(Pe_END) | SHIFT(Pe_QUOTE) | SHIFT(Pc_CONNECTOR) |
+ SHIFT(Po_OTHER) | SHIFT(Po_QUOTE) | SHIFT(Po_TERMINAL) | SHIFT(Po_EXTENDER) | SHIFT(Po_HYPHEN) |
+ SHIFT(Pi_QUOTE) | SHIFT(Pf_QUOTE));
+}
+inline bool IsXdigit(wchar32 ch) {
+ return IsHexdigit(ch);
+}
+inline bool IsDigit(wchar32 ch) {
+ return IsDecdigit(ch);
+}
+
+inline bool IsCommonDigit(wchar32 ch) {
+ // IsDigit returns true for some exotic symbols like "VAI DIGIT TWO" (U+A622)
+ // and cannot be used safely with FromString() convertors
+ const wchar32 ZERO = '0';
+ const wchar32 NINE = '9';
+ return ch >= ZERO && ch <= NINE;
+}
+
+inline bool IsGraph(wchar32 ch) {
+ return IsAlnum(ch) || IsPunct(ch) || IsSymbol(ch);
+}
+inline bool IsBlank(wchar32 ch) {
+ return NUnicode::CharHasType(ch, SHIFT(Zs_SPACE) | SHIFT(Zs_ZWSPACE)) || ch == '\t';
+}
+inline bool IsPrint(wchar32 ch) {
+ return IsAlnum(ch) || IsPunct(ch) || IsSymbol(ch) || IsBlank(ch);
+}
+
+inline bool IsRomanDigit(wchar32 ch) {
+ if (NUnicode::CharHasType(ch, SHIFT(Nl_LETTER)) && 0x2160 <= ch && ch <= 0x2188)
+ return true;
+ if (ch < 127) {
+ switch (static_cast<char>(::ToLower(ch))) {
+ case 'i':
+ case 'v':
+ case 'x':
+ case 'l':
+ case 'c':
+ case 'd':
+ case 'm':
+ return true;
+ }
+ }
+ return false;
+}
+
+#undef SHIFT
diff --git a/util/charset/ut/utf8/invalid_UTF8.bin b/util/charset/ut/utf8/invalid_UTF8.bin
new file mode 100644
index 0000000000..3972ab163e
--- /dev/null
+++ b/util/charset/ut/utf8/invalid_UTF8.bin
Binary files differ
diff --git a/util/charset/ut/utf8/test1.txt b/util/charset/ut/utf8/test1.txt
new file mode 100644
index 0000000000..47a0c36486
--- /dev/null
+++ b/util/charset/ut/utf8/test1.txt
@@ -0,0 +1,505 @@
+Sentences that contain all letters commonly used in a language
+--------------------------------------------------------------
+
+Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/> -- 2001-09-02
+
+This file is UTF-8 encoded.
+
+
+Danish (da)
+---------
+
+ Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen
+ Wolther spillede på xylofon.
+ (= Quiz contestants were eating strawbery with cream while Wolther
+ the circus clown played on xylophone.)
+
+German (de)
+-----------
+
+ Falsches Üben von Xylophonmusik quält jeden größeren Zwerg
+ (= Wrongful practicing of xylophone music tortures every larger dwarf)
+
+ Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich
+ (= Twelve boxing fighters hunted Eva across the dike of Sylt)
+
+ Heizölrückstoßabdämpfung
+ (= fuel oil recoil absorber)
+ (jqvwxy missing, but all non-ASCII letters in one word)
+
+English (en)
+------------
+
+ The quick brown fox jumps over the lazy dog
+
+Spanish (es)
+------------
+
+ El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y
+ frío, añoraba a su querido cachorro.
+ (Contains every letter and every accent, but not every combination
+ of vowel + acute.)
+
+French (fr)
+-----------
+
+ Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à
+ côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce
+ qui lui permet de penser à la cænogenèse de l'être dont il est question
+ dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui,
+ pense-t-il, diminue çà et là la qualité de son œuvre.
+
+ l'île exiguë
+ Où l'obèse jury mûr
+ Fête l'haï volapük,
+ Âne ex aéquo au whist,
+ Ôtez ce vœu déçu.
+
+ Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en
+ canoë au delà des îles, près du mälström où brûlent les novæ.
+
+Irish Gaelic (ga)
+-----------------
+
+ D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh
+
+Hungarian (hu)
+--------------
+
+ Árvíztűrő tükörfúrógép
+ (= flood-proof mirror-drilling machine, only all non-ASCII letters)
+
+Icelandic (is)
+--------------
+
+ Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa
+
+ Sævör grét áðan því úlpan var ónýt
+ (some ASCII letters missing)
+
+Japanese (jp)
+-------------
+
+ Hiragana: (Iroha)
+
+ いろはにほへとちりぬるを
+ わかよたれそつねならむ
+ うゐのおくやまけふこえて
+ あさきゆめみしゑひもせす
+
+ Katakana:
+
+ イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム
+ ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン
+
+Hebrew (iw)
+-----------
+
+ ? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה
+
+Polish (pl)
+-----------
+
+ Pchnąć w tę łódź jeża lub ośm skrzyń fig
+ (= To push a hedgehog or eight bins of figs in this boat)
+
+Russian (ru)
+------------
+
+ В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!
+ (= Would a citrus live in the bushes of south? Yes, but only a fake one!)
+
+Thai (th)
+---------
+
+ [--------------------------|------------------------]
+ ๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน
+ จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร
+ ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย
+ ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอย ฯ
+
+ [The copyright for the Thai example is owned by The Computer
+ Association of Thailand under the Royal Patronage of His Majesty the
+ King.]
+
+Please let me know if you find others! Special thanks to the people
+from all over the world who contributed these sentences.
+? *Unicode Transcriptions* Notes <#Notes>
+
+Glyphs <http://www.macchiato.com/unicode/show.html> | Samples
+<http://www.macchiato.com/unicode/Unicode_transcriptions.html> | Charts
+<http://www.macchiato.com/unicode/charts.html> | UTF
+<http://www.macchiato.com/unicode/convert.html> | Forms
+<http://www-4.ibm.com/software/developer/library/utfencodingforms/> |
+Home <http://www.macchiato.com>.
+<http://member.linkexchange.com/cgi-bin/fc/fastcounter-login?750641>
+
+Name Text Image
+Arabic (Arabic) يونِكود ?
+Arabic (Persian) یونی‌کُد / ?/
+Armenian Յունիկօդ
+Bengali য়ূনিকোড
+Bopomofo ㄊㄨㄥ˅ ㄧˋ ㄇㄚ˅
+ㄨㄢˋ ㄍㄨㄛˊ ㄇㄚ˅
+Braille
+Buhid
+Canadian Aboriginal ᔫᗂᑰᑦ
+Cherokee ᏳᏂᎪᏛ
+Cypriot
+Cyrillic (Russian) Юникод ?
+Deseret (English) ???????
+Devanagari (Hindi) यूनिकोड ?
+Ethiopic ዩኒኮድ
+Georgian უნიკოდი ?
+Gothic
+Greek Γιούνικοντ
+Gujarati યૂનિકોડ
+Gurmukhi ਯੂਨਿਕੋਡ
+Han (Chinese) 统一码 ?
+統一碼 ?
+万国码 ?
+萬國碼 ?
+Hangul 유니코드
+Hanunoo
+Hebrew יוניקוד
+Hebrew (pointed) יוּנִיקוׁד
+Hebrew (Yiddish) יוניקאָד ?
+Hiragana (Japanese) ゆにこおど
+Katakana (Japanese) ユニコード ?
+Kannada ಯೂನಿಕೋಡ್
+Khmer យូនីគោដ
+Lao
+Latin Unicode Unicode
+Latin (IPA <#English_Pronunciation>) ˈjunɪˌkoːd ?
+Latin (Am. Dict. <#American_Dictionary>) Ūnĭcōde̽ ?
+Limbu
+Linear B
+Malayalam യൂനികോഡ്
+Mongolian
+Myanmar
+Ogham ᚔᚒᚅᚔᚉᚑᚇ / /
+Old Italic
+Oriya ୟୂନିକୋଡ
+Osmanya
+Runic (Anglo-Saxon) ᛡᚢᚾᛁᚳᚩᛞ
+Shavian
+Sinhala යණනිකෞද්
+Syriac ܝܘܢܝܩܘܕ
+Tagbanwa
+Tagalog
+Tai Le
+Tamil யூனிகோட்
+Telugu యూనికోడ్
+Thaana
+Thai ยูนืโคด
+Tibetan (Dzongkha) ཨུ་ནི་ཀོཌྲ།
+Ugaritic
+Yi
+
+
+ Notes:
+
+There are different ways to transcribe the word “Unicode”, depending on
+the language and script. In some cases there is only one language that
+customarily uses a given script; in others there are many languages. The
+goal here is at a minimum to collect at least one transcription for each
+script in a language customarily written in that script, with more
+languages if possible. If the transcription is the same for multiple
+languages in a script, then a single representative language is used.
+
+Still missing are transcriptions for the items above in RED (in at least
+one language). I would appreciate any other transcriptions, or
+corrections for the ones listed here. Send to mark3@macchiato.com
+<mailto:mark3@macchiato.com>, using the directions below:
+
+ * *Supplying Missing Items*
+ o Most Latin-script languages will follow the spelling, and
+ change the pronunciation. For any that would not, it would
+ be good to have the alternate spelling.
+ o For non-Latin scripts the goal is to match the English
+ pronunciation — /*not*/ spelling. Above is the IPA <#IPA>
+ (in phonemic transcription) that should be matched as
+ closely as possible (without sounding affected in the target
+ language)
+ o Text would be best in either the UTF-8 text, or the code
+ points in hex HTML. E.g. either of the following:
+ + "Юникод"
+ + "&#x042E;&#x043D;&#x0438;&#x043A;&#x043E;&#x0434;"
+ + Note: for / supplementary characters/
+ <http://www.unicode.org/glossary/#supplementary_character>,
+ there should be one hex number per code point, not two
+ surrogates
+ <http://www.unicode.org/glossary/#surrogate_code_point>:
+ # &#x10000; /*not*/ &#xD800;&xDC00;
+ o If you have a good font, I'd also appreciate a GIF. It
+ should be *96 x 24* bits, with the text centered, in black
+ on white (plus grays if smoothed).
+ * *Other Comments*
+ o Because some browsers won't handle the text, both text and
+ GIF image are supplied. If you can’t read the text columns,
+ see Display Problems
+ <http://www.unicode.org/help/display_problems.html>.
+ o The Chinese versions (inc. Bopomofo) are translations, not
+ transcriptions, since "transcription in Chinese is pretty
+ lame" [J. Becker].
+ o There are other "translations" of Unicode that may be in
+ use, such as the Vietnamese "Thống Nhất Mã".
+ o For sample pages in different languages on the Unicode site,
+ see What is Unicode?
+ <http://www.unicode.org/unicode/standard/WhatIsUnicode.html>
+ o Americans are not generally used to IPA, and find a variety
+ of different systems in their dictionaries. This one leaves
+ the base letters as they are, and uses diacritics for
+ pronunciation.
+ * *Etymology of /Unicode/*
+ o Coined by J. Becker. Not related to previous usages, such as:
+ + A telegraphic code in which one word or set of letters
+ represents a sentence or phrase; a telegram or message
+ in this. (late 19th century, OED)
+ o According to my references, the prefix "uni" is directly
+ from Latin while the word "code" is through French.
+ o The original Indo-European apparently would have been
+ *oino-kau-do ("one strike give"): *kau apparently being
+ related to such English words as: hew, haggle, hoe, hag,
+ hay, hack, caudad, caudal, caudate, caudex, coda, codex,
+ codicil, coward, incus, and Kovač (personal name: "smith").
+ + I will leave the exact derivations to the exegetes,
+ but I like the association with "haggle" myself.
+ * *Contributions*
+ o This draws on contributions or comments from:
+ + Dixon Au
+ + Joe Becker
+ + Maurice Bauhahn
+ + Abel Cheung
+ + Peter Constable
+ + Michael Everson
+ + Christopher John Fynn
+ + Michael Kaplan
+ + George Kiraz
+ + Abdul Malik
+ + Siva Nataraja
+ + Roozbeh Pournader
+ + Jonathan Rosenne
+ + Jungshik Shin
+
+------------------------------------------------------------------------
+
+
+Terms of Use <http://www.macchiato.com/terms_of_use.html>. Last updated:
+MED - 04/20/2003 15:30:33.
+<http://member.linkexchange.com/cgi-bin/fc/fastcounter-login?750641>
+
+
+
+
+UTF-8 encoded sample plain-text file
+‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
+
+Markus Kuhn [ˈmaʳkʊs kuːn] <http://www.cl.cam.ac.uk/~mgk25/> — 2002-07-25
+
+
+The ASCII compatible UTF-8 encoding used in this plain-text file
+is defined in Unicode, ISO 10646-1, and RFC 2279.
+
+
+Using Unicode/UTF-8, you can write in emails and source code things such as
+
+Mathematics and sciences:
+
+ ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ⎧⎡⎛┌─────┐⎞⎤⎫
+ ⎪⎢⎜│a²+b³ ⎟⎥⎪
+ ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪
+ ⎪⎢⎜⎷ c₈ ⎟⎥⎪
+ ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⎨⎢⎜ ⎟⎥⎬
+ ⎪⎢⎜ ∞ ⎟⎥⎪
+ ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪
+ ⎪⎢⎜ ⎳aⁱ-bⁱ⎟⎥⎪
+ 2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣⎝i=1 ⎠⎦⎭
+
+Linguistics and dictionaries:
+
+ ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn
+ Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ]
+
+APL:
+
+ ((V⍳V)=⍳⍴V)/V←,V ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈
+
+Nicer typography in plain text files:
+
+ ╔══════════════════════════════════════════╗
+ ║ ║
+ ║ • ‘single’ and “double” quotes ║
+ ║ ║
+ ║ • Curly apostrophes: “We’ve been here” ║
+ ║ ║
+ ║ • Latin-1 apostrophe and accents: '´` ║
+ ║ ║
+ ║ • ‚deutsche‘ „Anführungszeichen“ ║
+ ║ ║
+ ║ • †, ‡, ‰, •, 3–4, —, −5/+5, ™, … ║
+ ║ ║
+ ║ • ASCII safety test: 1lI|, 0OD, 8B ║
+ ║ ╭─────────╮ ║
+ ║ • the euro symbol: │ 14.95 € │ ║
+ ║ ╰─────────╯ ║
+ ╚══════════════════════════════════════════╝
+
+Combining characters:
+
+ STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑
+
+Greek (in Polytonic):
+
+ The Greek anthem:
+
+ Σὲ γνωρίζω ἀπὸ τὴν κόψη
+ τοῦ σπαθιοῦ τὴν τρομερή,
+ σὲ γνωρίζω ἀπὸ τὴν ὄψη
+ ποὺ μὲ βία μετράει τὴ γῆ.
+
+ ᾿Απ᾿ τὰ κόκκαλα βγαλμένη
+ τῶν ῾Ελλήνων τὰ ἱερά
+ καὶ σὰν πρῶτα ἀνδρειωμένη
+ χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά!
+
+ From a speech of Demosthenes in the 4th century BC:
+
+ Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,
+ ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς
+ λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ
+ τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿
+ εἰς τοῦτο προήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ
+ πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν
+ οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,
+ οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν
+ ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
+ τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι
+ γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
+ προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους
+ σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ
+ τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ
+ τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς
+ τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.
+
+ Δημοσθένους, Γ´ ᾿Ολυνθιακὸς
+
+Georgian:
+
+ From a Unicode conference invitation:
+
+ გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო
+ კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს,
+ ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს
+ ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი,
+ ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება
+ ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში,
+ ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში.
+
+Russian:
+
+ From a Unicode conference invitation:
+
+ Зарегистрируйтесь сейчас на Десятую Международную Конференцию по
+ Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии.
+ Конференция соберет широкий круг экспертов по вопросам глобального
+ Интернета и Unicode, локализации и интернационализации, воплощению и
+ применению Unicode в различных операционных системах и программных
+ приложениях, шрифтах, верстке и многоязычных компьютерных системах.
+
+Thai (UCS Level 2):
+
+ Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese
+ classic 'San Gua'):
+
+ [----------------------------|------------------------]
+ ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่
+ สิบสองกษัตริย์ก่อนหน้าแลถัดไป สององค์ไซร้โง่เขลาเบาปัญญา
+ ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนักหนา
+ โฮจิ๋นเรียกทัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัญ
+ เหมือนขับไสไล่เสือจากเคหา รับหมาป่าเข้ามาเลยอาสัญ
+ ฝ่ายอ้องอุ้นยุแยกให้แตกกัน ใช้สาวนั้นเป็นชนวนชื่นชวนใจ
+ พลันลิฉุยกุยกีกลับก่อเหตุ ช่างอาเพศจริงหนาฟ้าร้องไห้
+ ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ
+
+ (The above is a two-column text. If combining characters are handled
+ correctly, the lines of the second column should be aligned with the
+ | character above.)
+
+Ethiopian:
+
+ Proverbs in the Amharic language:
+
+ ሰማይ አይታረስ ንጉሥ አይከሰስ።
+ ብላ ካለኝ እንደአባቴ በቆመጠኝ።
+ ጌጥ ያለቤቱ ቁምጥና ነው።
+ ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው።
+ የአፍ ወለምታ በቅቤ አይታሽም።
+ አይጥ በበላ ዳዋ ተመታ።
+ ሲተረጉሙ ይደረግሙ።
+ ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል።
+ ድር ቢያብር አንበሳ ያስር።
+ ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም።
+ እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም።
+ የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ።
+ ሥራ ከመፍታት ልጄን ላፋታት።
+ ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል።
+ የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ።
+ ተንጋሎ ቢተፉ ተመልሶ ባፉ።
+ ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው።
+ እግርህን በፍራሽህ ልክ ዘርጋ።
+
+Runes:
+
+ ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ
+
+ (Old English, which transcribed into Latin reads 'He cwaeth that he
+ bude thaem lande northweardum with tha Westsae.' and means 'He said
+ that he lived in the northern land near the Western Sea.')
+
+Braille:
+
+ ⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌
+
+ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞
+ ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎
+ ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂
+ ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙
+ ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑
+ ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲
+
+ ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲
+
+ ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹
+ ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞
+ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕
+ ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹
+ ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎
+ ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎
+ ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳
+ ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞
+ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲
+
+ (The first couple of paragraphs of "A Christmas Carol" by Dickens)
+
+Compact font selection example text:
+
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
+ abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ
+ –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд
+ ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა
+
+Greetings in various languages:
+
+ Hello world, Καλημέρα κόσμε, コンニチハ
+
+Box drawing alignment tests: █
+ ▉
+ ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳
+ ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳
+ ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳
+ ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳
+ ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎
+ ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏
+ ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█
+ ▝▀▘▙▄▟
diff --git a/util/charset/ut/ya.make b/util/charset/ut/ya.make
new file mode 100644
index 0000000000..6526815e92
--- /dev/null
+++ b/util/charset/ut/ya.make
@@ -0,0 +1,17 @@
+UNITTEST_FOR(util/charset)
+
+OWNER(g:util)
+SUBSCRIBER(g:util-subscribers)
+
+DATA(arcadia/util/charset/ut/utf8)
+
+SRCS(
+ utf8_ut.cpp
+ wide_ut.cpp
+)
+
+INCLUDE(${ARCADIA_ROOT}/util/tests/ya_util_tests.inc)
+
+REQUIREMENTS(ram:17)
+
+END()
diff --git a/util/charset/utf8.cpp b/util/charset/utf8.cpp
new file mode 100644
index 0000000000..efe3a52f61
--- /dev/null
+++ b/util/charset/utf8.cpp
@@ -0,0 +1,170 @@
+#include "unidata.h"
+#include "utf8.h"
+
+namespace {
+ enum class ECaseConversion {
+ ToUpper,
+ ToLower,
+ };
+
+ wchar32 ConvertChar(ECaseConversion conversion, wchar32 ch) {
+ switch (conversion) {
+ case ECaseConversion::ToUpper:
+ return ToUpper(ch);
+ case ECaseConversion::ToLower:
+ return ToLower(ch);
+ }
+ Y_ASSERT(false); // NOTREACHED
+ return 0;
+ }
+
+ bool ConvertCaseUTF8Impl(ECaseConversion conversion, const char* beg, size_t n,
+ TString& newString) {
+ const unsigned char* p = (const unsigned char*)beg;
+ const unsigned char* const end = p + n;
+
+ // first loop searches for the first character, which is changed by ConvertChar
+ // if there is no changed character, we don't need reallocation/copy
+ wchar32 cNew = 0;
+ size_t cLen = 0;
+ while (p < end) {
+ wchar32 c;
+ if (RECODE_OK != SafeReadUTF8Char(c, cLen, p, end)) {
+ ythrow yexception()
+ << "failed to decode UTF-8 string at pos " << ((const char*)p - beg);
+ }
+ cNew = ConvertChar(conversion, c);
+
+ if (cNew != c)
+ break;
+ p += cLen;
+ }
+ if (p == end) {
+ return false;
+ }
+
+ // some character changed after ToLower. Write new string to newString.
+ newString.resize(n);
+
+ size_t written = (char*)p - beg;
+ char* writePtr = newString.begin();
+ memcpy(writePtr, beg, written);
+ writePtr += written;
+ size_t destSpace = n - written;
+
+ // before each iteration (including the first one) variable 'cNew' contains unwritten symbol
+ while (true) {
+ size_t cNewLen;
+ Y_ASSERT((writePtr - newString.data()) + destSpace == newString.size());
+ if (RECODE_EOOUTPUT ==
+ SafeWriteUTF8Char(cNew, cNewLen, (unsigned char*)writePtr, destSpace)) {
+ destSpace += newString.size();
+ newString.resize(newString.size() * 2);
+ writePtr = newString.begin() + (newString.size() - destSpace);
+ continue;
+ }
+ destSpace -= cNewLen;
+ writePtr += cNewLen;
+ p += cLen;
+ if (p == end) {
+ newString.resize(newString.size() - destSpace);
+ return true;
+ }
+ wchar32 c = 0;
+ if (RECODE_OK != SafeReadUTF8Char(c, cLen, p, end)) {
+ ythrow yexception()
+ << "failed to decode UTF-8 string at pos " << ((const char*)p - beg);
+ }
+ cNew = ConvertChar(conversion, c);
+ }
+ Y_ASSERT(false);
+ return false;
+ }
+} // namespace
+
+extern const wchar32 BROKEN_RUNE = 0xFFFD;
+
+static const char* SkipUTF8Chars(const char* begin, const char* end, size_t numChars) {
+ const unsigned char* uEnd = reinterpret_cast<const unsigned char*>(end);
+ while (begin != end && numChars > 0) {
+ const unsigned char* uBegin = reinterpret_cast<const unsigned char*>(begin);
+ size_t runeLen;
+ if (GetUTF8CharLen(runeLen, uBegin, uEnd) != RECODE_OK) {
+ ythrow yexception() << "invalid UTF-8 char";
+ }
+ begin += runeLen;
+ Y_ASSERT(begin <= end);
+ --numChars;
+ }
+ return begin;
+}
+
+TStringBuf SubstrUTF8(const TStringBuf str, size_t pos, size_t len) {
+ const char* start = SkipUTF8Chars(str.begin(), str.end(), pos);
+ const char* end = SkipUTF8Chars(start, str.end(), len);
+ return TStringBuf(start, end - start);
+}
+
+EUTF8Detect UTF8Detect(const char* s, size_t len) {
+ const unsigned char* s0 = (const unsigned char*)s;
+ const unsigned char* send = s0 + len;
+ wchar32 rune;
+ size_t rune_len;
+ EUTF8Detect res = ASCII;
+
+ while (s0 < send) {
+ RECODE_RESULT rr = SafeReadUTF8Char(rune, rune_len, s0, send);
+
+ if (rr != RECODE_OK) {
+ return NotUTF8;
+ }
+
+ if (rune_len > 1) {
+ res = UTF8;
+ }
+
+ s0 += rune_len;
+ }
+
+ return res;
+}
+
+bool ToLowerUTF8Impl(const char* beg, size_t n, TString& newString) {
+ return ConvertCaseUTF8Impl(ECaseConversion::ToLower, beg, n, newString);
+}
+
+TString ToLowerUTF8(const TString& s) {
+ TString newString;
+ bool changed = ToLowerUTF8Impl(s.data(), s.size(), newString);
+ return changed ? newString : s;
+}
+
+TString ToLowerUTF8(TStringBuf s) {
+ TString newString;
+ bool changed = ToLowerUTF8Impl(s.data(), s.size(), newString);
+ return changed ? newString : TString(s.data(), s.size());
+}
+
+TString ToLowerUTF8(const char* s) {
+ return ToLowerUTF8(TStringBuf(s));
+}
+
+bool ToUpperUTF8Impl(const char* beg, size_t n, TString& newString) {
+ return ConvertCaseUTF8Impl(ECaseConversion::ToUpper, beg, n, newString);
+}
+
+TString ToUpperUTF8(const TString& s) {
+ TString newString;
+ bool changed = ToUpperUTF8Impl(s.data(), s.size(), newString);
+ return changed ? newString : s;
+}
+
+TString ToUpperUTF8(TStringBuf s) {
+ TString newString;
+ bool changed = ToUpperUTF8Impl(s.data(), s.size(), newString);
+ return changed ? newString : TString(s.data(), s.size());
+}
+
+TString ToUpperUTF8(const char* s) {
+ return ToUpperUTF8(TStringBuf(s));
+}
diff --git a/util/charset/utf8.h b/util/charset/utf8.h
new file mode 100644
index 0000000000..5039b46ae9
--- /dev/null
+++ b/util/charset/utf8.h
@@ -0,0 +1,388 @@
+#pragma once
+
+#include "recode_result.h"
+
+#include <util/generic/strbuf.h>
+#include <util/generic/string.h>
+#include <util/generic/yexception.h>
+#include <util/system/defaults.h>
+#include <util/system/yassert.h>
+
+extern const wchar32 BROKEN_RUNE;
+
+inline unsigned char UTF8LeadByteMask(size_t utf8_rune_len) {
+ // Y_ASSERT (utf8_rune_len <= 4);
+ return "\0\0\037\017\007"[utf8_rune_len];
+}
+
+inline size_t UTF8RuneLen(const unsigned char lead_byte) {
+ //b0XXXXXXX
+ if ((lead_byte & 0x80) == 0x00) {
+ return 1;
+ }
+ //b110XXXXX
+ if ((lead_byte & 0xe0) == 0xc0) {
+ return 2;
+ }
+ //b1110XXXX
+ if ((lead_byte & 0xf0) == 0xe0) {
+ return 3;
+ }
+ //b11110XXX
+ if ((lead_byte & 0xf8) == 0xf0) {
+ return 4;
+ }
+ //b10XXXXXX
+ return 0;
+}
+
+inline size_t UTF8RuneLenByUCS(wchar32 rune) {
+ if (rune < 0x80)
+ return 1U;
+ else if (rune < 0x800)
+ return 2U;
+ else if (rune < 0x10000)
+ return 3U;
+ else if (rune < 0x200000)
+ return 4U;
+ else if (rune < 0x4000000)
+ return 5U;
+ else
+ return 6U;
+}
+
+inline void PutUTF8LeadBits(wchar32& rune, unsigned char c, size_t len) {
+ rune = c;
+ rune &= UTF8LeadByteMask(len);
+}
+
+inline void PutUTF8SixBits(wchar32& rune, unsigned char c) {
+ rune <<= 6;
+ rune |= c & 0x3F;
+}
+
+inline bool IsUTF8ContinuationByte(unsigned char c) {
+ return (c & static_cast<unsigned char>(0xC0)) == static_cast<unsigned char>(0x80);
+}
+
+//! returns length of the current UTF8 character
+//! @param n length of the current character, it is assigned in case of valid UTF8 byte sequence
+//! @param p pointer to the current character
+//! @param e end of the character sequence
+inline RECODE_RESULT GetUTF8CharLen(size_t& n, const unsigned char* p, const unsigned char* e) {
+ Y_ASSERT(p < e); // since p < e then we will check RECODE_EOINPUT only for n > 1 (see calls of this functions)
+ switch (UTF8RuneLen(*p)) {
+ case 0:
+ return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in first byte
+
+ case 1:
+ n = 1;
+ return RECODE_OK;
+
+ case 2:
+ if (p + 2 > e) {
+ return RECODE_EOINPUT;
+ } else if (!IsUTF8ContinuationByte(p[1])) {
+ return RECODE_BROKENSYMBOL;
+ } else {
+ n = 2;
+ return RECODE_OK;
+ }
+ case 3:
+ if (p + 3 > e) {
+ return RECODE_EOINPUT;
+ } else if (!IsUTF8ContinuationByte(p[1]) || !IsUTF8ContinuationByte(p[2])) {
+ return RECODE_BROKENSYMBOL;
+ } else {
+ n = 3;
+ return RECODE_OK;
+ }
+ default: // actually 4
+ if (p + 4 > e) {
+ return RECODE_EOINPUT;
+ } else if (!IsUTF8ContinuationByte(p[1]) || !IsUTF8ContinuationByte(p[2]) || !IsUTF8ContinuationByte(p[3])) {
+ return RECODE_BROKENSYMBOL;
+ } else {
+ n = 4;
+ return RECODE_OK;
+ }
+ }
+}
+
+//! returns number of characters in UTF8 encoded text, stops immediately if UTF8 byte sequence is wrong
+//! @param text UTF8 encoded text
+//! @param len the length of the text in bytes
+//! @param number number of encoded symbols in the text
+inline bool GetNumberOfUTF8Chars(const char* text, size_t len, size_t& number) {
+ const unsigned char* cur = reinterpret_cast<const unsigned char*>(text);
+ const unsigned char* const last = cur + len;
+ number = 0;
+ size_t runeLen;
+ bool res = true;
+ while (cur != last) {
+ if (GetUTF8CharLen(runeLen, cur, last) != RECODE_OK) { // actually it could be RECODE_BROKENSYMBOL only
+ res = false;
+ break;
+ }
+ cur += runeLen;
+ Y_ASSERT(cur <= last);
+ ++number;
+ }
+ return res;
+}
+
+inline size_t GetNumberOfUTF8Chars(TStringBuf text) {
+ size_t number;
+ if (!GetNumberOfUTF8Chars(text.data(), text.size(), number)) {
+ ythrow yexception() << "GetNumberOfUTF8Chars failed on invalid utf-8 " << TString(text.substr(0, 50)).Quote();
+ }
+ return number;
+}
+
+//! reads one unicode symbol from a character sequence encoded UTF8 and checks for overlong encoding
+//! @param rune value of the current character
+//! @param rune_len length of the UTF8 bytes sequence that has been read
+//! @param s pointer to the current character
+//! @param end the end of the character sequence
+inline RECODE_RESULT SafeReadUTF8Char(wchar32& rune, size_t& rune_len, const unsigned char* s, const unsigned char* end) {
+ rune = BROKEN_RUNE;
+ rune_len = 0;
+ wchar32 _rune;
+
+ size_t _len = UTF8RuneLen(*s);
+ if (s + _len > end)
+ return RECODE_EOINPUT; //[EOINPUT]
+ if (_len == 0)
+ return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in first byte
+ _rune = *s++; //[00000000 0XXXXXXX]
+
+ if (_len > 1) {
+ _rune &= UTF8LeadByteMask(_len);
+ unsigned char ch = *s++;
+ if (!IsUTF8ContinuationByte(ch))
+ return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in second byte
+ PutUTF8SixBits(_rune, ch); //[00000XXX XXYYYYYY]
+ if (_len > 2) {
+ ch = *s++;
+ if (!IsUTF8ContinuationByte(ch))
+ return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in third byte
+ PutUTF8SixBits(_rune, ch); //[XXXXYYYY YYZZZZZZ]
+ if (_len > 3) {
+ ch = *s;
+ if (!IsUTF8ContinuationByte(ch))
+ return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in fourth byte
+ PutUTF8SixBits(_rune, ch); //[XXXYY YYYYZZZZ ZZQQQQQQ]
+ if (_rune > 0x10FFFF) // it is not a valid Unicode code point
+ return RECODE_BROKENSYMBOL;
+ if (_rune < 0x10000) // check for overlong encoding
+ return RECODE_BROKENSYMBOL;
+ } else {
+ if (_rune < 0x800) // check for overlong encoding
+ return RECODE_BROKENSYMBOL;
+ }
+ } else {
+ if (_rune < 0x80) // check for overlong encoding
+ return RECODE_BROKENSYMBOL;
+ }
+ }
+ rune_len = _len;
+ rune = _rune;
+ return RECODE_OK;
+}
+
+//! reads one unicode symbol from a character sequence encoded UTF8 and moves pointer to the next character
+//! @param c value of the current character
+//! @param p pointer to the current character, it will be changed in case of valid UTF8 byte sequence
+//! @param e the end of the character sequence
+Y_FORCE_INLINE RECODE_RESULT ReadUTF8CharAndAdvance(wchar32& rune, const unsigned char*& p, const unsigned char* e) noexcept {
+ Y_ASSERT(p < e); // since p < e then we will check RECODE_EOINPUT only for n > 1 (see calls of this functions)
+ switch (UTF8RuneLen(*p)) {
+ case 0:
+ rune = BROKEN_RUNE;
+ return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in first byte
+
+ case 1:
+ rune = *p; //[00000000 0XXXXXXX]
+ ++p;
+ return RECODE_OK;
+
+ case 2:
+ if (p + 2 > e) {
+ return RECODE_EOINPUT;
+ } else if (!IsUTF8ContinuationByte(p[1])) {
+ rune = BROKEN_RUNE;
+ return RECODE_BROKENSYMBOL;
+ } else {
+ PutUTF8LeadBits(rune, *p++, 2); //[00000000 000XXXXX]
+ PutUTF8SixBits(rune, *p++); //[00000XXX XXYYYYYY]
+ if (Y_UNLIKELY(rune < 0x80)) { // overlong encoding
+ p -= 2;
+ rune = BROKEN_RUNE;
+ return RECODE_BROKENSYMBOL;
+ }
+ return RECODE_OK;
+ }
+ case 3:
+ if (p + 3 > e) {
+ return RECODE_EOINPUT;
+ } else if (!IsUTF8ContinuationByte(p[1]) || !IsUTF8ContinuationByte(p[2])) {
+ rune = BROKEN_RUNE;
+ return RECODE_BROKENSYMBOL;
+ } else {
+ PutUTF8LeadBits(rune, *p++, 3); //[00000000 0000XXXX]
+ PutUTF8SixBits(rune, *p++); //[000000XX XXYYYYYY]
+ PutUTF8SixBits(rune, *p++); //[XXXXYYYY YYZZZZZZ]
+ if (Y_UNLIKELY(rune < 0x800)) { // overlong encoding
+ p -= 3;
+ rune = BROKEN_RUNE;
+ return RECODE_BROKENSYMBOL;
+ }
+ return RECODE_OK;
+ }
+ case 4:
+ if (p + 4 > e) {
+ return RECODE_EOINPUT;
+ } else if (!IsUTF8ContinuationByte(p[1]) || !IsUTF8ContinuationByte(p[2]) || !IsUTF8ContinuationByte(p[3])) {
+ rune = BROKEN_RUNE;
+ return RECODE_BROKENSYMBOL;
+ } else {
+ PutUTF8LeadBits(rune, *p++, 4); //[00000000 00000000 00000XXX]
+ PutUTF8SixBits(rune, *p++); //[00000000 0000000X XXYYYYYY]
+ PutUTF8SixBits(rune, *p++); //[00000000 0XXXYYYY YYZZZZZZ]
+ PutUTF8SixBits(rune, *p++); //[000XXXYY YYYYZZZZ ZZQQQQQQ]
+ if (Y_UNLIKELY(rune < 0x10000 || rune > 0x10FFFF)) { // overlong encoding or non-valid code point
+ p -= 4;
+ rune = BROKEN_RUNE;
+ return RECODE_BROKENSYMBOL;
+ }
+ return RECODE_OK;
+ }
+ default: // >4
+ rune = BROKEN_RUNE;
+ return RECODE_BROKENSYMBOL;
+ }
+}
+
+//! writes one unicode symbol into a character sequence encoded UTF8
+//! checks for end of the buffer and returns the result of encoding
+//! @param rune value of the current character
+//! @param rune_len length of the UTF8 byte sequence that has been written
+//! @param s pointer to the output buffer
+//! @param tail available size of the buffer
+inline RECODE_RESULT SafeWriteUTF8Char(wchar32 rune, size_t& rune_len, unsigned char* s, size_t tail) {
+ rune_len = 0;
+ if (rune < 0x80) {
+ if (tail <= 0)
+ return RECODE_EOOUTPUT;
+ *s = static_cast<unsigned char>(rune);
+ rune_len = 1;
+ return RECODE_OK;
+ }
+ if (rune < 0x800) {
+ if (tail <= 1)
+ return RECODE_EOOUTPUT;
+ *s++ = static_cast<unsigned char>(0xC0 | (rune >> 6));
+ *s = static_cast<unsigned char>(0x80 | (rune & 0x3F));
+ rune_len = 2;
+ return RECODE_OK;
+ }
+ if (rune < 0x10000) {
+ if (tail <= 2)
+ return RECODE_EOOUTPUT;
+ *s++ = static_cast<unsigned char>(0xE0 | (rune >> 12));
+ *s++ = static_cast<unsigned char>(0x80 | ((rune >> 6) & 0x3F));
+ *s = static_cast<unsigned char>(0x80 | (rune & 0x3F));
+ rune_len = 3;
+ return RECODE_OK;
+ }
+ /*if (rune < 0x200000)*/ {
+ if (tail <= 3)
+ return RECODE_EOOUTPUT;
+ *s++ = static_cast<unsigned char>(0xF0 | ((rune >> 18) & 0x07));
+ *s++ = static_cast<unsigned char>(0x80 | ((rune >> 12) & 0x3F));
+ *s++ = static_cast<unsigned char>(0x80 | ((rune >> 6) & 0x3F));
+ *s = static_cast<unsigned char>(0x80 | (rune & 0x3F));
+ rune_len = 4;
+ return RECODE_OK;
+ }
+}
+
+inline RECODE_RESULT SafeWriteUTF8Char(wchar32 rune, size_t& rune_len, unsigned char* s, const unsigned char* end) {
+ return SafeWriteUTF8Char(rune, rune_len, s, end - s);
+}
+
+//! writes one unicode symbol into a character sequence encoded UTF8
+//! @attention this function works as @c SafeWriteUTF8Char it does not check
+//! the size of the output buffer, it supposes that buffer is long enough
+//! @param rune value of the current character
+//! @param rune_len length of the UTF8 byte sequence that has been written
+//! @param s pointer to the output buffer
+inline void WriteUTF8Char(wchar32 rune, size_t& rune_len, unsigned char* s) {
+ if (rune < 0x80) {
+ *s = static_cast<unsigned char>(rune);
+ rune_len = 1;
+ return;
+ }
+ if (rune < 0x800) {
+ *s++ = static_cast<unsigned char>(0xC0 | (rune >> 6));
+ *s = static_cast<unsigned char>(0x80 | (rune & 0x3F));
+ rune_len = 2;
+ return;
+ }
+ if (rune < 0x10000) {
+ *s++ = static_cast<unsigned char>(0xE0 | (rune >> 12));
+ *s++ = static_cast<unsigned char>(0x80 | ((rune >> 6) & 0x3F));
+ *s = static_cast<unsigned char>(0x80 | (rune & 0x3F));
+ rune_len = 3;
+ return;
+ }
+ /*if (rune < 0x200000)*/ {
+ *s++ = static_cast<unsigned char>(0xF0 | ((rune >> 18) & 0x07));
+ *s++ = static_cast<unsigned char>(0x80 | ((rune >> 12) & 0x3F));
+ *s++ = static_cast<unsigned char>(0x80 | ((rune >> 6) & 0x3F));
+ *s = static_cast<unsigned char>(0x80 | (rune & 0x3F));
+ rune_len = 4;
+ }
+}
+
+TStringBuf SubstrUTF8(const TStringBuf str, size_t pos, size_t len);
+
+enum EUTF8Detect {
+ NotUTF8,
+ UTF8,
+ ASCII
+};
+
+EUTF8Detect UTF8Detect(const char* s, size_t len);
+
+inline EUTF8Detect UTF8Detect(const TStringBuf input) {
+ return UTF8Detect(input.data(), input.size());
+}
+
+inline bool IsUtf(const char* input, size_t len) {
+ return UTF8Detect(input, len) != NotUTF8;
+}
+
+inline bool IsUtf(const TStringBuf input) {
+ return IsUtf(input.data(), input.size());
+}
+
+//! returns true, if result is not the same as input, and put it in newString
+//! returns false, if result is unmodified
+bool ToLowerUTF8Impl(const char* beg, size_t n, TString& newString);
+
+TString ToLowerUTF8(const TString& s);
+TString ToLowerUTF8(TStringBuf s);
+TString ToLowerUTF8(const char* s);
+
+inline TString ToLowerUTF8(const std::string& s) {
+ return ToLowerUTF8(TStringBuf(s));
+}
+
+//! returns true, if result is not the same as input, and put it in newString
+//! returns false, if result is unmodified
+bool ToUpperUTF8Impl(const char* beg, size_t n, TString& newString);
+
+TString ToUpperUTF8(const TString& s);
+TString ToUpperUTF8(TStringBuf s);
+TString ToUpperUTF8(const char* s);
diff --git a/util/charset/utf8_ut.cpp b/util/charset/utf8_ut.cpp
new file mode 100644
index 0000000000..9e68881cca
--- /dev/null
+++ b/util/charset/utf8_ut.cpp
@@ -0,0 +1,126 @@
+#include "utf8.h"
+#include "wide.h"
+
+#include <util/stream/file.h>
+#include <util/ysaveload.h>
+
+#include <library/cpp/testing/unittest/registar.h>
+#include <library/cpp/testing/unittest/env.h>
+
+Y_UNIT_TEST_SUITE(TUtfUtilTest) {
+ Y_UNIT_TEST(TestUTF8Len) {
+ UNIT_ASSERT_EQUAL(GetNumberOfUTF8Chars("привет!"), 7);
+ }
+
+ Y_UNIT_TEST(TestToLowerUtfString) {
+ UNIT_ASSERT_VALUES_EQUAL(ToLowerUTF8("xyz XYZ ПРИВЕТ!"), "xyz xyz привет!");
+
+ UNIT_ASSERT_VALUES_EQUAL(ToLowerUTF8(TStringBuf("xyz")), "xyz");
+
+ {
+ TString s = "привет!";
+ TString q = "ПРИВЕТ!";
+ TString tmp;
+ UNIT_ASSERT(ToLowerUTF8Impl(s.data(), s.size(), tmp) == false);
+ UNIT_ASSERT(ToLowerUTF8Impl(q.data(), q.size(), tmp) == true);
+ }
+
+ {
+ const char* weird = "\xC8\xBE"; // 'Ⱦ', U+023E. strlen(weird)==2, strlen(tolower_utf8(weird)) is 3
+ const char* turkI = "İ"; //strlen("İ") == 2, strlen(tolower_utf8("İ") == 1
+ TStringBuf chars[] = {"f", "F", "Б", "б", weird, turkI};
+ const int N = Y_ARRAY_SIZE(chars);
+ //try all combinations of these letters.
+ int numberOfVariants = 1;
+ for (int len = 0; len <= 4; ++len) {
+ for (int i = 0; i < numberOfVariants; ++i) {
+ TString s;
+ int k = i;
+ for (int j = 0; j < len; ++j) {
+ //Treat 'i' like number in base-N system with digits from 'chars'-array
+ s += chars[k % N];
+ k /= N;
+ }
+
+ TUtf16String tmp = UTF8ToWide(s);
+ tmp.to_lower();
+
+ UNIT_ASSERT_VALUES_EQUAL(ToLowerUTF8(s), WideToUTF8(tmp));
+ }
+ numberOfVariants *= N;
+ }
+ }
+ }
+
+ Y_UNIT_TEST(TestToUpperUtfString) {
+ UNIT_ASSERT_VALUES_EQUAL(ToUpperUTF8("xyz XYZ привет!"), "XYZ XYZ ПРИВЕТ!");
+
+ UNIT_ASSERT_VALUES_EQUAL(ToUpperUTF8(TStringBuf("XYZ")), "XYZ");
+
+ {
+ TString s = "ПРИВЕТ!";
+ TString q = "привет!";
+ TString tmp;
+ UNIT_ASSERT(ToUpperUTF8Impl(s.data(), s.size(), tmp) == false);
+ UNIT_ASSERT(ToUpperUTF8Impl(q.data(), q.size(), tmp) == true);
+ }
+
+ {
+ const char* weird = "\xC8\xBE"; // 'Ⱦ', U+023E. strlen(weird)==2, strlen(ToUpper_utf8(weird)) is 3
+ const char* turkI = "İ"; //strlen("İ") == 2, strlen(ToUpper_utf8("İ") == 1
+ TStringBuf chars[] = {"F", "f", "б", "Б", turkI, weird};
+ const int N = Y_ARRAY_SIZE(chars);
+ //try all combinations of these letters.
+ int numberOfVariants = 1;
+ for (int len = 0; len <= 4; ++len) {
+ for (int i = 0; i < numberOfVariants; ++i) {
+ TString s;
+ int k = i;
+ for (int j = 0; j < len; ++j) {
+ //Treat 'i' like number in base-N system with digits from 'chars'-array
+ s += chars[k % N];
+ k /= N;
+ }
+
+ TUtf16String tmp = UTF8ToWide(s);
+ tmp.to_upper();
+
+ UNIT_ASSERT_VALUES_EQUAL(ToUpperUTF8(s), WideToUTF8(tmp));
+ }
+ numberOfVariants *= N;
+ }
+ }
+ }
+
+ Y_UNIT_TEST(TestUTF8ToWide) {
+ TFileInput in(ArcadiaSourceRoot() + TStringBuf("/util/charset/ut/utf8/test1.txt"));
+
+ TString text = in.ReadAll();
+ UNIT_ASSERT(WideToUTF8(UTF8ToWide(text)) == text);
+ }
+
+ Y_UNIT_TEST(TestInvalidUTF8) {
+ TVector<TString> testData;
+ TFileInput input(ArcadiaSourceRoot() + TStringBuf("/util/charset/ut/utf8/invalid_UTF8.bin"));
+ Load(&input, testData);
+
+ for (const auto& text : testData) {
+ UNIT_ASSERT_EXCEPTION(UTF8ToWide(text), yexception);
+ }
+ }
+
+ Y_UNIT_TEST(TestUTF8ToWideScalar) {
+ TFileInput in(ArcadiaSourceRoot() + TStringBuf("/util/charset/ut/utf8/test1.txt"));
+
+ TString text = in.ReadAll();
+ TUtf16String wtextSSE = UTF8ToWide(text);
+ TUtf16String wtextScalar = TUtf16String::Uninitialized(text.size());
+ const unsigned char* textBegin = reinterpret_cast<const unsigned char*>(text.c_str());
+ wchar16* wtextBegin = wtextScalar.begin();
+ ::NDetail::UTF8ToWideImplScalar<false>(textBegin, textBegin + text.size(), wtextBegin);
+ UNIT_ASSERT(wtextBegin == wtextScalar.begin() + wtextSSE.size());
+ UNIT_ASSERT(textBegin == reinterpret_cast<const unsigned char*>(text.end()));
+ wtextScalar.remove(wtextSSE.size());
+ UNIT_ASSERT(wtextScalar == wtextSSE);
+ }
+}
diff --git a/util/charset/wide.cpp b/util/charset/wide.cpp
new file mode 100644
index 0000000000..a287438ddd
--- /dev/null
+++ b/util/charset/wide.cpp
@@ -0,0 +1,626 @@
+#include "wide.h"
+
+#include <util/generic/mem_copy.h>
+#include <util/string/strip.h>
+
+namespace {
+ //! the constants are not zero-terminated
+ const wchar16 LT[] = {'&', 'l', 't', ';'};
+ const wchar16 GT[] = {'&', 'g', 't', ';'};
+ const wchar16 AMP[] = {'&', 'a', 'm', 'p', ';'};
+ const wchar16 BR[] = {'<', 'B', 'R', '>'};
+ const wchar16 QUOT[] = {'&', 'q', 'u', 'o', 't', ';'};
+
+ template <bool insertBr>
+ inline size_t EscapedLen(wchar16 c) {
+ switch (c) {
+ case '<':
+ return Y_ARRAY_SIZE(LT);
+ case '>':
+ return Y_ARRAY_SIZE(GT);
+ case '&':
+ return Y_ARRAY_SIZE(AMP);
+ case '\"':
+ return Y_ARRAY_SIZE(QUOT);
+ default:
+ if (insertBr && (c == '\r' || c == '\n'))
+ return Y_ARRAY_SIZE(BR);
+ else
+ return 1;
+ }
+ }
+}
+
+void Collapse(TUtf16String& w) {
+ CollapseImpl(w, w, 0, IsWhitespace);
+}
+
+size_t Collapse(wchar16* s, size_t n) {
+ return CollapseImpl(s, n, IsWhitespace);
+}
+
+TWtringBuf StripLeft(const TWtringBuf text) noexcept {
+ const auto* p = text.data();
+ const auto* const pe = text.data() + text.size();
+
+ for (; p != pe && IsWhitespace(*p); ++p) {
+ }
+
+ return {p, pe};
+}
+
+void StripLeft(TUtf16String& text) {
+ const auto stripped = StripLeft(TWtringBuf(text));
+ if (stripped.size() == text.size()) {
+ return;
+ }
+
+ text = stripped;
+}
+
+TWtringBuf StripRight(const TWtringBuf text) noexcept {
+ if (!text) {
+ return {};
+ }
+
+ const auto* const pe = text.data() - 1;
+ const auto* p = text.data() + text.size() - 1;
+
+ for (; p != pe && IsWhitespace(*p); --p) {
+ }
+
+ return {pe + 1, p + 1};
+}
+
+void StripRight(TUtf16String& text) {
+ const auto stripped = StripRight(TWtringBuf(text));
+ if (stripped.size() == text.size()) {
+ return;
+ }
+
+ text.resize(stripped.size());
+}
+
+TWtringBuf Strip(const TWtringBuf text) noexcept {
+ return StripRight(StripLeft(text));
+}
+
+void Strip(TUtf16String& text) {
+ StripLeft(text);
+ StripRight(text);
+}
+
+template <typename T>
+static bool IsReductionOnSymbolsTrue(const TWtringBuf text, T&& f) {
+ const auto* p = text.data();
+ const auto* const pe = text.data() + text.length();
+ while (p != pe) {
+ const auto symbol = ReadSymbolAndAdvance(p, pe);
+ if (!f(symbol)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool IsLowerWord(const TWtringBuf text) noexcept {
+ return IsReductionOnSymbolsTrue(text, [](const wchar32 s) { return IsLower(s); });
+}
+
+bool IsUpperWord(const TWtringBuf text) noexcept {
+ return IsReductionOnSymbolsTrue(text, [](const wchar32 s) { return IsUpper(s); });
+}
+
+bool IsLower(const TWtringBuf text) noexcept {
+ return IsReductionOnSymbolsTrue(text, [](const wchar32 s) {
+ if (IsAlpha(s)) {
+ return IsLower(s);
+ }
+ return true;
+ });
+}
+
+bool IsUpper(const TWtringBuf text) noexcept {
+ return IsReductionOnSymbolsTrue(text, [](const wchar32 s) {
+ if (IsAlpha(s)) {
+ return IsUpper(s);
+ }
+ return true;
+ });
+}
+
+bool IsTitleWord(const TWtringBuf text) noexcept {
+ if (!text) {
+ return false;
+ }
+
+ const auto* p = text.data();
+ const auto* pe = text.data() + text.size();
+
+ const auto firstSymbol = ReadSymbolAndAdvance(p, pe);
+ if (firstSymbol != ToTitle(firstSymbol)) {
+ return false;
+ }
+
+ return IsLowerWord({p, pe});
+}
+
+template <bool stopOnFirstModification, typename TCharType, typename F>
+static bool ModifySequence(TCharType*& p, const TCharType* const pe, F&& f) {
+ while (p != pe) {
+ const auto symbol = ReadSymbol(p, pe);
+ const auto modified = f(symbol);
+ if (symbol != modified) {
+ if (stopOnFirstModification) {
+ return true;
+ }
+
+ WriteSymbol(modified, p); // also moves `p` forward
+ } else {
+ p = SkipSymbol(p, pe);
+ }
+ }
+
+ return false;
+}
+
+template <bool stopOnFirstModification, typename TCharType, typename F>
+static bool ModifySequence(const TCharType*& p, const TCharType* const pe, TCharType*& out, F&& f) {
+ while (p != pe) {
+ const auto symbol = stopOnFirstModification ? ReadSymbol(p, pe) : ReadSymbolAndAdvance(p, pe);
+ const auto modified = f(symbol);
+
+ if (stopOnFirstModification) {
+ if (symbol != modified) {
+ return true;
+ }
+
+ p = SkipSymbol(p, pe);
+ }
+
+ WriteSymbol(modified, out);
+ }
+
+ return false;
+}
+
+template <class TStringType>
+static void DetachAndFixPointers(TStringType& text, typename TStringType::value_type*& p, const typename TStringType::value_type*& pe) {
+ const auto pos = p - text.data();
+ const auto count = pe - p;
+ p = text.Detach() + pos;
+ pe = p + count;
+}
+
+template <class TStringType, typename F>
+static bool ModifyStringSymbolwise(TStringType& text, size_t pos, size_t count, F&& f) {
+ // TODO(yazevnul): this is done for consistency with `TUtf16String::to_lower` and friends
+ // at r2914050, maybe worth replacing them with asserts. Also see the same code in `ToTitle`.
+ pos = pos < text.size() ? pos : text.size();
+ count = count < text.size() - pos ? count : text.size() - pos;
+
+ // TUtf16String is refcounted and it's `data` method return pointer to the constant memory.
+ // To simplify the code we do a `const_cast`, though first write to the memory will be done only
+ // after we call `Detach()` and get pointer to a writable piece of memory.
+ auto* p = const_cast<typename TStringType::value_type*>(text.data() + pos);
+ const auto* pe = text.data() + pos + count;
+
+ if (ModifySequence<true>(p, pe, f)) {
+ DetachAndFixPointers(text, p, pe);
+ ModifySequence<false>(p, pe, f);
+ return true;
+ }
+
+ return false;
+}
+
+bool ToLower(TUtf16String& text, size_t pos, size_t count) {
+ const auto f = [](const wchar32 s) { return ToLower(s); };
+ return ModifyStringSymbolwise(text, pos, count, f);
+}
+
+bool ToUpper(TUtf16String& text, size_t pos, size_t count) {
+ const auto f = [](const wchar32 s) { return ToUpper(s); };
+ return ModifyStringSymbolwise(text, pos, count, f);
+}
+
+bool ToLower(TUtf32String& text, size_t pos, size_t count) {
+ const auto f = [](const wchar32 s) { return ToLower(s); };
+ return ModifyStringSymbolwise(text, pos, count, f);
+}
+
+bool ToUpper(TUtf32String& text, size_t pos, size_t count) {
+ const auto f = [](const wchar32 s) { return ToUpper(s); };
+ return ModifyStringSymbolwise(text, pos, count, f);
+}
+
+bool ToTitle(TUtf16String& text, size_t pos, size_t count) {
+ if (!text) {
+ return false;
+ }
+
+ pos = pos < text.size() ? pos : text.size();
+ count = count < text.size() - pos ? count : text.size() - pos;
+
+ const auto toLower = [](const wchar32 s) { return ToLower(s); };
+
+ auto* p = const_cast<wchar16*>(text.data() + pos);
+ const auto* pe = text.data() + pos + count;
+
+ const auto firstSymbol = ReadSymbol(p, pe);
+ if (firstSymbol == ToTitle(firstSymbol)) {
+ p = SkipSymbol(p, pe);
+ if (ModifySequence<true>(p, pe, toLower)) {
+ DetachAndFixPointers(text, p, pe);
+ ModifySequence<false>(p, pe, toLower);
+ return true;
+ }
+ } else {
+ DetachAndFixPointers(text, p, pe);
+ WriteSymbol(ToTitle(ReadSymbol(p, pe)), p); // also moves `p` forward
+ ModifySequence<false>(p, pe, toLower);
+ return true;
+ }
+
+ return false;
+}
+
+bool ToTitle(TUtf32String& text, size_t pos, size_t count) {
+ if (!text) {
+ return false;
+ }
+
+ pos = pos < text.size() ? pos : text.size();
+ count = count < text.size() - pos ? count : text.size() - pos;
+
+ const auto toLower = [](const wchar32 s) { return ToLower(s); };
+
+ auto* p = const_cast<wchar32*>(text.data() + pos);
+ const auto* pe = text.data() + pos + count;
+
+ const auto firstSymbol = *p;
+ if (firstSymbol == ToTitle(firstSymbol)) {
+ p += 1;
+ if (ModifySequence<true>(p, pe, toLower)) {
+ DetachAndFixPointers(text, p, pe);
+ ModifySequence<false>(p, pe, toLower);
+ return true;
+ }
+ } else {
+ DetachAndFixPointers(text, p, pe);
+ WriteSymbol(ToTitle(ReadSymbol(p, pe)), p); // also moves `p` forward
+ ModifySequence<false>(p, pe, toLower);
+ return true;
+ }
+
+ return false;
+}
+
+TUtf16String ToLowerRet(TUtf16String text, size_t pos, size_t count) {
+ ToLower(text, pos, count);
+ return text;
+}
+
+TUtf16String ToUpperRet(TUtf16String text, size_t pos, size_t count) {
+ ToUpper(text, pos, count);
+ return text;
+}
+
+TUtf16String ToTitleRet(TUtf16String text, size_t pos, size_t count) {
+ ToTitle(text, pos, count);
+ return text;
+}
+
+TUtf32String ToLowerRet(TUtf32String text, size_t pos, size_t count) {
+ ToLower(text, pos, count);
+ return text;
+}
+
+TUtf32String ToUpperRet(TUtf32String text, size_t pos, size_t count) {
+ ToUpper(text, pos, count);
+ return text;
+}
+
+TUtf32String ToTitleRet(TUtf32String text, size_t pos, size_t count) {
+ ToTitle(text, pos, count);
+ return text;
+}
+
+bool ToLower(const wchar16* text, size_t length, wchar16* out) noexcept {
+ // TODO(yazevnul): get rid of `text == out` case (it is probably used only in lemmer) and then
+ // we can declare text and out as `__restrict__`
+ Y_ASSERT(text == out || !(out >= text && out < text + length));
+ const auto f = [](const wchar32 s) { return ToLower(s); };
+ const auto* p = text;
+ const auto* const pe = text + length;
+ if (ModifySequence<true>(p, pe, out, f)) {
+ ModifySequence<false>(p, pe, out, f);
+ return true;
+ }
+ return false;
+}
+
+bool ToUpper(const wchar16* text, size_t length, wchar16* out) noexcept {
+ Y_ASSERT(text == out || !(out >= text && out < text + length));
+ const auto f = [](const wchar32 s) { return ToUpper(s); };
+ const auto* p = text;
+ const auto* const pe = text + length;
+ if (ModifySequence<true>(p, pe, out, f)) {
+ ModifySequence<false>(p, pe, out, f);
+ return true;
+ }
+ return false;
+}
+
+bool ToTitle(const wchar16* text, size_t length, wchar16* out) noexcept {
+ if (!length) {
+ return false;
+ }
+
+ Y_ASSERT(text == out || !(out >= text && out < text + length));
+
+ const auto* const textEnd = text + length;
+ const auto firstSymbol = ReadSymbolAndAdvance(text, textEnd);
+ const auto firstSymbolTitle = ToTitle(firstSymbol);
+
+ WriteSymbol(firstSymbolTitle, out);
+
+ return ToLower(text, textEnd - text, out) || firstSymbol != firstSymbolTitle;
+}
+
+bool ToLower(wchar16* text, size_t length) noexcept {
+ const auto f = [](const wchar32 s) { return ToLower(s); };
+ const auto* const textEnd = text + length;
+ if (ModifySequence<true>(text, textEnd, f)) {
+ ModifySequence<false>(text, textEnd, f);
+ return true;
+ }
+ return false;
+}
+
+bool ToUpper(wchar16* text, size_t length) noexcept {
+ const auto f = [](const wchar32 s) { return ToUpper(s); };
+ const auto* const textEnd = text + length;
+ if (ModifySequence<true>(text, textEnd, f)) {
+ ModifySequence<false>(text, textEnd, f);
+ return true;
+ }
+ return false;
+}
+
+bool ToTitle(wchar16* text, size_t length) noexcept {
+ if (!length) {
+ return false;
+ }
+
+ const auto* textEnd = text + length;
+ const auto firstSymbol = ReadSymbol(text, textEnd);
+ const auto firstSymbolTitle = ToTitle(firstSymbol);
+
+ // avoid unnacessary writes to the memory
+ if (firstSymbol != firstSymbolTitle) {
+ WriteSymbol(firstSymbolTitle, text);
+ } else {
+ text = SkipSymbol(text, textEnd);
+ }
+
+ return ToLower(text, textEnd - text) || firstSymbol != firstSymbolTitle;
+}
+
+bool ToLower(const wchar32* text, size_t length, wchar32* out) noexcept {
+ // TODO(yazevnul): get rid of `text == out` case (it is probably used only in lemmer) and then
+ // we can declare text and out as `__restrict__`
+ Y_ASSERT(text == out || !(out >= text && out < text + length));
+ const auto f = [](const wchar32 s) { return ToLower(s); };
+ const auto* p = text;
+ const auto* const pe = text + length;
+ if (ModifySequence<true>(p, pe, out, f)) {
+ ModifySequence<false>(p, pe, out, f);
+ return true;
+ }
+ return false;
+}
+
+bool ToUpper(const wchar32* text, size_t length, wchar32* out) noexcept {
+ Y_ASSERT(text == out || !(out >= text && out < text + length));
+ const auto f = [](const wchar32 s) { return ToUpper(s); };
+ const auto* p = text;
+ const auto* const pe = text + length;
+ if (ModifySequence<true>(p, pe, out, f)) {
+ ModifySequence<false>(p, pe, out, f);
+ return true;
+ }
+ return false;
+}
+
+bool ToTitle(const wchar32* text, size_t length, wchar32* out) noexcept {
+ if (!length) {
+ return false;
+ }
+
+ Y_ASSERT(text == out || !(out >= text && out < text + length));
+
+ const auto* const textEnd = text + length;
+ const auto firstSymbol = ReadSymbolAndAdvance(text, textEnd);
+ const auto firstSymbolTitle = ToTitle(firstSymbol);
+
+ WriteSymbol(firstSymbolTitle, out);
+
+ return ToLower(text, textEnd - text, out) || firstSymbol != firstSymbolTitle;
+}
+
+bool ToLower(wchar32* text, size_t length) noexcept {
+ const auto f = [](const wchar32 s) { return ToLower(s); };
+ const auto* const textEnd = text + length;
+ if (ModifySequence<true>(text, textEnd, f)) {
+ ModifySequence<false>(text, textEnd, f);
+ return true;
+ }
+ return false;
+}
+
+bool ToUpper(wchar32* text, size_t length) noexcept {
+ const auto f = [](const wchar32 s) { return ToUpper(s); };
+ const auto* const textEnd = text + length;
+ if (ModifySequence<true>(text, textEnd, f)) {
+ ModifySequence<false>(text, textEnd, f);
+ return true;
+ }
+ return false;
+}
+
+bool ToTitle(wchar32* text, size_t length) noexcept {
+ if (!length) {
+ return false;
+ }
+
+ const auto* textEnd = text + length;
+ const auto firstSymbol = ReadSymbol(text, textEnd);
+ const auto firstSymbolTitle = ToTitle(firstSymbol);
+
+ // avoid unnacessary writes to the memory
+ if (firstSymbol != firstSymbolTitle) {
+ WriteSymbol(firstSymbolTitle, text);
+ } else {
+ text = SkipSymbol(text, textEnd);
+ }
+
+ return ToLower(text, textEnd - text) || firstSymbol != firstSymbolTitle;
+}
+
+template <typename F>
+static TUtf16String ToSmthRet(const TWtringBuf text, size_t pos, size_t count, F&& f) {
+ pos = pos < text.size() ? pos : text.size();
+ count = count < text.size() - pos ? count : text.size() - pos;
+
+ auto res = TUtf16String::Uninitialized(text.size());
+ auto* const resBegin = res.Detach();
+
+ if (pos) {
+ MemCopy(resBegin, text.data(), pos);
+ }
+
+ f(text.data() + pos, count, resBegin + pos);
+
+ if (count - pos != text.size()) {
+ MemCopy(resBegin + pos + count, text.data() + pos + count, text.size() - pos - count);
+ }
+
+ return res;
+}
+
+template <typename F>
+static TUtf32String ToSmthRet(const TUtf32StringBuf text, size_t pos, size_t count, F&& f) {
+ pos = pos < text.size() ? pos : text.size();
+ count = count < text.size() - pos ? count : text.size() - pos;
+
+ auto res = TUtf32String::Uninitialized(text.size());
+ auto* const resBegin = res.Detach();
+
+ if (pos) {
+ MemCopy(resBegin, text.data(), pos);
+ }
+
+ f(text.data() + pos, count, resBegin + pos);
+
+ if (count - pos != text.size()) {
+ MemCopy(resBegin + pos + count, text.data() + pos + count, text.size() - pos - count);
+ }
+
+ return res;
+}
+
+TUtf16String ToLowerRet(const TWtringBuf text, size_t pos, size_t count) {
+ return ToSmthRet(text, pos, count, [](const wchar16* theText, size_t length, wchar16* out) {
+ ToLower(theText, length, out);
+ });
+}
+
+TUtf16String ToUpperRet(const TWtringBuf text, size_t pos, size_t count) {
+ return ToSmthRet(text, pos, count, [](const wchar16* theText, size_t length, wchar16* out) {
+ ToUpper(theText, length, out);
+ });
+}
+
+TUtf16String ToTitleRet(const TWtringBuf text, size_t pos, size_t count) {
+ return ToSmthRet(text, pos, count, [](const wchar16* theText, size_t length, wchar16* out) {
+ ToTitle(theText, length, out);
+ });
+}
+
+TUtf32String ToLowerRet(const TUtf32StringBuf text, size_t pos, size_t count) {
+ return ToSmthRet(text, pos, count, [](const wchar32* theText, size_t length, wchar32* out) {
+ ToLower(theText, length, out);
+ });
+}
+
+TUtf32String ToUpperRet(const TUtf32StringBuf text, size_t pos, size_t count) {
+ return ToSmthRet(text, pos, count, [](const wchar32* theText, size_t length, wchar32* out) {
+ ToUpper(theText, length, out);
+ });
+}
+
+TUtf32String ToTitleRet(const TUtf32StringBuf text, size_t pos, size_t count) {
+ return ToSmthRet(text, pos, count, [](const wchar32* theText, size_t length, wchar32* out) {
+ ToTitle(theText, length, out);
+ });
+}
+
+template <bool insertBr>
+void EscapeHtmlChars(TUtf16String& str) {
+ static const TUtf16String lt(LT, Y_ARRAY_SIZE(LT));
+ static const TUtf16String gt(GT, Y_ARRAY_SIZE(GT));
+ static const TUtf16String amp(AMP, Y_ARRAY_SIZE(AMP));
+ static const TUtf16String br(BR, Y_ARRAY_SIZE(BR));
+ static const TUtf16String quot(QUOT, Y_ARRAY_SIZE(QUOT));
+
+ size_t escapedLen = 0;
+
+ const TUtf16String& cs = str;
+
+ for (size_t i = 0; i < cs.size(); ++i)
+ escapedLen += EscapedLen<insertBr>(cs[i]);
+
+ if (escapedLen == cs.size())
+ return;
+
+ TUtf16String res;
+ res.reserve(escapedLen);
+
+ size_t start = 0;
+
+ for (size_t i = 0; i < cs.size(); ++i) {
+ const TUtf16String* ent = nullptr;
+ switch (cs[i]) {
+ case '<':
+ ent = &lt;
+ break;
+ case '>':
+ ent = &gt;
+ break;
+ case '&':
+ ent = &amp;
+ break;
+ case '\"':
+ ent = &quot;
+ break;
+ default:
+ if (insertBr && (cs[i] == '\r' || cs[i] == '\n')) {
+ ent = &br;
+ break;
+ } else
+ continue;
+ }
+
+ res.append(cs.begin() + start, cs.begin() + i);
+ res.append(ent->begin(), ent->end());
+ start = i + 1;
+ }
+
+ res.append(cs.begin() + start, cs.end());
+ res.swap(str);
+}
+
+template void EscapeHtmlChars<false>(TUtf16String& str);
+template void EscapeHtmlChars<true>(TUtf16String& str);
diff --git a/util/charset/wide.h b/util/charset/wide.h
new file mode 100644
index 0000000000..04e6928aab
--- /dev/null
+++ b/util/charset/wide.h
@@ -0,0 +1,843 @@
+#pragma once
+
+#include "recode_result.h"
+#include "unidata.h"
+#include "utf8.h"
+#include "wide_specific.h"
+
+#include <util/generic/algorithm.h>
+#include <util/generic/string.h>
+#include <util/generic/yexception.h>
+#include <util/memory/tempbuf.h>
+#include <util/system/compiler.h>
+#include <util/system/cpu_id.h>
+#include <util/system/yassert.h>
+
+#include <cstring>
+
+#ifdef _sse2_
+ #include <emmintrin.h>
+#endif
+
+template <class T>
+class TTempArray;
+using TCharTemp = TTempArray<wchar16>;
+
+namespace NDetail {
+ inline TString InStringMsg(const char* s, size_t len) {
+ return (len <= 50) ? " in string " + TString(s, len).Quote() : TString();
+ }
+
+ template <bool isPointer>
+ struct TSelector;
+
+ template <>
+ struct TSelector<false> {
+ template <class T>
+ static inline void WriteSymbol(wchar16 s, T& dest) noexcept {
+ dest.push_back(s);
+ }
+ };
+
+ template <>
+ struct TSelector<true> {
+ template <class T>
+ static inline void WriteSymbol(wchar16 s, T& dest) noexcept {
+ *(dest++) = s;
+ }
+ };
+
+ inline wchar32 ReadSurrogatePair(const wchar16* chars) noexcept {
+ const wchar32 SURROGATE_OFFSET = static_cast<wchar32>(0x10000 - (0xD800 << 10) - 0xDC00);
+ wchar16 lead = chars[0];
+ wchar16 tail = chars[1];
+
+ Y_ASSERT(IsW16SurrogateLead(lead));
+ Y_ASSERT(IsW16SurrogateTail(tail));
+
+ return (static_cast<wchar32>(lead) << 10) + tail + SURROGATE_OFFSET;
+ }
+
+ template <class T>
+ inline void WriteSurrogatePair(wchar32 s, T& dest) noexcept;
+
+}
+
+inline wchar16* SkipSymbol(wchar16* begin, const wchar16* end) noexcept {
+ return begin + W16SymbolSize(begin, end);
+}
+inline const wchar16* SkipSymbol(const wchar16* begin, const wchar16* end) noexcept {
+ return begin + W16SymbolSize(begin, end);
+}
+inline wchar32* SkipSymbol(wchar32* begin, const wchar32* end) noexcept {
+ Y_ASSERT(begin < end);
+ return begin + 1;
+}
+inline const wchar32* SkipSymbol(const wchar32* begin, const wchar32* end) noexcept {
+ Y_ASSERT(begin < end);
+ return begin + 1;
+}
+
+inline wchar32 ReadSymbol(const wchar16* begin, const wchar16* end) noexcept {
+ Y_ASSERT(begin < end);
+ if (IsW16SurrogateLead(*begin)) {
+ if (begin + 1 < end && IsW16SurrogateTail(*(begin + 1)))
+ return ::NDetail::ReadSurrogatePair(begin);
+
+ return BROKEN_RUNE;
+ } else if (IsW16SurrogateTail(*begin)) {
+ return BROKEN_RUNE;
+ }
+
+ return *begin;
+}
+
+inline wchar32 ReadSymbol(const wchar32* begin, const wchar32* end) noexcept {
+ Y_ASSERT(begin < end);
+ return *begin;
+}
+
+//! presuming input data is either big enought of null terminated
+inline wchar32 ReadSymbolAndAdvance(const wchar16*& begin) noexcept {
+ Y_ASSERT(*begin);
+ if (IsW16SurrogateLead(begin[0])) {
+ if (IsW16SurrogateTail(begin[1])) {
+ Y_ASSERT(begin[1] != 0);
+ const wchar32 c = ::NDetail::ReadSurrogatePair(begin);
+ begin += 2;
+ return c;
+ }
+ ++begin;
+ return BROKEN_RUNE;
+ } else if (IsW16SurrogateTail(begin[0])) {
+ ++begin;
+ return BROKEN_RUNE;
+ }
+ return *(begin++);
+}
+
+//! presuming input data is either big enought of null terminated
+inline wchar32 ReadSymbolAndAdvance(const wchar32*& begin) noexcept {
+ Y_ASSERT(*begin);
+ return *(begin++);
+}
+
+inline wchar32 ReadSymbolAndAdvance(const wchar16*& begin, const wchar16* end) noexcept {
+ Y_ASSERT(begin < end);
+ if (IsW16SurrogateLead(begin[0])) {
+ if (begin + 1 != end && IsW16SurrogateTail(begin[1])) {
+ const wchar32 c = ::NDetail::ReadSurrogatePair(begin);
+ begin += 2;
+ return c;
+ }
+ ++begin;
+ return BROKEN_RUNE;
+ } else if (IsW16SurrogateTail(begin[0])) {
+ ++begin;
+ return BROKEN_RUNE;
+ }
+ return *(begin++);
+}
+
+inline wchar32 ReadSymbolAndAdvance(const wchar32*& begin, const wchar32* end) noexcept {
+ Y_ASSERT(begin < end);
+ return *(begin++);
+}
+
+template <class T>
+inline size_t WriteSymbol(wchar16 s, T& dest) noexcept {
+ ::NDetail::TSelector<std::is_pointer<T>::value>::WriteSymbol(s, dest);
+ return 1;
+}
+
+template <class T>
+inline size_t WriteSymbol(wchar32 s, T& dest) noexcept {
+ if (s > 0xFFFF) {
+ if (s >= ::NUnicode::UnicodeInstancesLimit()) {
+ return WriteSymbol(static_cast<wchar16>(BROKEN_RUNE), dest);
+ }
+
+ ::NDetail::WriteSurrogatePair(s, dest);
+ return 2;
+ }
+
+ return WriteSymbol(static_cast<wchar16>(s), dest);
+}
+
+inline bool WriteSymbol(wchar32 s, wchar16*& dest, const wchar16* destEnd) noexcept {
+ Y_ASSERT(dest < destEnd);
+
+ if (s > 0xFFFF) {
+ if (s >= NUnicode::UnicodeInstancesLimit()) {
+ *(dest++) = static_cast<wchar16>(BROKEN_RUNE);
+ return true;
+ }
+
+ if (dest + 2 > destEnd)
+ return false;
+
+ ::NDetail::WriteSurrogatePair(s, dest);
+ } else {
+ *(dest++) = static_cast<wchar16>(s);
+ }
+
+ return true;
+}
+
+inline size_t WriteSymbol(wchar32 s, wchar32*& dest) noexcept {
+ *(dest++) = s;
+ return 1;
+}
+
+inline bool WriteSymbol(wchar32 s, wchar32*& dest, const wchar32* destEnd) noexcept {
+ Y_ASSERT(dest < destEnd);
+
+ *(dest++) = s;
+
+ return true;
+}
+
+template <class T>
+inline void ::NDetail::WriteSurrogatePair(wchar32 s, T& dest) noexcept {
+ const wchar32 LEAD_OFFSET = 0xD800 - (0x10000 >> 10);
+ Y_ASSERT(s > 0xFFFF && s < ::NUnicode::UnicodeInstancesLimit());
+
+ wchar16 lead = LEAD_OFFSET + (static_cast<wchar16>(s >> 10));
+ wchar16 tail = 0xDC00 + static_cast<wchar16>(s & 0x3FF);
+ Y_ASSERT(IsW16SurrogateLead(lead));
+ Y_ASSERT(IsW16SurrogateTail(tail));
+
+ WriteSymbol(lead, dest);
+ WriteSymbol(tail, dest);
+}
+
+class TCharIterator {
+private:
+ const wchar16* Begin;
+ const wchar16* End;
+
+public:
+ inline explicit TCharIterator(const wchar16* end)
+ : Begin(end)
+ , End(end)
+ {
+ }
+
+ inline TCharIterator(const wchar16* begin, const wchar16* end)
+ : Begin(begin)
+ , End(end)
+ {
+ }
+
+ inline TCharIterator& operator++() {
+ Begin = SkipSymbol(Begin, End);
+
+ return *this;
+ }
+
+ inline bool operator==(const wchar16* other) const {
+ return Begin == other;
+ }
+ inline bool operator!=(const wchar16* other) const {
+ return !(*this == other);
+ }
+
+ inline bool operator==(const TCharIterator& other) const {
+ return *this == other.Begin;
+ }
+ inline bool operator!=(const TCharIterator& other) const {
+ return *this != other.Begin;
+ }
+
+ inline wchar32 operator*() const {
+ return ReadSymbol(Begin, End);
+ }
+
+ inline const wchar16* Get() const {
+ return Begin;
+ }
+};
+
+namespace NDetail {
+ template <bool robust, typename TCharType>
+ inline void UTF8ToWideImplScalar(const unsigned char*& cur, const unsigned char* last, TCharType*& dest) noexcept {
+ wchar32 rune = BROKEN_RUNE;
+
+ while (cur != last) {
+ if (ReadUTF8CharAndAdvance(rune, cur, last) != RECODE_OK) {
+ if (robust) {
+ rune = BROKEN_RUNE;
+ ++cur;
+ } else {
+ break;
+ }
+ }
+
+ Y_ASSERT(cur <= last);
+ WriteSymbol(rune, dest);
+ }
+ }
+
+ template <typename TCharType>
+ inline void UTF16ToUTF32ImplScalar(const wchar16* cur, const wchar16* last, TCharType*& dest) noexcept {
+ wchar32 rune = BROKEN_RUNE;
+
+ while (cur != last) {
+ rune = ReadSymbolAndAdvance(cur, last);
+ Y_ASSERT(cur <= last);
+ WriteSymbol(rune, dest);
+ }
+ }
+
+ template <class TCharType>
+ inline void UTF8ToWideImplSSE41(const unsigned char*& /*cur*/, const unsigned char* /*last*/, TCharType*& /*dest*/) noexcept {
+ }
+
+ void UTF8ToWideImplSSE41(const unsigned char*& cur, const unsigned char* last, wchar16*& dest) noexcept;
+
+ void UTF8ToWideImplSSE41(const unsigned char*& cur, const unsigned char* last, wchar32*& dest) noexcept;
+}
+
+//! @return len if robust and position where encoding stopped if not
+template <bool robust, typename TCharType>
+inline size_t UTF8ToWideImpl(const char* text, size_t len, TCharType* dest, size_t& written) noexcept {
+ const unsigned char* cur = reinterpret_cast<const unsigned char*>(text);
+ const unsigned char* last = cur + len;
+ TCharType* p = dest;
+#ifdef _sse_ //can't check for sse4, as we build most of arcadia without sse4 support even on platforms that support it
+ if (cur + 16 <= last && NX86::CachedHaveSSE41()) {
+ ::NDetail::UTF8ToWideImplSSE41(cur, last, p);
+ }
+#endif
+
+ ::NDetail::UTF8ToWideImplScalar<robust>(cur, last, p);
+ written = p - dest;
+ return cur - reinterpret_cast<const unsigned char*>(text);
+}
+
+template <typename TCharType>
+inline size_t UTF8ToWideImpl(const char* text, size_t len, TCharType* dest, size_t& written) {
+ return UTF8ToWideImpl<false>(text, len, dest, written);
+}
+
+template <bool robust>
+inline TUtf16String UTF8ToWide(const char* text, size_t len) {
+ TUtf16String w = TUtf16String::Uninitialized(len);
+ size_t written;
+ size_t pos = UTF8ToWideImpl<robust>(text, len, w.begin(), written);
+ if (pos != len)
+ ythrow yexception() << "failed to decode UTF-8 string at pos " << pos << ::NDetail::InStringMsg(text, len);
+ Y_ASSERT(w.size() >= written);
+ w.remove(written);
+ return w;
+}
+
+template <bool robust, typename TCharType>
+inline bool UTF8ToWide(const char* text, size_t len, TCharType* dest, size_t& written) noexcept {
+ return UTF8ToWideImpl<robust>(text, len, dest, written) == len;
+}
+
+//! converts text from UTF8 to unicode, stops immediately it UTF8 byte sequence is wrong
+//! @attention destination buffer must be long enough to fit all characters of the text,
+//! conversion stops if a broken symbol is met
+//! @return @c true if all the text converted successfully, @c false - a broken symbol was found
+template <typename TCharType>
+inline bool UTF8ToWide(const char* text, size_t len, TCharType* dest, size_t& written) noexcept {
+ return UTF8ToWide<false>(text, len, dest, written);
+}
+
+template <bool robust>
+inline TWtringBuf UTF8ToWide(const TStringBuf src, TUtf16String& dst) {
+ dst.ReserveAndResize(src.size());
+ size_t written = 0;
+ UTF8ToWideImpl<robust>(src.data(), src.size(), dst.begin(), written);
+ dst.resize(written);
+ return dst;
+}
+
+//! if not robust will stop at first error position
+template <bool robust>
+inline TUtf32StringBuf UTF8ToUTF32(const TStringBuf src, TUtf32String& dst) {
+ dst.ReserveAndResize(src.size());
+ size_t written = 0;
+ UTF8ToWideImpl<robust>(src.data(), src.size(), dst.begin(), written);
+ dst.resize(written);
+ return dst;
+}
+
+inline TWtringBuf UTF8ToWide(const TStringBuf src, TUtf16String& dst) {
+ return UTF8ToWide<false>(src, dst);
+}
+
+inline TUtf16String UTF8ToWide(const char* text, size_t len) {
+ return UTF8ToWide<false>(text, len);
+}
+
+template <bool robust>
+inline TUtf16String UTF8ToWide(const TStringBuf s) {
+ return UTF8ToWide<robust>(s.data(), s.size());
+}
+
+template <bool robust>
+inline TUtf32String UTF8ToUTF32(const TStringBuf s) {
+ TUtf32String r;
+ UTF8ToUTF32<robust>(s, r);
+ return r;
+}
+
+inline TUtf16String UTF8ToWide(const TStringBuf s) {
+ return UTF8ToWide<false>(s.data(), s.size());
+}
+
+//! converts text from unicode to UTF8
+//! @attention destination buffer must be long enough to fit all characters of the text,
+//! @c WriteUTF8Char converts @c wchar32 into maximum 4 bytes of UTF8 so
+//! destination buffer must have length equal to <tt> len * 4 </tt>
+template <typename TCharType>
+inline void WideToUTF8(const TCharType* text, size_t len, char* dest, size_t& written) {
+ const TCharType* const last = text + len;
+ unsigned char* p = reinterpret_cast<unsigned char*>(dest);
+ size_t runeLen;
+ for (const TCharType* cur = text; cur != last;) {
+ WriteUTF8Char(ReadSymbolAndAdvance(cur, last), runeLen, p);
+ Y_ASSERT(runeLen <= 4);
+ p += runeLen;
+ }
+ written = p - reinterpret_cast<unsigned char*>(dest);
+}
+
+constexpr size_t WideToUTF8BufferSize(const size_t inputStringSize) noexcept {
+ return inputStringSize * 4; // * 4 because the conversion functions can convert unicode character into maximum 4 bytes of UTF8
+}
+
+inline TStringBuf WideToUTF8(const TWtringBuf src, TString& dst) {
+ dst.ReserveAndResize(WideToUTF8BufferSize(src.size()));
+ size_t written = 0;
+ WideToUTF8(src.data(), src.size(), dst.begin(), written);
+ Y_ASSERT(dst.size() >= written);
+ dst.remove(written);
+ return dst;
+}
+
+inline TString WideToUTF8(const wchar16* text, size_t len) {
+ TString s = TString::Uninitialized(WideToUTF8BufferSize(len));
+ size_t written = 0;
+ WideToUTF8(text, len, s.begin(), written);
+ Y_ASSERT(s.size() >= written);
+ s.remove(written);
+ return s;
+}
+
+inline TString WideToUTF8(const wchar32* text, size_t len) {
+ TString s = TString::Uninitialized(WideToUTF8BufferSize(len));
+ size_t written = 0;
+ WideToUTF8(text, len, s.begin(), written);
+ Y_ASSERT(s.size() >= written);
+ s.remove(written);
+ return s;
+}
+
+inline TString WideToUTF8(const TWtringBuf w) {
+ return WideToUTF8(w.data(), w.size());
+}
+
+inline TString WideToUTF8(const TUtf32StringBuf w) {
+ return WideToUTF8(w.data(), w.size());
+}
+
+inline TUtf16String UTF32ToWide(const wchar32* begin, size_t len) {
+ TUtf16String res;
+ res.reserve(len);
+
+ const wchar32* end = begin + len;
+ for (const wchar32* i = begin; i != end; ++i) {
+ WriteSymbol(*i, res);
+ }
+
+ return res;
+}
+
+// adopted from https://chromium.googlesource.com/chromium/src/+/master/base/strings/string_util.cc
+// Assuming that a pointer is the size of a "machine word", then
+// uintptr_t is an integer type that is also a machine word.
+
+namespace NDetail {
+ using TMachineWord = uintptr_t;
+ const uintptr_t kMachineWordAlignmentMask = sizeof(TMachineWord) - 1;
+
+ inline bool IsAlignedToMachineWord(const void* pointer) {
+ return !(reinterpret_cast<TMachineWord>(pointer) & kMachineWordAlignmentMask);
+ }
+
+ template <typename T>
+ inline T* AlignToMachineWord(T* pointer) {
+ return reinterpret_cast<T*>(reinterpret_cast<TMachineWord>(pointer) & ~kMachineWordAlignmentMask);
+ }
+
+ template <size_t size, typename CharacterType>
+ struct NonASCIIMask;
+
+ template <>
+ struct
+ NonASCIIMask<4, wchar16> {
+ static constexpr ui32 Value() {
+ return 0xFF80FF80U;
+ }
+ };
+
+ template <>
+ struct
+ NonASCIIMask<4, char> {
+ static constexpr ui32 Value() {
+ return 0x80808080U;
+ }
+ };
+
+ template <>
+ struct
+ NonASCIIMask<8, wchar16> {
+ static constexpr ui64 Value() {
+ return 0xFF80FF80FF80FF80ULL;
+ }
+ };
+
+ template <>
+ struct
+ NonASCIIMask<8, char> {
+ static constexpr ui64 Value() {
+ return 0x8080808080808080ULL;
+ }
+ };
+
+ template <typename TChar>
+ inline bool DoIsStringASCIISlow(const TChar* first, const TChar* last) {
+ using TUnsignedChar = std::make_unsigned_t<TChar>;
+ Y_ASSERT(first <= last);
+ for (; first != last; ++first) {
+ if (static_cast<TUnsignedChar>(*first) > 0x7F) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ template <typename TChar>
+ inline bool DoIsStringASCII(const TChar* first, const TChar* last) {
+ if (last - first < 10) {
+ return DoIsStringASCIISlow(first, last);
+ }
+ TMachineWord allCharBits = 0;
+ TMachineWord nonAsciiBitMask = NonASCIIMask<sizeof(TMachineWord), TChar>::Value();
+
+ // Prologue: align the input.
+ while (!IsAlignedToMachineWord(first) && first != last) {
+ allCharBits |= *first;
+ ++first;
+ }
+
+ // Compare the values of CPU word size.
+ const TChar* word_end = AlignToMachineWord(last);
+ const size_t loopIncrement = sizeof(TMachineWord) / sizeof(TChar);
+ while (first < word_end) {
+ allCharBits |= *(reinterpret_cast<const TMachineWord*>(first));
+ first += loopIncrement;
+
+ // fast exit
+ if (allCharBits & nonAsciiBitMask) {
+ return false;
+ }
+ }
+
+ // Process the remaining bytes.
+ while (first != last) {
+ allCharBits |= *first;
+ ++first;
+ }
+
+ return !(allCharBits & nonAsciiBitMask);
+ }
+
+#ifdef _sse2_
+ inline bool DoIsStringASCIISSE(const unsigned char* first, const unsigned char* last) {
+ //scalar version for short strings
+ if (first + 8 > last) {
+ return ::NDetail::DoIsStringASCIISlow(first, last);
+ }
+
+ alignas(16) unsigned char buf[16];
+
+ while (first + 16 <= last) {
+ memcpy(buf, first, 16);
+ __m128i chunk = _mm_load_si128(reinterpret_cast<__m128i*>(buf));
+
+ int asciiMask = _mm_movemask_epi8(chunk);
+ if (asciiMask) {
+ return false;
+ }
+ first += 16;
+ }
+
+ if (first + 8 <= last) {
+ memcpy(buf, first, 8);
+ __m128i chunk = _mm_loadl_epi64(reinterpret_cast<__m128i*>(buf));
+
+ int asciiMask = _mm_movemask_epi8(chunk);
+ if (asciiMask) {
+ return false;
+ }
+ first += 8;
+ }
+
+ return ::NDetail::DoIsStringASCIISlow(first, last);
+ }
+#endif //_sse2_
+
+}
+
+//! returns @c true if character sequence has no symbols with value greater than 0x7F
+template <typename TChar>
+inline bool IsStringASCII(const TChar* first, const TChar* last) {
+ return ::NDetail::DoIsStringASCII(first, last);
+}
+
+#ifdef _sse2_
+template <>
+inline bool IsStringASCII<unsigned char>(const unsigned char* first, const unsigned char* last) {
+ return ::NDetail::DoIsStringASCIISSE(first, last);
+}
+template <>
+inline bool IsStringASCII<char>(const char* first, const char* last) {
+ return ::NDetail::DoIsStringASCIISSE(reinterpret_cast<const unsigned char*>(first), reinterpret_cast<const unsigned char*>(last));
+}
+#endif
+
+//! copies elements from one character sequence to another using memcpy
+//! for compatibility only
+template <typename TChar>
+inline void Copy(const TChar* first, size_t len, TChar* result) {
+ memcpy(result, first, len * sizeof(TChar));
+}
+
+template <typename TChar1, typename TChar2>
+inline void Copy(const TChar1* first, size_t len, TChar2* result) {
+ Copy(first, first + len, result);
+}
+
+//! copies symbols from one character sequence to another without any conversion
+//! @note this function can be used instead of the template constructor of @c std::basic_string:
+//! template <typename InputIterator>
+//! basic_string(InputIterator begin, InputIterator end, const Allocator& a = Allocator());
+//! and the family of template member functions: append, assign, insert, replace.
+template <typename TStringType, typename TChar>
+inline TStringType CopyTo(const TChar* first, const TChar* last) {
+ Y_ASSERT(first <= last);
+ TStringType str = TStringType::Uninitialized(last - first);
+ Copy(first, last, str.begin());
+ return str;
+}
+
+template <typename TStringType, typename TChar>
+inline TStringType CopyTo(const TChar* s, size_t n) {
+ TStringType str = TStringType::Uninitialized(n);
+ Copy(s, n, str.begin());
+ return str;
+}
+
+inline TString WideToASCII(const TWtringBuf w) {
+ Y_ASSERT(IsStringASCII(w.begin(), w.end()));
+ return CopyTo<TString>(w.begin(), w.end());
+}
+
+inline TUtf16String ASCIIToWide(const TStringBuf s) {
+ Y_ASSERT(IsStringASCII(s.begin(), s.end()));
+ return CopyTo<TUtf16String>(s.begin(), s.end());
+}
+
+inline TUtf32String ASCIIToUTF32(const TStringBuf s) {
+ Y_ASSERT(IsStringASCII(s.begin(), s.end()));
+ return CopyTo<TUtf32String>(s.begin(), s.end());
+}
+
+//! returns @c true if string contains whitespace characters only
+inline bool IsSpace(const wchar16* s, size_t n) {
+ if (n == 0)
+ return false;
+
+ Y_ASSERT(s);
+
+ const wchar16* const e = s + n;
+ for (const wchar16* p = s; p != e; ++p) {
+ if (!IsWhitespace(*p))
+ return false;
+ }
+ return true;
+}
+
+//! returns @c true if string contains whitespace characters only
+inline bool IsSpace(const TWtringBuf s) {
+ return IsSpace(s.data(), s.length());
+}
+
+//! replaces multiple sequential whitespace characters with a single space character
+void Collapse(TUtf16String& w);
+
+//! @return new length
+size_t Collapse(wchar16* s, size_t n);
+
+//! Removes leading whitespace characters
+TWtringBuf StripLeft(const TWtringBuf text) noexcept Y_WARN_UNUSED_RESULT;
+void StripLeft(TUtf16String& text);
+
+//! Removes trailing whitespace characters
+TWtringBuf StripRight(const TWtringBuf text) noexcept Y_WARN_UNUSED_RESULT;
+void StripRight(TUtf16String& text);
+
+//! Removes leading and trailing whitespace characters
+TWtringBuf Strip(const TWtringBuf text) noexcept Y_WARN_UNUSED_RESULT;
+void Strip(TUtf16String& text);
+
+/* Check if given word is lowercase/uppercase. Will return false if string contains any
+ * non-alphabetical symbols. It is expected that `text` is a correct UTF-16 string.
+ *
+ * For example `IsLowerWord("hello")` will return `true`, when `IsLowerWord("hello there")` will
+ * return false because of the space in the middle of the string. Empty string is also considered
+ * lowercase.
+ */
+bool IsLowerWord(const TWtringBuf text) noexcept;
+bool IsUpperWord(const TWtringBuf text) noexcept;
+
+/* Will check if given word starts with capital letter and the rest of the word is lowercase. Will
+ * return `false` for empty string. See also `IsLowerWord`.
+ */
+bool IsTitleWord(const TWtringBuf text) noexcept;
+
+/* Check if given string is lowercase/uppercase. Will return `true` if all alphabetic symbols are
+ * in proper case, all other symbols are ignored. It is expected that `text` is a correct UTF-16
+ * string.
+ *
+ * For example `IsLowerWord("hello")` will return `true` and `IsLowerWord("hello there")` will
+ * also return true because. Empty string is also considered lowercase.
+ *
+ * NOTE: for any case where `IsLowerWord` returns `true` `IsLower` will also return `true`.
+ */
+bool IsLower(const TWtringBuf text) noexcept;
+bool IsUpper(const TWtringBuf text) noexcept;
+
+/* Lowercase/uppercase given string inplace. Any alphabetic symbol will be converted to a proper
+ * case, the rest of the symbols will be kept the same. It is expected that `text` is a correct
+ * UTF-16 string.
+ *
+ * For example `ToLower("heLLo")` will return `"hello"`.
+ *
+ * @param text String to modify
+ * @param pos Position of the first character to modify
+ * @param count Length of the substring
+ * @returns `true` if `text` was changed
+ *
+ * NOTE: `pos` and `count` are measured in `wchar16`, not in codepoints.
+ */
+bool ToLower(TUtf16String& text, size_t pos = 0, size_t count = TUtf16String::npos);
+bool ToUpper(TUtf16String& text, size_t pos = 0, size_t count = TUtf16String::npos);
+
+/* Lowercase/uppercase given string inplace. Any alphabetic symbol will be converted to a proper
+* case, the rest of the symbols will be kept the same. It is expected that `text` is a correct
+* UTF-32 string.
+*
+* For example `ToLower("heLLo")` will return `"hello"`.
+*
+* @param text String to modify
+* @param pos Position of the first character to modify
+* @param count Length of the substring
+* @returns `true` if `text` was changed
+*
+* NOTE: `pos` and `count` are measured in `wchar16`, not in codepoints.
+*/
+bool ToLower(TUtf32String& /*text*/, size_t /*pos*/ = 0, size_t /*count*/ = TUtf16String::npos);
+bool ToUpper(TUtf32String& /*text*/, size_t /*pos*/ = 0, size_t /*count*/ = TUtf16String::npos);
+
+/* Titlecase first symbol and lowercase the rest, see `ToLower` for more details.
+ */
+bool ToTitle(TUtf16String& text, size_t pos = 0, size_t count = TUtf16String::npos);
+
+/* Titlecase first symbol and lowercase the rest, see `ToLower` for more details.
+*/
+bool ToTitle(TUtf32String& /*text*/, size_t /*pos*/ = 0, size_t /*count*/ = TUtf16String::npos);
+
+/* @param text Pointer to the string to modify
+ * @param length Length of the string to modify
+ * @param out Pointer to the character array to write to
+ *
+ * NOTE: [text, text+length) and [out, out+length) should not interleave.
+ *
+ * TODO(yazevnul): replace these functions with `bool(const TWtringBuf, const TArrayRef<wchar16>)`
+ * overload.
+ */
+bool ToLower(const wchar16* text, size_t length, wchar16* out) noexcept;
+bool ToUpper(const wchar16* text, size_t length, wchar16* out) noexcept;
+bool ToTitle(const wchar16* text, size_t length, wchar16* out) noexcept;
+
+bool ToLower(const wchar32* text, size_t length, wchar32* out) noexcept;
+bool ToUpper(const wchar32* text, size_t length, wchar32* out) noexcept;
+bool ToTitle(const wchar32* text, size_t length, wchar32* out) noexcept;
+
+/* @param text Pointer to the string to modify
+ * @param length Length of the string to modify
+ *
+ * TODO(yazevnul): replace these functions with `bool(const TArrayRef<wchar16>)` overload.
+ */
+bool ToLower(wchar16* text, size_t length) noexcept;
+bool ToUpper(wchar16* text, size_t length) noexcept;
+bool ToTitle(wchar16* text, size_t length) noexcept;
+
+bool ToLower(wchar32* text, size_t length) noexcept;
+bool ToUpper(wchar32* text, size_t length) noexcept;
+bool ToTitle(wchar32* text, size_t length) noexcept;
+
+/* Convenience wrappers for `ToLower`, `ToUpper` and `ToTitle`.
+ */
+TUtf16String ToLowerRet(TUtf16String text, size_t pos = 0, size_t count = TUtf16String::npos) Y_WARN_UNUSED_RESULT;
+TUtf16String ToUpperRet(TUtf16String text, size_t pos = 0, size_t count = TUtf16String::npos) Y_WARN_UNUSED_RESULT;
+TUtf16String ToTitleRet(TUtf16String text, size_t pos = 0, size_t count = TUtf16String::npos) Y_WARN_UNUSED_RESULT;
+
+TUtf16String ToLowerRet(const TWtringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT;
+TUtf16String ToUpperRet(const TWtringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT;
+TUtf16String ToTitleRet(const TWtringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT;
+
+TUtf32String ToLowerRet(const TUtf32StringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT;
+TUtf32String ToUpperRet(const TUtf32StringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT;
+TUtf32String ToTitleRet(const TUtf32StringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT;
+
+//! replaces the '<', '>' and '&' characters in string with '&lt;', '&gt;' and '&amp;' respectively
+// insertBr=true - replace '\r' and '\n' with "<BR>"
+template <bool insertBr>
+void EscapeHtmlChars(TUtf16String& str);
+
+//! returns number of characters in range. Handle surrogate pairs as one character.
+inline size_t CountWideChars(const wchar16* b, const wchar16* e) {
+ size_t count = 0;
+ Y_ENSURE(b <= e, TStringBuf("invalid iterators"));
+ while (b < e) {
+ b = SkipSymbol(b, e);
+ ++count;
+ }
+ return count;
+}
+
+inline size_t CountWideChars(const TWtringBuf str) {
+ return CountWideChars(str.begin(), str.end());
+}
+
+//! checks whether the range is valid UTF-16 sequence
+inline bool IsValidUTF16(const wchar16* b, const wchar16* e) {
+ Y_ENSURE(b <= e, TStringBuf("invalid iterators"));
+ while (b < e) {
+ wchar32 symbol = ReadSymbolAndAdvance(b, e);
+ if (symbol == BROKEN_RUNE)
+ return false;
+ }
+ return true;
+}
+
+inline bool IsValidUTF16(const TWtringBuf str) {
+ return IsValidUTF16(str.begin(), str.end());
+}
diff --git a/util/charset/wide_specific.h b/util/charset/wide_specific.h
new file mode 100644
index 0000000000..4ea765b94b
--- /dev/null
+++ b/util/charset/wide_specific.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include <util/system/types.h>
+#include <util/system/yassert.h>
+
+inline constexpr bool IsW16SurrogateLead(wchar16 c) noexcept {
+ return 0xD800 <= c && c <= 0xDBFF;
+}
+
+inline constexpr bool IsW16SurrogateTail(wchar16 c) noexcept {
+ return 0xDC00 <= c && c <= 0xDFFF;
+}
+
+inline size_t W16SymbolSize(const wchar16* begin, const wchar16* end) {
+ Y_ASSERT(begin < end);
+
+ if ((begin + 1 != end) && IsW16SurrogateLead(*begin) && IsW16SurrogateTail(*(begin + 1))) {
+ return 2;
+ }
+
+ return 1;
+}
diff --git a/util/charset/wide_sse41.cpp b/util/charset/wide_sse41.cpp
new file mode 100644
index 0000000000..d1f2a74851
--- /dev/null
+++ b/util/charset/wide_sse41.cpp
@@ -0,0 +1,247 @@
+#include <util/charset/wide.h>
+#include <util/system/types.h>
+
+#ifdef SSE41_STUB
+
+namespace NDetail {
+ void UTF8ToWideImplSSE41(const unsigned char*&, const unsigned char*, wchar16*&) noexcept {
+ }
+ void UTF8ToWideImplSSE41(const unsigned char*&, const unsigned char*, wchar32*&) noexcept {
+ }
+}
+
+#else
+
+ #include <util/system/compiler.h>
+
+ #include <cstring>
+ #include <emmintrin.h>
+ #include <smmintrin.h>
+
+//processes to the first error, or until less then 16 bytes left
+//most code taken from https://woboq.com/blog/utf-8-processing-using-simd.html
+
+//return dstAdvance 0 in case of problems
+static Y_FORCE_INLINE ui32 Unpack16BytesIntoUtf16IfNoSurrogats(const unsigned char*& cur, __m128i& utf16Low, __m128i& utf16High) {
+ unsigned char curAligned[16];
+
+ memcpy(curAligned, cur, sizeof(__m128i));
+ __m128i chunk = _mm_load_si128(reinterpret_cast<const __m128i*>(curAligned));
+
+ //only ascii characters - simple copy
+ if (!_mm_movemask_epi8(chunk)) {
+ utf16Low = _mm_unpacklo_epi8(chunk, _mm_setzero_si128());
+ utf16High = _mm_unpackhi_epi8(chunk, _mm_setzero_si128());
+ cur += 16;
+ return 16;
+ }
+
+ __m128i chunkSigned = _mm_add_epi8(chunk, _mm_set1_epi8(0x80));
+ __m128i isAsciiMask = _mm_cmpgt_epi8(chunk, _mm_set1_epi8(0));
+
+ __m128i cond2 = _mm_cmplt_epi8(_mm_set1_epi8(0xc2 - 1 - 0x80), chunkSigned);
+ __m128i state = _mm_set1_epi8(0x0 | (char)0x80);
+
+ __m128i cond3 = _mm_cmplt_epi8(_mm_set1_epi8(0xe0 - 1 - 0x80), chunkSigned);
+ state = _mm_blendv_epi8(state, _mm_set1_epi8(0x2 | (char)0xc0), cond2);
+
+ int sourceAdvance;
+ __m128i shifts;
+ __m128i chunkLow, chunkHigh;
+
+ if (Y_LIKELY(!_mm_movemask_epi8(cond3))) {
+ //main case: no bloks of size 3 or 4
+
+ //rune len for start of multi-byte sequences (0 for b0... and b10..., 2 for b110..., etc.)
+ __m128i count = _mm_and_si128(state, _mm_set1_epi8(0x7));
+
+ __m128i countSub1 = _mm_subs_epu8(count, _mm_set1_epi8(0x1));
+
+ shifts = countSub1;
+ __m128i continuation1 = _mm_slli_si128(countSub1, 1);
+
+ shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 1));
+ shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 2));
+
+ __m128i counts = _mm_or_si128(count, continuation1);
+
+ __m128i isBeginMultibyteMask = _mm_cmpgt_epi8(count, _mm_set1_epi8(0));
+ __m128i needNoContinuationMask = _mm_cmpeq_epi8(continuation1, _mm_set1_epi8(0));
+ __m128i isBeginMask = _mm_add_epi8(isBeginMultibyteMask, isAsciiMask);
+ //each symbol should be exactly one of ascii, continuation or begin
+ __m128i okMask = _mm_cmpeq_epi8(isBeginMask, needNoContinuationMask);
+
+ if (_mm_movemask_epi8(okMask) != 0xFFFF) {
+ return 0;
+ }
+
+ shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 4));
+
+ __m128i mask = _mm_and_si128(state, _mm_set1_epi8(0xf8));
+ shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 8));
+
+ chunk = _mm_andnot_si128(mask, chunk); // from now on, we only have usefull bits
+ shifts = _mm_and_si128(shifts, _mm_cmplt_epi8(counts, _mm_set1_epi8(2))); // <=1
+
+ __m128i chunk_right = _mm_slli_si128(chunk, 1);
+ shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 1),
+ _mm_srli_si128(_mm_slli_epi16(shifts, 7), 1));
+
+ chunkLow = _mm_blendv_epi8(chunk,
+ _mm_or_si128(chunk, _mm_and_si128(_mm_slli_epi16(chunk_right, 6), _mm_set1_epi8(0xc0))),
+ _mm_cmpeq_epi8(counts, _mm_set1_epi8(1)));
+
+ chunkHigh = _mm_and_si128(chunk, _mm_cmpeq_epi8(counts, _mm_set1_epi8(2)));
+
+ shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 2),
+ _mm_srli_si128(_mm_slli_epi16(shifts, 6), 2));
+ chunkHigh = _mm_srli_epi32(chunkHigh, 2);
+
+ shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 4),
+ _mm_srli_si128(_mm_slli_epi16(shifts, 5), 4));
+
+ int c = _mm_extract_epi16(counts, 7);
+ sourceAdvance = !(c & 0x0200) ? 16 : 15;
+
+ } else {
+ __m128i mask3 = _mm_slli_si128(cond3, 1);
+
+ __m128i cond4 = _mm_cmplt_epi8(_mm_set1_epi8(0xf0 - 1 - 0x80), chunkSigned);
+ state = _mm_blendv_epi8(state, _mm_set1_epi8(0x3 | (char)0xe0), cond3);
+
+ // 4 bytes sequences are not vectorize. Fall back to the scalar processing
+ if (Y_UNLIKELY(_mm_movemask_epi8(cond4))) {
+ return 0;
+ }
+
+ //rune len for start of multi-byte sequences (0 for b0... and b10..., 2 for b110..., etc.)
+ __m128i count = _mm_and_si128(state, _mm_set1_epi8(0x7));
+
+ __m128i countSub1 = _mm_subs_epu8(count, _mm_set1_epi8(0x1));
+ __m128i continuation2 = _mm_slli_si128(_mm_subs_epu8(count, _mm_set1_epi8(0x2)), 2);
+
+ shifts = countSub1;
+ __m128i continuation1 = _mm_slli_si128(countSub1, 1);
+
+ shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 1));
+ __m128i continuationsRunelen = _mm_or_si128(continuation1, continuation2);
+
+ shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 2));
+ __m128i counts = _mm_or_si128(count, continuationsRunelen);
+
+ __m128i isBeginMultibyteMask = _mm_cmpgt_epi8(count, _mm_set1_epi8(0));
+ __m128i needNoContinuationMask = _mm_cmpeq_epi8(continuationsRunelen, _mm_set1_epi8(0));
+ __m128i isBeginMask = _mm_add_epi8(isBeginMultibyteMask, isAsciiMask);
+ //each symbol should be exactly one of ascii, continuation or begin
+ __m128i okMask = _mm_cmpeq_epi8(isBeginMask, needNoContinuationMask);
+
+ if (_mm_movemask_epi8(okMask) != 0xFFFF) {
+ return 0;
+ }
+
+ shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 4));
+
+ __m128i mask = _mm_and_si128(state, _mm_set1_epi8(0xf8));
+ shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 8));
+
+ chunk = _mm_andnot_si128(mask, chunk); // from now on, we only have usefull bits
+ shifts = _mm_and_si128(shifts, _mm_cmplt_epi8(counts, _mm_set1_epi8(2))); // <=1
+
+ __m128i chunk_right = _mm_slli_si128(chunk, 1);
+ shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 1),
+ _mm_srli_si128(_mm_slli_epi16(shifts, 7), 1));
+
+ chunkLow = _mm_blendv_epi8(chunk,
+ _mm_or_si128(chunk, _mm_and_si128(_mm_slli_epi16(chunk_right, 6), _mm_set1_epi8(0xc0))),
+ _mm_cmpeq_epi8(counts, _mm_set1_epi8(1)));
+
+ chunkHigh = _mm_and_si128(chunk, _mm_cmpeq_epi8(counts, _mm_set1_epi8(2)));
+
+ shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 2),
+ _mm_srli_si128(_mm_slli_epi16(shifts, 6), 2));
+ chunkHigh = _mm_srli_epi32(chunkHigh, 2);
+
+ shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 4),
+ _mm_srli_si128(_mm_slli_epi16(shifts, 5), 4));
+ chunkHigh = _mm_or_si128(chunkHigh,
+ _mm_and_si128(_mm_and_si128(_mm_slli_epi32(chunk_right, 4), _mm_set1_epi8(0xf0)),
+ mask3));
+
+ int c = _mm_extract_epi16(counts, 7);
+ sourceAdvance = !(c & 0x0200) ? 16 : !(c & 0x02) ? 15
+ : 14;
+ }
+
+ shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 8),
+ _mm_srli_si128(_mm_slli_epi16(shifts, 4), 8));
+
+ chunkHigh = _mm_slli_si128(chunkHigh, 1);
+
+ __m128i shuf = _mm_add_epi8(shifts, _mm_set_epi8(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
+
+ chunkLow = _mm_shuffle_epi8(chunkLow, shuf);
+ chunkHigh = _mm_shuffle_epi8(chunkHigh, shuf);
+
+ utf16Low = _mm_unpacklo_epi8(chunkLow, chunkHigh);
+ utf16High = _mm_unpackhi_epi8(chunkLow, chunkHigh);
+
+ ui32 s = _mm_extract_epi32(shifts, 3);
+ ui32 destAdvance = sourceAdvance - (0xff & (s >> (8 * (3 - 16 + sourceAdvance))));
+ cur += sourceAdvance;
+ return destAdvance;
+}
+
+namespace NDetail {
+ void UTF8ToWideImplSSE41(const unsigned char*& cur, const unsigned char* last, wchar16*& dest) noexcept {
+ alignas(16) wchar16 destAligned[16];
+
+ while (cur + 16 <= last) {
+ __m128i utf16Low;
+ __m128i utf16High;
+ ui32 dstAdvance = Unpack16BytesIntoUtf16IfNoSurrogats(cur, utf16Low, utf16High);
+
+ if (dstAdvance == 0) {
+ break;
+ }
+
+ _mm_store_si128(reinterpret_cast<__m128i*>(destAligned), utf16Low);
+ _mm_store_si128(reinterpret_cast<__m128i*>(destAligned) + 1, utf16High);
+ memcpy(dest, destAligned, sizeof(__m128i) * 2);
+ dest += dstAdvance;
+ }
+ //The rest will be handled sequencially.
+ // Possible improvement: go back to the vectorized processing after the error or the 4 byte sequence
+ }
+
+ void UTF8ToWideImplSSE41(const unsigned char*& cur, const unsigned char* last, wchar32*& dest) noexcept {
+ alignas(16) wchar32 destAligned[16];
+
+ while (cur + 16 <= last) {
+ __m128i utf16Low;
+ __m128i utf16High;
+ ui32 dstAdvance = Unpack16BytesIntoUtf16IfNoSurrogats(cur, utf16Low, utf16High);
+
+ if (dstAdvance == 0) {
+ break;
+ }
+
+ //NOTE: we only work in case without surrogat pairs, so we can make simple copying with zeroes in 2 high bytes
+ __m128i utf32_lowlow = _mm_unpacklo_epi16(utf16Low, _mm_set1_epi8(0));
+ __m128i utf32_lowhigh = _mm_unpackhi_epi16(utf16Low, _mm_set1_epi8(0));
+ __m128i utf32_highlow = _mm_unpacklo_epi16(utf16High, _mm_set1_epi8(0));
+ __m128i utf32_highhigh = _mm_unpackhi_epi16(utf16High, _mm_set1_epi8(0));
+
+ _mm_store_si128(reinterpret_cast<__m128i*>(destAligned), utf32_lowlow);
+ _mm_store_si128(reinterpret_cast<__m128i*>(destAligned) + 1, utf32_lowhigh);
+ _mm_store_si128(reinterpret_cast<__m128i*>(destAligned) + 2, utf32_highlow);
+ _mm_store_si128(reinterpret_cast<__m128i*>(destAligned) + 3, utf32_highhigh);
+
+ memcpy(dest, destAligned, sizeof(__m128i) * 4);
+ dest += dstAdvance;
+ }
+ //The rest will be handled sequencially.
+ // Possible improvement: go back to the vectorized processing after the error or the 4 byte sequence
+ }
+}
+
+#endif
diff --git a/util/charset/wide_ut.cpp b/util/charset/wide_ut.cpp
new file mode 100644
index 0000000000..d8f3233e73
--- /dev/null
+++ b/util/charset/wide_ut.cpp
@@ -0,0 +1,1742 @@
+#include "utf8.h"
+#include "wide.h"
+
+#include <library/cpp/testing/unittest/registar.h>
+
+#include <util/string/reverse.h>
+
+#include <algorithm>
+
+namespace {
+ //! three UTF8 encoded russian letters (A, B, V)
+ const char utext[] = "\xd0\x90\xd0\x91\xd0\x92";
+
+ const char asciiLatinAlphabet[] = "ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz";
+ const wchar16 wideLatinAlphabet[] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'g', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0};
+ const wchar16 wideCyrillicAlphabet[] = {
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x00};
+ const char utf8CyrillicAlphabet[] =
+ "\xd0\x90\xd0\x91\xd0\x92\xd0\x93\xd0\x94\xd0\x95\xd0\x96\xd0\x97"
+ "\xd0\x98\xd0\x99\xd0\x9a\xd0\x9b\xd0\x9c\xd0\x9d\xd0\x9e\xd0\x9f"
+ "\xd0\xa0\xd0\xa1\xd0\xa2\xd0\xa3\xd0\xa4\xd0\xa5\xd0\xa6\xd0\xa7"
+ "\xd0\xa8\xd0\xa9\xd0\xaa\xd0\xab\xd0\xac\xd0\xad\xd0\xae\xd0\xaf"
+ "\xd0\xb0\xd0\xb1\xd0\xb2\xd0\xb3\xd0\xb4\xd0\xb5\xd0\xb6\xd0\xb7"
+ "\xd0\xb8\xd0\xb9\xd0\xba\xd0\xbb\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xbf"
+ "\xd1\x80\xd1\x81\xd1\x82\xd1\x83\xd1\x84\xd1\x85\xd1\x86\xd1\x87"
+ "\xd1\x88\xd1\x89\xd1\x8a\xd1\x8b\xd1\x8c\xd1\x8d\xd1\x8e\xd1\x8f";
+
+ const wchar32 LEAD_BITS_MASK_2_BYTES = 0x1F;
+ const wchar32 LEAD_BITS_MASK_3_BYTES = 0x0F;
+ const wchar32 LEAD_BITS_MASK_4_BYTES = 0x07;
+
+ wchar16 ws[] = {
+ 0x0009,
+ 0x000A, 0x2028, 0x2029,
+ 0x000B,
+ 0x000C,
+ 0x000D,
+ 0x0020, 0x1680,
+ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B,
+ 0x202F, 0x205F, 0x3000,
+ 0x00A0};
+
+ const size_t CaseTestDataSize = 10;
+ wchar32 WideStringTestData[][CaseTestDataSize] = {
+ {0x01C4, 0x10428, 0x10429, 0x10447, 0x10441, 0x1C03, 0x00A0, 0x10400, 0x10415, 0x10437}, // original
+ {0x01C6, 0x10428, 0x10429, 0x10447, 0x10441, 0x1C03, 0x00A0, 0x10428, 0x1043D, 0x10437}, // lower
+ {0x01C4, 0x10400, 0x10401, 0x1041F, 0x10419, 0x1C03, 0x00A0, 0x10400, 0x10415, 0x1040F}, // upper
+ {0x01C5, 0x10428, 0x10429, 0x10447, 0x10441, 0x1C03, 0x00A0, 0x10428, 0x1043D, 0x10437}, // title
+ };
+
+ TUtf16String CreateUnicodeText() {
+ const int len = 256;
+ wchar16 text[len] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00 - 0x0F
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x10 - 0x1F
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x20 - 0x2F
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x30 - 0x3F
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x40 - 0x4F
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x50 - 0x5F
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x60 - 0x6F
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x70 - 0x7F
+
+ 0x0301, 0x00C4, 0x00D6, 0x00DC, 0x0104, 0x0106, 0x0118, 0x0141, 0x00E0, 0x00E2, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x0490, 0x00AD, // 0x80 - 0x8F
+ 0x00DF, 0x00E4, 0x00F6, 0x00FC, 0x0105, 0x0107, 0x0119, 0x0142, 0x00EB, 0x00EE, 0x00EF, 0x00F4, 0x00F9, 0x00FB, 0x0491, 0x92CF, // 0x90 - 0x9F
+ 0x00A0, 0x0143, 0x00D3, 0x015A, 0x017B, 0x0179, 0x046C, 0x00A7, 0x0401, 0x0462, 0x0472, 0x0474, 0x040E, 0x0406, 0x0404, 0x0407, // 0xA0 - 0xAF
+ 0x00B0, 0x0144, 0x00F3, 0x015B, 0x017C, 0x017A, 0x046D, 0x2116, 0x0451, 0x0463, 0x0473, 0x0475, 0x045E, 0x0456, 0x0454, 0x0457 // 0xB0 - 0xBF
+ };
+ for (int i = 0; i < len; ++i) {
+ if (i <= 0x7F) { // ASCII characters without 0x7 and 0x1B
+ text[i] = static_cast<wchar16>(i);
+ } else if (i >= 0xC0 && i <= 0xFF) { // russian characters (without YO and yo)
+ text[i] = static_cast<wchar16>(i + 0x0350); // 0x0410 - 0x044F
+ }
+ }
+ return TUtf16String(text, len);
+ }
+
+ TString CreateUTF8Text() {
+ char text[] = {
+ '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f',
+ '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f',
+ '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27', '\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f',
+ '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37', '\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f',
+ '\x40', '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47', '\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f',
+ '\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57', '\x58', '\x59', '\x5a', '\x5b', '\x5c', '\x5d', '\x5e', '\x5f',
+ '\x60', '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67', '\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f',
+ '\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77', '\x78', '\x79', '\x7a', '\x7b', '\x7c', '\x7d', '\x7e', '\x7f',
+ '\xcc', '\x81', '\xc3', '\x84', '\xc3', '\x96', '\xc3', '\x9c', '\xc4', '\x84', '\xc4', '\x86', '\xc4', '\x98', '\xc5', '\x81',
+ '\xc3', '\xa0', '\xc3', '\xa2', '\xc3', '\xa7', '\xc3', '\xa8', '\xc3', '\xa9', '\xc3', '\xaa', '\xd2', '\x90', '\xc2', '\xad',
+ '\xc3', '\x9f', '\xc3', '\xa4', '\xc3', '\xb6', '\xc3', '\xbc', '\xc4', '\x85', '\xc4', '\x87', '\xc4', '\x99', '\xc5', '\x82',
+ '\xc3', '\xab', '\xc3', '\xae', '\xc3', '\xaf', '\xc3', '\xb4', '\xc3', '\xb9', '\xc3', '\xbb', '\xd2', '\x91', '\xe9', '\x8b',
+ '\x8f', '\xc2', '\xa0', '\xc5', '\x83', '\xc3', '\x93', '\xc5', '\x9a', '\xc5', '\xbb', '\xc5', '\xb9', '\xd1', '\xac', '\xc2',
+ '\xa7', '\xd0', '\x81', '\xd1', '\xa2', '\xd1', '\xb2', '\xd1', '\xb4', '\xd0', '\x8e', '\xd0', '\x86', '\xd0', '\x84', '\xd0',
+ '\x87', '\xc2', '\xb0', '\xc5', '\x84', '\xc3', '\xb3', '\xc5', '\x9b', '\xc5', '\xbc', '\xc5', '\xba', '\xd1', '\xad', '\xe2',
+ '\x84', '\x96', '\xd1', '\x91', '\xd1', '\xa3', '\xd1', '\xb3', '\xd1', '\xb5', '\xd1', '\x9e', '\xd1', '\x96', '\xd1', '\x94',
+ '\xd1', '\x97', '\xd0', '\x90', '\xd0', '\x91', '\xd0', '\x92', '\xd0', '\x93', '\xd0', '\x94', '\xd0', '\x95', '\xd0', '\x96',
+ '\xd0', '\x97', '\xd0', '\x98', '\xd0', '\x99', '\xd0', '\x9a', '\xd0', '\x9b', '\xd0', '\x9c', '\xd0', '\x9d', '\xd0', '\x9e',
+ '\xd0', '\x9f', '\xd0', '\xa0', '\xd0', '\xa1', '\xd0', '\xa2', '\xd0', '\xa3', '\xd0', '\xa4', '\xd0', '\xa5', '\xd0', '\xa6',
+ '\xd0', '\xa7', '\xd0', '\xa8', '\xd0', '\xa9', '\xd0', '\xaa', '\xd0', '\xab', '\xd0', '\xac', '\xd0', '\xad', '\xd0', '\xae',
+ '\xd0', '\xaf', '\xd0', '\xb0', '\xd0', '\xb1', '\xd0', '\xb2', '\xd0', '\xb3', '\xd0', '\xb4', '\xd0', '\xb5', '\xd0', '\xb6',
+ '\xd0', '\xb7', '\xd0', '\xb8', '\xd0', '\xb9', '\xd0', '\xba', '\xd0', '\xbb', '\xd0', '\xbc', '\xd0', '\xbd', '\xd0', '\xbe',
+ '\xd0', '\xbf', '\xd1', '\x80', '\xd1', '\x81', '\xd1', '\x82', '\xd1', '\x83', '\xd1', '\x84', '\xd1', '\x85', '\xd1', '\x86',
+ '\xd1', '\x87', '\xd1', '\x88', '\xd1', '\x89', '\xd1', '\x8a', '\xd1', '\x8b', '\xd1', '\x8c', '\xd1', '\x8d', '\xd1', '\x8e',
+ '\xd1', '\x8f'};
+ return TString(text, Y_ARRAY_SIZE(text));
+ }
+
+ //! use this function to dump UTF8 text into a file in case of any changes
+ // void DumpUTF8Text() {
+ // TString s = WideToUTF8(UnicodeText);
+ // std::ofstream f("utf8.txt");
+ // f << std::hex;
+ // for (int i = 0; i < (int)s.size(); ++i) {
+ // f << "0x" << std::setw(2) << std::setfill('0') << (int)(ui8)s[i] << ", ";
+ // if ((i + 1) % 16 == 0)
+ // f << std::endl;
+ // }
+ // }
+
+ void CheckRecodeOK(wchar32 expected, unsigned char* first, size_t n) {
+ wchar32 w = 0;
+ const unsigned char* p = first;
+
+ RECODE_RESULT r = ReadUTF8CharAndAdvance(w, p, first + n);
+ UNIT_ASSERT(w == expected);
+ UNIT_ASSERT(size_t(p - first) == n);
+ UNIT_ASSERT(r == RECODE_OK);
+ }
+
+ void CheckBrokenSymbol(unsigned char* first, unsigned char* last) {
+ wchar32 w = 0;
+ const unsigned char* p = first;
+
+ RECODE_RESULT r = ReadUTF8CharAndAdvance(w, p, last);
+ UNIT_ASSERT(w == BROKEN_RUNE);
+ UNIT_ASSERT(p - first == 0);
+ UNIT_ASSERT(r == RECODE_BROKENSYMBOL);
+ }
+
+ void CheckEndOfInput(unsigned char* first, size_t n) {
+ wchar32 w = 0;
+ const unsigned char* p = first;
+
+ RECODE_RESULT r = ReadUTF8CharAndAdvance(w, p, first + n);
+ (void)w;
+ UNIT_ASSERT(p - first == 0);
+ UNIT_ASSERT(r == RECODE_EOINPUT);
+ }
+
+ void CheckCharLen(unsigned char* first, unsigned char* last, size_t len, RECODE_RESULT result) {
+ size_t n = 0;
+ RECODE_RESULT r = GetUTF8CharLen(n, first, last);
+ UNIT_ASSERT(n == len);
+ UNIT_ASSERT(r == result);
+ }
+}
+
+class TConversionTest: public TTestBase {
+private:
+ //! @note every of the text can have zeros in the middle
+ const TUtf16String UnicodeText_;
+ const TString Utf8Text_;
+
+private:
+ UNIT_TEST_SUITE(TConversionTest);
+ UNIT_TEST(TestReadUTF8Char);
+ UNIT_TEST(TestGetUTF8CharLen);
+ UNIT_TEST(TestWriteUTF8Char);
+ UNIT_TEST(TestUTF8ToWide);
+ UNIT_TEST(TestWideToUTF8);
+ UNIT_TEST(TestGetNumOfUTF8Chars);
+ UNIT_TEST(TestSubstrUTF8);
+ UNIT_TEST(TestUnicodeCase);
+ UNIT_TEST(TestUnicodeDetails);
+ UNIT_TEST(TestHexConversion);
+ UNIT_TEST_SUITE_END();
+
+public:
+ TConversionTest()
+ : UnicodeText_(CreateUnicodeText())
+ , Utf8Text_(CreateUTF8Text())
+ {
+ }
+
+ void TestReadUTF8Char();
+ void TestGetUTF8CharLen();
+ void TestWriteUTF8Char();
+ void TestUTF8ToWide();
+ void TestWideToUTF8();
+ void TestGetNumOfUTF8Chars();
+ void TestSubstrUTF8();
+ void TestUnicodeCase();
+ void TestUnicodeDetails();
+ void TestHexConversion();
+};
+
+UNIT_TEST_SUITE_REGISTRATION(TConversionTest);
+
+void TConversionTest::TestHexConversion() {
+ for (char ch = '0'; ch <= '9'; ++ch) {
+ UNIT_ASSERT(isxdigit(ch));
+ UNIT_ASSERT(IsHexdigit(ch));
+ }
+
+ for (char ch = 'a'; ch <= 'f'; ++ch) {
+ UNIT_ASSERT(isxdigit(ch));
+ UNIT_ASSERT(IsHexdigit(ch));
+ }
+
+ for (char ch = 'A'; ch <= 'F'; ++ch) {
+ UNIT_ASSERT(isxdigit(ch));
+ UNIT_ASSERT(IsHexdigit(ch));
+ }
+
+ for (wchar16 i = std::numeric_limits<wchar16>::min(); i < std::numeric_limits<wchar16>::max(); ++i) {
+ if (IsHexdigit(i)) {
+ UNIT_ASSERT(isxdigit(char(i)));
+ }
+ }
+}
+
+void TConversionTest::TestReadUTF8Char() {
+ wchar32 e; // expected unicode char
+ wchar32 c;
+ unsigned long u; // single UTF8 encoded character
+ unsigned char* const first = reinterpret_cast<unsigned char*>(&u);
+ unsigned char* const last = first + sizeof(u);
+
+ // all ASCII characters are converted with no change (zero converted successfully as well)
+ for (c = 0; c <= 0x7F; ++c) {
+ u = c;
+ CheckRecodeOK(c, first, 1);
+ }
+
+ // broken symbols from the second half of ASCII table (1000 0000 - 1011 1111)
+ for (c = 0x80; c <= 0xBF; ++c) {
+ u = c;
+ CheckBrokenSymbol(first, last);
+ }
+
+ // overlong encoding: leading byte of 2-byte symbol: 1100 0000 - 1100 0001
+ for (c = 0xC0; c <= 0xC1; ++c) {
+ u = c;
+ CheckBrokenSymbol(first, last);
+
+ u |= 0x8000;
+ CheckBrokenSymbol(first, first + 2);
+
+ CheckEndOfInput(first, 1);
+ }
+
+ // leading byte of 2-byte symbol: 1100 0000 - 1101 1111
+ for (c = 0xC2; c <= 0xDF; ++c) {
+ u = c;
+ CheckBrokenSymbol(first, last);
+
+ u |= 0x8000;
+ // w: 0000 0000 0000 0000 - 0000 0111 1100 0000
+ e = c & LEAD_BITS_MASK_2_BYTES;
+ e <<= 6;
+ CheckRecodeOK(e, first, 2);
+
+ CheckEndOfInput(first, 1);
+ }
+
+ // possible overlong encoding with leading byte 1110 0000
+ {
+ u = c = 0xE0;
+ CheckBrokenSymbol(first, last);
+
+ u |= 0x808000;
+ CheckBrokenSymbol(first, first + 3);
+
+ u = c | 0x80A000;
+ e = 0x800;
+ CheckRecodeOK(e, first, 3);
+
+ CheckEndOfInput(first, 2);
+ CheckEndOfInput(first, 1);
+ }
+
+ // leading byte of 3-byte symbol: 1110 0001 - 1110 1111
+ for (c = 0xE1; c <= 0xEF; ++c) {
+ u = c;
+ CheckBrokenSymbol(first, last);
+
+ u |= 0x808000;
+ // w: 0000 0000 0000 0000 - 0000 0111 1100 0000
+ e = c & LEAD_BITS_MASK_3_BYTES;
+ e <<= 12;
+ CheckRecodeOK(e, first, 3);
+
+ CheckEndOfInput(first, 2);
+ CheckEndOfInput(first, 1);
+ }
+
+ // possible overlong encoding with leading byte 1111 0000
+ {
+ u = c = 0xF0;
+ CheckBrokenSymbol(first, last);
+
+ u |= 0x80808000;
+ CheckBrokenSymbol(first, first + 4);
+
+ u = c | 0x80809000;
+ e = 0x10000;
+ CheckRecodeOK(e, first, 4);
+
+ CheckEndOfInput(first, 3);
+ CheckEndOfInput(first, 2);
+ CheckEndOfInput(first, 1);
+ }
+
+ // leading byte of 4-byte symbol: 1111 0001 - 1111 0111
+ for (c = 0xF1; c <= 0xF3; ++c) {
+ u = c;
+ CheckBrokenSymbol(first, last);
+
+ u |= 0x80808000;
+ // w: 0000 0000 0000 0000 - 0000 0111 1100 0000
+ e = c & LEAD_BITS_MASK_4_BYTES;
+ e <<= 18;
+ CheckRecodeOK(e, first, 4);
+
+ CheckEndOfInput(first, 3);
+ CheckEndOfInput(first, 2);
+ CheckEndOfInput(first, 1);
+ }
+
+ // possible invalid code points with leading byte 1111 0100
+ {
+ c = 0xF4;
+
+ u = 0x80808000 | c;
+ e = c & LEAD_BITS_MASK_4_BYTES;
+ e <<= 18;
+ CheckRecodeOK(e, first, 4);
+
+ // the largest possible Unicode code point
+ u = 0xBFBF8F00 | c;
+ e = 0x10FFFF;
+ CheckRecodeOK(e, first, 4);
+
+ u = 0x80809000 | c;
+ CheckBrokenSymbol(first, last);
+ }
+
+ // broken symbols: 1111 0101 - 1111 1111
+ for (c = 0xF5; c <= 0xFF; ++c) {
+ u = c;
+ CheckBrokenSymbol(first, last);
+ }
+}
+
+void TConversionTest::TestGetUTF8CharLen() {
+ wchar32 c;
+ unsigned long u; // single UTF8 encoded character
+ unsigned char* const first = reinterpret_cast<unsigned char*>(&u);
+ unsigned char* const last = first + sizeof(u);
+
+ // all ASCII characters are converted with no change (zero converted successfully as well)
+ for (c = 0; c <= 0x7F; ++c) {
+ u = c;
+ CheckCharLen(first, last, 1, RECODE_OK);
+ }
+
+ // broken symbols from the second half of ASCII table (1000 0000 - 1011 1111)
+ for (c = 0x80; c <= 0xBF; ++c) {
+ u = c;
+ CheckCharLen(first, last, 0, RECODE_BROKENSYMBOL);
+ }
+
+ // leading byte of 2-byte symbol: 1100 0000 - 1101 1111
+ for (c = 0xC0; c <= 0xDF; ++c) {
+ u = c;
+ CheckCharLen(first, last, 0, RECODE_BROKENSYMBOL);
+
+ u |= 0x8000;
+ // w: 0000 0000 0000 0000 - 0000 0111 1100 0000
+ CheckCharLen(first, last, 2, RECODE_OK);
+
+ CheckCharLen(first, first + 1, 0, RECODE_EOINPUT);
+ }
+
+ // leading byte of 3-byte symbol: 1110 0000 - 1110 1111
+ for (c = 0xE0; c <= 0xEF; ++c) {
+ u = c;
+ CheckCharLen(first, last, 0, RECODE_BROKENSYMBOL);
+
+ u |= 0x808000;
+ // w: 0000 0000 0000 0000 - 0000 0111 1100 0000
+ CheckCharLen(first, last, 3, RECODE_OK);
+
+ CheckCharLen(first, first + 2, 0, RECODE_EOINPUT);
+ CheckCharLen(first, first + 1, 0, RECODE_EOINPUT);
+ }
+
+ // leading byte of 4-byte symbol: 1111 0000 - 1111 0111
+ for (c = 0xF0; c <= 0xF3; ++c) {
+ u = c;
+ CheckCharLen(first, last, 0, RECODE_BROKENSYMBOL);
+
+ u |= 0x80808000;
+ // w: 0000 0000 0000 0000 - 0000 0111 1100 0000
+ CheckCharLen(first, last, 4, RECODE_OK);
+
+ CheckCharLen(first, first + 3, 0, RECODE_EOINPUT);
+ CheckCharLen(first, first + 2, 0, RECODE_EOINPUT);
+ CheckCharLen(first, first + 1, 0, RECODE_EOINPUT);
+ }
+
+ // broken symbols: 1111 1000 - 1111 1111
+ for (c = 0xF8; c <= 0xFF; ++c) {
+ u = c;
+ CheckCharLen(first, last, 0, RECODE_BROKENSYMBOL);
+ }
+}
+
+void TConversionTest::TestWriteUTF8Char() {
+ wchar32 w;
+ unsigned long u; // single UTF8 encoded character
+ size_t n;
+
+ for (w = 0x00; w < 0x80; ++w) {
+ u = 0;
+ WriteUTF8Char(w, n, reinterpret_cast<unsigned char*>(&u));
+ UNIT_ASSERT((u & 0xFFFFFF80) == 0x00000000);
+ UNIT_ASSERT(n == 1);
+ }
+
+ for (w = 0x80; w < 0x800; ++w) {
+ u = 0;
+ WriteUTF8Char(w, n, reinterpret_cast<unsigned char*>(&u));
+ UNIT_ASSERT((u & 0xFFFFC000) == 0x00008000); // see constants in ReadUTF8Char
+ UNIT_ASSERT(n == 2);
+ }
+
+ for (w = 0x800; w < 0x10000; ++w) {
+ u = 0;
+ WriteUTF8Char(w, n, reinterpret_cast<unsigned char*>(&u));
+ UNIT_ASSERT((u & 0xFFC0C000) == 0x00808000); // see constants in ReadUTF8Char
+ UNIT_ASSERT(n == 3);
+ }
+
+ for (w = 0x10000; w < 0x80; ++w) {
+ WriteUTF8Char(w, n, reinterpret_cast<unsigned char*>(&u));
+ UNIT_ASSERT((u & 0xC0C0C000) == 0x80808000); // see constants in ReadUTF8Char
+ UNIT_ASSERT(n == 4);
+ }
+}
+
+static void TestSurrogates(const char* str, const wchar16* wide, size_t wideSize) {
+ TUtf16String w = UTF8ToWide(str);
+
+ UNIT_ASSERT(w.size() == wideSize);
+ UNIT_ASSERT(!memcmp(w.c_str(), wide, wideSize));
+
+ TString s = WideToUTF8(w);
+
+ UNIT_ASSERT(s == str);
+}
+
+void TConversionTest::TestUTF8ToWide() {
+ TUtf16String w = UTF8ToWide(Utf8Text_);
+
+ UNIT_ASSERT(w.size() == 256);
+ UNIT_ASSERT(w.size() == UnicodeText_.size());
+
+ for (int i = 0; i < 256; ++i) {
+ UNIT_ASSERT_VALUES_EQUAL(w[i], UnicodeText_[i]);
+ }
+
+ wchar16 buffer[4] = {0};
+ size_t written = 0;
+ // the function must extract 2 symbols only
+ bool result = UTF8ToWide(utext, 5, buffer, written);
+ UNIT_ASSERT(!result);
+ UNIT_ASSERT(buffer[0] == 0x0410);
+ UNIT_ASSERT(buffer[1] == 0x0411);
+ UNIT_ASSERT(buffer[2] == 0x0000);
+ UNIT_ASSERT(buffer[3] == 0x0000);
+ UNIT_ASSERT(written == 2);
+
+ memset(buffer, 0, 4);
+ written = 0;
+ result = UTF8ToWide(utext, 1, buffer, written);
+ UNIT_ASSERT(!result);
+ UNIT_ASSERT(buffer[0] == 0x0000);
+ UNIT_ASSERT(buffer[1] == 0x0000);
+ UNIT_ASSERT(buffer[2] == 0x0000);
+ UNIT_ASSERT(buffer[3] == 0x0000);
+ UNIT_ASSERT(written == 0);
+
+ w = UTF8ToWide(asciiLatinAlphabet, strlen(asciiLatinAlphabet));
+ UNIT_ASSERT(w == wideLatinAlphabet);
+ w = UTF8ToWide(utf8CyrillicAlphabet, strlen(utf8CyrillicAlphabet));
+ UNIT_ASSERT(w == wideCyrillicAlphabet);
+
+ const char* utf8NonBMP = "\xf4\x80\x89\x84\xf4\x80\x89\x87\xf4\x80\x88\xba";
+ wchar16 wNonBMPDummy[] = {0xDBC0, 0xDE44, 0xDBC0, 0xDE47, 0xDBC0, 0xDE3A};
+ TestSurrogates(utf8NonBMP, wNonBMPDummy, Y_ARRAY_SIZE(wNonBMPDummy));
+
+ const char* utf8NonBMP2 = "ab\xf4\x80\x89\x87n";
+ wchar16 wNonBMPDummy2[] = {'a', 'b', 0xDBC0, 0xDE47, 'n'};
+ TestSurrogates(utf8NonBMP2, wNonBMPDummy2, Y_ARRAY_SIZE(wNonBMPDummy2));
+
+ UNIT_ASSERT_VALUES_EQUAL(WideToUTF8(UTF8ToWide(WideToUTF8(UTF8ToWide<true>(
+ "m\xFB\xB2\xA5\xAA\xAFyeuse.sexwebcamz.com")))),
+ TString(
+ "m\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBDyeuse.sexwebcamz.com"));
+}
+
+void TConversionTest::TestWideToUTF8() {
+ TString s = WideToUTF8(UnicodeText_);
+ size_t len = 0;
+ for (TUtf16String::const_iterator i = UnicodeText_.begin(), ie = UnicodeText_.end(); i != ie; ++i) {
+ len += UTF8RuneLenByUCS(*i);
+ }
+
+ UNIT_ASSERT(s.size() == Utf8Text_.size());
+ UNIT_ASSERT(s.size() == len);
+
+ for (int i = 0; i < static_cast<int>(s.size()); ++i) {
+ UNIT_ASSERT_VALUES_EQUAL(s[i], Utf8Text_[i]);
+ }
+}
+
+void TConversionTest::TestGetNumOfUTF8Chars() {
+ size_t n = 0;
+ bool result = GetNumberOfUTF8Chars(Utf8Text_.c_str(), Utf8Text_.size(), n);
+ UNIT_ASSERT(result);
+ UNIT_ASSERT(n == 256);
+
+ n = 0;
+ result = GetNumberOfUTF8Chars(utext, 5, n);
+ UNIT_ASSERT(!result);
+ UNIT_ASSERT(n == 2);
+
+ n = 0;
+ result = GetNumberOfUTF8Chars(utext, 1, n);
+ UNIT_ASSERT(!result);
+ UNIT_ASSERT(n == 0);
+
+ UNIT_ASSERT_EQUAL(GetNumberOfUTF8Chars("привет!"), 7);
+}
+
+void TConversionTest::TestSubstrUTF8() {
+ TStringBuf utextBuf(utext, sizeof(utext));
+ UNIT_ASSERT(SubstrUTF8(utextBuf, 0, 2) == utextBuf.substr(0, 4));
+ UNIT_ASSERT(SubstrUTF8(utextBuf, 1, 1) == utextBuf.substr(2, 2));
+ UNIT_ASSERT(SubstrUTF8(utextBuf, 1, 2) == utextBuf.substr(2, 4));
+ UNIT_ASSERT(SubstrUTF8(utextBuf, 1, 3) == utextBuf.substr(2, 6));
+}
+
+inline bool MustBeSurrogate(wchar32 ch) {
+ return ch > 0xFFFF;
+}
+
+void TConversionTest::TestUnicodeCase() {
+ // ToLower, ToUpper, ToTitle functions depend on equal size of both original and changed characters
+ for (wchar32 i = 0; i != NUnicode::UnicodeInstancesLimit(); ++i) {
+ UNIT_ASSERT(MustBeSurrogate(i) == MustBeSurrogate(ToLower(i)));
+ UNIT_ASSERT(MustBeSurrogate(i) == MustBeSurrogate(ToUpper(i)));
+ UNIT_ASSERT(MustBeSurrogate(i) == MustBeSurrogate(ToTitle(i)));
+ }
+}
+
+void TConversionTest::TestUnicodeDetails() {
+ TUtf16String temp;
+ for (wchar32 i = 0; i != NUnicode::UnicodeInstancesLimit(); ++i) {
+ temp.clear();
+ WriteSymbol(i, temp);
+ UNIT_ASSERT(temp.size() == W16SymbolSize(temp.c_str(), temp.c_str() + temp.size()));
+ }
+}
+
+class TWideUtilTest: public TTestBase {
+ UNIT_TEST_SUITE(TWideUtilTest);
+ UNIT_TEST(TestCollapse);
+ UNIT_TEST(TestCollapseBuffer);
+ UNIT_TEST(TestStrip);
+ UNIT_TEST(TestIsSpace);
+ UNIT_TEST(TestEscapeHtmlChars);
+ UNIT_TEST(TestToLower);
+ UNIT_TEST(TestToUpper);
+ UNIT_TEST(TestWideString);
+ UNIT_TEST(TestCountWideChars);
+ UNIT_TEST(TestIsValidUTF16);
+ UNIT_TEST(TestIsStringASCII);
+ UNIT_TEST(TestIsLowerWordStr);
+ UNIT_TEST(TestIsUpperWordStr);
+ UNIT_TEST(TestIsTitleStr);
+ UNIT_TEST(TestIsLowerStr);
+ UNIT_TEST(TestIsUpperStr);
+ UNIT_TEST(TestToLowerStr);
+ UNIT_TEST(TestToUpperStr);
+ UNIT_TEST(TestToTitleStr);
+ UNIT_TEST_SUITE_END();
+
+public:
+ void TestCollapse() {
+ TUtf16String s;
+ s.append(ws, Y_ARRAY_SIZE(ws)).append(3, 'a').append(ws, Y_ARRAY_SIZE(ws)).append(3, 'b').append(ws, Y_ARRAY_SIZE(ws));
+ Collapse(s);
+ UNIT_ASSERT(s == ASCIIToWide(" aaa bbb "));
+ {
+ const TUtf16String w(ASCIIToWide(" a b c "));
+ s = w;
+ Collapse(s);
+ UNIT_ASSERT(s == w);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.c_str() == w.c_str()); // Collapse() does not change the string at all
+#endif
+ }
+ s = ASCIIToWide(" 123 456 ");
+ Collapse(s);
+ UNIT_ASSERT(s == ASCIIToWide(" 123 456 "));
+
+ s = ASCIIToWide(" 1\n\n\n23\t 4\f\f56 ");
+ Collapse(s);
+ UNIT_ASSERT(s == ASCIIToWide(" 1 23 4 56 "));
+
+ s = ASCIIToWide(" 1\n\n\n\f\f56 ");
+ Collapse(s);
+ UNIT_ASSERT(s == ASCIIToWide(" 1 56 "));
+
+ s = ASCIIToWide(" 1\r\n,\n(\n23\t 4\f\f56 ");
+ Collapse(s);
+ UNIT_ASSERT(s == ASCIIToWide(" 1 , ( 23 4 56 "));
+
+ s = ASCIIToWide("1 23 ");
+ Collapse(s);
+ UNIT_ASSERT(s == ASCIIToWide("1 23 "));
+ {
+ const TUtf16String w = ASCIIToWide(" ");
+ s = w;
+ Collapse(s);
+ UNIT_ASSERT(s == w);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.c_str() == w.c_str()); // Collapse() does not change the string at all
+#endif
+ }
+ s = ASCIIToWide(" ");
+ Collapse(s);
+ UNIT_ASSERT(s == ASCIIToWide(" "));
+
+ s = ASCIIToWide(",\r\n\"");
+ Collapse(s);
+ UNIT_ASSERT(s == ASCIIToWide(", \""));
+
+ s = ASCIIToWide("-");
+ Collapse(s);
+ UNIT_ASSERT(s == ASCIIToWide("-"));
+
+ s.clear();
+ Collapse(s);
+ UNIT_ASSERT(s == TUtf16String());
+ }
+
+ void TestCollapseBuffer() {
+ TUtf16String s;
+ s.append(ws, Y_ARRAY_SIZE(ws)).append(3, 'a').append(ws, Y_ARRAY_SIZE(ws)).append(3, 'b').append(ws, Y_ARRAY_SIZE(ws));
+ size_t n = Collapse(s.begin(), s.size());
+ s.resize(n);
+ UNIT_ASSERT(s == ASCIIToWide(" aaa bbb "));
+
+ s = ASCIIToWide(" a b c ");
+ n = Collapse(s.begin(), s.size());
+ UNIT_ASSERT(n == s.size()); // length was not changed
+ UNIT_ASSERT(s == ASCIIToWide(" a b c "));
+
+ s = ASCIIToWide(" 123 456 ");
+ n = Collapse(s.begin(), s.size());
+ s.resize(n);
+ UNIT_ASSERT(s == ASCIIToWide(" 123 456 "));
+
+ s = ASCIIToWide(" 1\n\n\n23\t 4\f\f56 ");
+ n = Collapse(s.begin(), s.size());
+ s.resize(n);
+ UNIT_ASSERT(s == ASCIIToWide(" 1 23 4 56 "));
+
+ s = ASCIIToWide(" 1\n\n\n\f\f56 ");
+ n = Collapse(s.begin(), s.size());
+ s.resize(n);
+ UNIT_ASSERT(s == ASCIIToWide(" 1 56 "));
+
+ s = ASCIIToWide(" 1\r\n,\n(\n23\t 4\f\f56 ");
+ n = Collapse(s.begin(), s.size());
+ s.resize(n);
+ UNIT_ASSERT(s == ASCIIToWide(" 1 , ( 23 4 56 "));
+
+ s = ASCIIToWide("1 23 ");
+ n = Collapse(s.begin(), s.size());
+ s.resize(n);
+ UNIT_ASSERT(s == ASCIIToWide("1 23 "));
+
+ s = ASCIIToWide(" ");
+ n = Collapse(s.begin(), s.size());
+ UNIT_ASSERT(n == 1);
+ UNIT_ASSERT(s == ASCIIToWide(" "));
+
+ s = ASCIIToWide(" ");
+ n = Collapse(s.begin(), s.size());
+ s.resize(n);
+ UNIT_ASSERT(s == ASCIIToWide(" "));
+
+ s = ASCIIToWide(",\r\n\"");
+ n = Collapse(s.begin(), s.size());
+ s.resize(n);
+ UNIT_ASSERT(s == ASCIIToWide(", \""));
+
+ s = ASCIIToWide("-");
+ n = Collapse(s.begin(), s.size());
+ UNIT_ASSERT(n == 1);
+ UNIT_ASSERT(s == ASCIIToWide("-"));
+
+ s = ASCIIToWide("\t");
+ n = Collapse(s.begin(), s.size());
+ UNIT_ASSERT(n == 1);
+ UNIT_ASSERT(s == ASCIIToWide(" "));
+
+ s.clear();
+ n = Collapse(s.begin(), s.size());
+ UNIT_ASSERT(n == 0);
+ UNIT_ASSERT(s == TUtf16String());
+ }
+
+ void TestStrip() {
+ TUtf16String s;
+
+ Strip(s);
+ UNIT_ASSERT(s == TUtf16String());
+ StripLeft(s);
+ UNIT_ASSERT(s == TUtf16String());
+ StripRight(s);
+ UNIT_ASSERT(s == TUtf16String());
+
+ s = ASCIIToWide(" \t\r\n");
+ Strip(s);
+ UNIT_ASSERT(s == TUtf16String());
+ s = ASCIIToWide(" \t\r\n");
+ StripLeft(s);
+ UNIT_ASSERT(s == TUtf16String());
+ s = ASCIIToWide(" \t\r\n");
+ StripRight(s);
+ UNIT_ASSERT(s == TUtf16String());
+
+ s = ASCIIToWide("\t\f\va \r\n");
+ Strip(s);
+ UNIT_ASSERT(s == ASCIIToWide("a"));
+ s = ASCIIToWide("\t\f\va \r\n");
+ StripLeft(s);
+ UNIT_ASSERT(s == ASCIIToWide("a \r\n"));
+ s = ASCIIToWide("\t\f\va \r\n");
+ StripRight(s);
+ UNIT_ASSERT(s == ASCIIToWide("\t\f\va"));
+
+ s = ASCIIToWide("\r\na\r\nb\t\tc\r\n");
+ Strip(s);
+ UNIT_ASSERT(s == ASCIIToWide("a\r\nb\t\tc"));
+ s = ASCIIToWide("\r\na\r\nb\t\tc\r\n");
+ StripLeft(s);
+ UNIT_ASSERT(s == ASCIIToWide("a\r\nb\t\tc\r\n"));
+ s = ASCIIToWide("\r\na\r\nb\t\tc\r\n");
+ StripRight(s);
+ UNIT_ASSERT(s == ASCIIToWide("\r\na\r\nb\t\tc"));
+
+ const TUtf16String w(ASCIIToWide("a b"));
+ s = w;
+ Strip(s);
+ UNIT_ASSERT(s == w);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.c_str() == w.c_str()); // Strip() does not change the string at all
+#endif
+ s = w;
+ StripLeft(s);
+ UNIT_ASSERT(s == w);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.c_str() == w.c_str()); // Strip() does not change the string at all
+#endif
+ s = w;
+ StripRight(s);
+ UNIT_ASSERT(s == w);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.c_str() == w.c_str()); // Strip() does not change the string at all
+#endif
+ }
+
+ void TestIsSpace() {
+ UNIT_ASSERT(!IsSpace(TUtf16String()));
+
+ UNIT_ASSERT(IsSpace(ws, Y_ARRAY_SIZE(ws)));
+
+ TUtf16String w;
+ w.assign(ws, Y_ARRAY_SIZE(ws)).append(TUtf16String(1, '!'));
+ UNIT_ASSERT(!IsSpace(w.c_str(), w.size()));
+
+ w.assign(TUtf16String(1, '_')).append(ws, Y_ARRAY_SIZE(ws));
+ UNIT_ASSERT(!IsSpace(w.c_str(), w.size()));
+
+ w.assign(ws, Y_ARRAY_SIZE(ws)).append(TUtf16String(1, '$')).append(ws, Y_ARRAY_SIZE(ws));
+ UNIT_ASSERT(!IsSpace(w.c_str(), w.size()));
+ }
+
+ void TestEscapeHtmlChars() {
+ // characters from the first half of the ASCII table
+ for (wchar16 c = 1; c < 0x7F; ++c) {
+ TUtf16String w(1, c);
+ EscapeHtmlChars<false>(w);
+
+ switch (c) {
+ case '<':
+ UNIT_ASSERT(w == ASCIIToWide("&lt;"));
+ break;
+ case '>':
+ UNIT_ASSERT(w == ASCIIToWide("&gt;"));
+ break;
+ case '&':
+ UNIT_ASSERT(w == ASCIIToWide("&amp;"));
+ break;
+ case '"':
+ UNIT_ASSERT(w == ASCIIToWide("&quot;"));
+ break;
+ default:
+ UNIT_ASSERT(w == TUtf16String(1, c));
+ break;
+ }
+ }
+
+ for (wchar16 c = 1; c < 0x7F; ++c) {
+ TUtf16String w(1, c);
+ EscapeHtmlChars<true>(w);
+
+ switch (c) {
+ case '<':
+ UNIT_ASSERT(w == ASCIIToWide("&lt;"));
+ break;
+ case '>':
+ UNIT_ASSERT(w == ASCIIToWide("&gt;"));
+ break;
+ case '&':
+ UNIT_ASSERT(w == ASCIIToWide("&amp;"));
+ break;
+ case '"':
+ UNIT_ASSERT(w == ASCIIToWide("&quot;"));
+ break;
+ case '\r':
+ case '\n':
+ UNIT_ASSERT(w == ASCIIToWide("<BR>"));
+ break;
+ default:
+ UNIT_ASSERT(w == TUtf16String(1, c));
+ break;
+ }
+ }
+ }
+
+ void TestToLower() {
+ const size_t n = 32;
+ wchar16 upperCase[n];
+ std::copy(wideCyrillicAlphabet, wideCyrillicAlphabet + n, upperCase);
+ ToLower(upperCase, n);
+ UNIT_ASSERT(TWtringBuf(upperCase, n) == TWtringBuf(wideCyrillicAlphabet + n, n));
+ }
+
+ void TestToUpper() {
+ const size_t n = 32;
+ wchar16 lowerCase[n];
+ std::copy(wideCyrillicAlphabet + n, wideCyrillicAlphabet + n * 2, lowerCase);
+ ToUpper(lowerCase, n);
+ UNIT_ASSERT(TWtringBuf(lowerCase, n) == TWtringBuf(wideCyrillicAlphabet, n));
+ }
+
+ void TestWideString() {
+ const TUtf16String original = UTF32ToWide(WideStringTestData[0], CaseTestDataSize);
+ const TUtf16String lower = UTF32ToWide(WideStringTestData[1], CaseTestDataSize);
+ const TUtf16String upper = UTF32ToWide(WideStringTestData[2], CaseTestDataSize);
+ const TUtf16String title = UTF32ToWide(WideStringTestData[3], CaseTestDataSize);
+ TUtf16String temp;
+
+ temp = original;
+ temp.to_lower();
+ UNIT_ASSERT(temp == lower);
+
+ temp = original;
+ ToLower(temp.begin(), temp.size());
+ UNIT_ASSERT(temp == lower);
+
+ temp = original;
+ temp.to_upper();
+ UNIT_ASSERT(temp == upper);
+
+ temp = original;
+ ToUpper(temp.begin(), temp.size());
+ UNIT_ASSERT(temp == upper);
+
+ temp = original;
+ temp.to_title();
+ UNIT_ASSERT(temp == title);
+
+ temp = original;
+ ToTitle(temp.begin(), temp.size());
+ UNIT_ASSERT(temp == title);
+
+ TVector<wchar32> buffer(WideStringTestData[0], WideStringTestData[0] + CaseTestDataSize);
+ std::reverse(buffer.begin(), buffer.end());
+ const TUtf16String reversed = UTF32ToWide(buffer.data(), buffer.size());
+
+ temp = original;
+ ReverseInPlace(temp);
+ UNIT_ASSERT(temp == reversed);
+ }
+
+ void TestCountWideChars() {
+ UNIT_ASSERT_EQUAL(CountWideChars(UTF8ToWide("привет!")), 7);
+ TUtf16String wideStr = UTF8ToWide("\xf0\x9f\x92\xb8привет!");
+ UNIT_ASSERT_EQUAL(wideStr.size(), 9);
+ UNIT_ASSERT_EQUAL(CountWideChars(wideStr), 8);
+ }
+
+ void TestIsValidUTF16() {
+ static wchar16 str1[] = {'h', 'e', 'l', 'l', 'o', '!', 0};
+ static wchar16 str2[] = {'h', 'e', 'l', 'l', 'o', 0xD842, 0xDEAD, '!', 0};
+ static wchar16 str3[] = {'h', 'e', 'l', 'l', 'o', 0xD842, '!', 0};
+ static wchar16 str4[] = {'h', 'e', 'l', 'l', 'o', 0xDEAD, 0xD842, '!', 0};
+ static wchar16 str5[] = {'h', 'e', 'l', 'l', 'o', 0xD842, 0xDEAD, 0xDEAD, '!', 0};
+ UNIT_ASSERT(IsValidUTF16(TWtringBuf(str1)));
+ UNIT_ASSERT(IsValidUTF16(TWtringBuf(str2)));
+ UNIT_ASSERT(!IsValidUTF16(TWtringBuf(str3)));
+ UNIT_ASSERT(!IsValidUTF16(TWtringBuf(str4)));
+ UNIT_ASSERT(!IsValidUTF16(TWtringBuf(str5)));
+ }
+
+ void TestIsStringASCII() {
+ static char charAscii[] = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
+ static wchar16 char16Ascii[] = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'A',
+ 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6',
+ '7', '8', '9', '0', 'A', 'B', 'C', 'D', 'E', 'F', 0};
+
+ // Test a variety of the fragment start positions and lengths in order to make
+ // sure that bit masking in IsStringASCII works correctly.
+ // Also, test that a non-ASCII character will be detected regardless of its
+ // position inside the string.
+ {
+ const size_t stringLength = Y_ARRAY_SIZE(charAscii) - 1;
+ for (size_t offset = 0; offset < 8; ++offset) {
+ for (size_t len = 0, maxLen = stringLength - offset; len < maxLen; ++len) {
+ UNIT_ASSERT(IsStringASCII(charAscii + offset, charAscii + offset + len));
+ for (size_t charPos = offset; charPos < len; ++charPos) {
+ charAscii[charPos] |= '\x80';
+ UNIT_ASSERT(!IsStringASCII(charAscii + offset, charAscii + offset + len));
+ charAscii[charPos] &= ~'\x80';
+ }
+ }
+ }
+ }
+
+ {
+ const size_t stringLength = Y_ARRAY_SIZE(char16Ascii) - 1;
+ for (size_t offset = 0; offset < 4; ++offset) {
+ for (size_t len = 0, maxLen = stringLength - offset; len < maxLen; ++len) {
+ UNIT_ASSERT(IsStringASCII(char16Ascii + offset, char16Ascii + offset + len));
+
+ for (size_t charPos = offset; charPos < len; ++charPos) {
+ char16Ascii[charPos] |= 0x80;
+ UNIT_ASSERT(
+ !IsStringASCII(char16Ascii + offset, char16Ascii + offset + len));
+
+ char16Ascii[charPos] &= ~0x80;
+ // Also test when the upper half is non-zero.
+ char16Ascii[charPos] |= 0x100;
+ UNIT_ASSERT(
+ !IsStringASCII(char16Ascii + offset, char16Ascii + offset + len));
+ char16Ascii[charPos] &= ~0x100;
+ }
+ }
+ }
+ }
+ }
+
+ void TestIsLowerWordStr() {
+ UNIT_ASSERT(IsLowerWord(TWtringBuf()));
+ UNIT_ASSERT(IsLowerWord(UTF8ToWide("")));
+ UNIT_ASSERT(IsLowerWord(UTF8ToWide("test")));
+ UNIT_ASSERT(IsLowerWord(UTF8ToWide("тест"))); // "тест" is "test" in russian (cyrrilic)
+ UNIT_ASSERT(!IsLowerWord(UTF8ToWide("тест тест")));
+ UNIT_ASSERT(!IsLowerWord(UTF8ToWide("тест100500")));
+
+ UNIT_ASSERT(!IsLowerWord(UTF8ToWide("Test")));
+ UNIT_ASSERT(!IsLowerWord(UTF8ToWide("tesT")));
+ UNIT_ASSERT(!IsLowerWord(UTF8ToWide("tEst")));
+
+ UNIT_ASSERT(!IsLowerWord(UTF8ToWide("Тест")));
+ UNIT_ASSERT(!IsLowerWord(UTF8ToWide("теСт")));
+ UNIT_ASSERT(!IsLowerWord(UTF8ToWide("тесТ")));
+ }
+
+ void TestIsUpperWordStr() {
+ UNIT_ASSERT(IsUpperWord(TWtringBuf()));
+ UNIT_ASSERT(IsUpperWord(UTF8ToWide("")));
+ UNIT_ASSERT(IsUpperWord(UTF8ToWide("TEST")));
+ UNIT_ASSERT(IsUpperWord(UTF8ToWide("ТЕСТ")));
+ UNIT_ASSERT(!IsUpperWord(UTF8ToWide("тест тест")));
+ UNIT_ASSERT(!IsUpperWord(UTF8ToWide("тест100500")));
+
+ UNIT_ASSERT(!IsUpperWord(UTF8ToWide("Test")));
+ UNIT_ASSERT(!IsUpperWord(UTF8ToWide("tesT")));
+ UNIT_ASSERT(!IsUpperWord(UTF8ToWide("tEst")));
+
+ UNIT_ASSERT(!IsUpperWord(UTF8ToWide("Тест")));
+ UNIT_ASSERT(!IsUpperWord(UTF8ToWide("теСт")));
+ UNIT_ASSERT(!IsUpperWord(UTF8ToWide("тесТ")));
+ }
+
+ void TestIsTitleStr() {
+ UNIT_ASSERT(!IsTitleWord(TWtringBuf()));
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("")));
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("t")));
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("й")));
+ UNIT_ASSERT(IsTitleWord(UTF8ToWide("T")));
+ UNIT_ASSERT(IsTitleWord(UTF8ToWide("Й")));
+ UNIT_ASSERT(IsTitleWord(UTF8ToWide("Test")));
+ UNIT_ASSERT(IsTitleWord(UTF8ToWide("Тест")));
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("тест тест")));
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("тест100500")));
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("Тест тест")));
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("Тест100500")));
+
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("tesT")));
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("tEst")));
+
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("теСт")));
+ UNIT_ASSERT(!IsTitleWord(UTF8ToWide("тесТ")));
+ }
+
+ void TestIsLowerStr() {
+ UNIT_ASSERT(IsLower(TWtringBuf()));
+ UNIT_ASSERT(IsLower(UTF8ToWide("")));
+ UNIT_ASSERT(IsLower(UTF8ToWide("test")));
+ UNIT_ASSERT(IsLower(UTF8ToWide("тест"))); // "тест" is "test" in russian (cyrrilic)
+ UNIT_ASSERT(IsLower(UTF8ToWide("тест тест")));
+ UNIT_ASSERT(IsLower(UTF8ToWide("тест100500")));
+
+ UNIT_ASSERT(!IsLower(UTF8ToWide("Test")));
+ UNIT_ASSERT(!IsLower(UTF8ToWide("tesT")));
+ UNIT_ASSERT(!IsLower(UTF8ToWide("tEst")));
+
+ UNIT_ASSERT(!IsLower(UTF8ToWide("Тест")));
+ UNIT_ASSERT(!IsLower(UTF8ToWide("теСт")));
+ UNIT_ASSERT(!IsLower(UTF8ToWide("тесТ")));
+ }
+
+ void TestIsUpperStr() {
+ UNIT_ASSERT(IsUpper(TWtringBuf()));
+ UNIT_ASSERT(IsUpper(UTF8ToWide("")));
+ UNIT_ASSERT(IsUpper(UTF8ToWide("TEST")));
+ UNIT_ASSERT(IsUpper(UTF8ToWide("ТЕСТ")));
+ UNIT_ASSERT(IsUpper(UTF8ToWide("ТЕСТ ТЕСТ")));
+ UNIT_ASSERT(IsUpper(UTF8ToWide("ТЕСТ100500")));
+
+ UNIT_ASSERT(!IsUpper(UTF8ToWide("Test")));
+ UNIT_ASSERT(!IsUpper(UTF8ToWide("tesT")));
+ UNIT_ASSERT(!IsUpper(UTF8ToWide("tEst")));
+
+ UNIT_ASSERT(!IsUpper(UTF8ToWide("Тест")));
+ UNIT_ASSERT(!IsUpper(UTF8ToWide("теСт")));
+ UNIT_ASSERT(!IsUpper(UTF8ToWide("тесТ")));
+ }
+
+ void TestToLowerStr() {
+ // In these test and test for `ToUpper` and `ToTitle` we are checking that string keep
+ // pointing to the same piece of memory we are doing it the following way:
+ //
+ // TUtf16String s = ...
+ // const auto copy = s;
+ // ...
+ // UNIT_ASSERT(s.data() == copy.data())
+ //
+ // It saves us a couple lines (we are reusing `copy` later) and if one day `TString` will
+ // become non-refcounted we'll need to rewrite it to something like:
+ //
+ // TUtf16String s = ...
+ // const auto* const data = s.data();
+ // const auto length = s.length();
+ // ...
+ // UNIT_ASSERT(s.data() == data);
+ // UNIT_ASSERT(s.length() == length);
+ {
+ TUtf16String s;
+ auto writableCopy = s;
+ const auto copy = s;
+ const TUtf16String lower;
+
+ UNIT_ASSERT(!ToLower(s));
+ UNIT_ASSERT(s == lower);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToLower(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(!ToLower(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(ToLowerRet(copy) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower);
+ }
+ {
+ TUtf16String s = UTF8ToWide("");
+ auto writableCopy = s;
+ const auto copy = s;
+ const TUtf16String lower;
+
+ UNIT_ASSERT(!ToLower(s));
+ UNIT_ASSERT(s == lower);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToLower(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(!ToLower(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(ToLowerRet(copy) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower);
+ }
+ {
+ TUtf16String s;
+ const auto copy = s;
+ const TUtf16String lower;
+
+ UNIT_ASSERT(!ToLower(s, 100500));
+ UNIT_ASSERT(s == lower);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(ToLowerRet(copy, 100500) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 100500) == lower);
+ }
+ {
+ TUtf16String s;
+ const auto copy = s;
+ const TUtf16String lower;
+
+ UNIT_ASSERT(!ToLower(s, 100500, 1111));
+ UNIT_ASSERT(s == lower);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(ToLowerRet(copy, 100500, 1111) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 100500, 1111) == lower);
+ }
+ {
+ auto s = UTF8ToWide("Й");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto lower = UTF8ToWide("й");
+
+ UNIT_ASSERT(ToLower(s));
+ UNIT_ASSERT(s == lower);
+
+ UNIT_ASSERT(ToLower(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(ToLower(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(ToLowerRet(copy) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower);
+ }
+ {
+ auto s = UTF8ToWide("й");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto lower = UTF8ToWide("й");
+
+ UNIT_ASSERT(!ToLower(s));
+ UNIT_ASSERT(s == lower);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToLower(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(!ToLower(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(ToLowerRet(copy) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower);
+ }
+ {
+ auto s = UTF8ToWide("тест");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto lower = UTF8ToWide("тест");
+
+ UNIT_ASSERT(!ToLower(s));
+ UNIT_ASSERT(s == lower);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToLower(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(!ToLower(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(ToLowerRet(copy) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower);
+ }
+ {
+ auto s = UTF8ToWide("Тест");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto lower = UTF8ToWide("тест");
+
+ UNIT_ASSERT(ToLower(s));
+ UNIT_ASSERT(s == lower);
+
+ UNIT_ASSERT(ToLower(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(ToLower(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == lower);
+
+ UNIT_ASSERT(ToLowerRet(copy) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower);
+ }
+ {
+ TUtf16String s = UTF8ToWide("тЕст");
+ const auto copy = s;
+ const auto lower = UTF8ToWide("тест");
+
+ UNIT_ASSERT(ToLower(s));
+ UNIT_ASSERT(s == UTF8ToWide("тест"));
+
+ UNIT_ASSERT(ToLowerRet(copy) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower);
+ }
+ {
+ auto s = UTF8ToWide("тЕст");
+ const auto copy = s;
+ const auto lower = UTF8ToWide("тЕст");
+
+ UNIT_ASSERT(!ToLower(s, 2));
+ UNIT_ASSERT(s == lower);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(ToLowerRet(copy, 2) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 2) == lower);
+ }
+ {
+ auto s = UTF8ToWide("теСт");
+ const auto copy = s;
+ const auto lower = UTF8ToWide("тест");
+
+ UNIT_ASSERT(ToLower(s, 2));
+ UNIT_ASSERT(s == lower);
+
+ UNIT_ASSERT(ToLowerRet(copy, 2) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 2) == lower);
+ }
+ {
+ auto s = UTF8ToWide("теСт");
+ const auto copy = s;
+ const auto lower = UTF8ToWide("теСт");
+
+ UNIT_ASSERT(!ToLower(s, 3, 1));
+ UNIT_ASSERT(s == copy);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(ToLowerRet(copy, 3, 1) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 3, 1) == lower);
+ }
+ {
+ auto s = UTF8ToWide("теСт");
+ const auto copy = s;
+ const auto lower = UTF8ToWide("теСт");
+
+ UNIT_ASSERT(!ToLower(s, 3, 100500));
+ UNIT_ASSERT(s == copy);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(ToLowerRet(copy, 3, 100500) == lower);
+ UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 3, 100500) == lower);
+ }
+ }
+
+ void TestToUpperStr() {
+ {
+ TUtf16String s;
+ auto writableCopy = s;
+ const auto copy = s;
+ const TUtf16String upper;
+
+ UNIT_ASSERT(!ToUpper(s));
+ UNIT_ASSERT(s == upper);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToUpper(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(!ToUpper(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper);
+ }
+ {
+ auto s = UTF8ToWide("");
+ auto writableCopy = s;
+ const auto copy = s;
+ const TUtf16String upper;
+
+ UNIT_ASSERT(!ToUpper(s));
+ UNIT_ASSERT(s == upper);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToUpper(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(!ToUpper(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper);
+ }
+ {
+ TUtf16String s;
+ auto writableCopy = s;
+ const auto copy = s;
+ const TUtf16String upper;
+
+ UNIT_ASSERT(!ToUpper(s, 100500));
+ UNIT_ASSERT(s == upper);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToUpper(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(!ToUpper(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy, 100500) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 100500) == upper);
+ }
+ {
+ TUtf16String s;
+ const auto copy = s;
+ const TUtf16String upper;
+
+ UNIT_ASSERT(!ToUpper(s, 100500, 1111));
+ UNIT_ASSERT(s == upper);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(ToUpperRet(copy, 100500, 1111) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 100500, 1111) == upper);
+ }
+ {
+ auto s = UTF8ToWide("й");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto upper = UTF8ToWide("Й");
+
+ UNIT_ASSERT(ToUpper(s));
+ UNIT_ASSERT(s == upper);
+
+ UNIT_ASSERT(ToUpper(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpper(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper);
+ }
+ {
+ auto s = UTF8ToWide("Й");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto upper = UTF8ToWide("Й");
+
+ UNIT_ASSERT(!ToUpper(s));
+ UNIT_ASSERT(s == copy);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToUpper(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(!ToUpper(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper);
+ }
+ {
+ auto s = UTF8ToWide("тест");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto upper = UTF8ToWide("ТЕСТ");
+
+ UNIT_ASSERT(ToUpper(s));
+ UNIT_ASSERT(s == upper);
+
+ UNIT_ASSERT(ToUpper(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpper(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper);
+ }
+ {
+ auto s = UTF8ToWide("Тест");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto upper = UTF8ToWide("ТЕСТ");
+
+ UNIT_ASSERT(ToUpper(s));
+ UNIT_ASSERT(s == upper);
+
+ UNIT_ASSERT(ToUpper(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpper(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper);
+ }
+ {
+ auto s = UTF8ToWide("тЕст");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto upper = UTF8ToWide("ТЕСТ");
+
+ UNIT_ASSERT(ToUpper(s));
+ UNIT_ASSERT(s == upper);
+
+ UNIT_ASSERT(ToUpper(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpper(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper);
+ }
+ {
+ auto s = UTF8ToWide("тЕст");
+ const auto copy = s;
+ const auto upper = UTF8ToWide("тЕСТ");
+
+ UNIT_ASSERT(ToUpper(s, 2));
+ UNIT_ASSERT(s == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy, 2) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 2) == upper);
+ }
+ {
+ auto s = UTF8ToWide("теСт");
+ const auto copy = s;
+ const auto upper = UTF8ToWide("теСТ");
+
+ UNIT_ASSERT(ToUpper(s, 2));
+ UNIT_ASSERT(s == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy, 2) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 2) == upper);
+ }
+ {
+ auto s = UTF8ToWide("теСт");
+ const auto copy = s;
+ const auto upper = UTF8ToWide("теСТ");
+
+ UNIT_ASSERT(ToUpper(s, 3, 1));
+ UNIT_ASSERT(s == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy, 3, 1) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 3, 1) == upper);
+ }
+ {
+ auto s = UTF8ToWide("теСт");
+ const auto copy = s;
+ const auto upper = UTF8ToWide("теСТ");
+
+ UNIT_ASSERT(ToUpper(s, 3, 100500));
+ UNIT_ASSERT(s == upper);
+
+ UNIT_ASSERT(ToUpperRet(copy, 3, 100500) == upper);
+ UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 3, 100500) == upper);
+ }
+ }
+
+ void TestToTitleStr() {
+ {
+ TUtf16String s;
+ auto writableCopy = s;
+ const auto copy = s;
+ const TUtf16String title;
+
+ UNIT_ASSERT(!ToTitle(s));
+ UNIT_ASSERT(s == title);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToTitle(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(!ToTitle(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(ToTitleRet(copy) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title);
+ }
+ {
+ auto s = UTF8ToWide("");
+ auto writableCopy = s;
+ const auto copy = s;
+ const TUtf16String title;
+
+ UNIT_ASSERT(!ToTitle(s));
+ UNIT_ASSERT(s == title);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToTitle(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(!ToTitle(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(ToTitleRet(copy) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title);
+ }
+ {
+ TUtf16String s;
+ const auto copy = s;
+ const TUtf16String title;
+
+ UNIT_ASSERT(!ToTitle(s, 100500));
+ UNIT_ASSERT(s == title);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(ToTitleRet(copy) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title);
+ }
+ {
+ TUtf16String s;
+ const auto copy = s;
+ const TUtf16String title;
+
+ UNIT_ASSERT(!ToTitle(s, 100500, 1111));
+ UNIT_ASSERT(s == title);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(ToTitleRet(copy) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title);
+ }
+ {
+ auto s = UTF8ToWide("й");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto title = UTF8ToWide("Й");
+
+ UNIT_ASSERT(ToTitle(s));
+ UNIT_ASSERT(s == title);
+
+ UNIT_ASSERT(ToTitle(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(ToTitle(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(ToTitleRet(copy) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title);
+ }
+ {
+ auto s = UTF8ToWide("Й");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto title = UTF8ToWide("Й");
+
+ UNIT_ASSERT(!ToTitle(s));
+ UNIT_ASSERT(s == title);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToTitle(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(!ToTitle(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(ToTitleRet(copy) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title);
+ }
+ {
+ auto s = UTF8ToWide("тест");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto title = UTF8ToWide("Тест");
+
+ UNIT_ASSERT(ToTitle(s));
+ UNIT_ASSERT(s == title);
+
+ UNIT_ASSERT(ToTitle(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(ToTitle(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(ToTitleRet(copy) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title);
+ }
+ {
+ auto s = UTF8ToWide("Тест");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto title = UTF8ToWide("Тест");
+
+ UNIT_ASSERT(!ToTitle(s));
+ UNIT_ASSERT(s == title);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(!ToTitle(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(!ToTitle(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(ToTitleRet(copy) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title);
+ }
+ {
+ auto s = UTF8ToWide("тЕст");
+ auto writableCopy = s;
+ const auto copy = s;
+ const auto title = UTF8ToWide("Тест");
+
+ UNIT_ASSERT(ToTitle(s));
+ UNIT_ASSERT(s == title);
+
+ UNIT_ASSERT(ToTitle(writableCopy.Detach(), writableCopy.size()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(ToTitle(copy.data(), copy.size(), writableCopy.Detach()));
+ UNIT_ASSERT(writableCopy == title);
+
+ UNIT_ASSERT(ToTitleRet(copy) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title);
+ }
+ {
+ auto s = UTF8ToWide("тЕст");
+ const auto copy = s;
+ const auto title = UTF8ToWide("тЕСт");
+
+ UNIT_ASSERT(ToTitle(s, 2));
+ UNIT_ASSERT(s == title);
+
+ UNIT_ASSERT(ToTitleRet(copy, 2) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy), 2) == title);
+ }
+ {
+ auto s = UTF8ToWide("теСт");
+ const auto copy = s;
+ const auto title = UTF8ToWide("теСт");
+
+ UNIT_ASSERT(!ToTitle(s, 2));
+ UNIT_ASSERT(s == title);
+#ifndef TSTRING_IS_STD_STRING
+ UNIT_ASSERT(s.data() == copy.data());
+#endif
+
+ UNIT_ASSERT(ToTitleRet(copy, 2) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy), 2) == title);
+ }
+ {
+ auto s = UTF8ToWide("теСт");
+ const auto copy = s;
+ const auto title = UTF8ToWide("теСТ");
+
+ UNIT_ASSERT(ToTitle(s, 3, 1));
+ UNIT_ASSERT(s == title);
+
+ UNIT_ASSERT(ToTitleRet(copy, 3, 1) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy), 3, 1) == title);
+ }
+ {
+ auto s = UTF8ToWide("теСт");
+ const auto copy = s;
+ const auto title = UTF8ToWide("теСТ");
+
+ UNIT_ASSERT(ToTitle(s, 3, 100500));
+ UNIT_ASSERT(s == title);
+
+ UNIT_ASSERT(ToTitleRet(copy, 3, 100500) == title);
+ UNIT_ASSERT(ToTitleRet(TWtringBuf(copy), 3, 100500) == title);
+ }
+ }
+};
+
+UNIT_TEST_SUITE_REGISTRATION(TWideUtilTest);
diff --git a/util/charset/ya.make b/util/charset/ya.make
new file mode 100644
index 0000000000..26d38cb10b
--- /dev/null
+++ b/util/charset/ya.make
@@ -0,0 +1,35 @@
+LIBRARY()
+
+OWNER(g:util)
+SUBSCRIBER(g:util-subscribers)
+
+NO_UTIL()
+
+IF (TSTRING_IS_STD_STRING)
+ CFLAGS(GLOBAL -DTSTRING_IS_STD_STRING)
+ENDIF()
+
+JOIN_SRCS(
+ all_charset.cpp
+ generated/unidata.cpp
+ recode_result.cpp
+ unicode_table.cpp
+ unidata.cpp
+ utf8.cpp
+ wide.cpp
+)
+
+IF (ARCH_X86_64 AND NOT DISABLE_INSTRUCTION_SETS)
+ SRC_CPP_SSE41(wide_sse41.cpp)
+ELSE()
+ SRC(
+ wide_sse41.cpp
+ -DSSE41_STUB
+ )
+ENDIF()
+
+END()
+
+RECURSE_FOR_TESTS(
+ ut
+)