summaryrefslogtreecommitdiffstats
path: root/src/corelib/text
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/text')
-rw-r--r--src/corelib/text/UNICODE_LICENSE.txt46
-rw-r--r--src/corelib/text/qanystringview.cpp660
-rw-r--r--src/corelib/text/qanystringview.h351
-rw-r--r--src/corelib/text/qbytearray.cpp2998
-rw-r--r--src/corelib/text/qbytearray.h944
-rw-r--r--src/corelib/text/qbytearray_p.h65
-rw-r--r--src/corelib/text/qbytearrayalgorithms.h148
-rw-r--r--src/corelib/text/qbytearraylist.cpp90
-rw-r--r--src/corelib/text/qbytearraylist.h79
-rw-r--r--src/corelib/text/qbytearraymatcher.cpp124
-rw-r--r--src/corelib/text/qbytearraymatcher.h120
-rw-r--r--src/corelib/text/qbytearrayview.h406
-rw-r--r--src/corelib/text/qbytearrayview.qdoc1056
-rw-r--r--src/corelib/text/qbytedata_p.h145
-rw-r--r--src/corelib/text/qchar.cpp536
-rw-r--r--src/corelib/text/qchar.h382
-rw-r--r--src/corelib/text/qcollator.cpp319
-rw-r--r--src/corelib/text/qcollator.h74
-rw-r--r--src/corelib/text/qcollator_icu.cpp55
-rw-r--r--src/corelib/text/qcollator_macx.cpp64
-rw-r--r--src/corelib/text/qcollator_p.h52
-rw-r--r--src/corelib/text/qcollator_posix.cpp75
-rw-r--r--src/corelib/text/qcollator_win.cpp73
-rw-r--r--src/corelib/text/qdoublescanprint_p.h42
-rw-r--r--src/corelib/text/qlatin1stringmatcher.cpp201
-rw-r--r--src/corelib/text/qlatin1stringmatcher.h172
-rw-r--r--src/corelib/text/qlatin1stringview.h375
-rw-r--r--src/corelib/text/qlatin1stringview.qdoc1295
-rw-r--r--src/corelib/text/qlocale.cpp4076
-rw-r--r--src/corelib/text/qlocale.h1863
-rw-r--r--src/corelib/text/qlocale.qdoc732
-rw-r--r--src/corelib/text/qlocale_data_p.h13730
-rw-r--r--src/corelib/text/qlocale_icu.cpp40
-rw-r--r--src/corelib/text/qlocale_mac.mm632
-rw-r--r--src/corelib/text/qlocale_p.h615
-rw-r--r--src/corelib/text/qlocale_tools.cpp708
-rw-r--r--src/corelib/text/qlocale_tools_p.h125
-rw-r--r--src/corelib/text/qlocale_unix.cpp109
-rw-r--r--src/corelib/text/qlocale_wasm.cpp54
-rw-r--r--src/corelib/text/qlocale_win.cpp606
-rw-r--r--src/corelib/text/qregexp.cpp5039
-rw-r--r--src/corelib/text/qregexp.h151
-rw-r--r--src/corelib/text/qregularexpression.cpp678
-rw-r--r--src/corelib/text/qregularexpression.h243
-rw-r--r--src/corelib/text/qstaticlatin1stringmatcher.h140
-rw-r--r--src/corelib/text/qstaticlatin1stringmatcher.qdoc86
-rw-r--r--src/corelib/text/qstring.cpp9674
-rw-r--r--src/corelib/text/qstring.h2325
-rw-r--r--src/corelib/text/qstring_compat.cpp112
-rw-r--r--src/corelib/text/qstring_mips_dsp_asm.S40
-rw-r--r--src/corelib/text/qstringalgorithms.h276
-rw-r--r--src/corelib/text/qstringalgorithms_p.h64
-rw-r--r--src/corelib/text/qstringbuilder.cpp102
-rw-r--r--src/corelib/text/qstringbuilder.h319
-rw-r--r--src/corelib/text/qstringconverter.cpp1595
-rw-r--r--src/corelib/text/qstringconverter.h374
-rw-r--r--src/corelib/text/qstringconverter_base.h176
-rw-r--r--src/corelib/text/qstringconverter_p.h229
-rw-r--r--src/corelib/text/qstringfwd.h56
-rw-r--r--src/corelib/text/qstringiterator.qdoc28
-rw-r--r--src/corelib/text/qstringiterator_p.h85
-rw-r--r--src/corelib/text/qstringlist.cpp458
-rw-r--r--src/corelib/text/qstringlist.h413
-rw-r--r--src/corelib/text/qstringliteral.h72
-rw-r--r--src/corelib/text/qstringmatcher.cpp139
-rw-r--r--src/corelib/text/qstringmatcher.h73
-rw-r--r--src/corelib/text/qstringtokenizer.cpp132
-rw-r--r--src/corelib/text/qstringtokenizer.h98
-rw-r--r--src/corelib/text/qstringview.cpp638
-rw-r--r--src/corelib/text/qstringview.h464
-rw-r--r--src/corelib/text/qt_attribution.json36
-rw-r--r--src/corelib/text/qtextboundaryfinder.cpp234
-rw-r--r--src/corelib/text/qtextboundaryfinder.h68
-rw-r--r--src/corelib/text/qtliterals.qdoc44
-rw-r--r--src/corelib/text/qunicodetables.cpp28146
-rw-r--r--src/corelib/text/qunicodetables_p.h96
-rw-r--r--src/corelib/text/qunicodetools.cpp830
-rw-r--r--src/corelib/text/qunicodetools_p.h51
-rw-r--r--src/corelib/text/qutf8stringview.h434
-rw-r--r--src/corelib/text/qutf8stringview.qdoc720
-rw-r--r--src/corelib/text/qvsnprintf.cpp42
-rw-r--r--src/corelib/text/text.pri92
82 files changed, 49482 insertions, 39827 deletions
diff --git a/src/corelib/text/UNICODE_LICENSE.txt b/src/corelib/text/UNICODE_LICENSE.txt
deleted file mode 100644
index 567fda24dd..0000000000
--- a/src/corelib/text/UNICODE_LICENSE.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
-
-See Terms of Use for definitions of Unicode Inc.'s
-Data Files and Software.
-
-NOTICE TO USER: Carefully read the following legal agreement.
-BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S
-DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"),
-YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
-TERMS AND CONDITIONS OF THIS AGREEMENT.
-IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE
-THE DATA FILES OR SOFTWARE.
-
-COPYRIGHT AND PERMISSION NOTICE
-
-Copyright © 1991-2019 Unicode, Inc. All rights reserved.
-Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Unicode data files and any associated documentation
-(the "Data Files") or Unicode software and any associated documentation
-(the "Software") to deal in the Data Files or Software
-without restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, and/or sell copies of
-the Data Files or Software, and to permit persons to whom the Data Files
-or Software are furnished to do so, provided that either
-(a) this copyright and permission notice appear with all copies
-of the Data Files or Software, or
-(b) this copyright and permission notice appear in associated
-Documentation.
-
-THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT OF THIRD PARTY RIGHTS.
-IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
-NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THE DATA FILES OR SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder
-shall not be used in advertising or otherwise to promote the sale,
-use or other dealings in these Data Files or Software without prior
-written authorization of the copyright holder.
diff --git a/src/corelib/text/qanystringview.cpp b/src/corelib/text/qanystringview.cpp
new file mode 100644
index 0000000000..4129257c02
--- /dev/null
+++ b/src/corelib/text/qanystringview.cpp
@@ -0,0 +1,660 @@
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qanystringview.h"
+#include "qdebug.h"
+#include "qttypetraits.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QAnyStringView
+ \inmodule QtCore
+ \since 6.0
+ \brief The QAnyStringView class provides a unified view on Latin-1, UTF-8,
+ or UTF-16 strings with a read-only subset of the QString API.
+ \reentrant
+ \ingroup tools
+ \ingroup string-processing
+
+ \compares strong
+ \compareswith strong char16_t QChar {const char16_t *} {const char *} \
+ QByteArray QByteArrayView QString QStringView QUtf8StringView \
+ QLatin1StringView
+ \endcompareswith
+
+ A QAnyStringView references a contiguous portion of a string it does
+ not own. It acts as an interface type to all kinds of strings,
+ without the need to construct a QString first.
+
+ Unlike QStringView and QUtf8StringView, QAnyStringView can hold
+ strings of any of the following encodings: UTF-8, UTF-16, and
+ Latin-1. The latter is supported because Latin-1, unlike UTF-8,
+ can be efficiently compared to UTF-16 data: a length mismatch
+ already means the strings cannot be equal. This is not true for
+ UTF-8/UTF-16 comparisons, because UTF-8 is a variable-length
+ encoding.
+
+ The string may be represented as an array (or an array-compatible
+ data-structure such as QString, std::basic_string, etc.) of \c
+ char, \c char8_t, QChar, \c ushort, \c char16_t or (on platforms,
+ such as Windows, where it is a 16-bit type) \c wchar_t.
+
+ QAnyStringView is designed as an interface type; its main use-case
+ is as a function parameter type. When QAnyStringViews are used as
+ automatic variables or data members, care must be taken to ensure
+ that the referenced string data (for example, owned by a QString)
+ outlives the QAnyStringView on all code paths, lest the string
+ view ends up referencing deleted data.
+
+ When used as an interface type, QAnyStringView allows a single
+ function to accept a wide variety of string data sources. One
+ function accepting QAnyStringView thus replaces five function
+ overloads (taking QString, \c{(const QChar*, qsizetype)},
+ QUtf8StringView, QLatin1StringView (but see above), and QChar), while
+ at the same time enabling even more string data sources to be
+ passed to the function, such as \c{u8"Hello World"}, a \c char8_t
+ string literal.
+
+ Like elsewhere in Qt, QAnyStringView assumes \c char data is encoded
+ in UTF-8, unless it is presented as a QLatin1StringView.
+
+ Since Qt 6.4, however, UTF-8 string literals that are pure US-ASCII are
+ automatically stored as Latin-1. This is a compile-time check with no
+ runtime overhead. The feature requires compiling in C++20, or with a recent
+ GCC.
+
+ QAnyStringViews should be passed by value, not by reference-to-const:
+ \snippet code/src_corelib_text_qanystringview.cpp 0
+
+ QAnyStringView can also be used as the return value of a function,
+ but this is not recommended. QUtf8StringView or QStringView are
+ better suited as function return values. If you call a function
+ returning QAnyStringView, take extra care to not keep the
+ QAnyStringView around longer than the function promises to keep
+ the referenced string data alive. If in doubt, obtain a strong
+ reference to the data by calling toString() to convert the
+ QAnyStringView into a QString.
+
+ QAnyStringView is a \e{Literal Type}.
+
+ \section2 Compatible Character Types
+
+ QAnyStringView accepts strings over a variety of character types:
+
+ \list
+ \li \c char (both signed and unsigned)
+ \li \c char8_t (C++20 only)
+ \li \c char16_t
+ \li \c wchar_t (where it's a 16-bit type, e.g. Windows)
+ \li \c ushort
+ \li \c QChar
+ \endlist
+
+ The 8-bit character types are interpreted as UTF-8 data (except when
+ presented as a QLatin1StringView) while the 16-bit character types are
+ interpreted as UTF-16 data in host byte order (the same as QString).
+
+ \section2 Sizes and Sub-Strings
+
+ All sizes and positions in QAnyStringView functions are in the
+ encoding's code units (that is, UTF-16 surrogate pairs count as
+ two for the purposes of these functions, the same as in QString,
+ and UTF-8 multibyte sequences count as two, three or four,
+ depending on their length).
+
+ \sa QUtf8StringView, QStringView
+*/
+
+/*!
+ \typedef QAnyStringView::difference_type
+
+ Alias for \c{std::ptrdiff_t}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QAnyStringView::size_type
+
+ Alias for qsizetype. Provided for compatibility with the STL.
+*/
+
+/*!
+ \fn QAnyStringView::QAnyStringView()
+
+ Constructs a null string view.
+
+ \sa isNull()
+*/
+
+/*!
+ \fn QAnyStringView::QAnyStringView(std::nullptr_t)
+
+ Constructs a null string view.
+
+ \sa isNull()
+*/
+
+/*!
+ \fn template <typename Char, QAnyStringView::if_compatible_char<Char> = true> QAnyStringView::QAnyStringView(const Char *str, qsizetype len)
+
+ Constructs a string view on \a str with length \a len.
+
+ The range \c{[str,len)} must remain valid for the lifetime of this string view object.
+
+ Passing \nullptr as \a str is safe if \a len is 0, too, and results in a null string view.
+
+ The behavior is undefined if \a len is negative or, when positive, if \a str is \nullptr.
+
+ This constructor only participates in overload resolution if \c Char is a compatible
+ character type.
+
+ \sa isNull(), {Compatible Character Types}
+*/
+
+/*!
+ \fn template <typename Char, QAnyStringView::if_compatible_char<Char> = true> QAnyStringView::QAnyStringView(const Char *first, const Char *last)
+
+ Constructs a string view on \a first with length (\a last - \a first).
+
+ The range \c{[first,last)} must remain valid for the lifetime of
+ this string view object.
+
+ Passing \nullptr as \a first is safe if \a last is \nullptr, too,
+ and results in a null string view.
+
+ The behavior is undefined if \a last precedes \a first, or \a first
+ is \nullptr and \a last is not.
+
+ This constructor only participates in overload resolution if \c Char
+ is a compatible character type.
+
+ \sa isNull(), {Compatible Character Types}
+*/
+
+/*!
+ \fn template <typename Char> QAnyStringView::QAnyStringView(const Char *str)
+
+ Constructs a string view on \a str. The length is determined
+ by scanning for the first \c{Char(0)}.
+
+ \a str must remain valid for the lifetime of this string view object.
+
+ Passing \nullptr as \a str is safe and results in a null string view.
+
+ This constructor only participates in overload resolution if \a
+ str is not an array and if \c Char is a compatible character
+ type.
+
+ \sa isNull(), {Compatible Character Types}
+*/
+
+/*!
+ \fn template <typename Char, size_t N> QAnyStringView::QAnyStringView(const Char (&string)[N])
+
+ Constructs a string view on the character string literal \a string.
+ The view covers the array until the first \c{Char(0)} is encountered,
+ or \c N, whichever comes first.
+ If you need the full array, use fromArray() instead.
+
+ \a string must remain valid for the lifetime of this string view
+ object.
+
+ This constructor only participates in overload resolution if \a
+ string is an actual array and \c Char is a compatible character
+ type.
+
+ \sa {Compatible Character Types}
+*/
+
+/*!
+ \fn QAnyStringView::QAnyStringView(const QString &str)
+
+ Constructs a string view on \a str.
+
+ \c{str.data()} must remain valid for the lifetime of this string view object.
+
+ The string view will be null if and only if \c{str.isNull()}.
+*/
+
+/*!
+ \fn QAnyStringView::QAnyStringView(const QByteArray &str)
+
+ Constructs a string view on \a str. The data in \a str is interpreted as UTF-8.
+
+ \c{str.data()} must remain valid for the lifetime of this string view object.
+
+ The string view will be null if and only if \c{str.isNull()}.
+*/
+
+/*!
+ \fn template <typename Container, QAnyStringView::if_compatible_container<Container>> QAnyStringView::QAnyStringView(const Container &str)
+
+ Constructs a string view on \a str. The length is taken from \c{std::size(str)}.
+
+ \c{std::data(str)} must remain valid for the lifetime of this string view object.
+
+ This constructor only participates in overload resolution if \c Container is a
+ container with a compatible character type as \c{value_type}.
+
+ The string view will be empty if and only if \c{std::size(str) == 0}. It is unspecified
+ whether this constructor can result in a null string view (\c{std::data(str)} would
+ have to return \nullptr for this).
+
+ \sa isNull(), isEmpty()
+*/
+
+/*!
+ \fn template <typename Char, size_t Size> static QAnyStringView fromArray(const Char (&string)[Size]) noexcept
+
+ Constructs a string view on the full character string literal \a string,
+ including any trailing \c{Char(0)}. If you don't want the
+ null-terminator included in the view then you can use the constructor
+ overload taking a pointer and a size:
+
+ \snippet code/src_corelib_text_qanystringview.cpp 2
+
+ Alternatively you can use the constructor overload taking an
+ array literal which will create a view up to, but not including,
+ the first null-terminator in the data.
+
+ \a string must remain valid for the lifetime of this string view
+ object.
+
+ This function will work with any array literal if \c Char is a
+ compatible character type.
+*/
+
+/*!
+ \fn QString QAnyStringView::toString() const
+
+ Returns a deep copy of this string view's data as a QString.
+
+ The return value will be a null QString if and only if this string view is null.
+*/
+
+/*!
+ \fn const void *QAnyStringView::data() const
+
+ Returns a const pointer to the first character in the string view.
+
+ \note The character array represented by the return value is \e not null-terminated.
+
+ \sa size_bytes()
+*/
+
+/*!
+ \fn bool QAnyStringView::empty() const
+
+ Returns whether this string view is empty - that is, whether \c{size() == 0}.
+
+ This function is provided for STL compatibility.
+
+ \sa isEmpty(), isNull(), size()
+*/
+
+/*!
+ \fn bool QAnyStringView::isEmpty() const
+
+ Returns whether this string view is empty - that is, whether \c{size() == 0}.
+
+ This function is provided for compatibility with other Qt containers.
+
+ \sa empty(), isNull(), size()
+*/
+
+/*!
+ \fn bool QAnyStringView::isNull() const
+
+ Returns whether this string view is null - that is, whether \c{data() == nullptr}.
+
+ This functions is provided for compatibility with other Qt containers.
+
+ \sa empty(), isEmpty(), size()
+*/
+
+/*!
+ \fn qsizetype QAnyStringView::size() const
+
+ Returns the size of this string view, in the encoding's code points.
+
+ \sa empty(), isEmpty(), isNull(), size_bytes(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::size_bytes() const
+
+ Returns the size of this string view, but in bytes, not code-points.
+
+ You can use this function together with data() for hashing or serialization.
+
+ This function is provided for STL compatibility.
+
+ \sa size(), data()
+*/
+
+/*!
+ \fn QAnyStringView::length() const
+
+ Same as size().
+
+ This function is provided for compatibility with other Qt containers.
+
+ \sa size()
+*/
+
+/*!
+ \fn QChar QAnyStringView::front() const
+
+ Returns the first character in the string view.
+
+ This function is provided for STL compatibility.
+
+ \warning Calling this function on an empty string view constitutes
+ undefined behavior.
+
+ \sa back(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QChar QAnyStringView::back() const
+
+ Returns the last character in the string view.
+
+ This function is provided for STL compatibility.
+
+ \warning Calling this function on an empty string view constitutes
+ undefined behavior.
+
+ \sa front(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::mid(qsizetype pos, qsizetype n) const
+ \since 6.5
+
+ Returns the substring of length \a n starting at position
+ \a pos in this object.
+
+ \deprecated Use sliced() instead in new code.
+
+ Returns an empty string view if \a n exceeds the
+ length of the string view. If there are less than \a n code points
+ available in the string view starting at \a pos, or if
+ \a n is negative (default), the function returns all code points that
+ are available from \a pos.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::left(qsizetype n) const
+ \since 6.5
+
+ \deprecated Use first() instead in new code.
+
+ Returns the substring of length \a n starting at position
+ 0 in this object.
+
+ The entire string view is returned if \a n is greater than or equal
+ to size(), or less than zero.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::right(qsizetype n) const
+ \since 6.5
+
+ \deprecated Use last() instead in new code.
+
+ Returns the substring of length \a n starting at position
+ size() - \a n in this object.
+
+ The entire string view is returned if \a n is greater than or equal
+ to size(), or less than zero.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::first(qsizetype n) const
+ \since 6.5
+
+ Returns a string view that contains the first \a n code points
+ of this string view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa last(), sliced(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::last(qsizetype n) const
+ \since 6.5
+
+ Returns a string view that contains the last \a n code points of this string view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa first(), sliced(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::sliced(qsizetype pos, qsizetype n) const
+ \since 6.5
+
+ Returns a string view containing \a n code points of this string view,
+ starting at position \a pos.
+
+//! [UB-sliced-index-length]
+ \note The behavior is undefined when \a pos < 0, \a n < 0,
+ or \a pos + \a n > size().
+//! [UB-sliced-index-length]
+
+ \sa first(), last(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::sliced(qsizetype pos) const
+ \since 6.5
+
+ Returns a string view starting at position \a pos in this object,
+ and extending to its end.
+
+//! [UB-sliced-index-only]
+ \note The behavior is undefined when \a pos < 0 or \a pos > size().
+//! [UB-sliced-index-only]
+
+ \sa first(), last(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::chopped(qsizetype n) const
+ \since 6.5
+
+ Returns the substring of length size() - \a n starting at the
+ beginning of this object.
+
+ Same as \c{first(size() - n)}.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa sliced(), first(), last(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::truncate(qsizetype n)
+ \since 6.5
+
+ Truncates this string view to \a n code points.
+
+ Same as \c{*this = first(n)}.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa sliced(), first(), last(), chopped(), chop(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::chop(qsizetype n)
+ \since 6.5
+
+ Truncates this string view by \a n code points.
+
+ Same as \c{*this = first(size() - n)}.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa sliced(), first(), last(), chopped(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*! \fn template <typename Visitor> decltype(auto) QAnyStringView::visit(Visitor &&v) const
+
+ Calls \a v with either a QUtf8StringView, QLatin1String, or QStringView, depending
+ on the encoding of the string data this string-view references.
+
+ This is how most functions taking QAnyStringView fork off into per-encoding
+ functions:
+
+ \code
+ void processImpl(QLatin1String s) { ~~~ }
+ void processImpl(QUtf8StringView s) { ~~~ }
+ void processImpl(QStringView s) { ~~~ }
+
+ void process(QAnyStringView s)
+ {
+ s.visit([](auto s) { processImpl(s); });
+ }
+ \endcode
+
+ Here, we're reusing the same name, \c s, for both the QAnyStringView
+ object, as well as the lambda's parameter. This is idiomatic code and helps
+ track the identity of the objects through visit() calls, for example in more
+ complex situations such as
+
+ \code
+ bool equal(QAnyStringView lhs, QAnyStringView rhs)
+ {
+ // assuming operator==(QAnyStringView, QAnyStringView) didn't, yet, exist:
+ return lhs.visit([rhs](auto lhs) {
+ rhs.visit([lhs](auto rhs) {
+ return lhs == rhs;
+ });
+ });
+ }
+ \endcode
+
+ visit() requires that all lambda instantiations have the same return type.
+ If they differ, you get a compile error, even if there is a common type. To
+ fix, you can use explicit return types on the lambda, or cast in the return
+ statements:
+
+ \code
+ // wrong:
+ QAnyStringView firstHalf(QAnyStringView input)
+ {
+ return input.visit([](auto input) { // ERROR: lambdas return different types
+ return input.sliced(0, input.size() / 2);
+ });
+ }
+ // correct:
+ QAnyStringView firstHalf(QAnyStringView input)
+ {
+ return input.visit([](auto input) -> QAnyStringView { // OK, explicit return type
+ return input.sliced(0, input.size() / 2);
+ });
+ }
+ // also correct:
+ QAnyStringView firstHalf(QAnyStringView input)
+ {
+ return input.visit([](auto input) {
+ return QAnyStringView(input.sliced(0, input.size() / 2)); // OK, cast to common type
+ });
+ }
+ \endcode
+*/
+
+/*!
+ \fn QAnyStringView::compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSensitivity cs)
+
+ Compares the string view \a lhs with the string view \a rhs and returns a
+ negative integer if \a lhs is less than \a rhs, a positive integer if it is
+ greater than \a rhs, and zero if they are equal.
+
+ If \a cs is Qt::CaseSensitive (the default), the comparison is case sensitive;
+ otherwise the comparison is case-insensitive.
+
+ \sa operator==(), operator<(), operator>()
+*/
+
+/*!
+ \fn bool QAnyStringView::operator==(const QAnyStringView &lhs, const QAnyStringView & rhs)
+ \fn bool QAnyStringView::operator!=(const QAnyStringView & lhs, const QAnyStringView & rhs)
+ \fn bool QAnyStringView::operator<=(const QAnyStringView & lhs, const QAnyStringView & rhs)
+ \fn bool QAnyStringView::operator>=(const QAnyStringView & lhs, const QAnyStringView & rhs)
+ \fn bool QAnyStringView::operator<(const QAnyStringView & lhs, const QAnyStringView & rhs)
+ \fn bool QAnyStringView::operator>(const QAnyStringView & lhs, const QAnyStringView & rhs)
+
+ Operators that compare \a lhs to \a rhs.
+
+ \sa compare()
+*/
+
+/*!
+ \fn template <typename QStringLike> qToAnyStringViewIgnoringNull(const QStringLike &s);
+ \since 6.0
+ \internal
+
+ Convert \a s to a QAnyStringView ignoring \c{s.isNull()}.
+
+ Returns a string view that references \a{s}'s data, but is never null.
+
+ This is a faster way to convert a QString or QByteArray to a QAnyStringView,
+ if null QStrings or QByteArrays can legitimately be treated as empty ones.
+
+ \sa QString::isNull(), QAnyStringView
+*/
+
+/*!
+ \fn QAnyStringView::operator<<(QDebug d, QAnyStringView s)
+ \since 6.7
+ \relates QDebug
+
+ Outputs \a s to debug stream \a d.
+
+ If \c{d.quotedString()} is \c true, indicates which encoding the string is
+ in. If you just want the string data, use visit() like this:
+
+ \code
+ s.visit([&d) (auto s) { d << s; });
+ \endcode
+
+ \sa QAnyStringView::visit()
+*/
+QDebug operator<<(QDebug d, QAnyStringView s)
+{
+ struct S { const char *prefix, *suffix; };
+ const auto affixes = s.visit([](auto s) {
+ using View = decltype(s);
+ if constexpr (std::is_same_v<View, QLatin1StringView>) {
+ return S{"", "_L1"};
+ } else if constexpr (std::is_same_v<View, QUtf8StringView>) {
+ return S{"u8", ""};
+ } else if constexpr (std::is_same_v<View, QStringView>) {
+ return S{"u", ""};
+ } else {
+ static_assert(QtPrivate::type_dependent_false<View>());
+ }
+ });
+ const QDebugStateSaver saver(d);
+ d.nospace();
+ if (d.quoteStrings())
+ d << affixes.prefix;
+ s.visit([&d](auto s) { d << s; });
+ if (d.quoteStrings())
+ d << affixes.suffix;
+ return d;
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/corelib/text/qanystringview.h b/src/corelib/text/qanystringview.h
new file mode 100644
index 0000000000..01efd83743
--- /dev/null
+++ b/src/corelib/text/qanystringview.h
@@ -0,0 +1,351 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+#ifndef QANYSTRINGVIEW_H
+#define QANYSTRINGVIEW_H
+
+#include <QtCore/qcompare.h>
+#include <QtCore/qlatin1stringview.h>
+#include <QtCore/qstringview.h>
+#include <QtCore/qutf8stringview.h>
+
+#ifdef __cpp_impl_three_way_comparison
+#include <compare>
+#endif
+#include <QtCore/q20type_traits.h>
+#include <limits>
+
+class tst_QAnyStringView;
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate {
+
+template <typename Tag, typename Result>
+struct wrapped { using type = Result; };
+
+template <typename Tag, typename Result>
+using wrapped_t = typename wrapped<Tag, Result>::type;
+
+} // namespace QtPrivate
+
+class QAnyStringView
+{
+public:
+ typedef qptrdiff difference_type;
+ typedef qsizetype size_type;
+private:
+ static constexpr size_t SizeMask = (std::numeric_limits<size_t>::max)() / 4;
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+ static constexpr int SizeShift = 2;
+ static constexpr size_t Latin1Flag = 1;
+#else
+ static constexpr int SizeShift = 0;
+ static constexpr size_t Latin1Flag = SizeMask + 1;
+#endif
+ static constexpr size_t TwoByteCodePointFlag = Latin1Flag << 1;
+ static constexpr size_t TypeMask = ~(SizeMask << SizeShift);
+ static_assert(TypeMask == (Latin1Flag|TwoByteCodePointFlag));
+
+ // Tag bits
+ // 0 0 Utf8
+ // 0 1 Latin1
+ // 1 0 Utf16
+ // 1 1 Unused
+ // ^ ^ latin1
+ // | sizeof code-point == 2
+ enum Tag : size_t {
+ Utf8 = 0,
+ Latin1 = Latin1Flag,
+ Utf16 = TwoByteCodePointFlag,
+ Unused = TypeMask,
+ };
+
+ template <typename Char>
+ using if_compatible_char = std::enable_if_t<std::disjunction_v<
+ QtPrivate::IsCompatibleCharType<Char>,
+ QtPrivate::IsCompatibleChar8Type<Char>
+ >, bool>;
+
+ template <typename Pointer>
+ using if_compatible_pointer = std::enable_if_t<std::disjunction_v<
+ QtPrivate::IsCompatiblePointer<Pointer>,
+ QtPrivate::IsCompatiblePointer8<Pointer>
+ >, bool>;
+
+
+ template <typename T>
+ using if_compatible_container = std::enable_if_t<std::disjunction_v<
+ QtPrivate::IsContainerCompatibleWithQStringView<T>,
+ QtPrivate::IsContainerCompatibleWithQUtf8StringView<T>
+ >, bool>;
+
+ template <typename QStringOrQByteArray, typename T>
+ using if_convertible_to = std::enable_if_t<std::conjunction_v<
+ // need to exclude a bunch of stuff, because we take by universal reference:
+ std::negation<std::disjunction<
+ std::is_same<q20::remove_cvref_t<T>, QAnyStringView::Tag>,
+ std::is_same<q20::remove_cvref_t<T>, QAnyStringView>, // don't make a copy/move ctor
+ std::is_pointer<std::decay_t<T>>, // const char*, etc
+ std::is_same<q20::remove_cvref_t<T>, QByteArray>,
+ std::is_same<q20::remove_cvref_t<T>, QString>
+ >>,
+ // this is what we're really after:
+ std::is_convertible<T, QStringOrQByteArray>
+ >, bool>;
+
+ // confirm we don't make an accidental copy constructor:
+ static_assert(QtPrivate::IsContainerCompatibleWithQStringView<QAnyStringView>::value == false);
+ static_assert(QtPrivate::IsContainerCompatibleWithQUtf8StringView<QAnyStringView>::value == false);
+
+ template<typename Char>
+ static constexpr bool isAsciiOnlyCharsAtCompileTime(Char *str, qsizetype sz) noexcept
+ {
+ // do not perform check if not at compile time
+ if (!q20::is_constant_evaluated())
+ return false;
+ if constexpr (sizeof(Char) != sizeof(char)) {
+ Q_UNUSED(str);
+ Q_UNUSED(sz);
+ return false;
+ } else {
+ for (qsizetype i = 0; i < sz; ++i) {
+ if (uchar(str[i]) > 0x7f)
+ return false;
+ }
+ return true;
+ }
+ }
+
+ template<typename Char>
+ static constexpr std::size_t encodeType(const Char *str, qsizetype sz) noexcept
+ {
+ // Utf16 if 16 bit, Latin1 if ASCII, else Utf8
+ Q_ASSERT(sz >= 0);
+ Q_ASSERT(sz <= qsizetype(SizeMask));
+ Q_ASSERT(str || !sz);
+ return (std::size_t(sz) << SizeShift)
+ | uint(sizeof(Char) == sizeof(char16_t)) * Tag::Utf16
+ | uint(isAsciiOnlyCharsAtCompileTime(str, sz)) * Tag::Latin1;
+ }
+
+ template <typename Char>
+ static constexpr qsizetype lengthHelperPointer(const Char *str) noexcept
+ {
+ if (q20::is_constant_evaluated())
+ return qsizetype(std::char_traits<Char>::length(str));
+ if constexpr (sizeof(Char) == sizeof(char16_t))
+ return QtPrivate::qustrlen(reinterpret_cast<const char16_t*>(str));
+ else
+ return qsizetype(strlen(reinterpret_cast<const char*>(str)));
+ }
+
+ static QChar toQChar(char ch) noexcept { return toQChar(QLatin1Char{ch}); } // we don't handle UTF-8 multibytes
+ static QChar toQChar(QChar ch) noexcept { return ch; }
+ static QChar toQChar(QLatin1Char ch) noexcept { return ch; }
+
+ explicit constexpr QAnyStringView(const void *d, qsizetype n, std::size_t sizeAndType) noexcept
+ : m_data{d}, m_size{std::size_t(n) | (sizeAndType & TypeMask)} {}
+public:
+ constexpr QAnyStringView() noexcept
+ : m_data{nullptr}, m_size{0} {}
+ constexpr QAnyStringView(std::nullptr_t) noexcept
+ : QAnyStringView() {}
+
+ template <typename Char, if_compatible_char<Char> = true>
+ constexpr QAnyStringView(const Char *str, qsizetype len)
+ : m_data{str}, m_size{encodeType<Char>(str, len)}
+ {
+ }
+
+ template <typename Char, if_compatible_char<Char> = true>
+ constexpr QAnyStringView(const Char *f, const Char *l)
+ : QAnyStringView(f, l - f) {}
+
+#ifdef Q_QDOC
+ template <typename Char, size_t N>
+ constexpr QAnyStringView(const Char (&array)[N]) noexcept;
+
+ template <typename Char>
+ constexpr QAnyStringView(const Char *str) noexcept;
+#else
+
+ template <typename Pointer, if_compatible_pointer<Pointer> = true>
+ constexpr QAnyStringView(const Pointer &str) noexcept
+ : QAnyStringView{str, str ? lengthHelperPointer(str) : 0} {}
+#endif
+
+ // defined in qstring.h
+ inline QAnyStringView(const QByteArray &str) noexcept; // TODO: Should we have this at all? Remove?
+ inline QAnyStringView(const QString &str) noexcept;
+ inline constexpr QAnyStringView(QLatin1StringView str) noexcept;
+
+ template <typename Container, if_compatible_container<Container> = true>
+ constexpr Q_ALWAYS_INLINE QAnyStringView(const Container &c) noexcept
+ : QAnyStringView(std::data(c), QtPrivate::lengthHelperContainer(c)) {}
+
+ template <typename Container, if_convertible_to<QString, Container> = true>
+ constexpr QAnyStringView(Container &&c, QtPrivate::wrapped_t<Container, QString> &&capacity = {})
+ //noexcept(std::is_nothrow_constructible_v<QString, Container>)
+ : QAnyStringView(capacity = std::forward<Container>(c)) {}
+
+ template <typename Container, if_convertible_to<QByteArray, Container> = true>
+ constexpr QAnyStringView(Container &&c, QtPrivate::wrapped_t<Container, QByteArray> &&capacity = {})
+ //noexcept(std::is_nothrow_constructible_v<QByteArray, Container>)
+ : QAnyStringView(capacity = std::forward<Container>(c)) {}
+
+ template <typename Char, if_compatible_char<Char> = true>
+ constexpr QAnyStringView(const Char &c) noexcept
+ : QAnyStringView{&c, 1} {}
+ constexpr QAnyStringView(const QChar &c) noexcept
+ : QAnyStringView{&c, 1} {}
+
+ template <typename Char, typename Container = decltype(QChar::fromUcs4(U'x')),
+ std::enable_if_t<std::is_same_v<Char, char32_t>, bool> = true>
+ constexpr QAnyStringView(Char c, Container &&capacity = {})
+ : QAnyStringView(capacity = QChar::fromUcs4(c)) {}
+
+ constexpr QAnyStringView(QStringView v) noexcept
+ : QAnyStringView(std::data(v), QtPrivate::lengthHelperContainer(v)) {}
+
+ template <bool UseChar8T>
+ constexpr QAnyStringView(QBasicUtf8StringView<UseChar8T> v) noexcept
+ : QAnyStringView(std::data(v), QtPrivate::lengthHelperContainer(v)) {}
+
+ template <typename Char, size_t Size, if_compatible_char<Char> = true>
+ [[nodiscard]] constexpr static QAnyStringView fromArray(const Char (&string)[Size]) noexcept
+ { return QAnyStringView(string, Size); }
+
+ // defined in qstring.h:
+ template <typename Visitor>
+ inline constexpr decltype(auto) visit(Visitor &&v) const;
+
+ [[nodiscard]]
+ constexpr QAnyStringView mid(qsizetype pos, qsizetype n = -1) const
+ {
+ using namespace QtPrivate;
+ auto result = QContainerImplHelper::mid(size(), &pos, &n);
+ return result == QContainerImplHelper::Null ? QAnyStringView() : sliced(pos, n);
+ }
+ [[nodiscard]]
+ constexpr QAnyStringView left(qsizetype n) const
+ {
+ if (size_t(n) >= size_t(size()))
+ n = size();
+ return sliced(0, n);
+ }
+ [[nodiscard]]
+ constexpr QAnyStringView right(qsizetype n) const
+ {
+ if (size_t(n) >= size_t(size()))
+ n = size();
+ return sliced(size() - n, n);
+ }
+
+ [[nodiscard]] constexpr QAnyStringView sliced(qsizetype pos) const
+ { verify(pos, 0); auto r = *this; r.advanceData(pos); r.setSize(size() - pos); return r; }
+ [[nodiscard]] constexpr QAnyStringView sliced(qsizetype pos, qsizetype n) const
+ { verify(pos, n); auto r = *this; r.advanceData(pos); r.setSize(n); return r; }
+ [[nodiscard]] constexpr QAnyStringView first(qsizetype n) const
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] constexpr QAnyStringView last(qsizetype n) const
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] constexpr QAnyStringView chopped(qsizetype n) const
+ { verify(0, n); return sliced(0, size() - n); }
+
+ constexpr void truncate(qsizetype n)
+ { verify(0, n); setSize(n); }
+ constexpr void chop(qsizetype n)
+ { verify(0, n); setSize(size() - n); }
+
+
+ [[nodiscard]] inline QString toString() const; // defined in qstring.h
+
+ [[nodiscard]] constexpr qsizetype size() const noexcept
+ { return qsizetype((m_size >> SizeShift) & SizeMask); }
+ [[nodiscard]] constexpr const void *data() const noexcept { return m_data; }
+
+ [[nodiscard]] Q_CORE_EXPORT static int compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+ [[nodiscard]] Q_CORE_EXPORT static bool equal(QAnyStringView lhs, QAnyStringView rhs) noexcept;
+
+ static constexpr inline bool detects_US_ASCII_at_compile_time =
+#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATED
+ true
+#else
+ false
+#endif
+ ;
+
+ //
+ // STL compatibility API:
+ //
+ [[nodiscard]] constexpr QChar front() const; // NOT noexcept!
+ [[nodiscard]] constexpr QChar back() const; // NOT noexcept!
+ [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; }
+ [[nodiscard]] constexpr qsizetype size_bytes() const noexcept
+ { return size() * charSize(); }
+
+ //
+ // Qt compatibility API:
+ //
+ [[nodiscard]] constexpr bool isNull() const noexcept { return !m_data; }
+ [[nodiscard]] constexpr bool isEmpty() const noexcept { return empty(); }
+ [[nodiscard]] constexpr qsizetype length() const noexcept
+ { return size(); }
+
+private:
+ friend bool comparesEqual(const QAnyStringView &lhs, const QAnyStringView &rhs) noexcept
+ { return QAnyStringView::equal(lhs, rhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QAnyStringView &lhs, const QAnyStringView &rhs) noexcept
+ {
+ const int res = QAnyStringView::compare(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QAnyStringView)
+
+#ifndef QT_NO_DEBUG_STREAM
+ Q_CORE_EXPORT friend QDebug operator<<(QDebug d, QAnyStringView s);
+#endif
+
+ [[nodiscard]] constexpr Tag tag() const noexcept { return Tag{m_size & TypeMask}; }
+ [[nodiscard]] constexpr bool isUtf16() const noexcept { return tag() == Tag::Utf16; }
+ [[nodiscard]] constexpr bool isUtf8() const noexcept { return tag() == Tag::Utf8; }
+ [[nodiscard]] constexpr bool isLatin1() const noexcept { return tag() == Tag::Latin1; }
+ [[nodiscard]] constexpr QStringView asStringView() const
+ { return Q_ASSERT(isUtf16()), QStringView{m_data_utf16, size()}; }
+ [[nodiscard]] constexpr q_no_char8_t::QUtf8StringView asUtf8StringView() const
+ { return Q_ASSERT(isUtf8()), q_no_char8_t::QUtf8StringView{m_data_utf8, size()}; }
+ [[nodiscard]] inline constexpr QLatin1StringView asLatin1StringView() const;
+ [[nodiscard]] constexpr size_t charSize() const noexcept { return isUtf16() ? 2 : 1; }
+ constexpr void setSize(qsizetype sz) noexcept { m_size = size_t(sz) | tag(); }
+ constexpr void advanceData(qsizetype delta) noexcept
+ { m_data_utf8 += delta * charSize(); }
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= size());
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= size() - pos);
+ }
+ union {
+ const void *m_data;
+ const char *m_data_utf8;
+ const char16_t *m_data_utf16;
+ };
+ size_t m_size;
+ friend class ::tst_QAnyStringView;
+};
+Q_DECLARE_TYPEINFO(QAnyStringView, Q_PRIMITIVE_TYPE);
+
+template <typename QStringLike, std::enable_if_t<std::disjunction_v<
+ std::is_same<QStringLike, QString>,
+ std::is_same<QStringLike, QByteArray>
+ >, bool> = true>
+[[nodiscard]] inline QAnyStringView qToAnyStringViewIgnoringNull(const QStringLike &s) noexcept
+{ return QAnyStringView(s.begin(), s.size()); }
+
+QT_END_NAMESPACE
+
+#endif /* QANYSTRINGVIEW_H */
diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp
index 95a1f9f52c..e6387e4bed 100644
--- a/src/corelib/text/qbytearray.cpp
+++ b/src/corelib/text/qbytearray.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qbytearray.h"
#include "qbytearraymatcher.h"
@@ -50,23 +14,37 @@
#include "private/qsimd_p.h"
#include "qstringalgorithms_p.h"
#include "qscopedpointer.h"
-#include "qbytearray_p.h"
+#include "qstringconverter_p.h"
#include <qdatastream.h>
#include <qmath.h>
+#if defined(Q_OS_WASM)
+#include "private/qstdweb_p.h"
+#endif
#ifndef QT_NO_COMPRESS
#include <zconf.h>
#include <zlib.h>
+#include <qxpfunctional.h>
#endif
#include <ctype.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
-#define IS_RAW_DATA(d) ((d)->flags() & QArrayData::RawDataType)
+#include <algorithm>
+
+#ifdef Q_OS_WIN
+# if !defined(QT_BOOTSTRAPPED) && (defined(QT_NO_CAST_FROM_ASCII) || defined(QT_NO_CAST_FROM_BYTEARRAY))
+// MSVC requires this, but let's apply it to MinGW compilers too, just in case
+# error "This file cannot be compiled with QT_NO_CAST_{TO,FROM}_ASCII, " \
+ "otherwise some QByteArray functions will not get exported."
+# endif
+#endif
QT_BEGIN_NAMESPACE
+Q_CONSTINIT const char QByteArray::_empty = '\0';
+
// ASCII case system, used by QByteArray::to{Upper,Lower}() and qstr(n)icmp():
static constexpr inline uchar asciiUpper(uchar c)
{
@@ -125,7 +103,7 @@ char *qstrcpy(char *dst, const char *src)
if (!src)
return nullptr;
#ifdef Q_CC_MSVC
- const int len = int(strlen(src));
+ const size_t len = strlen(src);
// This is actually not secure!!! It will be fixed
// properly in a later release!
if (len >= 0 && strcpy_s(dst, len+1, src) == 0)
@@ -141,34 +119,33 @@ char *qstrcpy(char *dst, const char *src)
A safe \c strncpy() function.
Copies at most \a len bytes from \a src (stopping at \a len or the
- terminating '\\0' whichever comes first) into \a dst and returns a
- pointer to \a dst. Guarantees that \a dst is '\\0'-terminated. If
- \a src or \a dst is \nullptr, returns \nullptr immediately.
+ terminating '\\0' whichever comes first) into \a dst. Guarantees that \a
+ dst is '\\0'-terminated, except when \a dst is \nullptr or \a len is 0. If
+ \a src is \nullptr, returns \nullptr, otherwise returns \a dst.
This function assumes that \a dst is at least \a len characters
long.
\note If \a dst and \a src overlap, the behavior is undefined.
+ \note Unlike strncpy(), this function does \e not write '\\0' to all \a
+ len bytes of \a dst, but stops after the terminating '\\0'. In this sense,
+ it's similar to C11's strncpy_s().
+
\sa qstrcpy()
*/
-char *qstrncpy(char *dst, const char *src, uint len)
+char *qstrncpy(char *dst, const char *src, size_t len)
{
- if (!src || !dst)
- return nullptr;
- if (len > 0) {
-#ifdef Q_CC_MSVC
- strncpy_s(dst, len, src, len - 1);
-#else
- strncpy(dst, src, len);
-#endif
- dst[len-1] = '\0';
+ if (dst && len > 0) {
+ *dst = '\0';
+ if (src)
+ std::strncat(dst, src, len - 1);
}
- return dst;
+ return src ? dst : nullptr;
}
-/*! \fn uint qstrlen(const char *str)
+/*! \fn size_t qstrlen(const char *str)
\relates QByteArray
A safe \c strlen() function.
@@ -179,7 +156,7 @@ char *qstrncpy(char *dst, const char *src, uint len)
\sa qstrnlen()
*/
-/*! \fn uint qstrnlen(const char *str, uint maxlen)
+/*! \fn size_t qstrnlen(const char *str, size_t maxlen)
\relates QByteArray
\since 4.2
@@ -204,7 +181,8 @@ char *qstrncpy(char *dst, const char *src, uint len)
\nullptr, it is treated as less than the other (even if the other is an
empty string).
- \sa qstrncmp(), qstricmp(), qstrnicmp(), {Character Case}, QByteArray::compare()
+ \sa qstrncmp(), qstricmp(), qstrnicmp(), {Character Case},
+ QByteArray::compare()
*/
int qstrcmp(const char *str1, const char *str2)
{
@@ -212,7 +190,7 @@ int qstrcmp(const char *str1, const char *str2)
: (str1 ? 1 : (str2 ? -1 : 0));
}
-/*! \fn int qstrncmp(const char *str1, const char *str2, uint len);
+/*! \fn int qstrncmp(const char *str1, const char *str2, size_t len);
\relates QByteArray
@@ -228,7 +206,8 @@ int qstrcmp(const char *str1, const char *str2)
\nullptr, it is treated as less than the other (even if the other is an
empty string or \a len is 0).
- \sa qstrcmp(), qstricmp(), qstrnicmp(), {Character Case}, QByteArray::compare()
+ \sa qstrcmp(), qstricmp(), qstrnicmp(), {Character Case},
+ QByteArray::compare()
*/
/*! \relates QByteArray
@@ -246,7 +225,8 @@ int qstrcmp(const char *str1, const char *str2)
\nullptr, it is treated as less than the other (even if the other is an
empty string).
- \sa qstrcmp(), qstrncmp(), qstrnicmp(), {Character Case}, QByteArray::compare()
+ \sa qstrcmp(), qstrncmp(), qstrnicmp(), {Character Case},
+ QByteArray::compare()
*/
int qstricmp(const char *str1, const char *str2)
@@ -264,7 +244,7 @@ int qstricmp(const char *str1, const char *str2)
max += offset;
do {
uchar c = s1[offset];
- if (int res = asciiLower(c) - asciiLower(s2[offset]))
+ if (int res = QtMiscUtils::caseCompareAscii(c, s2[offset]))
return res;
if (!c)
return 0;
@@ -282,7 +262,7 @@ int qstricmp(const char *str1, const char *str2)
// very quick.
quintptr u1 = quintptr(s1 + offset);
quintptr u2 = quintptr(s2 + offset);
- uint n = PageSize - ((u1 | u2) & PageMask);
+ size_t n = PageSize - ((u1 | u2) & PageMask);
qptrdiff maxoffset = offset + n;
for ( ; offset + 16 <= maxoffset; offset += sizeof(__m128i)) {
@@ -290,7 +270,7 @@ int qstricmp(const char *str1, const char *str2)
__m128i a = _mm_loadu_si128(reinterpret_cast<const __m128i *>(s1 + offset));
__m128i b = _mm_loadu_si128(reinterpret_cast<const __m128i *>(s2 + offset));
- // compare the two against each oher
+ // compare the two against each other
__m128i cmp = _mm_cmpeq_epi8(a, b);
// find NUL terminators too
@@ -303,7 +283,7 @@ int qstricmp(const char *str1, const char *str2)
// yes, find out where
uint start = qCountTrailingZeroBits(mask);
uint end = sizeof(mask) * 8 - qCountLeadingZeroBits(mask);
- Q_ASSUME(end >= start);
+ Q_ASSERT(end >= start);
offset += start;
n = end - start;
break;
@@ -335,10 +315,11 @@ int qstricmp(const char *str1, const char *str2)
\nullptr, it is treated as less than the other (even if the other is an
empty string or \a len is 0).
- \sa qstrcmp(), qstrncmp(), qstricmp(), {Character Case}, QByteArray::compare()
+ \sa qstrcmp(), qstrncmp(), qstricmp(), {Character Case},
+ QByteArray::compare()
*/
-int qstrnicmp(const char *str1, const char *str2, uint len)
+int qstrnicmp(const char *str1, const char *str2, size_t len)
{
const uchar *s1 = reinterpret_cast<const uchar *>(str1);
const uchar *s2 = reinterpret_cast<const uchar *>(str2);
@@ -346,7 +327,7 @@ int qstrnicmp(const char *str1, const char *str2, uint len)
return s1 ? 1 : (s2 ? -1 : 0);
for (; len--; ++s1, ++s2) {
const uchar c = *s1;
- if (int res = asciiLower(c) - asciiLower(*s2))
+ if (int res = QtMiscUtils::caseCompareAscii(c, *s2))
return res;
if (!c) // strings are equal
break;
@@ -364,11 +345,18 @@ int qstrnicmp(const char *str1, const char *str2, uint len)
*/
int qstrnicmp(const char *str1, qsizetype len1, const char *str2, qsizetype len2)
{
- Q_ASSERT(str1);
Q_ASSERT(len1 >= 0);
Q_ASSERT(len2 >= -1);
const uchar *s1 = reinterpret_cast<const uchar *>(str1);
const uchar *s2 = reinterpret_cast<const uchar *>(str2);
+ if (!s1 || !len1) {
+ if (len2 == 0)
+ return 0;
+ if (len2 == -1)
+ return (!s2 || !*s2) ? 0 : -1;
+ Q_ASSERT(s2);
+ return -1;
+ }
if (!s2)
return len1 == 0 ? 0 : 1;
@@ -380,7 +368,7 @@ int qstrnicmp(const char *str1, qsizetype len1, const char *str2, qsizetype len2
if (!c)
return 1;
- if (int res = asciiLower(s1[i]) - asciiLower(c))
+ if (int res = QtMiscUtils::caseCompareAscii(s1[i], c))
return res;
}
return s2[i] ? -1 : 0;
@@ -388,7 +376,7 @@ int qstrnicmp(const char *str1, qsizetype len1, const char *str2, qsizetype len2
// not null-terminated
const qsizetype len = qMin(len1, len2);
for (qsizetype i = 0; i < len; ++i) {
- if (int res = asciiLower(s1[i]) - asciiLower(s2[i]))
+ if (int res = QtMiscUtils::caseCompareAscii(s1[i], s2[i]))
return res;
}
if (len1 == len2)
@@ -399,47 +387,26 @@ int qstrnicmp(const char *str1, qsizetype len1, const char *str2, qsizetype len2
/*!
\internal
- ### Qt6: replace the QByteArray parameter with [pointer,len] pair
*/
-int qstrcmp(const QByteArray &str1, const char *str2)
+int QtPrivate::compareMemory(QByteArrayView lhs, QByteArrayView rhs)
{
- if (!str2)
- return str1.isEmpty() ? 0 : +1;
-
- const char *str1data = str1.constData();
- const char *str1end = str1data + str1.length();
- for ( ; str1data < str1end && *str2; ++str1data, ++str2) {
- int diff = int(uchar(*str1data)) - uchar(*str2);
- if (diff)
- // found a difference
- return diff;
+ if (!lhs.isNull() && !rhs.isNull()) {
+ int ret = memcmp(lhs.data(), rhs.data(), qMin(lhs.size(), rhs.size()));
+ if (ret != 0)
+ return ret;
}
- // Why did we stop?
- if (*str2 != '\0')
- // not the null, so we stopped because str1 is shorter
- return -1;
- if (str1data < str1end)
- // we haven't reached the end, so str1 must be longer
- return +1;
- return 0;
+ // they matched qMin(l1, l2) bytes
+ // so the longer one is lexically after the shorter one
+ return lhs.size() == rhs.size() ? 0 : lhs.size() > rhs.size() ? 1 : -1;
}
/*!
\internal
- ### Qt6: replace the QByteArray parameter with [pointer,len] pair
- */
-int qstrcmp(const QByteArray &str1, const QByteArray &str2)
+*/
+bool QtPrivate::isValidUtf8(QByteArrayView s) noexcept
{
- int l1 = str1.length();
- int l2 = str2.length();
- int ret = memcmp(str1.constData(), str2.constData(), qMin(l1, l2));
- if (ret != 0)
- return ret;
-
- // they matched qMin(l1, l2) bytes
- // so the longer one is lexically after the shorter one
- return l1 - l2;
+ return QUtf8::isValidUtf8(s).isValidUtf8;
}
// the CRC table below is created by the following piece of code
@@ -490,7 +457,7 @@ static const quint16 crc_tbl[16] = {
\relates QByteArray
\since 5.9
- Returns the CRC-16 checksum of the first \a len bytes of \a data.
+ Returns the CRC-16 checksum of \a data.
The checksum is independent of the byte order (endianness) and will
be calculated accorded to the algorithm published in \a standard.
@@ -499,7 +466,7 @@ static const quint16 crc_tbl[16] = {
\note This function is a 16-bit cache conserving (16 entry table)
implementation of the CRC-16-CCITT algorithm.
*/
-quint16 qChecksum(const char *data, uint len, Qt::ChecksumType standard)
+quint16 qChecksum(QByteArrayView data, Qt::ChecksumType standard)
{
quint16 crc = 0x0000;
switch (standard) {
@@ -511,7 +478,8 @@ quint16 qChecksum(const char *data, uint len, Qt::ChecksumType standard)
break;
}
uchar c;
- const uchar *p = reinterpret_cast<const uchar *>(data);
+ const uchar *p = reinterpret_cast<const uchar *>(data.data());
+ qsizetype len = data.size();
while (len--) {
c = *p++;
crc = ((crc >> 4) & 0x0fff) ^ crc_tbl[((crc ^ c) & 15)];
@@ -545,10 +513,12 @@ quint16 qChecksum(const char *data, uint len, Qt::ChecksumType standard)
The default value is -1, which specifies zlib's default
compression.
- \sa qUncompress()
+ \sa qUncompress(const QByteArray &data)
*/
-/*! \relates QByteArray
+/*!
+ \fn QByteArray qCompress(const uchar* data, qsizetype nbytes, int compressionLevel)
+ \relates QByteArray
\overload
@@ -557,44 +527,196 @@ quint16 qChecksum(const char *data, uint len, Qt::ChecksumType standard)
*/
#ifndef QT_NO_COMPRESS
-QByteArray qCompress(const uchar* data, int nbytes, int compressionLevel)
+using CompressSizeHint_t = quint32; // 32-bit BE, historically
+
+enum class ZLibOp : bool { Compression, Decompression };
+
+Q_DECL_COLD_FUNCTION
+static const char *zlibOpAsString(ZLibOp op)
{
- if (nbytes == 0) {
- return QByteArray(4, '\0');
+ switch (op) {
+ case ZLibOp::Compression: return "qCompress";
+ case ZLibOp::Decompression: return "qUncompress";
}
- if (!data) {
- qWarning("qCompress: Data is null");
- return QByteArray();
+ Q_UNREACHABLE_RETURN(nullptr);
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray zlibError(ZLibOp op, const char *what)
+{
+ qWarning("%s: %s", zlibOpAsString(op), what);
+ return QByteArray();
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray dataIsNull(ZLibOp op)
+{
+ return zlibError(op, "Data is null");
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray lengthIsNegative(ZLibOp op)
+{
+ return zlibError(op, "Input length is negative");
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray tooMuchData(ZLibOp op)
+{
+ return zlibError(op, "Not enough memory");
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray invalidCompressedData()
+{
+ return zlibError(ZLibOp::Decompression, "Input data is corrupted");
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray unexpectedZlibError(ZLibOp op, int err, const char *msg)
+{
+ qWarning("%s unexpected zlib error: %s (%d)",
+ zlibOpAsString(op),
+ msg ? msg : "",
+ err);
+ return QByteArray();
+}
+
+static QByteArray xxflate(ZLibOp op, QArrayDataPointer<char> out, QByteArrayView input,
+ qxp::function_ref<int(z_stream *) const> init,
+ qxp::function_ref<int(z_stream *, size_t) const> processChunk,
+ qxp::function_ref<void(z_stream *) const> deinit)
+{
+ if (out.data() == nullptr) // allocation failed
+ return tooMuchData(op);
+ qsizetype capacity = out.allocatedCapacity();
+
+ const auto initalSize = out.size;
+
+ z_stream zs = {};
+ zs.next_in = reinterpret_cast<uchar *>(const_cast<char *>(input.data())); // 1980s C API...
+ if (const int err = init(&zs); err != Z_OK)
+ return unexpectedZlibError(op, err, zs.msg);
+ const auto sg = qScopeGuard([&] { deinit(&zs); });
+
+ using ZlibChunkSize_t = decltype(zs.avail_in);
+ static_assert(!std::is_signed_v<ZlibChunkSize_t>);
+ static_assert(std::is_same_v<ZlibChunkSize_t, decltype(zs.avail_out)>);
+ constexpr auto MaxChunkSize = std::numeric_limits<ZlibChunkSize_t>::max();
+ [[maybe_unused]]
+ constexpr auto MaxStatisticsSize = std::numeric_limits<decltype(zs.total_out)>::max();
+
+ size_t inputLeft = size_t(input.size());
+
+ int res;
+ do {
+ Q_ASSERT(out.freeSpaceAtBegin() == 0); // ensure prepend optimization stays out of the way
+ Q_ASSERT(capacity == out.allocatedCapacity());
+
+ if (zs.avail_out == 0) {
+ Q_ASSERT(size_t(out.size) - initalSize > MaxStatisticsSize || // total_out overflow
+ size_t(out.size) - initalSize == zs.total_out);
+ Q_ASSERT(out.size <= capacity);
+
+ qsizetype avail_out = capacity - out.size;
+ if (avail_out == 0) {
+ out->reallocateAndGrow(QArrayData::GrowsAtEnd, 1); // grow to next natural capacity
+ if (out.data() == nullptr) // reallocation failed
+ return tooMuchData(op);
+ capacity = out.allocatedCapacity();
+ avail_out = capacity - out.size;
+ }
+ zs.next_out = reinterpret_cast<uchar *>(out.data()) + out.size;
+ zs.avail_out = size_t(avail_out) > size_t(MaxChunkSize) ? MaxChunkSize
+ : ZlibChunkSize_t(avail_out);
+ out.size += zs.avail_out;
+
+ Q_ASSERT(zs.avail_out > 0);
+ }
+
+ if (zs.avail_in == 0) {
+ // zs.next_in is kept up-to-date by processChunk(), so nothing to do
+ zs.avail_in = inputLeft > MaxChunkSize ? MaxChunkSize : ZlibChunkSize_t(inputLeft);
+ inputLeft -= zs.avail_in;
+ }
+
+ res = processChunk(&zs, inputLeft);
+ } while (res == Z_OK);
+
+ switch (res) {
+ case Z_STREAM_END:
+ out.size -= zs.avail_out;
+ Q_ASSERT(size_t(out.size) - initalSize > MaxStatisticsSize || // total_out overflow
+ size_t(out.size) - initalSize == zs.total_out);
+ Q_ASSERT(out.size <= out.allocatedCapacity());
+ out.data()[out.size] = '\0';
+ return QByteArray(std::move(out));
+
+ case Z_MEM_ERROR:
+ return tooMuchData(op);
+
+ case Z_BUF_ERROR:
+ Q_UNREACHABLE(); // cannot happen - we supply a buffer that can hold the result,
+ // or else error out early
+
+ case Z_DATA_ERROR: // can only happen on decompression
+ Q_ASSERT(op == ZLibOp::Decompression);
+ return invalidCompressedData();
+
+ default:
+ return unexpectedZlibError(op, res, zs.msg);
+ }
+}
+
+QByteArray qCompress(const uchar* data, qsizetype nbytes, int compressionLevel)
+{
+ constexpr qsizetype HeaderSize = sizeof(CompressSizeHint_t);
+ if (nbytes == 0) {
+ return QByteArray(HeaderSize, '\0');
}
+ if (!data)
+ return dataIsNull(ZLibOp::Compression);
+
+ if (nbytes < 0)
+ return lengthIsNegative(ZLibOp::Compression);
+
if (compressionLevel < -1 || compressionLevel > 9)
compressionLevel = -1;
- ulong len = nbytes + nbytes / 100 + 13;
- QByteArray bazip;
- int res;
- do {
- bazip.resize(len + 4);
- res = ::compress2((uchar*)bazip.data()+4, &len, data, nbytes, compressionLevel);
-
- switch (res) {
- case Z_OK:
- bazip.resize(len + 4);
- bazip[0] = (nbytes & 0xff000000) >> 24;
- bazip[1] = (nbytes & 0x00ff0000) >> 16;
- bazip[2] = (nbytes & 0x0000ff00) >> 8;
- bazip[3] = (nbytes & 0x000000ff);
- break;
- case Z_MEM_ERROR:
- qWarning("qCompress: Z_MEM_ERROR: Not enough memory");
- bazip.resize(0);
- break;
- case Z_BUF_ERROR:
- len *= 2;
- break;
+ QArrayDataPointer out = [&] {
+ constexpr qsizetype SingleAllocLimit = 256 * 1024; // the maximum size for which we use
+ // zlib's compressBound() to guarantee
+ // the output buffer size is sufficient
+ // to hold result
+ qsizetype capacity = HeaderSize;
+ if (nbytes < SingleAllocLimit) {
+ // use maximum size
+ capacity += compressBound(uLong(nbytes)); // cannot overflow (both times)!
+ return QArrayDataPointer<char>(capacity);
}
- } while (res == Z_BUF_ERROR);
- return bazip;
+ // for larger buffers, assume it compresses optimally, and
+ // grow geometrically from there:
+ constexpr qsizetype MaxCompressionFactor = 1024; // max theoretical factor is 1032
+ // cf. http://www.zlib.org/zlib_tech.html,
+ // but use a nearby power-of-two (faster)
+ capacity += std::max(qsizetype(compressBound(uLong(SingleAllocLimit))),
+ nbytes / MaxCompressionFactor);
+ return QArrayDataPointer<char>(capacity, 0, QArrayData::Grow);
+ }();
+
+ if (out.data() == nullptr) // allocation failed
+ return tooMuchData(ZLibOp::Compression);
+
+ qToBigEndian(qt_saturate<CompressSizeHint_t>(nbytes), out.data());
+ out.size = HeaderSize;
+
+ return xxflate(ZLibOp::Compression, std::move(out), {data, nbytes},
+ [=] (z_stream *zs) { return deflateInit(zs, compressionLevel); },
+ [] (z_stream *zs, size_t inputLeft) {
+ return deflate(zs, inputLeft ? Z_NO_FLUSH : Z_FINISH);
+ },
+ [] (z_stream *zs) { deflateEnd(zs); });
}
#endif
@@ -616,18 +738,21 @@ QByteArray qCompress(const uchar* data, int nbytes, int compressionLevel)
data that was compressed using zlib, you first need to prepend a four
byte header to the byte array containing the data. The header must
contain the expected length (in bytes) of the uncompressed data,
- expressed as an unsigned, big-endian, 32-bit integer.
+ expressed as an unsigned, big-endian, 32-bit integer. This number is
+ just a hint for the initial size of the output buffer size,
+ though. If the indicated size is too small to hold the result, the
+ output buffer size will still be increased until either the output
+ fits or the system runs out of memory. So, despite the 32-bit
+ header, this function, on 64-bit platforms, can produce more than
+ 4GiB of output.
+
+ \note In Qt versions prior to Qt 6.5, more than 2GiB of data
+ worked unreliably; in Qt versions prior to Qt 6.0, not at all.
\sa qCompress()
*/
#ifndef QT_NO_COMPRESS
-static QByteArray invalidCompressedData()
-{
- qWarning("qUncompress: Input data is corrupted");
- return QByteArray();
-}
-
/*! \relates QByteArray
\overload
@@ -635,66 +760,41 @@ static QByteArray invalidCompressedData()
Uncompresses the first \a nbytes of \a data and returns a new byte
array with the uncompressed data.
*/
-QByteArray qUncompress(const uchar* data, int nbytes)
+QByteArray qUncompress(const uchar* data, qsizetype nbytes)
{
- if (!data) {
- qWarning("qUncompress: Data is null");
- return QByteArray();
- }
- if (nbytes <= 4) {
- if (nbytes < 4 || (data[0]!=0 || data[1]!=0 || data[2]!=0 || data[3]!=0))
- qWarning("qUncompress: Input data is corrupted");
- return QByteArray();
- }
- ulong expectedSize = uint((data[0] << 24) | (data[1] << 16) |
- (data[2] << 8) | (data[3] ));
- ulong len = qMax(expectedSize, 1ul);
- const ulong maxPossibleSize = MaxAllocSize - sizeof(QByteArray::Data);
- if (Q_UNLIKELY(len >= maxPossibleSize)) {
- // QByteArray does not support that huge size anyway.
- return invalidCompressedData();
- }
+ if (!data)
+ return dataIsNull(ZLibOp::Decompression);
- QByteArray::DataPointer d(QByteArray::Data::allocate(expectedSize + 1));
- if (Q_UNLIKELY(d.data() == nullptr))
+ if (nbytes < 0)
+ return lengthIsNegative(ZLibOp::Decompression);
+
+ constexpr qsizetype HeaderSize = sizeof(CompressSizeHint_t);
+ if (nbytes < HeaderSize)
return invalidCompressedData();
- forever {
- ulong alloc = len;
- int res = ::uncompress((uchar*)d.data(), &len,
- data+4, nbytes-4);
-
- switch (res) {
- case Z_OK: {
- Q_ASSERT(len <= alloc);
- Q_UNUSED(alloc)
- d.data()[len] = '\0';
- d.size = len;
- return QByteArray(d);
- }
+ const auto expectedSize = qFromBigEndian<CompressSizeHint_t>(data);
+ if (nbytes == HeaderSize) {
+ if (expectedSize != 0)
+ return invalidCompressedData();
+ return QByteArray();
+ }
- case Z_MEM_ERROR:
- qWarning("qUncompress: Z_MEM_ERROR: Not enough memory");
- return QByteArray();
+ constexpr auto MaxDecompressedSize = size_t(QByteArray::max_size());
+ if constexpr (MaxDecompressedSize < std::numeric_limits<CompressSizeHint_t>::max()) {
+ if (expectedSize > MaxDecompressedSize)
+ return tooMuchData(ZLibOp::Decompression);
+ }
- case Z_BUF_ERROR:
- len *= 2;
- if (Q_UNLIKELY(len >= maxPossibleSize)) {
- // QByteArray does not support that huge size anyway.
- return invalidCompressedData();
- } else {
- // grow the block
- d->reallocate(d->allocatedCapacity()*2, QByteArray::Data::GrowsForward);
- if (Q_UNLIKELY(d.data() == nullptr))
- return invalidCompressedData();
- }
- continue;
+ // expectedSize may be truncated, so always use at least nbytes
+ // (larger by at most 1%, according to zlib docs)
+ qsizetype capacity = std::max(qsizetype(expectedSize), // cannot overflow!
+ nbytes);
- case Z_DATA_ERROR:
- qWarning("qUncompress: Z_DATA_ERROR: Input data is corrupted");
- return QByteArray();
- }
- }
+ QArrayDataPointer<char> d(capacity);
+ return xxflate(ZLibOp::Decompression, std::move(d), {data + HeaderSize, nbytes - HeaderSize},
+ [] (z_stream *zs) { return inflateInit(zs); },
+ [] (z_stream *zs, size_t) { return inflate(zs, Z_NO_FLUSH); },
+ [] (z_stream *zs) { inflateEnd(zs); });
}
#endif
@@ -709,6 +809,14 @@ QByteArray qUncompress(const uchar* data, int nbytes)
\reentrant
+ \compares strong
+ \compareswith strong {const char *} QByteArrayView
+ \endcompareswith
+ \compareswith strong QChar char16_t QString QStringView QLatin1StringView \
+ QUtf8StringView
+ When comparing with string types, the content is interpreted as utf-8.
+ \endcompareswith
+
QByteArray can be used to store both raw bytes (including '\\0's)
and traditional 8-bit '\\0'-terminated strings. Using QByteArray
is much more convenient than using \c{const char *}. Behind the
@@ -756,7 +864,7 @@ QByteArray qUncompress(const uchar* data, int nbytes)
at() can be faster than operator[](), because it never causes a
\l{deep copy} to occur.
- To extract many bytes at a time, use left(), right(), or mid().
+ To extract many bytes at a time, use first(), last(), or sliced().
A QByteArray can embed '\\0' bytes. The size() function always
returns the size of the whole array, including embedded '\\0'
@@ -785,16 +893,48 @@ QByteArray qUncompress(const uchar* data, int nbytes)
\snippet code/src_corelib_text_qbytearray.cpp 3
- The replace() and remove() functions' first two arguments are the
- position from which to start erasing and the number of bytes that
- should be erased.
+ In the above example the replace() function's first two arguments are the
+ position from which to start replacing and the number of bytes that
+ should be replaced.
+
+ When data-modifying functions increase the size of the array,
+ they may lead to reallocation of memory for the QByteArray object. When
+ this happens, QByteArray expands by more than it immediately needs so as
+ to have space for further expansion without reallocation until the size
+ of the array has greatly increased.
+
+ The insert(), remove() and, when replacing a sub-array with one of
+ different size, replace() functions can be slow (\l{linear time}) for
+ large arrays, because they require moving many bytes in the array by
+ at least one position in memory.
- When you append() data to a non-empty array, the array will be
- reallocated and the new data copied to it. You can avoid this
- behavior by calling reserve(), which preallocates a certain amount
+ If you are building a QByteArray gradually and know in advance
+ approximately how many bytes the QByteArray will contain, you
+ can call reserve(), asking QByteArray to preallocate a certain amount
of memory. You can also call capacity() to find out how much
- memory QByteArray actually allocated. Data appended to an empty
- array is not copied.
+ memory the QByteArray actually has allocated.
+
+ Note that using non-const operators and functions can cause
+ QByteArray to do a deep copy of the data, due to \l{implicit sharing}.
+
+ QByteArray provides \l{STL-style iterators} (QByteArray::const_iterator and
+ QByteArray::iterator). In practice, iterators are handy when working with
+ generic algorithms provided by the C++ standard library.
+
+ \note Iterators and references to individual QByteArray elements are subject
+ to stability issues. They are often invalidated when a QByteArray-modifying
+ operation (e.g. insert() or remove()) is called. When stability and
+ iterator-like functionality is required, you should use indexes instead of
+ iterators as they are not tied to QByteArray's internal state and thus do
+ not get invalidated.
+
+ \note Iterators over a QByteArray, and references to individual bytes
+ within one, cannot be relied on to remain valid when any non-const method
+ of the QByteArray is called. Accessing such an iterator or reference after
+ the call to a non-const method leads to undefined behavior. When stability
+ for iterator-like functionality is required, you should use indexes instead
+ of iterators as they are not tied to QByteArray's internal state and thus do
+ not get invalidated.
If you want to find all occurrences of a particular byte or sequence of
bytes in a QByteArray, use indexOf() or lastIndexOf(). The former searches
@@ -836,15 +976,19 @@ QByteArray qUncompress(const uchar* data, int nbytes)
\section1 Maximum size and out-of-memory conditions
- The current version of QByteArray is limited to just under 2 GB (2^31
- bytes) in size. The exact value is architecture-dependent, since it depends
- on the overhead required for managing the data block, but is no more than
- 32 bytes. Raw data blocks are also limited by the use of \c int type in the
- current version to 2 GB minus 1 byte.
+ The maximum size of QByteArray depends on the architecture. Most 64-bit
+ systems can allocate more than 2 GB of memory, with a typical limit
+ of 2^63 bytes. The actual value also depends on the overhead required for
+ managing the data block. As a result, you can expect the maximum size
+ of 2 GB minus overhead on 32-bit platforms, and 2^63 bytes minus overhead
+ on 64-bit platforms. The number of elements that can be stored in a
+ QByteArray is this maximum size.
- In case memory allocation fails, QByteArray will throw a \c std::bad_alloc
- exception. Out of memory conditions in the Qt containers are the only case
- where Qt will throw exceptions.
+ When memory allocation fails, QByteArray throws a \c std::bad_alloc
+ exception if the application is being compiled with exception support.
+ Out of memory conditions in Qt containers are the only case where Qt
+ will throw exceptions. If exceptions are disabled, then running out of
+ memory is undefined behavior.
Note that the operating system may impose further limits on applications
holding a lot of allocated memory, especially large, contiguous blocks.
@@ -878,17 +1022,18 @@ QByteArray qUncompress(const uchar* data, int nbytes)
\section2 Spacing Characters
A frequent requirement is to remove spacing characters from a byte array
- ('\\n', '\\t', ' ', etc.). If you want to remove spacing from both ends of a
- QByteArray, use trimmed(). If you want to also replace each run of spacing
- characters with a single space character within the byte array, use
+ (\c{'\n'}, \c{'\t'}, \c{' '}, etc.). If you want to remove spacing from both
+ ends of a QByteArray, use trimmed(). If you want to also replace each run of
+ spacing characters with a single space character within the byte array, use
simplified(). Only ASCII spacing characters are recognized for these
purposes.
\section2 Number-String Conversions
- Functions that perform conversions between numeric data types and strings
- are performed in the C locale, regardless of the user's locale settings. Use
- QLocale to perform locale-aware conversions between numbers and strings.
+ Functions that perform conversions between numeric data types and string
+ representations are performed in the C locale, regardless of the user's
+ locale settings. Use QLocale to perform locale-aware conversions between
+ numbers and strings.
\section2 Character Case
@@ -896,13 +1041,13 @@ QByteArray qUncompress(const uchar* data, int nbytes)
comparison is limited to ASCII. Non-ASCII characters are treated as
caseless, since their case depends on encoding. This affects functions that
support a case insensitive option or that change the case of their
- arguments. Functions that this affects include contains(), indexOf(),
- lastIndexOf(), isLower(), isUpper(), toLower() and toUpper().
+ arguments. Functions that this affects include compare(), isLower(),
+ isUpper(), toLower() and toUpper().
This issue does not apply to \l{QString}s since they represent characters
using Unicode.
- \sa QString, QBitArray
+ \sa QByteArrayView, QString, QBitArray
*/
/*!
@@ -941,6 +1086,11 @@ QByteArray qUncompress(const uchar* data, int nbytes)
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first
byte in the byte-array.
+//! [iterator-invalidation-func-desc]
+ \warning The returned iterator is invalidated on detachment or when the
+ QByteArray is modified.
+//! [iterator-invalidation-func-desc]
+
\sa constBegin(), end()
*/
@@ -955,6 +1105,8 @@ QByteArray qUncompress(const uchar* data, int nbytes)
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the
first byte in the byte-array.
+ \include qbytearray.cpp iterator-invalidation-func-desc
+
\sa begin(), cend()
*/
@@ -963,6 +1115,8 @@ QByteArray qUncompress(const uchar* data, int nbytes)
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the
first byte in the byte-array.
+ \include qbytearray.cpp iterator-invalidation-func-desc
+
\sa begin(), constEnd()
*/
@@ -971,6 +1125,8 @@ QByteArray qUncompress(const uchar* data, int nbytes)
Returns an \l{STL-style iterators}{STL-style iterator} pointing just after
the last byte in the byte-array.
+ \include qbytearray.cpp iterator-invalidation-func-desc
+
\sa begin(), constEnd()
*/
@@ -985,6 +1141,8 @@ QByteArray qUncompress(const uchar* data, int nbytes)
Returns a const \l{STL-style iterators}{STL-style iterator} pointing just
after the last byte in the byte-array.
+ \include qbytearray.cpp iterator-invalidation-func-desc
+
\sa cbegin(), end()
*/
@@ -993,14 +1151,18 @@ QByteArray qUncompress(const uchar* data, int nbytes)
Returns a const \l{STL-style iterators}{STL-style iterator} pointing just
after the last byte in the byte-array.
+ \include qbytearray.cpp iterator-invalidation-func-desc
+
\sa constBegin(), end()
*/
/*! \fn QByteArray::reverse_iterator QByteArray::rbegin()
\since 5.6
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- byte in the byte-array, in reverse order.
+ Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to
+ the first byte in the byte-array, in reverse order.
+
+ \include qbytearray.cpp iterator-invalidation-func-desc
\sa begin(), crbegin(), rend()
*/
@@ -1013,8 +1175,10 @@ QByteArray qUncompress(const uchar* data, int nbytes)
/*! \fn QByteArray::const_reverse_iterator QByteArray::crbegin() const
\since 5.6
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- byte in the byte-array, in reverse order.
+ Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing
+ to the first byte in the byte-array, in reverse order.
+
+ \include qbytearray.cpp iterator-invalidation-func-desc
\sa begin(), rbegin(), rend()
*/
@@ -1022,8 +1186,10 @@ QByteArray qUncompress(const uchar* data, int nbytes)
/*! \fn QByteArray::reverse_iterator QByteArray::rend()
\since 5.6
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last byte in the byte-array, in reverse order.
+ Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing just
+ after the last byte in the byte-array, in reverse order.
+
+ \include qbytearray.cpp iterator-invalidation-func-desc
\sa end(), crend(), rbegin()
*/
@@ -1036,8 +1202,10 @@ QByteArray qUncompress(const uchar* data, int nbytes)
/*! \fn QByteArray::const_reverse_iterator QByteArray::crend() const
\since 5.6
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to one
- past the last byte in the byte-array, in reverse order.
+ Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing
+ just after the last byte in the byte-array, in reverse order.
+
+ \include qbytearray.cpp iterator-invalidation-func-desc
\sa end(), rend(), rbegin()
*/
@@ -1048,6 +1216,13 @@ QByteArray qUncompress(const uchar* data, int nbytes)
to append(\a other).
*/
+/*! \fn void QByteArray::push_back(QByteArrayView str)
+ \since 6.0
+ \overload
+
+ Same as append(\a str).
+*/
+
/*! \fn void QByteArray::push_back(const char *str)
\overload
@@ -1068,6 +1243,13 @@ QByteArray qUncompress(const uchar* data, int nbytes)
to prepend(\a other).
*/
+/*! \fn void QByteArray::push_front(QByteArrayView str)
+ \since 6.0
+ \overload
+
+ Same as prepend(\a str).
+*/
+
/*! \fn void QByteArray::push_front(const char *str)
\overload
@@ -1089,6 +1271,37 @@ QByteArray qUncompress(const uchar* data, int nbytes)
squeeze().
*/
+/*!
+ \since 6.1
+
+ Removes from the byte array the characters in the half-open range
+ [ \a first , \a last ). Returns an iterator to the character
+ referred to by \a last before the erase.
+*/
+QByteArray::iterator QByteArray::erase(QByteArray::const_iterator first, QByteArray::const_iterator last)
+{
+ const auto start = std::distance(cbegin(), first);
+ const auto len = std::distance(first, last);
+ remove(start, len);
+ return begin() + start;
+}
+
+/*!
+ \fn QByteArray::iterator QByteArray::erase(QByteArray::const_iterator it)
+
+ \overload
+ \since 6.5
+
+ Removes the character denoted by \c it from the byte array.
+ Returns an iterator to the character immediately after the
+ erased character.
+
+ \code
+ QByteArray ba = "abcdefg";
+ auto it = ba.erase(ba.cbegin()); // ba is now "bcdefg" and it points to "b"
+ \endcode
+*/
+
/*! \fn QByteArray::QByteArray(const QByteArray &other)
Constructs a copy of \a other.
@@ -1136,24 +1349,19 @@ QByteArray &QByteArray::operator=(const QByteArray & other) noexcept
\overload
Assigns \a str to this byte array.
+
+ \a str is assumed to point to a null-terminated string, and its length is
+ determined dynamically.
*/
QByteArray &QByteArray::operator=(const char *str)
{
- if (!str || !*str) {
- if (!str) {
- d.clear();
- } else {
- d = QByteArrayData(Data::allocate(0), 0);
- }
+ if (!str) {
+ d.clear();
+ } else if (!*str) {
+ d = DataPointer::fromRawData(&_empty, 0);
} else {
- const int len = int(strlen(str));
- const uint fullLen = uint(len) + 1;
- if (d->needsDetach() || fullLen > d->allocatedCapacity()
- || (len < size() && fullLen < (d->allocatedCapacity() >> 1)))
- reallocData(fullLen, d->detachFlags());
- memcpy(d.data(), str, fullLen); // include null terminator
- d.size = len;
+ assign(str);
}
return *this;
}
@@ -1173,7 +1381,7 @@ QByteArray &QByteArray::operator=(const char *str)
fast and never fails.
*/
-/*! \fn int QByteArray::size() const
+/*! \fn qsizetype QByteArray::size() const
Returns the number of bytes in this byte array.
@@ -1182,7 +1390,7 @@ QByteArray &QByteArray::operator=(const char *str)
you can use the return value of data() and constData() as arguments to
functions that expect '\\0'-terminated strings. If the QByteArray object was
created from a \l{fromRawData()}{raw data} that didn't include the trailing
- '\\0'-termination byte, then QByteArray doesn't add it automaticall unless a
+ '\\0'-termination byte, then QByteArray doesn't add it automatically unless a
\l{deep copy} is created.
Example:
@@ -1191,6 +1399,15 @@ QByteArray &QByteArray::operator=(const char *str)
\sa isEmpty(), resize()
*/
+/*! \fn qsizetype QByteArray::max_size()
+ \since 6.8
+
+ This function is provided for STL compatibility.
+ It returns the maximum number of elements that the byte array can
+ theoretically hold. In practice, the number can be much smaller,
+ limited by the amount of memory available to the system.
+*/
+
/*! \fn bool QByteArray::isEmpty() const
Returns \c true if the byte array has size 0; otherwise returns \c false.
@@ -1201,7 +1418,7 @@ QByteArray &QByteArray::operator=(const char *str)
\sa size()
*/
-/*! \fn int QByteArray::capacity() const
+/*! \fn qsizetype QByteArray::capacity() const
Returns the maximum number of bytes that can be stored in the
byte array without forcing a reallocation.
@@ -1214,21 +1431,36 @@ QByteArray &QByteArray::operator=(const char *str)
\note a statically allocated byte array will report a capacity of 0,
even if it's not empty.
+ \note The free space position in the allocated memory block is undefined. In
+ other words, one should not assume that the free memory is always located
+ after the initialized elements.
+
\sa reserve(), squeeze()
*/
-/*! \fn void QByteArray::reserve(int size)
+/*! \fn void QByteArray::reserve(qsizetype size)
+
+ Attempts to allocate memory for at least \a size bytes.
- Attempts to allocate memory for at least \a size bytes. If you
- know in advance how large the byte array will be, you can call
+ If you know in advance how large the byte array will be, you can call
this function, and if you call resize() often you are likely to
- get better performance. If \a size is an underestimate, the worst
- that will happen is that the QByteArray will be a bit slower.
+ get better performance.
+
+ If in doubt about how much space shall be needed, it is usually better to
+ use an upper bound as \a size, or a high estimate of the most likely size,
+ if a strict upper bound would be much bigger than this. If \a size is an
+ underestimate, the array will grow as needed once the reserved size is
+ exceeded, which may lead to a larger allocation than your best overestimate
+ would have and will slow the operation that triggers it.
+
+ \warning reserve() reserves memory but does not change the size of the byte
+ array. Accessing data beyond the end of the byte array is undefined
+ behavior. If you need to access memory beyond the current end of the array,
+ use resize().
The sole purpose of this function is to provide a means of fine
tuning QByteArray's memory usage. In general, you will rarely
- ever need to call this function. If you want to change the size
- of the byte array, call resize().
+ ever need to call this function.
\sa squeeze(), capacity()
*/
@@ -1247,12 +1479,16 @@ QByteArray &QByteArray::operator=(const char *str)
/*! \fn QByteArray::operator const char *() const
\fn QByteArray::operator const void *() const
- \obsolete Use constData() instead.
+ \note Use constData() instead in new code.
Returns a pointer to the data stored in the byte array. The
pointer can be used to access the bytes that compose the array.
- The data is '\\0'-terminated. The pointer remains valid as long
- as the array isn't reallocated or destroyed.
+ The data is '\\0'-terminated.
+
+//! [pointer-invalidation-desc]
+ The pointer remains valid as long as no detach happens and the QByteArray
+ is not modified.
+//! [pointer-invalidation-desc]
This operator is mostly useful to pass a byte array to a function
that accepts a \c{const char *}.
@@ -1287,9 +1523,10 @@ QByteArray &QByteArray::operator=(const char *str)
Example:
\snippet code/src_corelib_text_qbytearray.cpp 8
- The pointer remains valid as long as the byte array isn't
- reallocated or destroyed. For read-only access, constData() is
- faster because it never causes a \l{deep copy} to occur.
+ \include qbytearray.cpp pointer-invalidation-desc
+
+ For read-only access, constData() is faster because it never
+ causes a \l{deep copy} to occur.
This function is mostly useful to pass a byte array to a function
that accepts a \c{const char *}.
@@ -1318,11 +1555,11 @@ QByteArray &QByteArray::operator=(const char *str)
/*! \fn const char *QByteArray::constData() const
- Returns a pointer to the data stored in the byte array. The pointer can be
- used to access the bytes that compose the array. The data is
+ Returns a pointer to the const data stored in the byte array. The pointer
+ can be used to access the bytes that compose the array. The data is
'\\0'-terminated unless the QByteArray object was created from raw data.
- The pointer remains valid as long as the byte array isn't reallocated or
- destroyed.
+
+ \include qbytearray.cpp pointer-invalidation-desc
This function is mostly useful to pass a byte array to a function
that accepts a \c{const char *}.
@@ -1349,7 +1586,7 @@ QByteArray &QByteArray::operator=(const char *str)
\internal
*/
-/*! \fn char QByteArray::at(int i) const
+/*! \fn char QByteArray::at(qsizetype i) const
Returns the byte at index position \a i in the byte array.
@@ -1359,7 +1596,7 @@ QByteArray &QByteArray::operator=(const char *str)
\sa operator[]()
*/
-/*! \fn char &QByteArray::operator[](int i)
+/*! \fn char &QByteArray::operator[](qsizetype i)
Returns the byte at index position \a i as a modifiable reference.
@@ -1372,7 +1609,7 @@ QByteArray &QByteArray::operator=(const char *str)
\sa at()
*/
-/*! \fn char QByteArray::operator[](int i) const
+/*! \fn char QByteArray::operator[](qsizetype i) const
\overload
@@ -1439,22 +1676,15 @@ QByteArray &QByteArray::operator=(const char *str)
\sa front(), at(), operator[]()
*/
-/*! \fn bool QByteArray::contains(const QByteArray &ba) const
+/*! \fn bool QByteArray::contains(QByteArrayView bv) const
+ \since 6.0
- Returns \c true if the byte array contains an occurrence of the byte
- array \a ba; otherwise returns \c false.
+ Returns \c true if this byte array contains an occurrence of the
+ sequence of bytes viewed by \a bv; otherwise returns \c false.
\sa indexOf(), count()
*/
-/*! \fn bool QByteArray::contains(const char *str) const
-
- \overload
-
- Returns \c true if the byte array contains the '\\0'-terminated string \a
- str; otherwise returns \c false.
-*/
-
/*! \fn bool QByteArray::contains(char ch) const
\overload
@@ -1472,9 +1702,9 @@ QByteArray &QByteArray::operator=(const char *str)
Example:
\snippet code/src_corelib_text_qbytearray.cpp 10
- \sa chop(), resize(), left()
+ \sa chop(), resize(), first()
*/
-void QByteArray::truncate(int pos)
+void QByteArray::truncate(qsizetype pos)
{
if (pos < size())
resize(pos);
@@ -1490,10 +1720,10 @@ void QByteArray::truncate(int pos)
Example:
\snippet code/src_corelib_text_qbytearray.cpp 11
- \sa truncate(), resize(), left()
+ \sa truncate(), resize(), first()
*/
-void QByteArray::chop(int n)
+void QByteArray::chop(qsizetype n)
{
if (n > 0)
resize(size() - n);
@@ -1540,7 +1770,7 @@ void QByteArray::chop(int n)
reference to this byte array.
*/
-/*! \fn int QByteArray::length() const
+/*! \fn qsizetype QByteArray::length() const
Same as size().
*/
@@ -1581,16 +1811,21 @@ void QByteArray::chop(int n)
\sa fromRawData()
*/
-QByteArray::QByteArray(const char *data, int size)
+QByteArray::QByteArray(const char *data, qsizetype size)
{
if (!data) {
d = DataPointer();
} else {
if (size < 0)
- size = int(strlen(data));
- d = DataPointer(Data::allocate(uint(size) + 1u), size);
- memcpy(d.data(), data, size);
- d.data()[size] = '\0';
+ size = qstrlen(data);
+ if (!size) {
+ d = DataPointer::fromRawData(&_empty, 0);
+ } else {
+ d = DataPointer(size, size);
+ Q_CHECK_PTR(d.data());
+ memcpy(d.data(), data, size);
+ d.data()[size] = '\0';
+ }
}
}
@@ -1600,27 +1835,31 @@ QByteArray::QByteArray(const char *data, int size)
\sa fill()
*/
-QByteArray::QByteArray(int size, char ch)
+QByteArray::QByteArray(qsizetype size, char ch)
{
if (size <= 0) {
- d = DataPointer(Data::allocate(0), 0);
+ d = DataPointer::fromRawData(&_empty, 0);
} else {
- d = DataPointer(Data::allocate(uint(size) + 1u), size);
+ d = DataPointer(size, size);
+ Q_CHECK_PTR(d.data());
memset(d.data(), ch, size);
d.data()[size] = '\0';
}
}
/*!
- \internal
-
Constructs a byte array of size \a size with uninitialized contents.
*/
-QByteArray::QByteArray(int size, Qt::Initialization)
+QByteArray::QByteArray(qsizetype size, Qt::Initialization)
{
- d = DataPointer(Data::allocate(uint(size) + 1u), size);
- d.data()[size] = '\0';
+ if (size <= 0) {
+ d = DataPointer::fromRawData(&_empty, 0);
+ } else {
+ d = DataPointer(size, size);
+ Q_CHECK_PTR(d.data());
+ d.data()[size] = '\0';
+ }
}
/*!
@@ -1630,24 +1869,68 @@ QByteArray::QByteArray(int size, Qt::Initialization)
extended to make it \a size bytes with the extra bytes added to
the end. The new bytes are uninitialized.
- If \a size is less than the current size, bytes are removed from
- the end.
+ If \a size is less than the current size, bytes beyond position
+ \a size are excluded from the byte array.
+
+ \note While resize() will grow the capacity if needed, it never shrinks
+ capacity. To shed excess capacity, use squeeze().
- \sa size(), truncate()
+ \sa size(), truncate(), squeeze()
*/
-void QByteArray::resize(int size)
+void QByteArray::resize(qsizetype size)
{
if (size < 0)
size = 0;
- if (d->needsDetach() || size > capacity())
- reallocData(uint(size) + 1u, d->detachFlags() | Data::GrowsForward);
+ const auto capacityAtEnd = capacity() - d.freeSpaceAtBegin();
+ if (d->needsDetach() || size > capacityAtEnd)
+ reallocData(size, QArrayData::Grow);
d.size = size;
if (d->allocatedCapacity())
d.data()[size] = 0;
}
/*!
+ \since 6.4
+
+ Sets the size of the byte array to \a newSize bytes.
+
+ If \a newSize is greater than the current size, the byte array is
+ extended to make it \a newSize bytes with the extra bytes added to
+ the end. The new bytes are initialized to \a c.
+
+ If \a newSize is less than the current size, bytes beyond position
+ \a newSize are excluded from the byte array.
+
+ \note While resize() will grow the capacity if needed, it never shrinks
+ capacity. To shed excess capacity, use squeeze().
+
+ \sa size(), truncate(), squeeze()
+*/
+void QByteArray::resize(qsizetype newSize, char c)
+{
+ const auto old = d.size;
+ resize(newSize);
+ if (old < d.size)
+ memset(d.data() + old, c, d.size - old);
+}
+
+/*!
+ \since 6.8
+
+ Resizes the byte array to \a size bytes. If the size of the
+ byte array grows, the new bytes are uninitialized.
+
+ The behavior is identical to \c{resize(size)}.
+
+ \sa resize()
+*/
+void QByteArray::resizeForOverwrite(qsizetype size)
+{
+ resize(size);
+}
+
+/*!
Sets every byte in the byte array to \a ch. If \a size is different from -1
(the default), the byte array is resized to size \a size beforehand.
@@ -1657,7 +1940,7 @@ void QByteArray::resize(int size)
\sa resize()
*/
-QByteArray &QByteArray::fill(char ch, int size)
+QByteArray &QByteArray::fill(char ch, qsizetype size)
{
resize(size < 0 ? this->size() : size);
if (this->size())
@@ -1665,88 +1948,90 @@ QByteArray &QByteArray::fill(char ch, int size)
return *this;
}
-void QByteArray::reallocData(uint alloc, Data::ArrayOptions options)
+void QByteArray::reallocData(qsizetype alloc, QArrayData::AllocationOption option)
{
- if (d->needsDetach()) {
- DataPointer dd(Data::allocate(alloc, options), qMin(int(alloc) - 1, d.size));
- ::memcpy(dd.data(), d.data(), dd.size);
+ if (!alloc) {
+ d = DataPointer::fromRawData(&_empty, 0);
+ return;
+ }
+
+ // don't use reallocate path when reducing capacity and there's free space
+ // at the beginning: might shift data pointer outside of allocated space
+ const bool cannotUseReallocate = d.freeSpaceAtBegin() > 0;
+
+ if (d->needsDetach() || cannotUseReallocate) {
+ DataPointer dd(alloc, qMin(alloc, d.size), option);
+ Q_CHECK_PTR(dd.data());
+ if (dd.size > 0)
+ ::memcpy(dd.data(), d.data(), dd.size);
dd.data()[dd.size] = 0;
d = dd;
} else {
- d->reallocate(alloc, options);
+ d->reallocate(alloc, option);
}
}
-void QByteArray::expand(int i)
+void QByteArray::reallocGrowData(qsizetype n)
{
- resize(qMax(i + 1, size()));
-}
+ if (!n) // expected to always allocate
+ n = 1;
-/*!
- \internal
- Return a QByteArray that is sure to be '\\0'-terminated.
+ if (d->needsDetach()) {
+ DataPointer dd(DataPointer::allocateGrow(d, n, QArrayData::GrowsAtEnd));
+ Q_CHECK_PTR(dd.data());
+ dd->copyAppend(d.data(), d.data() + d.size);
+ dd.data()[dd.size] = 0;
+ d = dd;
+ } else {
+ d->reallocate(d.constAllocatedCapacity() + n, QArrayData::Grow);
+ }
+}
- By default, all QByteArray have an extra NUL at the end,
- guaranteeing that assumption. However, if QByteArray::fromRawData
- is used, then the NUL is there only if the user put it there. We
- can't be sure.
-*/
-QByteArray QByteArray::nulTerminated() const
+void QByteArray::expand(qsizetype i)
{
- // is this fromRawData?
- if (!IS_RAW_DATA(d))
- return *this; // no, then we're sure we're zero terminated
-
- QByteArray copy(*this);
- copy.detach();
- return copy;
+ resize(qMax(i + 1, size()));
}
/*!
- Prepends the byte array \a ba to this byte array and returns a
+ \fn QByteArray &QByteArray::prepend(QByteArrayView ba)
+
+ Prepends the byte array view \a ba to this byte array and returns a
reference to this byte array.
+ This operation is typically very fast (\l{constant time}), because
+ QByteArray preallocates extra space at the beginning of the data,
+ so it can grow without reallocating the entire array each time.
+
Example:
\snippet code/src_corelib_text_qbytearray.cpp 15
This is the same as insert(0, \a ba).
- Note: QByteArray is an \l{implicitly shared} class. Consequently,
- if you prepend to an empty byte array, then the byte array will just
- share the data held in \a ba. In this case, no copying of data is done,
- taking \l{constant time}. If a shared instance is modified, it will
- be copied (copy-on-write), taking \l{linear time}.
-
- If the byte array being prepended to is not empty, a deep copy of the
- data is performed, taking \l{linear time}.
-
\sa append(), insert()
*/
+/*!
+ \fn QByteArray &QByteArray::prepend(const QByteArray &ba)
+ \overload
+
+ Prepends \a ba to this byte array.
+*/
QByteArray &QByteArray::prepend(const QByteArray &ba)
{
- if (size() == 0 && d->isStatic() && !IS_RAW_DATA(ba.d)) {
- *this = ba;
- } else if (ba.size() != 0) {
- QByteArray tmp = *this;
- *this = ba;
- append(tmp);
- }
- return *this;
+ if (size() == 0 && ba.size() > d.constAllocatedCapacity() && ba.d.isMutable())
+ return (*this = ba);
+ return prepend(QByteArrayView(ba));
}
/*!
+ \fn QByteArray &QByteArray::prepend(const char *str)
\overload
Prepends the '\\0'-terminated string \a str to this byte array.
*/
-QByteArray &QByteArray::prepend(const char *str)
-{
- return prepend(str, qstrlen(str));
-}
-
/*!
+ \fn QByteArray &QByteArray::prepend(const char *str, qsizetype len)
\overload
\since 4.6
@@ -1754,20 +2039,7 @@ QByteArray &QByteArray::prepend(const char *str)
The bytes prepended may include '\\0' bytes.
*/
-QByteArray &QByteArray::prepend(const char *str, int len)
-{
- if (str) {
- if (d->needsDetach() || size() + len > capacity())
- reallocData(uint(size() + len) + 1u, d->detachFlags() | Data::GrowsForward);
- memmove(d.data()+len, d.data(), d.size);
- memcpy(d.data(), str, len);
- d.size += len;
- d.data()[d.size] = '\0';
- }
- return *this;
-}
-
-/*! \fn QByteArray &QByteArray::prepend(int count, char ch)
+/*! \fn QByteArray &QByteArray::prepend(qsizetype count, char ch)
\overload
\since 5.7
@@ -1776,22 +2048,12 @@ QByteArray &QByteArray::prepend(const char *str, int len)
*/
/*!
+ \fn QByteArray &QByteArray::prepend(char ch)
\overload
Prepends the byte \a ch to this byte array.
*/
-QByteArray &QByteArray::prepend(char ch)
-{
- if (d->needsDetach() || size() + 1 > capacity())
- reallocData(uint(size()) + 2u, d->detachFlags() | Data::GrowsForward);
- memmove(d.data()+1, d.data(), d.size);
- d.data()[0] = ch;
- ++d.size;
- d.data()[d.size] = '\0';
- return *this;
-}
-
/*!
Appends the byte array \a ba onto the end of this byte array.
@@ -1809,47 +2071,45 @@ QByteArray &QByteArray::prepend(char ch)
If the byte array being appended to is not empty, a deep copy of the
data is performed, taking \l{linear time}.
- This operation typically does not suffer from allocation overhead,
- because QByteArray preallocates extra space at the end of the data
- so that it may grow without reallocating for each append operation.
+ The append() function is typically very fast (\l{constant time}),
+ because QByteArray preallocates extra space at the end of the data,
+ so it can grow without reallocating the entire array each time.
\sa operator+=(), prepend(), insert()
*/
QByteArray &QByteArray::append(const QByteArray &ba)
{
- if (size() == 0 && d->isStatic() && !IS_RAW_DATA(ba.d)) {
- *this = ba;
- } else if (ba.size() != 0) {
- if (d->needsDetach() || size() + ba.size() > capacity())
- reallocData(uint(size() + ba.size()) + 1u, d->detachFlags() | Data::GrowsForward);
- memcpy(d.data() + d.size, ba.data(), ba.size());
- d.size += ba.size();
- d.data()[d.size] = '\0';
+ if (!ba.isNull()) {
+ if (isNull()) {
+ if (Q_UNLIKELY(!ba.d.isMutable()))
+ assign(ba); // fromRawData, so we do a deep copy
+ else
+ operator=(ba);
+ } else if (ba.size()) {
+ append(QByteArrayView(ba));
+ }
}
return *this;
}
/*!
+ \fn QByteArray &QByteArray::append(QByteArrayView data)
\overload
- Appends the '\\0'-terminated string \a str to this byte array.
+ Appends \a data to this byte array.
*/
-QByteArray& QByteArray::append(const char *str)
-{
- if (str) {
- const int len = int(strlen(str));
- if (d->needsDetach() || size() + len > capacity())
- reallocData(uint(size() + len) + 1u, d->detachFlags() | Data::GrowsForward);
- memcpy(d.data() + d.size, str, len + 1); // include null terminator
- d.size += len;
- }
- return *this;
-}
+/*!
+ \fn QByteArray& QByteArray::append(const char *str)
+ \overload
+
+ Appends the '\\0'-terminated string \a str to this byte array.
+*/
/*!
- \overload append()
+ \fn QByteArray &QByteArray::append(const char *str, qsizetype len)
+ \overload
Appends the first \a len bytes starting at \a str to this byte array and
returns a reference to this byte array. The bytes appended may include '\\0'
@@ -1863,21 +2123,7 @@ QByteArray& QByteArray::append(const char *str)
array. Ensure that \a len is \e not longer than \a str.
*/
-QByteArray &QByteArray::append(const char *str, int len)
-{
- if (len < 0)
- len = qstrlen(str);
- if (str && len) {
- if (d->needsDetach() || size() + len > capacity())
- reallocData(uint(size() + len) + 1u, d->detachFlags() | Data::GrowsForward);
- memcpy(d.data() + d.size, str, len);
- d.size += len;
- d.data()[d.size] = '\0';
- }
- return *this;
-}
-
-/*! \fn QByteArray &QByteArray::append(int count, char ch)
+/*! \fn QByteArray &QByteArray::append(qsizetype count, char ch)
\overload
\since 5.7
@@ -1896,95 +2142,174 @@ QByteArray &QByteArray::append(const char *str, int len)
QByteArray& QByteArray::append(char ch)
{
- if (d->needsDetach() || size() + 1 > capacity())
- reallocData(uint(size()) + 2u, d->detachFlags() | Data::GrowsForward);
- d.data()[d.size++] = ch;
+ d.detachAndGrow(QArrayData::GrowsAtEnd, 1, nullptr, nullptr);
+ d->copyAppend(1, ch);
d.data()[d.size] = '\0';
return *this;
}
/*!
- \internal
- Inserts \a len bytes from the array \a arr at position \a pos and returns a
- reference the modified byte array.
+ \fn QByteArray &QByteArray::assign(QByteArrayView v)
+ \since 6.6
+
+ Replaces the contents of this byte array with a copy of \a v and returns a
+ reference to this byte array.
+
+ The size of this byte array will be equal to the size of \a v.
+
+ This function only allocates memory if the size of \a v exceeds the capacity
+ of this byte array or this byte array is shared.
*/
-static inline QByteArray &qbytearray_insert(QByteArray *ba,
- int pos, const char *arr, int len)
+
+/*!
+ \fn QByteArray &QByteArray::assign(qsizetype n, char c)
+ \since 6.6
+
+ Replaces the contents of this byte array with \a n copies of \a c and
+ returns a reference to this byte array.
+
+ The size of this byte array will be equal to \a n, which has to be non-negative.
+
+ This function will only allocate memory if \a n exceeds the capacity of this
+ byte array or this byte array is shared.
+
+ \sa fill()
+*/
+
+/*!
+ \fn template <typename InputIterator, QByteArray::if_input_iterator<InputIterator>> QByteArray &QByteArray::assign(InputIterator first, InputIterator last)
+ \since 6.6
+
+ Replaces the contents of this byte array with a copy of the elements in the
+ iterator range [\a first, \a last) and returns a reference to this
+ byte array.
+
+ The size of this byte array will be equal to the number of elements in the
+ range [\a first, \a last).
+
+ This function will only allocate memory if the number of elements in the
+ range exceeds the capacity of this byte array or this byte array is shared.
+
+ \note This function overload only participates in overload resolution if
+ \c InputIterator meets the requirements of a
+ \l {https://en.cppreference.com/w/cpp/named_req/InputIterator} {LegacyInputIterator}.
+
+ \note The behavior is undefined if either argument is an iterator into *this or
+ [\a first, \a last) is not a valid range.
+*/
+
+QByteArray &QByteArray::assign(QByteArrayView v)
{
- if (pos < 0 || len <= 0 || arr == nullptr)
- return *ba;
-
- int oldsize = ba->size();
- ba->resize(qMax(pos, oldsize) + len);
- char *dst = ba->data();
- if (pos > oldsize)
- ::memset(dst + oldsize, 0x20, pos - oldsize);
- else
- ::memmove(dst + pos + len, dst + pos, oldsize - pos);
- memcpy(dst + pos, arr, len);
- return *ba;
+ const auto len = v.size();
+
+ if (len <= capacity() && isDetached()) {
+ const auto offset = d.freeSpaceAtBegin();
+ if (offset)
+ d.setBegin(d.begin() - offset);
+ std::memcpy(d.begin(), v.data(), len);
+ d.size = len;
+ d.data()[d.size] = '\0';
+ } else {
+ *this = v.toByteArray();
+ }
+ return *this;
}
/*!
- Inserts the byte array \a ba at index position \a i and returns a
+ Inserts \a data at index position \a i and returns a
reference to this byte array.
Example:
\snippet code/src_corelib_text_qbytearray.cpp 17
+ \since 6.0
+
+ For large byte arrays, this operation can be slow (\l{linear time}),
+ because it requires moving all the bytes at indexes \a i and
+ above by at least one position further in memory.
+
+//! [array-grow-at-insertion]
+ This array grows to accommodate the insertion. If \a i is beyond
+ the end of the array, the array is first extended with space characters
+ to reach this \a i.
+//! [array-grow-at-insertion]
\sa append(), prepend(), replace(), remove()
*/
-
-QByteArray &QByteArray::insert(int i, const QByteArray &ba)
+QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data)
{
- QByteArray copy(ba);
- return qbytearray_insert(this, i, copy.constData(), copy.size());
+ const char *str = data.data();
+ qsizetype size = data.size();
+ if (i < 0 || size <= 0)
+ return *this;
+
+ // handle this specially, as QArrayDataOps::insert() doesn't handle out of
+ // bounds positions
+ if (i >= d->size) {
+ // In case when data points into the range or is == *this, we need to
+ // defer a call to free() so that it comes after we copied the data from
+ // the old memory:
+ DataPointer detached{}; // construction is free
+ d.detachAndGrow(Data::GrowsAtEnd, (i - d.size) + size, &str, &detached);
+ Q_CHECK_PTR(d.data());
+ d->copyAppend(i - d->size, ' ');
+ d->copyAppend(str, str + size);
+ d.data()[d.size] = '\0';
+ return *this;
+ }
+
+ if (!d->needsDetach() && QtPrivate::q_points_into_range(str, d)) {
+ QVarLengthArray a(str, str + size);
+ return insert(i, a);
+ }
+
+ d->insert(i, str, size);
+ d.data()[d.size] = '\0';
+ return *this;
}
/*!
- \overload
+ \fn QByteArray &QByteArray::insert(qsizetype i, const QByteArray &data)
+ Inserts \a data at index position \a i and returns a
+ reference to this byte array.
- Inserts the '\\0'-terminated string \a str at position \a i in the byte
- array.
+ \include qbytearray.cpp array-grow-at-insertion
- If \a i is greater than size(), the array is first extended using
- resize().
+ \sa append(), prepend(), replace(), remove()
*/
-QByteArray &QByteArray::insert(int i, const char *str)
-{
- return qbytearray_insert(this, i, str, qstrlen(str));
-}
+/*!
+ \fn QByteArray &QByteArray::insert(qsizetype i, const char *s)
+ Inserts \a s at index position \a i and returns a
+ reference to this byte array.
+
+ \include qbytearray.cpp array-grow-at-insertion
+
+ The function is equivalent to \c{insert(i, QByteArrayView(s))}
+
+ \sa append(), prepend(), replace(), remove()
+*/
/*!
+ \fn QByteArray &QByteArray::insert(qsizetype i, const char *data, qsizetype len)
\overload
\since 4.6
- Inserts \a len bytes, starting at \a str, at position \a i in the byte
+ Inserts \a len bytes, starting at \a data, at position \a i in the byte
array.
- If \a i is greater than size(), the array is first extended using
- resize().
+ \include qbytearray.cpp array-grow-at-insertion
*/
-QByteArray &QByteArray::insert(int i, const char *str, int len)
-{
- return qbytearray_insert(this, i, str, len);
-}
-
/*!
+ \fn QByteArray &QByteArray::insert(qsizetype i, char ch)
\overload
- Inserts byte \a ch at index position \a i in the byte array. If \a i is
- greater than size(), the array is first extended using resize().
-*/
+ Inserts byte \a ch at index position \a i in the byte array.
-QByteArray &QByteArray::insert(int i, char ch)
-{
- return qbytearray_insert(this, i, &ch, 1);
-}
+ \include qbytearray.cpp array-grow-at-insertion
+*/
-/*! \fn QByteArray &QByteArray::insert(int i, int count, char ch)
+/*! \fn QByteArray &QByteArray::insert(qsizetype i, qsizetype count, char ch)
\overload
\since 5.7
@@ -1992,22 +2317,26 @@ QByteArray &QByteArray::insert(int i, char ch)
Inserts \a count copies of byte \a ch at index position \a i in the byte
array.
- If \a i is greater than size(), the array is first extended using resize().
+ \include qbytearray.cpp array-grow-at-insertion
*/
-QByteArray &QByteArray::insert(int i, int count, char ch)
+QByteArray &QByteArray::insert(qsizetype i, qsizetype count, char ch)
{
if (i < 0 || count <= 0)
return *this;
- int oldsize = size();
- resize(qMax(i, oldsize) + count);
- char *dst = d.data();
- if (i > oldsize)
- ::memset(dst + oldsize, 0x20, i - oldsize);
- else if (i < oldsize)
- ::memmove(dst + i + count, dst + i, oldsize - i);
- ::memset(dst + i, ch, count);
+ if (i >= d->size) {
+ // handle this specially, as QArrayDataOps::insert() doesn't handle out of bounds positions
+ d.detachAndGrow(Data::GrowsAtEnd, (i - d.size) + count, nullptr, nullptr);
+ Q_CHECK_PTR(d.data());
+ d->copyAppend(i - d->size, ' ');
+ d->copyAppend(count, ch);
+ d.data()[d.size] = '\0';
+ return *this;
+ }
+
+ d->insert(i, count, ch);
+ d.data()[d.size] = '\0';
return *this;
}
@@ -2022,24 +2351,77 @@ QByteArray &QByteArray::insert(int i, int count, char ch)
Example:
\snippet code/src_corelib_text_qbytearray.cpp 18
- \sa insert(), replace()
+ Element removal will preserve the array's capacity and not reduce the
+ amount of allocated memory. To shed extra capacity and free as much memory
+ as possible, call squeeze() after the last change to the array's size.
+
+ \sa insert(), replace(), squeeze()
*/
-QByteArray &QByteArray::remove(int pos, int len)
+QByteArray &QByteArray::remove(qsizetype pos, qsizetype len)
{
- if (len <= 0 || uint(pos) >= uint(size()))
+ if (len <= 0 || pos < 0 || size_t(pos) >= size_t(size()))
return *this;
- detach();
- if (len >= size() - pos) {
- resize(pos);
+ if (pos + len > d->size)
+ len = d->size - pos;
+
+ auto begin = d.begin();
+ if (!d->isShared()) {
+ d->erase(begin + pos, len);
+ d.data()[d.size] = '\0';
} else {
- memmove(d.data() + pos, d.data() + pos + len, size() - pos - len);
- resize(size() - len);
+ QByteArray copy{size() - len, Qt::Uninitialized};
+ const auto toRemove_start = d.begin() + pos;
+ copy.d->copyRanges({{d.begin(), toRemove_start},
+ {toRemove_start + len, d.end()}});
+ swap(copy);
}
return *this;
}
/*!
+ \fn QByteArray &QByteArray::removeAt(qsizetype pos)
+
+ \since 6.5
+
+ Removes the character at index \a pos. If \a pos is out of bounds
+ (i.e. \a pos >= size()) this function does nothing.
+
+ \sa remove()
+*/
+
+/*!
+ \fn QByteArray &QByteArray::removeFirst()
+
+ \since 6.5
+
+ Removes the first character in this byte array. If the byte array is empty,
+ this function does nothing.
+
+ \sa remove()
+*/
+/*!
+ \fn QByteArray &QByteArray::removeLast()
+
+ \since 6.5
+
+ Removes the last character in this byte array. If the byte array is empty,
+ this function does nothing.
+
+ \sa remove()
+*/
+
+/*!
+ \fn template <typename Predicate> QByteArray &QByteArray::removeIf(Predicate pred)
+ \since 6.1
+
+ Removes all bytes for which the predicate \a pred returns true
+ from the byte array. Returns a reference to the byte array.
+
+ \sa remove()
+*/
+
+/*!
Replaces \a len bytes from index position \a pos with the byte
array \a after, and returns a reference to this byte array.
@@ -2049,35 +2431,27 @@ QByteArray &QByteArray::remove(int pos, int len)
\sa insert(), remove()
*/
-QByteArray &QByteArray::replace(int pos, int len, const QByteArray &after)
+QByteArray &QByteArray::replace(qsizetype pos, qsizetype len, QByteArrayView after)
{
+ if (QtPrivate::q_points_into_range(after.data(), d)) {
+ QVarLengthArray copy(after.data(), after.data() + after.size());
+ return replace(pos, len, QByteArrayView{copy});
+ }
if (len == after.size() && (pos + len <= size())) {
- detach();
- memmove(d.data() + pos, after.data(), len*sizeof(char));
+ // same size: in-place replacement possible
+ if (len > 0) {
+ detach();
+ memcpy(d.data() + pos, after.data(), len*sizeof(char));
+ }
return *this;
} else {
- QByteArray copy(after);
// ### optimize me
remove(pos, len);
- return insert(pos, copy);
+ return insert(pos, after);
}
}
-/*! \fn QByteArray &QByteArray::replace(int pos, int len, const char *after)
-
- \overload
-
- Replaces \a len bytes from index position \a pos with the
- '\\0'-terminated string \a after.
-
- Notice: this can change the length of the byte array.
-*/
-QByteArray &QByteArray::replace(int pos, int len, const char *after)
-{
- return replace(pos,len,after,qstrlen(after));
-}
-
-/*! \fn QByteArray &QByteArray::replace(int pos, int len, const char *after, int alen)
+/*! \fn QByteArray &QByteArray::replace(qsizetype pos, qsizetype len, const char *after, qsizetype alen)
\overload
@@ -2086,83 +2460,51 @@ QByteArray &QByteArray::replace(int pos, int len, const char *after)
\since 4.7
*/
-QByteArray &QByteArray::replace(int pos, int len, const char *after, int alen)
-{
- if (len == alen && (pos + len <= size())) {
- detach();
- memcpy(d.data() + pos, after, len*sizeof(char));
- return *this;
- } else {
- remove(pos, len);
- return qbytearray_insert(this, pos, after, alen);
- }
-}
-
-// ### optimize all other replace method, by offering
-// QByteArray::replace(const char *before, int blen, const char *after, int alen)
/*!
+ \fn QByteArray &QByteArray::replace(const char *before, qsizetype bsize, const char *after, qsizetype asize)
\overload
- Replaces every occurrence of the byte array \a before with the
- byte array \a after.
-
- Example:
- \snippet code/src_corelib_text_qbytearray.cpp 20
+ Replaces every occurrence of the \a bsize bytes starting at \a before with
+ the \a asize bytes starting at \a after. Since the sizes of the strings are
+ given by \a bsize and \a asize, they may contain '\\0' bytes and do not need
+ to be '\\0'-terminated.
*/
-QByteArray &QByteArray::replace(const QByteArray &before, const QByteArray &after)
-{
- return replace(before.constData(), before.size(), after.constData(), after.size());
-}
-
/*!
- \fn QByteArray &QByteArray::replace(const char *before, const QByteArray &after)
\overload
+ \since 6.0
- Replaces every occurrence of the '\\0'-terminated string \a before with the
+ Replaces every occurrence of the byte array \a before with the
byte array \a after.
-*/
-
-QByteArray &QByteArray::replace(const char *c, const QByteArray &after)
-{
- return replace(c, qstrlen(c), after.constData(), after.size());
-}
-/*!
- \fn QByteArray &QByteArray::replace(const char *before, int bsize, const char *after, int asize)
- \overload
-
- Replaces every occurrence of the \a bsize bytes starting at \a before with
- the \asize bytes starting at \a after. Since the sizes of the strings are
- given by \a bsize and \a asize, they may contain '\\0' bytes and do not need
- to be '\\0'-terminated.
+ Example:
+ \snippet code/src_corelib_text_qbytearray.cpp 20
*/
-QByteArray &QByteArray::replace(const char *before, int bsize, const char *after, int asize)
+QByteArray &QByteArray::replace(QByteArrayView before, QByteArrayView after)
{
- if (isNull() || (before == after && bsize == asize))
+ const char *b = before.data();
+ qsizetype bsize = before.size();
+ const char *a = after.data();
+ qsizetype asize = after.size();
+
+ if (isNull() || (b == a && bsize == asize))
return *this;
// protect against before or after being part of this
- const char *a = after;
- const char *b = before;
- if (after >= constBegin() && after < constEnd()) {
- char *copy = (char *)malloc(asize);
- Q_CHECK_PTR(copy);
- memcpy(copy, after, asize);
- a = copy;
+ if (QtPrivate::q_points_into_range(a, d)) {
+ QVarLengthArray copy(a, a + asize);
+ return replace(before, QByteArrayView{copy});
}
- if (before >= constBegin() && before < constEnd()) {
- char *copy = (char *)malloc(bsize);
- Q_CHECK_PTR(copy);
- memcpy(copy, before, bsize);
- b = copy;
+ if (QtPrivate::q_points_into_range(b, d)) {
+ QVarLengthArray copy(b, b + bsize);
+ return replace(QByteArrayView{copy}, after);
}
- QByteArrayMatcher matcher(before, bsize);
- int index = 0;
- int len = size();
+ QByteArrayMatcher matcher(b, bsize);
+ qsizetype index = 0;
+ qsizetype len = size();
char *d = data(); // detaches
if (bsize == asize) {
@@ -2173,12 +2515,12 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
}
}
} else if (asize < bsize) {
- uint to = 0;
- uint movestart = 0;
- uint num = 0;
+ size_t to = 0;
+ size_t movestart = 0;
+ size_t num = 0;
while ((index = matcher.indexIn(*this, index)) != -1) {
if (num) {
- int msize = index - movestart;
+ qsizetype msize = index - movestart;
if (msize > 0) {
memmove(d + to, d + movestart, msize);
to += msize;
@@ -2195,7 +2537,7 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
num++;
}
if (num) {
- int msize = len - movestart;
+ qsizetype msize = len - movestart;
if (msize > 0)
memmove(d + to, d + movestart, msize);
resize(len - num*(bsize-asize));
@@ -2204,8 +2546,8 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
// the most complex case. We don't want to lose performance by doing repeated
// copies and reallocs of the data.
while (index != -1) {
- uint indices[4096];
- uint pos = 0;
+ size_t indices[4096];
+ size_t pos = 0;
while(pos < 4095) {
index = matcher.indexIn(*this, index);
if (index == -1)
@@ -2220,12 +2562,12 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
break;
// we have a table of replacement positions, use them for fast replacing
- int adjust = pos*(asize-bsize);
+ qsizetype adjust = pos*(asize-bsize);
// index has to be adjusted in case we get back into the loop above.
if (index != -1)
index += adjust;
- int newlen = len + adjust;
- int moveend = len;
+ qsizetype newlen = len + adjust;
+ qsizetype moveend = len;
if (newlen > len) {
resize(newlen);
len = newlen;
@@ -2234,9 +2576,9 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
while(pos) {
pos--;
- int movestart = indices[pos] + bsize;
- int insertstart = indices[pos] + pos*(asize-bsize);
- int moveto = insertstart + asize;
+ qsizetype movestart = indices[pos] + bsize;
+ qsizetype insertstart = indices[pos] + pos*(asize-bsize);
+ qsizetype moveto = insertstart + asize;
memmove(d + moveto, d + movestart, (moveend - movestart));
if (asize)
memcpy(d + insertstart, a, asize);
@@ -2244,54 +2586,17 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
}
}
}
-
- if (a != after)
- ::free(const_cast<char *>(a));
- if (b != before)
- ::free(const_cast<char *>(b));
-
-
return *this;
}
-
-/*!
- \fn QByteArray &QByteArray::replace(const QByteArray &before, const char *after)
- \overload
-
- Replaces every occurrence of the byte in \a before with the '\\0'-terminated
- string \a after.
-*/
-
-/*! \fn QByteArray &QByteArray::replace(const char *before, const char *after)
-
- \overload
-
- Replaces every occurrence of the '\\0'-terminated string \a before with the
- '\\0'-terminated string \a after.
-*/
-
/*!
+ \fn QByteArray &QByteArray::replace(char before, QByteArrayView after)
\overload
Replaces every occurrence of the byte \a before with the byte array \a
after.
*/
-QByteArray &QByteArray::replace(char before, const QByteArray &after)
-{
- char b[2] = { before, '\0' };
- return replace(b, 1, after.constData(), after.size());
-}
-
-/*! \fn QByteArray &QByteArray::replace(char before, const char *after)
-
- \overload
-
- Replaces every occurrence of the byte \a before with the '\\0'-terminated
- string \a after.
-*/
-
/*!
\overload
@@ -2300,12 +2605,11 @@ QByteArray &QByteArray::replace(char before, const QByteArray &after)
QByteArray &QByteArray::replace(char before, char after)
{
- if (!isEmpty()) {
- char *i = data();
- char *e = i + size();
- for (; i != e; ++i)
- if (*i == before)
- * i = after;
+ if (before != after) {
+ if (const auto pos = indexOf(before); pos >= 0) {
+ const auto detachedData = data();
+ std::replace(detachedData + pos, detachedData + size(), before, after);
+ }
}
return *this;
}
@@ -2320,8 +2624,8 @@ QByteArray &QByteArray::replace(char before, char after)
QList<QByteArray> QByteArray::split(char sep) const
{
QList<QByteArray> list;
- int start = 0;
- int end;
+ qsizetype start = 0;
+ qsizetype end;
while ((end = indexOf(sep, start)) != -1) {
list.append(mid(start, end - start));
start = end + 1;
@@ -2341,7 +2645,7 @@ QList<QByteArray> QByteArray::split(char sep) const
\snippet code/src_corelib_text_qbytearray.cpp 49
*/
-QByteArray QByteArray::repeated(int times) const
+QByteArray QByteArray::repeated(qsizetype times) const
{
if (isEmpty())
return *this;
@@ -2352,7 +2656,7 @@ QByteArray QByteArray::repeated(int times) const
return QByteArray();
}
- const int resultSize = times * size();
+ const qsizetype resultSize = times * size();
QByteArray result;
result.reserve(resultSize);
@@ -2361,10 +2665,10 @@ QByteArray QByteArray::repeated(int times) const
memcpy(result.d.data(), data(), size());
- int sizeSoFar = size();
+ qsizetype sizeSoFar = size();
char *end = result.d.data() + sizeSoFar;
- const int halfResultSize = resultSize >> 1;
+ const qsizetype halfResultSize = resultSize >> 1;
while (sizeSoFar <= halfResultSize) {
memcpy(end, result.d.data(), sizeSoFar);
end += sizeSoFar;
@@ -2378,64 +2682,49 @@ QByteArray QByteArray::repeated(int times) const
#define REHASH(a) \
if (ol_minus_1 < sizeof(std::size_t) * CHAR_BIT) \
- hashHaystack -= (a) << ol_minus_1; \
+ hashHaystack -= std::size_t(a) << ol_minus_1; \
hashHaystack <<= 1
-/*!
- Returns the index position of the first occurrence of the byte
- array \a ba in this byte array, searching forward from index
- position \a from. Returns -1 if \a ba could not be found.
-
- Example:
- \snippet code/src_corelib_text_qbytearray.cpp 21
-
- \sa lastIndexOf(), contains(), count()
-*/
-
-int QByteArray::indexOf(const QByteArray &ba, int from) const
+qsizetype QtPrivate::findByteArray(QByteArrayView haystack, qsizetype from, QByteArrayView needle) noexcept
{
- const int ol = ba.size();
- if (ol == 0)
- return from;
+ const auto ol = needle.size();
+ const auto l = haystack.size();
+ if (ol == 0) {
+ if (from < 0)
+ return qMax(from + l, 0);
+ else
+ return from > l ? -1 : from;
+ }
+
if (ol == 1)
- return indexOf(ba[0], from);
+ return findByteArray(haystack, from, needle.front());
- const int l = size();
if (from > l || ol + from > l)
return -1;
- return static_cast<int>(qFindByteArray(data(), size(), from, ba.data(), ol));
+ return qFindByteArray(haystack.data(), haystack.size(), from, needle.data(), ol);
}
-/*! \fn int QByteArray::indexOf(const char *str, int from) const
-
- \overload
+/*! \fn qsizetype QByteArray::indexOf(QByteArrayView bv, qsizetype from) const
+ \since 6.0
- Returns the index position of the first occurrence of the '\\0'-terminated
- string \a str in the byte array, searching forward from index position \a
- from. Returns -1 if \a str could not be found.
-*/
-int QByteArray::indexOf(const char *c, int from) const
-{
- const int ol = qstrlen(c);
- if (ol == 1)
- return indexOf(*c, from);
+ Returns the index position of the start of the first occurrence of the
+ sequence of bytes viewed by \a bv in this byte array, searching forward
+ from index position \a from. Returns -1 if no match is found.
- const int l = size();
- if (from > l || ol + from > l)
- return -1;
- if (ol == 0)
- return from;
+ Example:
+ \snippet code/src_corelib_text_qbytearray.cpp 21
- return static_cast<int>(qFindByteArray(data(), size(), from, c, ol));
-}
+ \sa lastIndexOf(), contains(), count()
+*/
/*!
+ \fn qsizetype QByteArray::indexOf(char ch, qsizetype from) const
\overload
- Returns the index position of the first occurrence of the byte \a ch in the
- byte array, searching forward from index position \a from. Returns -1 if \a
- ch could not be found.
+ Returns the index position of the start of the first occurrence of the
+ byte \a ch in this byte array, searching forward from index position \a from.
+ Returns -1 if no match is found.
Example:
\snippet code/src_corelib_text_qbytearray.cpp 22
@@ -2443,20 +2732,6 @@ int QByteArray::indexOf(const char *c, int from) const
\sa lastIndexOf(), contains()
*/
-int QByteArray::indexOf(char ch, int from) const
-{
- if (from < 0)
- from = qMax(from + size(), 0);
- if (from < size()) {
- const char *n = data() + from - 1;
- const char *e = end();
- while (++n != e)
- if (*n == ch)
- return n - data();
- }
- return -1;
-}
-
static qsizetype lastIndexOfHelper(const char *haystack, qsizetype l, const char *needle,
qsizetype ol, qsizetype from)
{
@@ -2491,53 +2766,90 @@ static qsizetype lastIndexOfHelper(const char *haystack, qsizetype l, const char
}
-/*!
- \fn int QByteArray::lastIndexOf(const QByteArray &ba, int from) const
+static inline qsizetype lastIndexOfCharHelper(QByteArrayView haystack, qsizetype from, char needle) noexcept
+{
+ if (haystack.size() == 0)
+ return -1;
+ if (from < 0)
+ from += haystack.size();
+ else if (from > haystack.size())
+ from = haystack.size() - 1;
+ if (from >= 0) {
+ const char *b = haystack.data();
+ const char *n = b + from + 1;
+ while (n-- != b) {
+ if (*n == needle)
+ return n - b;
+ }
+ }
+ return -1;
+}
- Returns the index position of the last occurrence of the byte array \a ba in
- this byte array, searching backward from index position \a from. If \a from
- is -1 (the default), the search starts at the last byte (at index size() -
- 1). Returns -1 if \a ba could not be found.
+qsizetype QtPrivate::lastIndexOf(QByteArrayView haystack, qsizetype from, char needle) noexcept
+{
+ return lastIndexOfCharHelper(haystack, from, needle);
+}
+
+qsizetype QtPrivate::lastIndexOf(QByteArrayView haystack, qsizetype from, QByteArrayView needle) noexcept
+{
+ if (haystack.isEmpty()) {
+ if (needle.isEmpty() && from == 0)
+ return 0;
+ return -1;
+ }
+ const auto ol = needle.size();
+ if (ol == 1)
+ return lastIndexOfCharHelper(haystack, from, needle.front());
+
+ return lastIndexOfHelper(haystack.data(), haystack.size(), needle.data(), ol, from);
+}
+
+/*! \fn qsizetype QByteArray::lastIndexOf(QByteArrayView bv, qsizetype from) const
+ \since 6.0
+
+ Returns the index position of the start of the last occurrence of the
+ sequence of bytes viewed by \a bv in this byte array, searching backward
+ from index position \a from.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if no match is found.
Example:
\snippet code/src_corelib_text_qbytearray.cpp 23
+ \note When searching for a 0-length \a bv, the match at the end of
+ the data is excluded from the search by a negative \a from, even
+ though \c{-1} is normally thought of as searching from the end of
+ the byte array: the match at the end is \e after the last character, so
+ it is excluded. To include such a final empty match, either give a
+ positive value for \a from or omit the \a from parameter entirely.
+
\sa indexOf(), contains(), count()
*/
-int QByteArray::lastIndexOf(const QByteArray &ba, int from) const
-{
- const int ol = ba.size();
- if (ol == 1)
- return lastIndexOf(ba[0], from);
+/*! \fn qsizetype QByteArray::lastIndexOf(QByteArrayView bv) const
+ \since 6.2
+ \overload
- return lastIndexOfHelper(data(), size(), ba.data(), ol, from);
-}
+ Returns the index position of the start of the last occurrence of the
+ sequence of bytes viewed by \a bv in this byte array, searching backward
+ from the end of the byte array. Returns -1 if no match is found.
-/*! \fn int QByteArray::lastIndexOf(const char *str, int from) const
- \overload
+ Example:
+ \snippet code/src_corelib_text_qbytearray.cpp 23
- Returns the index position of the last occurrence of the '\\0'-terminated
- string \a str in the byte array, searching backward from index position \a
- from. If \a from is -1 (the default), the search starts at the last byte (at
- index size() - 1). Returns -1 if \a str could not be found.
+ \sa indexOf(), contains(), count()
*/
-int QByteArray::lastIndexOf(const char *str, int from) const
-{
- const int ol = qstrlen(str);
- if (ol == 1)
- return lastIndexOf(*str, from);
-
- return lastIndexOfHelper(data(), size(), str, ol, from);
-}
/*!
+ \fn qsizetype QByteArray::lastIndexOf(char ch, qsizetype from) const
\overload
- Returns the index position of the last occurrence of byte \a ch in the byte
- array, searching backward from index position \a from. If \a from is -1 (the
- default), the search starts at the last byte (at index size() - 1). Returns
- -1 if \a ch could not be found.
+ Returns the index position of the start of the last occurrence of byte \a ch
+ in this byte array, searching backward from index position \a from.
+ If \a from is -1 (the default), the search starts at the last byte
+ (at index size() - 1). Returns -1 if no match is found.
Example:
\snippet code/src_corelib_text_qbytearray.cpp 24
@@ -2545,55 +2857,45 @@ int QByteArray::lastIndexOf(const char *str, int from) const
\sa indexOf(), contains()
*/
-int QByteArray::lastIndexOf(char ch, int from) const
+static inline qsizetype countCharHelper(QByteArrayView haystack, char needle) noexcept
{
- if (from < 0)
- from += size();
- else if (from > size())
- from = size()-1;
- if (from >= 0) {
- const char *b = data();
- const char *n = b + from + 1;
- while (n-- != b)
- if (*n == ch)
- return n - b;
+ qsizetype num = 0;
+ for (char ch : haystack) {
+ if (ch == needle)
+ ++num;
}
- return -1;
+ return num;
}
-/*!
- Returns the number of (potentially overlapping) occurrences of
- byte array \a ba in this byte array.
+qsizetype QtPrivate::count(QByteArrayView haystack, QByteArrayView needle) noexcept
+{
+ if (needle.size() == 0)
+ return haystack.size() + 1;
- \sa contains(), indexOf()
-*/
+ if (needle.size() == 1)
+ return countCharHelper(haystack, needle[0]);
-int QByteArray::count(const QByteArray &ba) const
-{
- int num = 0;
- int i = -1;
- if (size() > 500 && ba.size() > 5) {
- QByteArrayMatcher matcher(ba);
- while ((i = matcher.indexIn(*this, i + 1)) != -1)
+ qsizetype num = 0;
+ qsizetype i = -1;
+ if (haystack.size() > 500 && needle.size() > 5) {
+ QByteArrayMatcher matcher(needle);
+ while ((i = matcher.indexIn(haystack, i + 1)) != -1)
++num;
} else {
- while ((i = indexOf(ba, i + 1)) != -1)
+ while ((i = haystack.indexOf(needle, i + 1)) != -1)
++num;
}
return num;
}
-/*!
- \overload
+/*! \fn qsizetype QByteArray::count(QByteArrayView bv) const
+ \since 6.0
- Returns the number of (potentially overlapping) occurrences of
- '\\0'-terminated string \a str in the byte array.
-*/
+ Returns the number of (potentially overlapping) occurrences of the
+ sequence of bytes viewed by \a bv in this byte array.
-int QByteArray::count(const char *str) const
-{
- return count(fromRawData(str, qstrlen(str)));
-}
+ \sa contains(), indexOf()
+*/
/*!
\overload
@@ -2603,138 +2905,90 @@ int QByteArray::count(const char *str) const
\sa contains(), indexOf()
*/
-int QByteArray::count(char ch) const
+qsizetype QByteArray::count(char ch) const
{
- int num = 0;
- const char *i = end();
- const char *b = begin();
- while (i != b)
- if (*--i == ch)
- ++num;
- return num;
+ return countCharHelper(*this, ch);
}
-/*! \fn int QByteArray::count() const
-
+#if QT_DEPRECATED_SINCE(6, 4)
+/*! \fn qsizetype QByteArray::count() const
+ \deprecated [6.4] Use size() or length() instead.
\overload
Same as size().
*/
+#endif
/*!
- \fn int QByteArray::compare(const char *c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 5.12
+ \fn int QByteArray::compare(QByteArrayView bv, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \since 6.0
Returns an integer less than, equal to, or greater than zero depending on
whether this QByteArray sorts before, at the same position as, or after the
- '\\0'-terminated string \a c. The comparison is performed according to case
+ QByteArrayView \a bv. The comparison is performed according to case
sensitivity \a cs.
- \sa operator==
+ \sa operator==, {Character Case}
*/
-/*!
- \fn int QByteArray::compare(const QByteArray &a, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \overload
- \since 5.12
-
- Returns an integer less than, equal to, or greater than zero depending on
- whether this QByteArray sorts before, at the same position as, or after the
- QByteArray \a a. The comparison is performed according to case sensitivity
- \a cs.
+bool QtPrivate::startsWith(QByteArrayView haystack, QByteArrayView needle) noexcept
+{
+ if (haystack.size() < needle.size())
+ return false;
+ if (haystack.data() == needle.data() || needle.size() == 0)
+ return true;
+ return memcmp(haystack.data(), needle.data(), needle.size()) == 0;
+}
- \sa operator==
-*/
+/*! \fn bool QByteArray::startsWith(QByteArrayView bv) const
+ \since 6.0
-/*!
- Returns \c true if this byte array starts with byte array \a ba;
- otherwise returns \c false.
+ Returns \c true if this byte array starts with the sequence of bytes
+ viewed by \a bv; otherwise returns \c false.
Example:
\snippet code/src_corelib_text_qbytearray.cpp 25
- \sa endsWith(), left()
+ \sa endsWith(), first()
*/
-bool QByteArray::startsWith(const QByteArray &ba) const
-{
- if (size() < ba.size())
- return false;
- if (data() == ba.data() || ba.size() == 0)
- return true;
- return memcmp(data(), ba.data(), ba.size()) == 0;
-}
-/*! \overload
-
- Returns \c true if this byte array starts with '\\0'-terminated string \a
- str; otherwise returns \c false.
-*/
-bool QByteArray::startsWith(const char *str) const
-{
- if (!str || !*str)
- return true;
- const int len = int(strlen(str));
- if (size() < len)
- return false;
- return qstrncmp(data(), str, len) == 0;
-}
-
-/*! \overload
+/*!
+ \fn bool QByteArray::startsWith(char ch) const
+ \overload
Returns \c true if this byte array starts with byte \a ch; otherwise returns
\c false.
*/
-bool QByteArray::startsWith(char ch) const
+
+bool QtPrivate::endsWith(QByteArrayView haystack, QByteArrayView needle) noexcept
{
- if (size() == 0)
+ if (haystack.size() < needle.size())
return false;
- return data()[0] == ch;
+ if (haystack.end() == needle.end() || needle.size() == 0)
+ return true;
+ return memcmp(haystack.end() - needle.size(), needle.data(), needle.size()) == 0;
}
/*!
- Returns \c true if this byte array ends with byte array \a ba;
- otherwise returns \c false.
+ \fn bool QByteArray::endsWith(QByteArrayView bv) const
+ \since 6.0
+
+ Returns \c true if this byte array ends with the sequence of bytes
+ viewed by \a bv; otherwise returns \c false.
Example:
\snippet code/src_corelib_text_qbytearray.cpp 26
- \sa startsWith(), right()
-*/
-bool QByteArray::endsWith(const QByteArray &ba) const
-{
- if (size() < ba.size())
- return false;
- if (end() == ba.end() || ba.size() == 0)
- return true;
- return memcmp(end() - ba.size(), ba.data(), ba.size()) == 0;
-}
-
-/*! \overload
-
- Returns \c true if this byte array ends with '\\0'-terminated string \a str;
- otherwise returns \c false.
+ \sa startsWith(), last()
*/
-bool QByteArray::endsWith(const char *str) const
-{
- if (!str || !*str)
- return true;
- const int len = int(strlen(str));
- if (size() < len)
- return false;
- return qstrncmp(end() - len, str, len) == 0;
-}
-/*! \overload
+/*!
+ \fn bool QByteArray::endsWith(char ch) const
+ \overload
Returns \c true if this byte array ends with byte \a ch;
otherwise returns \c false.
*/
-bool QByteArray::endsWith(char ch) const
-{
- if (size() == 0)
- return false;
- return data()[size() - 1] == ch;
-}
/*
Returns true if \a c is an uppercase ASCII letter.
@@ -2744,125 +2998,108 @@ static constexpr inline bool isUpperCaseAscii(char c)
return c >= 'A' && c <= 'Z';
}
+/*
+ Returns true if \a c is an lowercase ASCII letter.
+ */
+static constexpr inline bool isLowerCaseAscii(char c)
+{
+ return c >= 'a' && c <= 'z';
+}
+
/*!
- Returns \c true if this byte array contains only ASCII uppercase letters,
- otherwise returns \c false.
+ Returns \c true if this byte array is uppercase, that is, if
+ it's identical to its toUpper() folding.
+
+ Note that this does \e not mean that the byte array only contains
+ uppercase letters; only that it contains no ASCII lowercase letters.
+
\since 5.12
\sa isLower(), toUpper()
*/
bool QByteArray::isUpper() const
{
- if (isEmpty())
- return false;
-
- const char *d = data();
-
- for (int i = 0, max = size(); i < max; ++i) {
- if (!isUpperCaseAscii(d[i]))
- return false;
- }
-
- return true;
-}
-
-/*
- Returns true if \a c is an lowercase ASCII letter.
- */
-static constexpr inline bool isLowerCaseAscii(char c)
-{
- return c >= 'a' && c <= 'z';
+ return std::none_of(begin(), end(), isLowerCaseAscii);
}
/*!
- Returns \c true if this byte array contains only lowercase ASCII letters,
- otherwise returns \c false.
+ Returns \c true if this byte array is lowercase, that is, if
+ it's identical to its toLower() folding.
+
+ Note that this does \e not mean that the byte array only contains
+ lowercase letters; only that it contains no ASCII uppercase letters.
+
\since 5.12
\sa isUpper(), toLower()
*/
bool QByteArray::isLower() const
{
- if (isEmpty())
- return false;
+ return std::none_of(begin(), end(), isUpperCaseAscii);
+}
- const char *d = data();
+/*!
+ \fn QByteArray::isValidUtf8() const
- for (int i = 0, max = size(); i < max; ++i) {
- if (!isLowerCaseAscii(d[i]))
- return false;
- }
+ Returns \c true if this byte array contains valid UTF-8 encoded data,
+ or \c false otherwise.
- return true;
-}
+ \since 6.3
+*/
/*!
+ \fn QByteArray QByteArray::left(qsizetype len) const &
+ \fn QByteArray QByteArray::left(qsizetype len) &&
+
Returns a byte array that contains the first \a len bytes of this byte
array.
- \obsolete Use first() instead in new code.
+ If you know that \a len cannot be out of bounds, use first() instead in new
+ code, because it is faster.
The entire byte array is returned if \a len is greater than
size().
Returns an empty QByteArray if \a len is smaller than 0.
- Example:
- \snippet code/src_corelib_text_qbytearray.cpp 27
-
\sa first(), last(), startsWith(), chopped(), chop(), truncate()
*/
-QByteArray QByteArray::left(int len) const
-{
- if (len >= size())
- return *this;
- if (len < 0)
- len = 0;
- return QByteArray(data(), len);
-}
-
/*!
+ \fn QByteArray QByteArray::right(qsizetype len) const &
+ \fn QByteArray QByteArray::right(qsizetype len) &&
+
Returns a byte array that contains the last \a len bytes of this byte array.
- \obsolete Use last() instead in new code.
+ If you know that \a len cannot be out of bounds, use last() instead in new
+ code, because it is faster.
The entire byte array is returned if \a len is greater than
size().
Returns an empty QByteArray if \a len is smaller than 0.
- Example:
- \snippet code/src_corelib_text_qbytearray.cpp 28
-
- \sa endsWith(), last(), first(), sliced(), chopped(), chop(), truncate()
+ \sa endsWith(), last(), first(), sliced(), chopped(), chop(), truncate(), slice()
*/
-QByteArray QByteArray::right(int len) const
-{
- if (len >= size())
- return *this;
- if (len < 0)
- len = 0;
- return QByteArray(end() - len, len);
-}
/*!
+ \fn QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const &
+ \fn QByteArray QByteArray::mid(qsizetype pos, qsizetype len) &&
+
Returns a byte array containing \a len bytes from this byte array,
starting at position \a pos.
- \obsolete Use sliced() instead in new code.
+ If you know that \a pos and \a len cannot be out of bounds, use sliced()
+ instead in new code, because it is faster.
If \a len is -1 (the default), or \a pos + \a len >= size(),
returns a byte array containing all bytes starting at position \a
pos until the end of the byte array.
- Example:
- \snippet code/src_corelib_text_qbytearray.cpp 29
-
- \sa first(), last(), sliced(), chopped(), chop(), truncate()
+ \sa first(), last(), sliced(), chopped(), chop(), truncate(), slice()
*/
-QByteArray QByteArray::mid(int pos, int len) const
+QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const &
{
qsizetype p = pos;
qsizetype l = len;
@@ -2872,43 +3109,68 @@ QByteArray QByteArray::mid(int pos, int len) const
return QByteArray();
case QContainerImplHelper::Empty:
{
- auto alloc = Data::allocate(0);
- QByteArray::DataPointer empty = { alloc.first, alloc.second, 0 };
- return QByteArray(empty);
+ return QByteArray(DataPointer::fromRawData(&_empty, 0));
}
case QContainerImplHelper::Full:
return *this;
case QContainerImplHelper::Subset:
- return QByteArray(d.data() + p, l);
+ return sliced(p, l);
}
- Q_UNREACHABLE();
- return QByteArray();
+ Q_UNREACHABLE_RETURN(QByteArray());
+}
+
+QByteArray QByteArray::mid(qsizetype pos, qsizetype len) &&
+{
+ qsizetype p = pos;
+ qsizetype l = len;
+ using namespace QtPrivate;
+ switch (QContainerImplHelper::mid(size(), &p, &l)) {
+ case QContainerImplHelper::Null:
+ return QByteArray();
+ case QContainerImplHelper::Empty:
+ resize(0); // keep capacity if we've reserve()d
+ [[fallthrough]];
+ case QContainerImplHelper::Full:
+ return std::move(*this);
+ case QContainerImplHelper::Subset:
+ return std::move(*this).sliced(p, l);
+ }
+ Q_UNREACHABLE_RETURN(QByteArray());
}
/*!
- \fn QByteArray QByteArray::first(qsizetype n) const
+ \fn QByteArray QByteArray::first(qsizetype n) const &
+ \fn QByteArray QByteArray::first(qsizetype n) &&
\since 6.0
Returns the first \a n bytes of the byte array.
\note The behavior is undefined when \a n < 0 or \a n > size().
- \sa last(), sliced(), from(), startsWith(), chopped(), chop(), truncate()
+ Example:
+ \snippet code/src_corelib_text_qbytearray.cpp 27
+
+ \sa last(), sliced(), startsWith(), chopped(), chop(), truncate(), slice()
*/
/*!
- \fn QByteArray QByteArray::last(qsizetype n) const
+ \fn QByteArray QByteArray::last(qsizetype n) const &
+ \fn QByteArray QByteArray::last(qsizetype n) &&
\since 6.0
Returns the last \a n bytes of the byte array.
\note The behavior is undefined when \a n < 0 or \a n > size().
- \sa first(), sliced(), from(), endsWith(), chopped(), chop(), truncate()
+ Example:
+ \snippet code/src_corelib_text_qbytearray.cpp 28
+
+ \sa first(), sliced(), endsWith(), chopped(), chop(), truncate(), slice()
*/
/*!
- \fn QByteArray QByteArray::sliced(qsizetype pos, qsizetype n) const
+ \fn QByteArray QByteArray::sliced(qsizetype pos, qsizetype n) const &
+ \fn QByteArray QByteArray::sliced(qsizetype pos, qsizetype n) &&
\since 6.0
Returns a byte array containing the \a n bytes of this object starting
@@ -2917,23 +3179,66 @@ QByteArray QByteArray::mid(int pos, int len) const
\note The behavior is undefined when \a pos < 0, \a n < 0,
or \a pos + \a n > size().
- \sa first(), last(), from(), chopped(), chop(), truncate()
+ Example:
+ \snippet code/src_corelib_text_qbytearray.cpp 29
+
+ \sa first(), last(), chopped(), chop(), truncate(), slice()
*/
+QByteArray QByteArray::sliced_helper(QByteArray &a, qsizetype pos, qsizetype n)
+{
+ if (n == 0)
+ return fromRawData(&_empty, 0);
+ DataPointer d = std::move(a.d).sliced(pos, n);
+ d.data()[n] = 0;
+ return QByteArray(std::move(d));
+}
/*!
- \fn QByteArray QByteArray::from(qsizetype pos) const
+ \fn QByteArray QByteArray::sliced(qsizetype pos) const &
+ \fn QByteArray QByteArray::sliced(qsizetype pos) &&
\since 6.0
+ \overload
Returns a byte array containing the bytes starting at position \a pos
in this object, and extending to the end of this object.
\note The behavior is undefined when \a pos < 0 or \a pos > size().
- \sa first(), last(), sliced(), chopped(), chop(), truncate()
+ \sa first(), last(), chopped(), chop(), truncate(), slice()
+*/
+
+/*!
+ \fn QByteArray &QByteArray::slice(qsizetype pos, qsizetype n)
+ \since 6.8
+
+ Modifies this byte array to start at position \a pos, extending for \a n
+ bytes, and returns a reference to this byte array.
+
+ \note The behavior is undefined if \a pos < 0, \a n < 0,
+ or \a pos + \a n > size().
+
+ Example:
+ \snippet code/src_corelib_text_qbytearray.cpp 57
+
+ \sa sliced(), first(), last(), chopped(), chop(), truncate()
*/
/*!
- \fn QByteArray::chopped(int len) const
+ \fn QByteArray &QByteArray::slice(qsizetype pos)
+ \since 6.8
+ \overload
+
+ Modifies this byte array to start at position \a pos, extending to its
+ end, and returns a reference to this byte array.
+
+ \note The behavior is undefined if \a pos < 0 or \a pos > size().
+
+ \sa sliced(), first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArray QByteArray::chopped(qsizetype len) const &
+ \fn QByteArray QByteArray::chopped(qsizetype len) &&
\since 5.10
Returns a byte array that contains the leftmost size() - \a len bytes of
@@ -2941,7 +3246,7 @@ QByteArray QByteArray::mid(int pos, int len) const
\note The behavior is undefined if \a len is negative or greater than size().
- \sa endsWith(), left(), right(), mid(), chop(), truncate()
+ \sa endsWith(), first(), last(), sliced(), chop(), truncate(), slice()
*/
/*!
@@ -2956,11 +3261,7 @@ QByteArray QByteArray::mid(int pos, int len) const
\sa isLower(), toUpper(), {Character Case}
*/
-// prevent the compiler from inlining the function in each of
-// toLower and toUpper when the only difference is the table being used
-// (even with constant propagation, there's no gain in performance).
template <typename T>
-Q_NEVER_INLINE
static QByteArray toCase_template(T &input, uchar (*lookup)(uchar))
{
// find the first bad character in input
@@ -3031,7 +3332,7 @@ void QByteArray::clear()
d.clear();
}
-#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE))
+#if !defined(QT_NO_DATASTREAM)
/*! \relates QByteArray
@@ -3044,7 +3345,7 @@ void QByteArray::clear()
QDataStream &operator<<(QDataStream &out, const QByteArray &ba)
{
if (ba.isNull() && out.version() >= 6) {
- out << (quint32)0xffffffff;
+ QDataStream::writeQSizeType(out, -1);
return out;
}
return out.writeBytes(ba.constData(), ba.size());
@@ -3061,16 +3362,24 @@ QDataStream &operator<<(QDataStream &out, const QByteArray &ba)
QDataStream &operator>>(QDataStream &in, QByteArray &ba)
{
ba.clear();
- quint32 len;
- in >> len;
- if (len == 0xffffffff)
+
+ qint64 size = QDataStream::readQSizeType(in);
+ qsizetype len = size;
+ if (size != len || size < -1) {
+ ba.clear();
+ in.setStatus(QDataStream::SizeLimitExceeded);
+ return in;
+ }
+ if (len == -1) { // null byte-array
+ ba = QByteArray();
return in;
+ }
- const quint32 Step = 1024 * 1024;
- quint32 allocated = 0;
+ constexpr qsizetype Step = 1024 * 1024;
+ qsizetype allocated = 0;
do {
- int blockSize = qMin(Step, len - allocated);
+ qsizetype blockSize = qMin(Step, len - allocated);
ba.resize(allocated + blockSize);
if (in.readRawData(ba.data() + allocated, blockSize) != blockSize) {
ba.clear();
@@ -3084,205 +3393,169 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
}
#endif // QT_NO_DATASTREAM
-/*! \fn bool operator==(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator==(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is equal to byte array \a a2;
+ Returns \c true if byte array \a lhs is equal to byte array \a rhs;
otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator==(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator==(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is equal to the '\\0'-terminated string
- \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is equal to the '\\0'-terminated string
+ \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator==(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator==(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is equal to byte array \a
- a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is equal to byte array \a
+ rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator!=(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator!=(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is not equal to byte array \a a2;
+ Returns \c true if byte array \a lhs is not equal to byte array \a rhs;
otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator!=(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator!=(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is not equal to the '\\0'-terminated
- string \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is not equal to the '\\0'-terminated
+ string \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator!=(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator!=(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is not equal to byte array
- \a a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is not equal to byte array
+ \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator<(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator<(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically less than byte array
- \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically less than byte array
+ \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn inline bool operator<(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator<(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically less than the
- '\\0'-terminated string \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically less than the
+ '\\0'-terminated string \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator<(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator<(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is lexically less than byte
- array \a a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is lexically less than byte
+ array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator<=(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator<=(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically less than or equal
- to byte array \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically less than or equal
+ to byte array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator<=(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator<=(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically less than or equal to the
- '\\0'-terminated string \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically less than or equal to the
+ '\\0'-terminated string \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator<=(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator<=(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is lexically less than or
- equal to byte array \a a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is lexically less than or
+ equal to byte array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator>(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator>(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically greater than byte
- array \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically greater than byte
+ array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator>(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator>(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically greater than the
- '\\0'-terminated string \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically greater than the
+ '\\0'-terminated string \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator>(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator>(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is lexically greater than
- byte array \a a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is lexically greater than
+ byte array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator>=(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator>=(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically greater than or
- equal to byte array \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically greater than or
+ equal to byte array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator>=(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator>=(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically greater than or equal to
- the '\\0'-terminated string \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically greater than or equal to
+ the '\\0'-terminated string \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool operator>=(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
+/*! \fn bool QByteArray::operator>=(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is lexically greater than
- or equal to byte array \a a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is lexically greater than
+ or equal to byte array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn const QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
+/*! \fn QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
\relates QByteArray
Returns a byte array that is the result of concatenating byte
@@ -3291,7 +3564,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
\sa QByteArray::operator+=()
*/
-/*! \fn const QByteArray operator+(const QByteArray &a1, const char *a2)
+/*! \fn QByteArray operator+(const QByteArray &a1, const char *a2)
\relates QByteArray
\overload
@@ -3300,7 +3573,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
and '\\0'-terminated string \a a2.
*/
-/*! \fn const QByteArray operator+(const QByteArray &a1, char a2)
+/*! \fn QByteArray operator+(const QByteArray &a1, char a2)
\relates QByteArray
\overload
@@ -3309,7 +3582,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
array \a a1 and byte \a a2.
*/
-/*! \fn const QByteArray operator+(const char *a1, const QByteArray &a2)
+/*! \fn QByteArray operator+(const char *a1, const QByteArray &a2)
\relates QByteArray
\overload
@@ -3318,7 +3591,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
string \a a1 and byte array \a a2.
*/
-/*! \fn const QByteArray operator+(char a1, const QByteArray &a2)
+/*! \fn QByteArray operator+(char a1, const QByteArray &a2)
\relates QByteArray
\overload
@@ -3383,6 +3656,11 @@ QByteArray QByteArray::trimmed_helper(QByteArray &a)
return QStringAlgorithms<QByteArray>::trimmed_helper(a);
}
+QByteArrayView QtPrivate::trimmed(QByteArrayView view) noexcept
+{
+ const auto [start, stop] = QStringAlgorithms<QByteArrayView>::trimmed_helper_positions(view);
+ return QByteArrayView(start, stop);
+}
/*!
Returns a byte array of size \a width that contains this byte array padded
@@ -3402,11 +3680,11 @@ QByteArray QByteArray::trimmed_helper(QByteArray &a)
\sa rightJustified()
*/
-QByteArray QByteArray::leftJustified(int width, char fill, bool truncate) const
+QByteArray QByteArray::leftJustified(qsizetype width, char fill, bool truncate) const
{
QByteArray result;
- int len = size();
- int padlen = width - len;
+ qsizetype len = size();
+ qsizetype padlen = width - len;
if (padlen > 0) {
result.resize(len+padlen);
if (len)
@@ -3439,11 +3717,11 @@ QByteArray QByteArray::leftJustified(int width, char fill, bool truncate) const
\sa leftJustified()
*/
-QByteArray QByteArray::rightJustified(int width, char fill, bool truncate) const
+QByteArray QByteArray::rightJustified(qsizetype width, char fill, bool truncate) const
{
QByteArray result;
- int len = size();
- int padlen = width - len;
+ qsizetype len = size();
+ qsizetype padlen = width - len;
if (padlen > 0) {
result.resize(len+padlen);
if (len)
@@ -3458,41 +3736,38 @@ QByteArray QByteArray::rightJustified(int width, char fill, bool truncate) const
return result;
}
-bool QByteArray::isNull() const
+auto QtPrivate::toSignedInteger(QByteArrayView data, int base) -> ParsedNumber<qlonglong>
{
- return d->isNull();
-}
-
-static qlonglong toIntegral_helper(const char *data, bool *ok, int base, qlonglong)
-{
- return QLocaleData::bytearrayToLongLong(data, base, ok);
-}
+#if defined(QT_CHECK_RANGE)
+ if (base != 0 && (base < 2 || base > 36)) {
+ qWarning("QByteArray::toIntegral: Invalid base %d", base);
+ base = 10;
+ }
+#endif
+ if (data.isEmpty())
+ return {};
-static qulonglong toIntegral_helper(const char *data, bool *ok, int base, qulonglong)
-{
- return QLocaleData::bytearrayToUnsLongLong(data, base, ok);
+ const QSimpleParsedNumber r = QLocaleData::bytearrayToLongLong(data, base);
+ if (r.ok())
+ return ParsedNumber(r.result);
+ return {};
}
-template <typename T> static inline
-T toIntegral_helper(const char *data, bool *ok, int base)
+auto QtPrivate::toUnsignedInteger(QByteArrayView data, int base) -> ParsedNumber<qulonglong>
{
- using Int64 = typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;
-
#if defined(QT_CHECK_RANGE)
if (base != 0 && (base < 2 || base > 36)) {
qWarning("QByteArray::toIntegral: Invalid base %d", base);
base = 10;
}
#endif
+ if (data.isEmpty())
+ return {};
- // we select the right overload by the last, unused parameter
- Int64 val = toIntegral_helper(data, ok, base, Int64());
- if (T(val) != val) {
- if (ok)
- *ok = false;
- val = 0;
- }
- return T(val);
+ const QSimpleParsedNumber r = QLocaleData::bytearrayToUnsLongLong(data, base);
+ if (r.ok())
+ return ParsedNumber(r.result);
+ return {};
}
/*!
@@ -3502,8 +3777,9 @@ T toIntegral_helper(const char *data, bool *ok, int base)
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3514,12 +3790,14 @@ T toIntegral_helper(const char *data, bool *ok, int base)
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
qlonglong QByteArray::toLongLong(bool *ok, int base) const
{
- return toIntegral_helper<qlonglong>(nulTerminated().constData(), ok, base);
+ return QtPrivate::toIntegral<qlonglong>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3529,8 +3807,9 @@ qlonglong QByteArray::toLongLong(bool *ok, int base) const
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3541,12 +3820,14 @@ qlonglong QByteArray::toLongLong(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
qulonglong QByteArray::toULongLong(bool *ok, int base) const
{
- return toIntegral_helper<qulonglong>(nulTerminated().constData(), ok, base);
+ return QtPrivate::toIntegral<qulonglong>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3556,8 +3837,9 @@ qulonglong QByteArray::toULongLong(bool *ok, int base) const
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3570,12 +3852,14 @@ qulonglong QByteArray::toULongLong(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
int QByteArray::toInt(bool *ok, int base) const
{
- return toIntegral_helper<int>(nulTerminated().constData(), ok, base);
+ return QtPrivate::toIntegral<int>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3585,8 +3869,9 @@ int QByteArray::toInt(bool *ok, int base) const
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3597,12 +3882,14 @@ int QByteArray::toInt(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
uint QByteArray::toUInt(bool *ok, int base) const
{
- return toIntegral_helper<uint>(nulTerminated().constData(), ok, base);
+ return QtPrivate::toIntegral<uint>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3614,8 +3901,9 @@ uint QByteArray::toUInt(bool *ok, int base) const
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3628,11 +3916,13 @@ uint QByteArray::toUInt(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
long QByteArray::toLong(bool *ok, int base) const
{
- return toIntegral_helper<long>(nulTerminated().constData(), ok, base);
+ return QtPrivate::toIntegral<long>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3644,8 +3934,9 @@ long QByteArray::toLong(bool *ok, int base) const
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3656,11 +3947,13 @@ long QByteArray::toLong(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
ulong QByteArray::toULong(bool *ok, int base) const
{
- return toIntegral_helper<ulong>(nulTerminated().constData(), ok, base);
+ return QtPrivate::toIntegral<ulong>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3669,9 +3962,10 @@ ulong QByteArray::toULong(bool *ok, int base) const
digits beyond 9; A is ten, B is eleven and so on.
If \a base is 0, the base is determined automatically using the following
- rules: If the byte array begins with "0x", it is assumed to be hexadecimal;
- otherwise, if it begins with "0", it is assumed to be octal; otherwise it is
- assumed to be decimal.
+ rules: If the byte array begins with "0x", it is assumed to be hexadecimal
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3682,12 +3976,14 @@ ulong QByteArray::toULong(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
short QByteArray::toShort(bool *ok, int base) const
{
- return toIntegral_helper<short>(nulTerminated().constData(), ok, base);
+ return QtPrivate::toIntegral<short>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3696,9 +3992,10 @@ short QByteArray::toShort(bool *ok, int base) const
letters for digits beyond 9; A is ten, B is eleven and so on.
If \a base is 0, the base is determined automatically using the following
- rules: If the byte array begins with "0x", it is assumed to be hexadecimal;
- otherwise, if it begins with "0", it is assumed to be octal; otherwise it is
- assumed to be decimal.
+ rules: If the byte array begins with "0x", it is assumed to be hexadecimal
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3709,15 +4006,16 @@ short QByteArray::toShort(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
ushort QByteArray::toUShort(bool *ok, int base) const
{
- return toIntegral_helper<ushort>(nulTerminated().constData(), ok, base);
+ return QtPrivate::toIntegral<ushort>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
-
/*!
Returns the byte array converted to a \c double value.
@@ -3745,13 +4043,16 @@ ushort QByteArray::toUShort(bool *ok, int base) const
double QByteArray::toDouble(bool *ok) const
{
- bool nonNullOk = false;
- int processed = 0;
- double d = qt_asciiToDouble(constData(), size(),
- nonNullOk, processed, WhitespacesAllowed);
- if (ok)
- *ok = nonNullOk;
- return d;
+ return QByteArrayView(*this).toDouble(ok);
+}
+
+auto QtPrivate::toDouble(QByteArrayView a) noexcept -> ParsedNumber<double>
+{
+ auto r = qt_asciiToDouble(a.data(), a.size(), WhitespacesAllowed);
+ if (r.ok())
+ return ParsedNumber{r.result};
+ else
+ return {};
}
/*!
@@ -3784,6 +4085,17 @@ float QByteArray::toFloat(bool *ok) const
return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
}
+auto QtPrivate::toFloat(QByteArrayView a) noexcept -> ParsedNumber<float>
+{
+ if (const auto r = toDouble(a)) {
+ bool ok = true;
+ const auto f = QLocaleData::convertDoubleToFloat(*r, &ok);
+ if (ok)
+ return ParsedNumber(f);
+ }
+ return {};
+}
+
/*!
\since 5.2
@@ -3797,27 +4109,29 @@ float QByteArray::toFloat(bool *ok) const
*/
QByteArray QByteArray::toBase64(Base64Options options) const
{
- const char alphabet_base64[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
- "ghijklmn" "opqrstuv" "wxyz0123" "456789+/";
- const char alphabet_base64url[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
- "ghijklmn" "opqrstuv" "wxyz0123" "456789-_";
+ constexpr char alphabet_base64[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
+ "ghijklmn" "opqrstuv" "wxyz0123" "456789+/";
+ constexpr char alphabet_base64url[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
+ "ghijklmn" "opqrstuv" "wxyz0123" "456789-_";
const char *const alphabet = options & Base64UrlEncoding ? alphabet_base64url : alphabet_base64;
- const char padchar = '=';
- int padlen = 0;
+ constexpr char padchar = '=';
+ qsizetype padlen = 0;
- QByteArray tmp((size() + 2) / 3 * 4, Qt::Uninitialized);
+ const qsizetype sz = size();
- int i = 0;
+ QByteArray tmp((sz + 2) / 3 * 4, Qt::Uninitialized);
+
+ qsizetype i = 0;
char *out = tmp.data();
- while (i < size()) {
+ while (i < sz) {
// encode 3 bytes at a time
int chunk = 0;
chunk |= int(uchar(data()[i++])) << 16;
- if (i == size()) {
+ if (i == sz) {
padlen = 2;
} else {
chunk |= int(uchar(data()[i++])) << 8;
- if (i == size())
+ if (i == sz)
padlen = 1;
else
chunk |= int(uchar(data()[i++]));
@@ -3852,10 +4166,12 @@ QByteArray QByteArray::toBase64(Base64Options options) const
/*!
\fn QByteArray &QByteArray::setNum(int n, int base)
- Sets the byte array to the printed value of \a n in base \a base (ten by
- default) and returns a reference to the byte array. Bases 2 through 36 are
+ Represent the whole number \a n as text.
+
+ Sets this byte array to a string representing \a n in base \a base (ten by
+ default) and returns a reference to this byte array. Bases 2 through 36 are
supported, using letters for digits beyond 9; A is ten, B is eleven and so
- on. For bases other than ten, n is treated as an unsigned integer.
+ on.
Example:
\snippet code/src_corelib_text_qbytearray.cpp 40
@@ -3910,7 +4226,7 @@ static char *qulltoa2(char *p, qulonglong n, int base)
base = 10;
}
#endif
- const char b = 'a' - 10;
+ constexpr char b = 'a' - 10;
do {
const int c = n % base;
n /= base;
@@ -3927,11 +4243,12 @@ static char *qulltoa2(char *p, qulonglong n, int base)
*/
QByteArray &QByteArray::setNum(qlonglong n, int base)
{
- const int buffsize = 66; // big enough for MAX_ULLONG in base 2
+ constexpr int buffsize = 66; // big enough for MAX_ULLONG in base 2
char buff[buffsize];
char *p;
- if (n < 0 && base == 10) {
+ if (n < 0) {
+ // Take care to avoid overflow on negating min value:
p = qulltoa2(buff + buffsize, qulonglong(-(1 + n)) + 1, base);
*--p = '-';
} else {
@@ -3951,7 +4268,7 @@ QByteArray &QByteArray::setNum(qlonglong n, int base)
QByteArray &QByteArray::setNum(qulonglong n, int base)
{
- const int buffsize = 66; // big enough for MAX_ULLONG in base 2
+ constexpr int buffsize = 66; // big enough for MAX_ULLONG in base 2
char buff[buffsize];
char *p = qulltoa2(buff + buffsize, n, base);
@@ -3963,82 +4280,39 @@ QByteArray &QByteArray::setNum(qulonglong n, int base)
/*!
\overload
- Sets the byte array to the printed value of \a n, formatted in format
- \a f with precision \a prec, and returns a reference to the
- byte array.
-
- The format \a f can be any of the following:
-
- \table
- \header \li Format \li Meaning
- \row \li \c e \li format as [-]9.9e[+|-]999
- \row \li \c E \li format as [-]9.9E[+|-]999
- \row \li \c f \li format as [-]9.9
- \row \li \c g \li use \c e or \c f format, whichever is the most concise
- \row \li \c G \li use \c E or \c f format, whichever is the most concise
- \endtable
+ Represent the floating-point number \a n as text.
- With 'e', 'E', and 'f', \a prec is the number of digits after the
- decimal point. With 'g' and 'G', \a prec is the maximum number of
- significant digits (trailing zeroes are omitted).
+ Sets this byte array to a string representing \a n, with a given \a format
+ and \a precision (with the same meanings as for \l {QString::number(double,
+ char, int)}), and returns a reference to this byte array.
- \note The format of the number is not localized; the default C locale is
- used regardless of the user's locale. Use QLocale to perform locale-aware
- conversions between numbers and strings.
-
- \sa toDouble()
+ \sa toDouble(), QLocale::FloatingPointPrecisionOption
*/
-QByteArray &QByteArray::setNum(double n, char f, int prec)
+QByteArray &QByteArray::setNum(double n, char format, int precision)
{
- QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- uint flags = QLocaleData::ZeroPadExponent;
-
- char lower = asciiLower(uchar(f));
- if (f != lower)
- flags |= QLocaleData::CapitalEorX;
- f = lower;
-
- switch (f) {
- case 'f':
- form = QLocaleData::DFDecimal;
- break;
- case 'e':
- form = QLocaleData::DFExponent;
- break;
- case 'g':
- form = QLocaleData::DFSignificantDigits;
- break;
- default:
-#if defined(QT_CHECK_RANGE)
- qWarning("QByteArray::setNum: Invalid format char '%c'", f);
-#endif
- break;
- }
-
- *this = QLocaleData::c()->doubleToString(n, prec, form, -1, flags).toUtf8();
- return *this;
+ return *this = QByteArray::number(n, format, precision);
}
/*!
- \fn QByteArray &QByteArray::setNum(float n, char f, int prec)
+ \fn QByteArray &QByteArray::setNum(float n, char format, int precision)
\overload
- Sets the byte array to the printed value of \a n, formatted in format
- \a f with precision \a prec, and returns a reference to the
- byte array.
+ Represent the floating-point number \a n as text.
- \note The format of the number is not localized; the default C locale is
- used regardless of the user's locale. Use QLocale to perform locale-aware
- conversions between numbers and strings.
+ Sets this byte array to a string representing \a n, with a given \a format
+ and \a precision (with the same meanings as for \l {QString::number(double,
+ char, int)}), and returns a reference to this byte array.
\sa toFloat()
*/
/*!
- Returns a byte array containing the printed value of the number \a n to base
- \a base (ten by default). Bases 2 through 36 are supported, using letters
- for digits beyond 9: A is ten, B is eleven and so on.
+ Returns a byte-array representing the whole number \a n as text.
+
+ Returns a byte array containing a string representing \a n, using the
+ specified \a base (ten by default). Bases 2 through 36 are supported, using
+ letters for digits beyond 9: A is ten, B is eleven and so on.
Example:
\snippet code/src_corelib_text_qbytearray.cpp 41
@@ -4118,42 +4392,43 @@ QByteArray QByteArray::number(qulonglong n, int base)
/*!
\overload
+ Returns a byte-array representing the floating-point number \a n as text.
- Returns a byte array that contains the printed value of \a n,
- formatted in format \a f with precision \a prec.
-
- Argument \a n is formatted according to the \a f format specified,
- which is \c g by default, and can be any of the following:
-
- \table
- \header \li Format \li Meaning
- \row \li \c e \li format as [-]9.9e[+|-]999
- \row \li \c E \li format as [-]9.9E[+|-]999
- \row \li \c f \li format as [-]9.9
- \row \li \c g \li use \c e or \c f format, whichever is the most concise
- \row \li \c G \li use \c E or \c f format, whichever is the most concise
- \endtable
-
- With 'e', 'E', and 'f', \a prec is the number of digits after the
- decimal point. With 'g' and 'G', \a prec is the maximum number of
- significant digits (trailing zeroes are omitted).
+ Returns a byte array containing a string representing \a n, with a given \a
+ format and \a precision, with the same meanings as for \l
+ {QString::number(double, char, int)}. For example:
\snippet code/src_corelib_text_qbytearray.cpp 42
- \note The format of the number is not localized; the default C locale is
- used regardless of the user's locale. Use QLocale to perform locale-aware
- conversions between numbers and strings.
-
- \sa toDouble()
+ \sa toDouble(), QLocale::FloatingPointPrecisionOption
*/
-QByteArray QByteArray::number(double n, char f, int prec)
+QByteArray QByteArray::number(double n, char format, int precision)
{
- QByteArray s;
- s.setNum(n, f, prec);
- return s;
+ QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
+
+ switch (QtMiscUtils::toAsciiLower(format)) {
+ case 'f':
+ form = QLocaleData::DFDecimal;
+ break;
+ case 'e':
+ form = QLocaleData::DFExponent;
+ break;
+ case 'g':
+ form = QLocaleData::DFSignificantDigits;
+ break;
+ default:
+#if defined(QT_CHECK_RANGE)
+ qWarning("QByteArray::setNum: Invalid format char '%c'", format);
+#endif
+ break;
+ }
+
+ return qdtoAscii(n, form, precision, isUpperCaseAscii(format));
}
/*!
+ \fn QByteArray QByteArray::fromRawData(const char *data, qsizetype size) constexpr
+
Constructs a QByteArray that uses the first \a size bytes of the
\a data array. The bytes are \e not copied. The QByteArray will
contain the \a data pointer. The caller guarantees that \a data
@@ -4187,18 +4462,6 @@ QByteArray QByteArray::number(double n, char f, int prec)
\sa setRawData(), data(), constData()
*/
-QByteArray QByteArray::fromRawData(const char *data, int size)
-{
- QByteArray::DataPointer x;
- if (!data) {
- } else if (!size) {
- x = DataPointer(Data::allocate(0), 0);
- } else {
- x = Data::fromRawData(data, size);
- }
- return QByteArray(x);
-}
-
/*!
\since 4.7
@@ -4213,17 +4476,12 @@ QByteArray QByteArray::fromRawData(const char *data, int size)
\sa fromRawData(), data(), constData()
*/
-QByteArray &QByteArray::setRawData(const char *data, uint size)
+QByteArray &QByteArray::setRawData(const char *data, qsizetype size)
{
- if (!data || !size) {
+ if (!data || !size)
clear();
- }
-// else if (d->isShared() || (d->flags() & Data::RawDataType) == 0) {
+ else
*this = fromRawData(data, size);
-// } else {
-// d.size = size;
-// d.data() = const_cast<char *>(data);
-// }
return *this;
}
@@ -4338,7 +4596,7 @@ QByteArray::FromBase64Result QByteArray::fromBase64Encoding(QByteArray &&base64,
base64.size(),
base64.data(), // in-place
options);
- base64.truncate(int(base64result.decodedLength));
+ base64.truncate(base64result.decodedLength);
return { std::move(base64), base64result.status };
}
@@ -4354,7 +4612,7 @@ QByteArray::FromBase64Result QByteArray::fromBase64Encoding(const QByteArray &ba
base64Size,
const_cast<char *>(result.constData()),
options);
- result.truncate(int(base64result.decodedLength));
+ result.truncate(base64result.decodedLength);
return { std::move(result), base64result.status };
}
@@ -4390,9 +4648,9 @@ QByteArray QByteArray::fromBase64(const QByteArray &base64, Base64Options option
}
/*!
- Returns a decoded copy of the hex encoded array \a hexEncoded. Input is not checked
- for validity; invalid characters in the input are skipped, enabling the
- decoding process to continue with subsequent characters.
+ Returns a decoded copy of the hex encoded array \a hexEncoded. Input is not
+ checked for validity; invalid characters in the input are skipped, enabling
+ the decoding process to continue with subsequent characters.
For example:
@@ -4406,7 +4664,7 @@ QByteArray QByteArray::fromHex(const QByteArray &hexEncoded)
uchar *result = (uchar *)res.data() + res.size();
bool odd_digit = true;
- for (int i = hexEncoded.size() - 1; i >= 0; --i) {
+ for (qsizetype i = hexEncoded.size() - 1; i >= 0; --i) {
uchar ch = uchar(hexEncoded.at(i));
int tmp = QtMiscUtils::fromHex(ch);
if (tmp == -1)
@@ -4425,10 +4683,13 @@ QByteArray QByteArray::fromHex(const QByteArray &hexEncoded)
return res;
}
-/*! Returns a hex encoded copy of the byte array. The hex encoding uses the numbers 0-9 and
- the letters a-f.
+/*!
+ Returns a hex encoded copy of the byte array.
+
+ The hex encoding uses the numbers 0-9 and the letters a-f.
- If \a separator is not '\0', the separator character is inserted between the hex bytes.
+ If \a separator is not '\0', the separator character is inserted between
+ the hex bytes.
Example:
\snippet code/src_corelib_text_qbytearray.cpp 50
@@ -4441,11 +4702,11 @@ QByteArray QByteArray::toHex(char separator) const
if (isEmpty())
return QByteArray();
- const int length = separator ? (size() * 3 - 1) : (size() * 2);
+ const qsizetype length = separator ? (size() * 3 - 1) : (size() * 2);
QByteArray hex(length, Qt::Uninitialized);
char *hexData = hex.data();
const uchar *data = (const uchar *)this->data();
- for (int i = 0, o = 0; i < size(); ++i) {
+ for (qsizetype i = 0, o = 0; i < size(); ++i) {
hexData[o++] = QtMiscUtils::toHexLower(data[i] >> 4);
hexData[o++] = QtMiscUtils::toHexLower(data[i] & 0xf);
@@ -4463,9 +4724,9 @@ static void q_fromPercentEncoding(QByteArray *ba, char percent)
char *data = ba->data();
const char *inputPtr = data;
- int i = 0;
- int len = ba->count();
- int outlen = 0;
+ qsizetype i = 0;
+ qsizetype len = ba->size();
+ qsizetype outlen = 0;
int a, b;
char c;
while (i < len) {
@@ -4495,20 +4756,17 @@ static void q_fromPercentEncoding(QByteArray *ba, char percent)
ba->truncate(outlen);
}
-void q_fromPercentEncoding(QByteArray *ba)
-{
- q_fromPercentEncoding(ba, '%');
-}
-
/*!
- \since 4.4
+ \since 6.4
- Returns a decoded copy of the URI/URL-style percent-encoded \a input.
- The \a percent parameter allows you to replace the '%' character for
- another (for instance, '_' or '=').
+ Decodes URI/URL-style percent-encoding.
+
+ Returns a byte array containing the decoded text. The \a percent parameter
+ allows use of a different character than '%' (for instance, '_' or '=') as
+ the escape character.
For example:
- \snippet code/src_corelib_text_qbytearray.cpp 51
+ \snippet code/src_corelib_text_qbytearray.cpp 54
\note Given invalid input (such as a string containing the sequence "%G5",
which is not a valid hexadecimal number) the output will be invalid as
@@ -4516,18 +4774,35 @@ void q_fromPercentEncoding(QByteArray *ba)
\sa toPercentEncoding(), QUrl::fromPercentEncoding()
*/
-QByteArray QByteArray::fromPercentEncoding(const QByteArray &input, char percent)
+QByteArray QByteArray::percentDecoded(char percent) const
{
- if (input.isNull())
- return QByteArray(); // preserve null
- if (input.isEmpty())
- return QByteArray(input.data(), 0);
+ if (isEmpty())
+ return *this; // Preserves isNull().
- QByteArray tmp = input;
+ QByteArray tmp = *this;
q_fromPercentEncoding(&tmp, percent);
return tmp;
}
+/*!
+ \since 4.4
+
+ Decodes \a input from URI/URL-style percent-encoding.
+
+ Returns a byte array containing the decoded text. The \a percent parameter
+ allows use of a different character than '%' (for instance, '_' or '=') as
+ the escape character. Equivalent to input.percentDecoded(percent).
+
+ For example:
+ \snippet code/src_corelib_text_qbytearray.cpp 51
+
+ \sa percentDecoded()
+*/
+QByteArray QByteArray::fromPercentEncoding(const QByteArray &input, char percent)
+{
+ return input.percentDecoded(percent);
+}
+
/*! \fn QByteArray QByteArray::fromStdString(const std::string &str)
\since 5.4
@@ -4535,6 +4810,10 @@ QByteArray QByteArray::fromPercentEncoding(const QByteArray &input, char percent
\sa toStdString(), QString::fromStdString()
*/
+QByteArray QByteArray::fromStdString(const std::string &s)
+{
+ return QByteArray(s.data(), qsizetype(s.size()));
+}
/*!
\fn std::string QByteArray::toStdString() const
@@ -4548,68 +4827,9 @@ QByteArray QByteArray::fromPercentEncoding(const QByteArray &input, char percent
\sa fromStdString(), QString::toStdString()
*/
-
-static inline bool q_strchr(const char str[], char chr)
+std::string QByteArray::toStdString() const
{
- if (!str) return false;
-
- const char *ptr = str;
- char c;
- while ((c = *ptr++))
- if (c == chr)
- return true;
- return false;
-}
-
-static void q_toPercentEncoding(QByteArray *ba, const char *dontEncode, const char *alsoEncode, char percent)
-{
- if (ba->isEmpty())
- return;
-
- QByteArray input = *ba;
- int len = input.count();
- const char *inputData = input.constData();
- char *output = nullptr;
- int length = 0;
-
- for (int i = 0; i < len; ++i) {
- unsigned char c = *inputData++;
- if (((c >= 0x61 && c <= 0x7A) // ALPHA
- || (c >= 0x41 && c <= 0x5A) // ALPHA
- || (c >= 0x30 && c <= 0x39) // DIGIT
- || c == 0x2D // -
- || c == 0x2E // .
- || c == 0x5F // _
- || c == 0x7E // ~
- || q_strchr(dontEncode, c))
- && !q_strchr(alsoEncode, c)) {
- if (output)
- output[length] = c;
- ++length;
- } else {
- if (!output) {
- // detach now
- ba->resize(len*3); // worst case
- output = ba->data();
- }
- output[length++] = percent;
- output[length++] = QtMiscUtils::toHexUpper((c & 0xf0) >> 4);
- output[length++] = QtMiscUtils::toHexUpper(c & 0xf);
- }
- }
- if (output)
- ba->truncate(length);
-}
-
-void q_toPercentEncoding(QByteArray *ba, const char *exclude, const char *include)
-{
- q_toPercentEncoding(ba, exclude, include, '%');
-}
-
-void q_normalizePercentEncoding(QByteArray *ba, const char *exclude)
-{
- q_fromPercentEncoding(ba, '%');
- q_toPercentEncoding(ba, exclude, nullptr, '%');
+ return std::string(data(), size_t(size()));
}
/*!
@@ -4644,23 +4864,100 @@ QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteA
if (isEmpty())
return QByteArray(data(), 0);
- QByteArray include2 = include;
- if (percent != '%') // the default
- if ((percent >= 0x61 && percent <= 0x7A) // ALPHA
- || (percent >= 0x41 && percent <= 0x5A) // ALPHA
- || (percent >= 0x30 && percent <= 0x39) // DIGIT
- || percent == 0x2D // -
- || percent == 0x2E // .
- || percent == 0x5F // _
- || percent == 0x7E) // ~
- include2 += percent;
+ const auto contains = [](const QByteArray &view, char c) {
+ // As view.contains(c), but optimised to bypass a lot of overhead:
+ return view.size() > 0 && memchr(view.data(), c, view.size()) != nullptr;
+ };
QByteArray result = *this;
- q_toPercentEncoding(&result, exclude.nulTerminated().constData(), include2.nulTerminated().constData(), percent);
+ char *output = nullptr;
+ qsizetype length = 0;
+
+ for (unsigned char c : *this) {
+ if (char(c) != percent
+ && ((c >= 0x61 && c <= 0x7A) // ALPHA
+ || (c >= 0x41 && c <= 0x5A) // ALPHA
+ || (c >= 0x30 && c <= 0x39) // DIGIT
+ || c == 0x2D // -
+ || c == 0x2E // .
+ || c == 0x5F // _
+ || c == 0x7E // ~
+ || contains(exclude, c))
+ && !contains(include, c)) {
+ if (output)
+ output[length] = c;
+ ++length;
+ } else {
+ if (!output) {
+ // detach now
+ result.resize(size() * 3); // worst case
+ output = result.data();
+ }
+ output[length++] = percent;
+ output[length++] = QtMiscUtils::toHexUpper((c & 0xf0) >> 4);
+ output[length++] = QtMiscUtils::toHexUpper(c & 0xf);
+ }
+ }
+ if (output)
+ result.truncate(length);
return result;
}
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+
+/*!
+ Constructs a new QByteArray containing a copy of the Uint8Array \a uint8array.
+
+ This function transfers data from a JavaScript data buffer - which
+ is not addressable from C++ code - to heap memory owned by a QByteArray.
+ The Uint8Array can be released once this function returns and a copy
+ has been made.
+
+ The \a uint8array argument must an emscripten::val referencing an Uint8Array
+ object, e.g. obtained from a global JavaScript variable:
+
+ \snippet code/src_corelib_text_qbytearray.cpp 55
+
+ This function returns a null QByteArray if the size of the Uint8Array
+ exceeds the maximum capacity of QByteArray, or if the \a uint8array
+ argument is not of the Uint8Array type.
+
+ \since 6.5
+ \ingroup platform-type-conversions
+
+ \sa toEcmaUint8Array()
+*/
+
+QByteArray QByteArray::fromEcmaUint8Array(emscripten::val uint8array)
+{
+ return qstdweb::Uint8Array(uint8array).copyToQByteArray();
+}
+
+/*!
+ Creates a Uint8Array from a QByteArray.
+
+ This function transfers data from heap memory owned by a QByteArray
+ to a JavaScript data buffer. The function allocates and copies into an
+ ArrayBuffer, and returns a Uint8Array view to that buffer.
+
+ The JavaScript objects own a copy of the data, and this
+ QByteArray can be safely deleted after the copy has been made.
+
+ \snippet code/src_corelib_text_qbytearray.cpp 56
+
+ \since 6.5
+ \ingroup platform-type-conversions
+
+ \sa toEcmaUint8Array()
+*/
+emscripten::val QByteArray::toEcmaUint8Array()
+{
+ return qstdweb::Uint8Array::copyFrom(*this).val();
+}
+
+#endif
+
/*! \typedef QByteArray::ConstIterator
\internal
*/
@@ -4757,6 +5054,57 @@ QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteA
\sa QStringLiteral
*/
+#if QT_DEPRECATED_SINCE(6, 8)
+/*!
+ \fn QtLiterals::operator""_qba(const char *str, size_t size)
+
+ \relates QByteArray
+ \since 6.2
+ \deprecated [6.8] Use \c _ba from Qt::StringLiterals namespace instead.
+
+ Literal operator that creates a QByteArray out of the first \a size characters
+ in the char string literal \a str.
+
+ The QByteArray is created at compile time, and the generated string data is stored
+ in the read-only segment of the compiled object file. Duplicate literals may share
+ the same read-only memory. This functionality is interchangeable with
+ QByteArrayLiteral, but saves typing when many string literals are present in the
+ code.
+
+ The following code creates a QByteArray:
+ \code
+ auto str = "hello"_qba;
+ \endcode
+
+ \sa QByteArrayLiteral, QtLiterals::operator""_qs(const char16_t *str, size_t size)
+*/
+#endif // QT_DEPRECATED_SINCE(6, 8)
+
+/*!
+ \fn Qt::Literals::StringLiterals::operator""_ba(const char *str, size_t size)
+
+ \relates QByteArray
+ \since 6.4
+
+ Literal operator that creates a QByteArray out of the first \a size characters
+ in the char string literal \a str.
+
+ The QByteArray is created at compile time, and the generated string data is stored
+ in the read-only segment of the compiled object file. Duplicate literals may share
+ the same read-only memory. This functionality is interchangeable with
+ QByteArrayLiteral, but saves typing when many string literals are present in the
+ code.
+
+ The following code creates a QByteArray:
+ \code
+ using namespace Qt::Literals::StringLiterals;
+
+ auto str = "hello"_ba;
+ \endcode
+
+ \sa Qt::Literals::StringLiterals
+*/
+
/*!
\class QByteArray::FromBase64Result
\inmodule QtCore
@@ -4809,8 +5157,7 @@ QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteA
*/
/*!
- \fn bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
- \relates QByteArray::FromBase64Result
+ \fn bool QByteArray::FromBase64Result::operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns \c true if \a lhs and \a rhs are equal, otherwise returns \c false.
@@ -4820,10 +5167,10 @@ QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteA
*/
/*!
- \fn bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
- \relates QByteArray::FromBase64Result
+ \fn bool QByteArray::FromBase64Result::operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
- Returns \c true if \a lhs and \a rhs are different, otherwise returns \c false.
+ Returns \c true if \a lhs and \a rhs are different, otherwise
+ returns \c false.
*/
/*!
@@ -4837,4 +5184,27 @@ size_t qHash(const QByteArray::FromBase64Result &key, size_t seed) noexcept
return qHashMulti(seed, key.decoded, static_cast<int>(key.decodingStatus));
}
+/*! \fn template <typename T> qsizetype erase(QByteArray &ba, const T &t)
+ \relates QByteArray
+ \since 6.1
+
+ Removes all elements that compare equal to \a t from the
+ byte array \a ba. Returns the number of elements removed, if any.
+
+ \sa erase_if
+*/
+
+/*! \fn template <typename Predicate> qsizetype erase_if(QByteArray &ba, Predicate pred)
+ \relates QByteArray
+ \since 6.1
+
+ Removes all elements for which the predicate \a pred returns true
+ from the byte array \a ba. Returns the number of elements removed, if
+ any.
+
+ \sa erase
+*/
+
QT_END_NAMESPACE
+
+#undef REHASH
diff --git a/src/corelib/text/qbytearray.h b/src/corelib/text/qbytearray.h
index 5cbcecb956..3c8a3bba45 100644
--- a/src/corelib/text/qbytearray.h
+++ b/src/corelib/text/qbytearray.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBYTEARRAY_H
#define QBYTEARRAY_H
@@ -45,15 +9,22 @@
#include <QtCore/qnamespace.h>
#include <QtCore/qarraydata.h>
#include <QtCore/qarraydatapointer.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qcontainerfwd.h>
+#include <QtCore/qbytearrayalgorithms.h>
+#include <QtCore/qbytearrayview.h>
#include <stdlib.h>
#include <string.h>
-#include <stdarg.h>
#include <string>
#include <iterator>
+#ifndef QT5_NULL_STRINGS
+// Would ideally be off, but in practice breaks too much (Qt 6.0).
+#define QT5_NULL_STRINGS 1
+#endif
+
#ifdef truncate
#error qbytearray.h must be included before any header file that defines truncate
#endif
@@ -63,53 +34,15 @@ Q_FORWARD_DECLARE_CF_TYPE(CFData);
Q_FORWARD_DECLARE_OBJC_CLASS(NSData);
#endif
-QT_BEGIN_NAMESPACE
-
-
-/*****************************************************************************
- Safe and portable C string functions; extensions to standard string.h
- *****************************************************************************/
-
-Q_CORE_EXPORT char *qstrdup(const char *);
-
-inline uint qstrlen(const char *str)
-{ return str ? uint(strlen(str)) : 0; }
-
-inline uint qstrnlen(const char *str, uint maxlen)
-{
- uint length = 0;
- if (str) {
- while (length < maxlen && *str++)
- length++;
- }
- return length;
-}
-
-Q_CORE_EXPORT char *qstrcpy(char *dst, const char *src);
-Q_CORE_EXPORT char *qstrncpy(char *dst, const char *src, uint len);
-
-Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2);
-Q_CORE_EXPORT int qstrcmp(const QByteArray &str1, const QByteArray &str2);
-Q_CORE_EXPORT int qstrcmp(const QByteArray &str1, const char *str2);
-static inline int qstrcmp(const char *str1, const QByteArray &str2)
-{ return -qstrcmp(str2, str1); }
-
-inline int qstrncmp(const char *str1, const char *str2, uint len)
-{
- return (str1 && str2) ? strncmp(str1, str2, len)
- : (str1 ? 1 : (str2 ? -1 : 0));
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+namespace emscripten {
+ class val;
}
-Q_CORE_EXPORT int qstricmp(const char *, const char *);
-Q_CORE_EXPORT int qstrnicmp(const char *, const char *, uint len);
-Q_CORE_EXPORT int qstrnicmp(const char *, qsizetype, const char *, qsizetype = -1);
+#endif
-// implemented in qvsnprintf.cpp
-Q_CORE_EXPORT int qvsnprintf(char *str, size_t n, const char *fmt, va_list ap);
-Q_CORE_EXPORT int qsnprintf(char *str, size_t n, const char *fmt, ...);
+class tst_QByteArray;
-// qChecksum: Internet checksum
-Q_CORE_EXPORT quint16 qChecksum(const char *s, uint len,
- Qt::ChecksumType standard = Qt::ChecksumIso3309);
+QT_BEGIN_NAMESPACE
class QString;
class QDataStream;
@@ -117,16 +50,7 @@ class QDataStream;
using QByteArrayData = QArrayDataPointer<char>;
# define QByteArrayLiteral(str) \
- ([]() -> QByteArray { \
- enum { Size = sizeof(str) - 1 }; \
- static const QArrayData qbytearray_literal = { \
- Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }; \
- QByteArrayData holder = { \
- static_cast<QTypedArrayData<char> *>(const_cast<QArrayData *>(&qbytearray_literal)), \
- const_cast<char *>(str), \
- Size }; \
- return QByteArray(holder); \
- }()) \
+ (QByteArray(QByteArrayData(nullptr, const_cast<char *>(str), sizeof(str) - 1))) \
/**/
class Q_CORE_EXPORT QByteArray
@@ -137,6 +61,12 @@ private:
typedef QTypedArrayData<char> Data;
DataPointer d;
+ static const char _empty;
+
+ friend class ::tst_QByteArray;
+
+ template <typename InputIterator>
+ using if_input_iterator = QtPrivate::IfIsInputIterator<InputIterator>;
public:
enum Base64Option {
@@ -158,29 +88,31 @@ public:
IllegalPadding,
};
- inline QByteArray() noexcept;
- QByteArray(const char *, int size = -1);
- QByteArray(int size, char c);
- QByteArray(int size, Qt::Initialization);
+ inline constexpr QByteArray() noexcept;
+ QByteArray(const char *, qsizetype size = -1);
+ QByteArray(qsizetype size, char c);
+ QByteArray(qsizetype size, Qt::Initialization);
+ explicit QByteArray(QByteArrayView v) : QByteArray(v.data(), v.size()) {}
inline QByteArray(const QByteArray &) noexcept;
inline ~QByteArray();
QByteArray &operator=(const QByteArray &) noexcept;
QByteArray &operator=(const char *str);
inline QByteArray(QByteArray && other) noexcept
- { qSwap(d, other.d); }
- inline QByteArray &operator=(QByteArray &&other) noexcept
- { qSwap(d, other.d); return *this; }
+ = default;
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QByteArray)
inline void swap(QByteArray &other) noexcept
- { qSwap(d, other.d); }
+ { d.swap(other.d); }
- inline bool isEmpty() const;
- void resize(int size);
+ bool isEmpty() const noexcept { return size() == 0; }
+ void resize(qsizetype size);
+ void resize(qsizetype size, char c);
+ void resizeForOverwrite(qsizetype size);
- QByteArray &fill(char c, int size = -1);
+ QByteArray &fill(char c, qsizetype size = -1);
- inline int capacity() const;
- inline void reserve(int size);
+ inline qsizetype capacity() const;
+ inline void reserve(qsizetype size);
inline void squeeze();
#ifndef QT_NO_CAST_FROM_BYTEARRAY
@@ -188,139 +120,255 @@ public:
inline operator const void *() const;
#endif
inline char *data();
- inline const char *data() const;
- inline const char *constData() const;
+ inline const char *data() const noexcept;
+ const char *constData() const noexcept { return data(); }
inline void detach();
inline bool isDetached() const;
- inline bool isSharedWith(const QByteArray &other) const
+ inline bool isSharedWith(const QByteArray &other) const noexcept
{ return data() == other.data() && size() == other.size(); }
void clear();
- inline char at(int i) const;
- inline char operator[](int i) const;
- Q_REQUIRED_RESULT inline char &operator[](int i);
- Q_REQUIRED_RESULT char front() const { return at(0); }
- Q_REQUIRED_RESULT inline char &front();
- Q_REQUIRED_RESULT char back() const { return at(size() - 1); }
- Q_REQUIRED_RESULT inline char &back();
-
- int indexOf(char c, int from = 0) const;
- int indexOf(const char *c, int from = 0) const;
- int indexOf(const QByteArray &a, int from = 0) const;
- int lastIndexOf(char c, int from = -1) const;
- int lastIndexOf(const char *c, int from = -1) const;
- int lastIndexOf(const QByteArray &a, int from = -1) const;
+ inline char at(qsizetype i) const;
+ inline char operator[](qsizetype i) const;
+ [[nodiscard]] inline char &operator[](qsizetype i);
+ [[nodiscard]] char front() const { return at(0); }
+ [[nodiscard]] inline char &front();
+ [[nodiscard]] char back() const { return at(size() - 1); }
+ [[nodiscard]] inline char &back();
+
+ QT_CORE_INLINE_SINCE(6, 7)
+ qsizetype indexOf(char c, qsizetype from = 0) const;
+ qsizetype indexOf(QByteArrayView bv, qsizetype from = 0) const
+ { return QtPrivate::findByteArray(qToByteArrayViewIgnoringNull(*this), from, bv); }
+
+ QT_CORE_INLINE_SINCE(6, 7)
+ qsizetype lastIndexOf(char c, qsizetype from = -1) const;
+ qsizetype lastIndexOf(QByteArrayView bv) const
+ { return lastIndexOf(bv, size()); }
+ qsizetype lastIndexOf(QByteArrayView bv, qsizetype from) const
+ { return QtPrivate::lastIndexOf(qToByteArrayViewIgnoringNull(*this), from, bv); }
inline bool contains(char c) const;
- inline bool contains(const char *a) const;
- inline bool contains(const QByteArray &a) const;
- int count(char c) const;
- int count(const char *a) const;
- int count(const QByteArray &a) const;
-
- inline int compare(const char *c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- inline int compare(const QByteArray &a, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
-
- Q_REQUIRED_RESULT QByteArray left(int len) const;
- Q_REQUIRED_RESULT QByteArray right(int len) const;
- Q_REQUIRED_RESULT QByteArray mid(int index, int len = -1) const;
-
- Q_REQUIRED_RESULT QByteArray first(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QByteArray(data(), int(n)); }
- Q_REQUIRED_RESULT QByteArray last(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QByteArray(data() + size() - n, int(n)); }
- Q_REQUIRED_RESULT QByteArray from(qsizetype pos) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(pos <= size()); return QByteArray(data() + pos, size() - int(pos)); }
- Q_REQUIRED_RESULT QByteArray sliced(qsizetype pos, qsizetype n) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(n >= 0); Q_ASSERT(size_t(pos) + size_t(n) <= size_t(size())); return QByteArray(data() + pos, int(n)); }
- Q_REQUIRED_RESULT QByteArray chopped(int len) const
- { Q_ASSERT(len >= 0); Q_ASSERT(len <= size()); return first(size() - len); }
-
- bool startsWith(const QByteArray &a) const;
- bool startsWith(char c) const;
- bool startsWith(const char *c) const;
-
- bool endsWith(const QByteArray &a) const;
- bool endsWith(char c) const;
- bool endsWith(const char *c) const;
+ inline bool contains(QByteArrayView bv) const;
+ qsizetype count(char c) const;
+ qsizetype count(QByteArrayView bv) const
+ { return QtPrivate::count(qToByteArrayViewIgnoringNull(*this), bv); }
+
+ inline int compare(QByteArrayView a, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+
+#if QT_CORE_REMOVED_SINCE(6, 7)
+ QByteArray left(qsizetype len) const;
+ QByteArray right(qsizetype len) const;
+ QByteArray mid(qsizetype index, qsizetype len = -1) const;
+ QByteArray first(qsizetype n) const;
+ QByteArray last(qsizetype n) const;
+ QByteArray sliced(qsizetype pos) const;
+ QByteArray sliced(qsizetype pos, qsizetype n) const;
+ QByteArray chopped(qsizetype len) const;
+#else
+ [[nodiscard]] QByteArray left(qsizetype n) const &
+ {
+ if (n >= size())
+ return *this;
+ return first(qMax(n, 0));
+ }
+ [[nodiscard]] QByteArray left(qsizetype n) &&
+ {
+ if (n >= size())
+ return std::move(*this);
+ return std::move(*this).first(qMax(n, 0));
+ }
+ [[nodiscard]] QByteArray right(qsizetype n) const &
+ {
+ if (n >= size())
+ return *this;
+ return last(qMax(n, 0));
+ }
+ [[nodiscard]] QByteArray right(qsizetype n) &&
+ {
+ if (n >= size())
+ return std::move(*this);
+ return std::move(*this).last(qMax(n, 0));
+ }
+ [[nodiscard]] QByteArray mid(qsizetype index, qsizetype len = -1) const &;
+ [[nodiscard]] QByteArray mid(qsizetype index, qsizetype len = -1) &&;
+
+ [[nodiscard]] QByteArray first(qsizetype n) const &
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] QByteArray last(qsizetype n) const &
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] QByteArray sliced(qsizetype pos) const &
+ { verify(pos, 0); return sliced(pos, size() - pos); }
+ [[nodiscard]] QByteArray sliced(qsizetype pos, qsizetype n) const &
+ { verify(pos, n); return QByteArray(d.data() + pos, n); }
+ [[nodiscard]] QByteArray chopped(qsizetype len) const &
+ { verify(0, len); return sliced(0, size() - len); }
+
+ [[nodiscard]] QByteArray first(qsizetype n) &&
+ {
+ verify(0, n);
+ resize(n); // may detach and allocate memory
+ return std::move(*this);
+ }
+ [[nodiscard]] QByteArray last(qsizetype n) &&
+ { verify(0, n); return sliced_helper(*this, size() - n, n); }
+ [[nodiscard]] QByteArray sliced(qsizetype pos) &&
+ { verify(pos, 0); return sliced_helper(*this, pos, size() - pos); }
+ [[nodiscard]] QByteArray sliced(qsizetype pos, qsizetype n) &&
+ { verify(pos, n); return sliced_helper(*this, pos, n); }
+ [[nodiscard]] QByteArray chopped(qsizetype len) &&
+ { verify(0, len); return std::move(*this).first(size() - len); }
+#endif
+
+ bool startsWith(QByteArrayView bv) const
+ { return QtPrivate::startsWith(qToByteArrayViewIgnoringNull(*this), bv); }
+ bool startsWith(char c) const { return size() > 0 && front() == c; }
+
+ bool endsWith(char c) const { return size() > 0 && back() == c; }
+ bool endsWith(QByteArrayView bv) const
+ { return QtPrivate::endsWith(qToByteArrayViewIgnoringNull(*this), bv); }
bool isUpper() const;
bool isLower() const;
- void truncate(int pos);
- void chop(int n);
-
-#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QSTRING_COMPAT_CPP) && !defined(Q_CLANG_QDOC)
-# if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL) && !__has_cpp_attribute(nodiscard)
- // required due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61941
-# pragma push_macro("Q_REQUIRED_RESULT")
-# undef Q_REQUIRED_RESULT
-# define Q_REQUIRED_RESULT
-# define Q_REQUIRED_RESULT_pushed
-# endif
- Q_REQUIRED_RESULT QByteArray toLower() const &
+ [[nodiscard]] bool isValidUtf8() const noexcept
+ {
+ return QtPrivate::isValidUtf8(qToByteArrayViewIgnoringNull(*this));
+ }
+
+ void truncate(qsizetype pos);
+ void chop(qsizetype n);
+
+ QByteArray &slice(qsizetype pos)
+ { verify(pos, 0); return remove(0, pos); }
+ QByteArray &slice(qsizetype pos, qsizetype n)
+ {
+ verify(pos, n);
+ if (isNull())
+ return *this;
+ resize(pos + n);
+ return remove(0, pos);
+ }
+
+#if !defined(Q_QDOC)
+ [[nodiscard]] QByteArray toLower() const &
{ return toLower_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toLower() &&
+ [[nodiscard]] QByteArray toLower() &&
{ return toLower_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toUpper() const &
+ [[nodiscard]] QByteArray toUpper() const &
{ return toUpper_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toUpper() &&
+ [[nodiscard]] QByteArray toUpper() &&
{ return toUpper_helper(*this); }
- Q_REQUIRED_RESULT QByteArray trimmed() const &
+ [[nodiscard]] QByteArray trimmed() const &
{ return trimmed_helper(*this); }
- Q_REQUIRED_RESULT QByteArray trimmed() &&
+ [[nodiscard]] QByteArray trimmed() &&
{ return trimmed_helper(*this); }
- Q_REQUIRED_RESULT QByteArray simplified() const &
+ [[nodiscard]] QByteArray simplified() const &
{ return simplified_helper(*this); }
- Q_REQUIRED_RESULT QByteArray simplified() &&
+ [[nodiscard]] QByteArray simplified() &&
{ return simplified_helper(*this); }
-# ifdef Q_REQUIRED_RESULT_pushed
-# pragma pop_macro("Q_REQUIRED_RESULT")
-# endif
#else
- Q_REQUIRED_RESULT QByteArray toLower() const;
- Q_REQUIRED_RESULT QByteArray toUpper() const;
- Q_REQUIRED_RESULT QByteArray trimmed() const;
- Q_REQUIRED_RESULT QByteArray simplified() const;
+ [[nodiscard]] QByteArray toLower() const;
+ [[nodiscard]] QByteArray toUpper() const;
+ [[nodiscard]] QByteArray trimmed() const;
+ [[nodiscard]] QByteArray simplified() const;
#endif
- Q_REQUIRED_RESULT QByteArray leftJustified(int width, char fill = ' ', bool truncate = false) const;
- Q_REQUIRED_RESULT QByteArray rightJustified(int width, char fill = ' ', bool truncate = false) const;
+ [[nodiscard]] QByteArray leftJustified(qsizetype width, char fill = ' ', bool truncate = false) const;
+ [[nodiscard]] QByteArray rightJustified(qsizetype width, char fill = ' ', bool truncate = false) const;
- QByteArray &prepend(char c);
- inline QByteArray &prepend(int count, char c);
- QByteArray &prepend(const char *s);
- QByteArray &prepend(const char *s, int len);
+ QByteArray &prepend(char c)
+ { return insert(0, QByteArrayView(&c, 1)); }
+ inline QByteArray &prepend(qsizetype count, char c);
+ QByteArray &prepend(const char *s)
+ { return insert(0, QByteArrayView(s, qsizetype(qstrlen(s)))); }
+ QByteArray &prepend(const char *s, qsizetype len)
+ { return insert(0, QByteArrayView(s, len)); }
QByteArray &prepend(const QByteArray &a);
+ QByteArray &prepend(QByteArrayView a)
+ { return insert(0, a); }
+
QByteArray &append(char c);
- inline QByteArray &append(int count, char c);
- QByteArray &append(const char *s);
- QByteArray &append(const char *s, int len);
+ inline QByteArray &append(qsizetype count, char c);
+ QByteArray &append(const char *s)
+ { return append(s, -1); }
+ QByteArray &append(const char *s, qsizetype len)
+ { return append(QByteArrayView(s, len < 0 ? qsizetype(qstrlen(s)) : len)); }
QByteArray &append(const QByteArray &a);
- QByteArray &insert(int i, char c);
- QByteArray &insert(int i, int count, char c);
- QByteArray &insert(int i, const char *s);
- QByteArray &insert(int i, const char *s, int len);
- QByteArray &insert(int i, const QByteArray &a);
- QByteArray &remove(int index, int len);
- QByteArray &replace(int index, int len, const char *s);
- QByteArray &replace(int index, int len, const char *s, int alen);
- QByteArray &replace(int index, int len, const QByteArray &s);
- inline QByteArray &replace(char before, const char *after);
- QByteArray &replace(char before, const QByteArray &after);
- inline QByteArray &replace(const char *before, const char *after);
- QByteArray &replace(const char *before, int bsize, const char *after, int asize);
- QByteArray &replace(const QByteArray &before, const QByteArray &after);
- inline QByteArray &replace(const QByteArray &before, const char *after);
- QByteArray &replace(const char *before, const QByteArray &after);
+ QByteArray &append(QByteArrayView a)
+ { return insert(size(), a); }
+
+ QByteArray &assign(QByteArrayView v);
+ QByteArray &assign(qsizetype n, char c)
+ {
+ Q_ASSERT(n >= 0);
+ return fill(c, n);
+ }
+ template <typename InputIterator, if_input_iterator<InputIterator> = true>
+ QByteArray &assign(InputIterator first, InputIterator last)
+ {
+ d.assign(first, last);
+ d.data()[d.size] = '\0';
+ return *this;
+ }
+
+ QByteArray &insert(qsizetype i, QByteArrayView data);
+ inline QByteArray &insert(qsizetype i, const char *s)
+ { return insert(i, QByteArrayView(s)); }
+ inline QByteArray &insert(qsizetype i, const QByteArray &data)
+ { return insert(i, QByteArrayView(data)); }
+ QByteArray &insert(qsizetype i, qsizetype count, char c);
+ QByteArray &insert(qsizetype i, char c)
+ { return insert(i, QByteArrayView(&c, 1)); }
+ QByteArray &insert(qsizetype i, const char *s, qsizetype len)
+ { return insert(i, QByteArrayView(s, len)); }
+
+ QByteArray &remove(qsizetype index, qsizetype len);
+ QByteArray &removeAt(qsizetype pos)
+ { return size_t(pos) < size_t(size()) ? remove(pos, 1) : *this; }
+ QByteArray &removeFirst() { return !isEmpty() ? remove(0, 1) : *this; }
+ QByteArray &removeLast() { return !isEmpty() ? remove(size() - 1, 1) : *this; }
+
+ template <typename Predicate>
+ QByteArray &removeIf(Predicate pred)
+ {
+ removeIf_helper(pred);
+ return *this;
+ }
+
+ QByteArray &replace(qsizetype index, qsizetype len, const char *s, qsizetype alen)
+ { return replace(index, len, QByteArrayView(s, alen)); }
+ QByteArray &replace(qsizetype index, qsizetype len, QByteArrayView s);
+ QByteArray &replace(char before, QByteArrayView after)
+ { return replace(QByteArrayView(&before, 1), after); }
+ QByteArray &replace(const char *before, qsizetype bsize, const char *after, qsizetype asize)
+ { return replace(QByteArrayView(before, bsize), QByteArrayView(after, asize)); }
+ QByteArray &replace(QByteArrayView before, QByteArrayView after);
QByteArray &replace(char before, char after);
- inline QByteArray &operator+=(char c);
- inline QByteArray &operator+=(const char *s);
- inline QByteArray &operator+=(const QByteArray &a);
+
+ QByteArray &operator+=(char c)
+ { return append(c); }
+ QByteArray &operator+=(const char *s)
+ { return append(s); }
+ QByteArray &operator+=(const QByteArray &a)
+ { return append(a); }
+ QByteArray &operator+=(QByteArrayView a)
+ { return append(a); }
QList<QByteArray> split(char sep) const;
- Q_REQUIRED_RESULT QByteArray repeated(int times) const;
+ [[nodiscard]] QByteArray repeated(qsizetype times) const;
+
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+#if QT_CORE_REMOVED_SINCE(6, 8)
+ QT_ASCII_CAST_WARN inline bool operator==(const QString &s2) const;
+ QT_ASCII_CAST_WARN inline bool operator!=(const QString &s2) const;
+ QT_ASCII_CAST_WARN inline bool operator<(const QString &s2) const;
+ QT_ASCII_CAST_WARN inline bool operator>(const QString &s2) const;
+ QT_ASCII_CAST_WARN inline bool operator<=(const QString &s2) const;
+ QT_ASCII_CAST_WARN inline bool operator>=(const QString &s2) const;
+#endif // QT_CORE_REMOVED_SINCE(6, 8)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
short toShort(bool *ok = nullptr, int base = 10) const;
ushort toUShort(bool *ok = nullptr, int base = 10) const;
@@ -337,6 +385,7 @@ public:
QByteArray toPercentEncoding(const QByteArray &exclude = QByteArray(),
const QByteArray &include = QByteArray(),
char percent = '%') const;
+ [[nodiscard]] QByteArray percentDecoded(char percent = '%') const;
inline QByteArray &setNum(short, int base = 10);
inline QByteArray &setNum(ushort, int base = 10);
@@ -346,25 +395,28 @@ public:
inline QByteArray &setNum(ulong, int base = 10);
QByteArray &setNum(qlonglong, int base = 10);
QByteArray &setNum(qulonglong, int base = 10);
- inline QByteArray &setNum(float, char f = 'g', int prec = 6);
- QByteArray &setNum(double, char f = 'g', int prec = 6);
- QByteArray &setRawData(const char *a, uint n); // ### Qt 6: use an int
-
- Q_REQUIRED_RESULT static QByteArray number(int, int base = 10);
- Q_REQUIRED_RESULT static QByteArray number(uint, int base = 10);
- Q_REQUIRED_RESULT static QByteArray number(long, int base = 10);
- Q_REQUIRED_RESULT static QByteArray number(ulong, int base = 10);
- Q_REQUIRED_RESULT static QByteArray number(qlonglong, int base = 10);
- Q_REQUIRED_RESULT static QByteArray number(qulonglong, int base = 10);
- Q_REQUIRED_RESULT static QByteArray number(double, char f = 'g', int prec = 6);
- Q_REQUIRED_RESULT static QByteArray fromRawData(const char *, int size);
+ inline QByteArray &setNum(float, char format = 'g', int precision = 6);
+ QByteArray &setNum(double, char format = 'g', int precision = 6);
+ QByteArray &setRawData(const char *a, qsizetype n);
+
+ [[nodiscard]] static QByteArray number(int, int base = 10);
+ [[nodiscard]] static QByteArray number(uint, int base = 10);
+ [[nodiscard]] static QByteArray number(long, int base = 10);
+ [[nodiscard]] static QByteArray number(ulong, int base = 10);
+ [[nodiscard]] static QByteArray number(qlonglong, int base = 10);
+ [[nodiscard]] static QByteArray number(qulonglong, int base = 10);
+ [[nodiscard]] static QByteArray number(double, char format = 'g', int precision = 6);
+ [[nodiscard]] static QByteArray fromRawData(const char *data, qsizetype size)
+ {
+ return QByteArray(DataPointer(nullptr, const_cast<char *>(data), size));
+ }
class FromBase64Result;
- Q_REQUIRED_RESULT static FromBase64Result fromBase64Encoding(QByteArray &&base64, Base64Options options = Base64Encoding);
- Q_REQUIRED_RESULT static FromBase64Result fromBase64Encoding(const QByteArray &base64, Base64Options options = Base64Encoding);
- Q_REQUIRED_RESULT static QByteArray fromBase64(const QByteArray &base64, Base64Options options = Base64Encoding);
- Q_REQUIRED_RESULT static QByteArray fromHex(const QByteArray &hexEncoded);
- Q_REQUIRED_RESULT static QByteArray fromPercentEncoding(const QByteArray &pctEncoded, char percent = '%');
+ [[nodiscard]] static FromBase64Result fromBase64Encoding(QByteArray &&base64, Base64Options options = Base64Encoding);
+ [[nodiscard]] static FromBase64Result fromBase64Encoding(const QByteArray &base64, Base64Options options = Base64Encoding);
+ [[nodiscard]] static QByteArray fromBase64(const QByteArray &base64, Base64Options options = Base64Encoding);
+ [[nodiscard]] static QByteArray fromHex(const QByteArray &hexEncoded);
+ [[nodiscard]] static QByteArray fromPercentEncoding(const QByteArray &pctEncoded, char percent = '%');
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
static QByteArray fromCFData(CFDataRef data);
@@ -377,63 +429,145 @@ public:
NSData *toRawNSData() const Q_DECL_NS_RETURNS_AUTORELEASED;
#endif
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+ static QByteArray fromEcmaUint8Array(emscripten::val uint8array);
+ emscripten::val toEcmaUint8Array();
+#endif
+
typedef char *iterator;
typedef const char *const_iterator;
typedef iterator Iterator;
typedef const_iterator ConstIterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- inline iterator begin();
- inline const_iterator begin() const;
- inline const_iterator cbegin() const;
- inline const_iterator constBegin() const;
- inline iterator end();
- inline const_iterator end() const;
- inline const_iterator cend() const;
- inline const_iterator constEnd() const;
+ iterator begin() { return data(); }
+ const_iterator begin() const noexcept { return d.data(); }
+ const_iterator cbegin() const noexcept { return begin(); }
+ const_iterator constBegin() const noexcept { return begin(); }
+ iterator end() { return begin() + size(); }
+ const_iterator end() const noexcept { return begin() + size(); }
+ const_iterator cend() const noexcept { return end(); }
+ const_iterator constEnd() const noexcept { return end(); }
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const { return const_reverse_iterator(begin()); }
+ const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ const_reverse_iterator crbegin() const noexcept { return rbegin(); }
+ const_reverse_iterator crend() const noexcept { return rend(); }
// stl compatibility
- typedef int size_type;
+ typedef qsizetype size_type;
typedef qptrdiff difference_type;
typedef const char & const_reference;
typedef char & reference;
typedef char *pointer;
typedef const char *const_pointer;
typedef char value_type;
- inline void push_back(char c);
- inline void push_back(const char *c);
- inline void push_back(const QByteArray &a);
- inline void push_front(char c);
- inline void push_front(const char *c);
- inline void push_front(const QByteArray &a);
+ void push_back(char c)
+ { append(c); }
+ void push_back(const char *s)
+ { append(s); }
+ void push_back(const QByteArray &a)
+ { append(a); }
+ void push_back(QByteArrayView a)
+ { append(a); }
+ void push_front(char c)
+ { prepend(c); }
+ void push_front(const char *c)
+ { prepend(c); }
+ void push_front(const QByteArray &a)
+ { prepend(a); }
+ void push_front(QByteArrayView a)
+ { prepend(a); }
void shrink_to_fit() { squeeze(); }
+ iterator erase(const_iterator first, const_iterator last);
+ inline iterator erase(const_iterator it) { return erase(it, it + 1); }
+ static constexpr qsizetype max_size() noexcept
+ {
+ // -1 to deal with the NUL terminator
+ return Data::max_size() - 1;
+ }
- static inline QByteArray fromStdString(const std::string &s);
- inline std::string toStdString() const;
+ static QByteArray fromStdString(const std::string &s);
+ std::string toStdString() const;
- inline int size() const { return d->size; }
- inline int count() const { return size(); }
- inline int length() const { return size(); }
- bool isNull() const;
+ inline qsizetype size() const noexcept { return d->size; }
+#if QT_DEPRECATED_SINCE(6, 4)
+ QT_DEPRECATED_VERSION_X_6_4("Use size() or length() instead.")
+ inline qsizetype count() const noexcept { return size(); }
+#endif
+ inline qsizetype length() const noexcept { return size(); }
+ QT_CORE_INLINE_SINCE(6, 4)
+ bool isNull() const noexcept;
+ inline const DataPointer &data_ptr() const { return d; }
inline DataPointer &data_ptr() { return d; }
- explicit inline QByteArray(const DataPointer &dd)
- : d(dd)
- {
- }
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ explicit inline QByteArray(const DataPointer &dd) : d(dd) {}
+#endif
+ explicit inline QByteArray(DataPointer &&dd) : d(std::move(dd)) {}
private:
- operator QNoImplicitBoolCast() const;
- void reallocData(uint alloc, Data::ArrayOptions options);
- void expand(int i);
- QByteArray nulTerminated() const;
+ friend bool comparesEqual(const QByteArray &lhs, const QByteArrayView &rhs) noexcept
+ { return QByteArrayView(lhs) == rhs; }
+ friend Qt::strong_ordering
+ compareThreeWay(const QByteArray &lhs, const QByteArrayView &rhs) noexcept
+ {
+ const int res = QtPrivate::compareMemory(QByteArrayView(lhs), rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray, QByteArrayView)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray, const char *)
+#if defined(__GLIBCXX__) && defined(__cpp_lib_three_way_comparison)
+ // libstdc++ has a bug [0] when `operator const void *()` is preferred over
+ // `operator<=>()` when calling std::less<> and other similar methods.
+ // Fix it by explicitly providing relational operators in such case.
+ // [0]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114153
+ friend bool operator<(const QByteArray &lhs, const QByteArray &rhs) noexcept
+ { return is_lt(compareThreeWay(lhs, rhs)); }
+ friend bool operator<=(const QByteArray &lhs, const QByteArray &rhs) noexcept
+ { return is_lteq(compareThreeWay(lhs, rhs)); }
+ friend bool operator>(const QByteArray &lhs, const QByteArray &rhs) noexcept
+ { return is_gt(compareThreeWay(lhs, rhs)); }
+ friend bool operator>=(const QByteArray &lhs, const QByteArray &rhs) noexcept
+ { return is_gteq(compareThreeWay(lhs, rhs)); }
+#endif // defined(__GLIBCXX__) && defined(__cpp_lib_three_way_comparison)
+
+ // Check isEmpty() instead of isNull() for backwards compatibility.
+ friend bool comparesEqual(const QByteArray &lhs, std::nullptr_t) noexcept
+ { return lhs.isEmpty(); }
+ friend Qt::strong_ordering compareThreeWay(const QByteArray &lhs, std::nullptr_t) noexcept
+ { return lhs.isEmpty() ? Qt::strong_ordering::equivalent : Qt::strong_ordering::greater; }
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray, std::nullptr_t)
+
+ // defined in qstring.cpp
+ friend Q_CORE_EXPORT bool comparesEqual(const QByteArray &lhs, const QChar &rhs) noexcept;
+ friend Q_CORE_EXPORT Qt::strong_ordering
+ compareThreeWay(const QByteArray &lhs, const QChar &rhs) noexcept;
+ friend Q_CORE_EXPORT bool comparesEqual(const QByteArray &lhs, char16_t rhs) noexcept;
+ friend Q_CORE_EXPORT Qt::strong_ordering
+ compareThreeWay(const QByteArray &lhs, char16_t rhs) noexcept;
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray, QChar, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray, char16_t, QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+
+
+ void reallocData(qsizetype alloc, QArrayData::AllocationOption option);
+ void reallocGrowData(qsizetype n);
+ void expand(qsizetype i);
+
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= d.size);
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= d.size - pos);
+ }
+ static QByteArray sliced_helper(QByteArray &a, qsizetype pos, qsizetype n);
static QByteArray toLower_helper(const QByteArray &a);
static QByteArray toLower_helper(QByteArray &a);
static QByteArray toUpper_helper(const QByteArray &a);
@@ -442,23 +576,32 @@ private:
static QByteArray trimmed_helper(QByteArray &a);
static QByteArray simplified_helper(const QByteArray &a);
static QByteArray simplified_helper(QByteArray &a);
+ template <typename Predicate>
+ qsizetype removeIf_helper(Predicate pred)
+ {
+ const qsizetype result = d->eraseIf(pred);
+ if (result > 0)
+ d.data()[d.size] = '\0';
+ return result;
+ }
friend class QString;
- friend Q_CORE_EXPORT QByteArray qUncompress(const uchar *data, int nbytes);
+ friend Q_CORE_EXPORT QByteArray qUncompress(const uchar *data, qsizetype nbytes);
+
+ template <typename T> friend qsizetype erase(QByteArray &ba, const T &t);
+ template <typename Predicate> friend qsizetype erase_if(QByteArray &ba, Predicate pred);
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QByteArray::Base64Options)
-inline QByteArray::QByteArray() noexcept {}
+inline constexpr QByteArray::QByteArray() noexcept {}
inline QByteArray::~QByteArray() {}
-inline char QByteArray::at(int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return d.data()[i]; }
-inline char QByteArray::operator[](int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return d.data()[i]; }
+inline char QByteArray::at(qsizetype i) const
+{ verify(i, 1); return d.data()[i]; }
+inline char QByteArray::operator[](qsizetype i) const
+{ verify(i, 1); return d.data()[i]; }
-inline bool QByteArray::isEmpty() const
-{ return size() == 0; }
#ifndef QT_NO_CAST_FROM_BYTEARRAY
inline QByteArray::operator const char *() const
{ return data(); }
@@ -466,183 +609,122 @@ inline QByteArray::operator const void *() const
{ return data(); }
#endif
inline char *QByteArray::data()
-{ detach(); return d.data(); }
-inline const char *QByteArray::data() const
-{ return d.data(); }
-inline const char *QByteArray::constData() const
-{ return d.data(); }
+{
+ detach();
+ Q_ASSERT(d.data());
+ return d.data();
+}
+inline const char *QByteArray::data() const noexcept
+{
+#if QT5_NULL_STRINGS == 1
+ return d.data() ? d.data() : &_empty;
+#else
+ return d.data();
+#endif
+}
inline void QByteArray::detach()
-{ if (d->needsDetach()) reallocData(uint(size()) + 1u, d->detachFlags()); }
+{ if (d->needsDetach()) reallocData(size(), QArrayData::KeepSize); }
inline bool QByteArray::isDetached() const
{ return !d->isShared(); }
inline QByteArray::QByteArray(const QByteArray &a) noexcept : d(a.d)
{}
-inline int QByteArray::capacity() const
-{ const auto realCapacity = d->constAllocatedCapacity(); return realCapacity ? int(realCapacity) - 1 : 0; }
+inline qsizetype QByteArray::capacity() const { return qsizetype(d->constAllocatedCapacity()); }
-inline void QByteArray::reserve(int asize)
+inline void QByteArray::reserve(qsizetype asize)
{
- if (d->needsDetach() || asize > capacity()) {
- reallocData(qMax(uint(size()), uint(asize)) + 1u, d->detachFlags() | Data::CapacityReserved);
- } else {
- d->flags() |= Data::CapacityReserved;
- }
+ if (d->needsDetach() || asize > capacity() - d->freeSpaceAtBegin())
+ reallocData(qMax(size(), asize), QArrayData::KeepSize);
+ if (d->constAllocatedCapacity())
+ d->setFlag(Data::CapacityReserved);
}
inline void QByteArray::squeeze()
{
- if ((d->flags() & Data::CapacityReserved) == 0)
+ if (!d.isMutable())
return;
- if (d->needsDetach() || size() < capacity()) {
- reallocData(uint(size()) + 1u, d->detachFlags() & ~Data::CapacityReserved);
- } else {
- d->flags() &= uint(~Data::CapacityReserved);
- }
+ if (d->needsDetach() || size() < capacity())
+ reallocData(size(), QArrayData::KeepSize);
+ if (d->constAllocatedCapacity())
+ d->clearFlag(Data::CapacityReserved);
}
-inline char &QByteArray::operator[](int i)
-{ Q_ASSERT(i >= 0 && i < size()); return data()[i]; }
+inline char &QByteArray::operator[](qsizetype i)
+{ verify(i, 1); return data()[i]; }
inline char &QByteArray::front() { return operator[](0); }
inline char &QByteArray::back() { return operator[](size() - 1); }
-inline QByteArray::iterator QByteArray::begin()
-{ return data(); }
-inline QByteArray::const_iterator QByteArray::begin() const
-{ return data(); }
-inline QByteArray::const_iterator QByteArray::cbegin() const
-{ return data(); }
-inline QByteArray::const_iterator QByteArray::constBegin() const
-{ return data(); }
-inline QByteArray::iterator QByteArray::end()
-{ return data() + size(); }
-inline QByteArray::const_iterator QByteArray::end() const
-{ return data() + size(); }
-inline QByteArray::const_iterator QByteArray::cend() const
-{ return data() + size(); }
-inline QByteArray::const_iterator QByteArray::constEnd() const
-{ return data() + size(); }
-inline QByteArray &QByteArray::append(int n, char ch)
+inline QByteArray &QByteArray::append(qsizetype n, char ch)
{ return insert(size(), n, ch); }
-inline QByteArray &QByteArray::prepend(int n, char ch)
+inline QByteArray &QByteArray::prepend(qsizetype n, char ch)
{ return insert(0, n, ch); }
-inline QByteArray &QByteArray::operator+=(char c)
-{ return append(c); }
-inline QByteArray &QByteArray::operator+=(const char *s)
-{ return append(s); }
-inline QByteArray &QByteArray::operator+=(const QByteArray &a)
-{ return append(a); }
-inline void QByteArray::push_back(char c)
-{ append(c); }
-inline void QByteArray::push_back(const char *c)
-{ append(c); }
-inline void QByteArray::push_back(const QByteArray &a)
-{ append(a); }
-inline void QByteArray::push_front(char c)
-{ prepend(c); }
-inline void QByteArray::push_front(const char *c)
-{ prepend(c); }
-inline void QByteArray::push_front(const QByteArray &a)
-{ prepend(a); }
-inline bool QByteArray::contains(const QByteArray &a) const
-{ return indexOf(a) != -1; }
inline bool QByteArray::contains(char c) const
{ return indexOf(c) != -1; }
-inline int QByteArray::compare(const char *c, Qt::CaseSensitivity cs) const noexcept
-{
- return cs == Qt::CaseSensitive ? qstrcmp(*this, c) :
- qstrnicmp(data(), size(), c, -1);
-}
-inline int QByteArray::compare(const QByteArray &a, Qt::CaseSensitivity cs) const noexcept
+inline bool QByteArray::contains(QByteArrayView bv) const
+{ return indexOf(bv) != -1; }
+inline int QByteArray::compare(QByteArrayView a, Qt::CaseSensitivity cs) const noexcept
{
- return cs == Qt::CaseSensitive ? qstrcmp(*this, a) :
+ return cs == Qt::CaseSensitive ? QtPrivate::compareMemory(*this, a) :
qstrnicmp(data(), size(), a.data(), a.size());
}
-inline bool operator==(const QByteArray &a1, const QByteArray &a2) noexcept
-{ return (a1.size() == a2.size()) && (memcmp(a1.constData(), a2.constData(), a1.size())==0); }
-inline bool operator==(const QByteArray &a1, const char *a2) noexcept
-{ return a2 ? qstrcmp(a1,a2) == 0 : a1.isEmpty(); }
-inline bool operator==(const char *a1, const QByteArray &a2) noexcept
-{ return a1 ? qstrcmp(a1,a2) == 0 : a2.isEmpty(); }
-inline bool operator!=(const QByteArray &a1, const QByteArray &a2) noexcept
-{ return !(a1==a2); }
-inline bool operator!=(const QByteArray &a1, const char *a2) noexcept
-{ return a2 ? qstrcmp(a1,a2) != 0 : !a1.isEmpty(); }
-inline bool operator!=(const char *a1, const QByteArray &a2) noexcept
-{ return a1 ? qstrcmp(a1,a2) != 0 : !a2.isEmpty(); }
-inline bool operator<(const QByteArray &a1, const QByteArray &a2) noexcept
-{ return qstrcmp(a1, a2) < 0; }
- inline bool operator<(const QByteArray &a1, const char *a2) noexcept
-{ return qstrcmp(a1, a2) < 0; }
-inline bool operator<(const char *a1, const QByteArray &a2) noexcept
-{ return qstrcmp(a1, a2) < 0; }
-inline bool operator<=(const QByteArray &a1, const QByteArray &a2) noexcept
-{ return qstrcmp(a1, a2) <= 0; }
-inline bool operator<=(const QByteArray &a1, const char *a2) noexcept
-{ return qstrcmp(a1, a2) <= 0; }
-inline bool operator<=(const char *a1, const QByteArray &a2) noexcept
-{ return qstrcmp(a1, a2) <= 0; }
-inline bool operator>(const QByteArray &a1, const QByteArray &a2) noexcept
-{ return qstrcmp(a1, a2) > 0; }
-inline bool operator>(const QByteArray &a1, const char *a2) noexcept
-{ return qstrcmp(a1, a2) > 0; }
-inline bool operator>(const char *a1, const QByteArray &a2) noexcept
-{ return qstrcmp(a1, a2) > 0; }
-inline bool operator>=(const QByteArray &a1, const QByteArray &a2) noexcept
-{ return qstrcmp(a1, a2) >= 0; }
-inline bool operator>=(const QByteArray &a1, const char *a2) noexcept
-{ return qstrcmp(a1, a2) >= 0; }
-inline bool operator>=(const char *a1, const QByteArray &a2) noexcept
-{ return qstrcmp(a1, a2) >= 0; }
#if !defined(QT_USE_QSTRINGBUILDER)
-inline const QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
+inline QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(const QByteArray &a1, const char *a2)
+inline QByteArray operator+(QByteArray &&lhs, const QByteArray &rhs)
+{ return std::move(lhs += rhs); }
+inline QByteArray operator+(const QByteArray &a1, const char *a2)
{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(const QByteArray &a1, char a2)
+inline QByteArray operator+(QByteArray &&lhs, const char *rhs)
+{ return std::move(lhs += rhs); }
+inline QByteArray operator+(const QByteArray &a1, char a2)
{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(const char *a1, const QByteArray &a2)
+inline QByteArray operator+(QByteArray &&lhs, char rhs)
+{ return std::move(lhs += rhs); }
+inline QByteArray operator+(const char *a1, const QByteArray &a2)
{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(char a1, const QByteArray &a2)
+inline QByteArray operator+(char a1, const QByteArray &a2)
{ return QByteArray(&a1, 1) += a2; }
#endif // QT_USE_QSTRINGBUILDER
-inline bool QByteArray::contains(const char *c) const
-{ return indexOf(c) != -1; }
-inline QByteArray &QByteArray::replace(char before, const char *c)
-{ return replace(&before, 1, c, qstrlen(c)); }
-inline QByteArray &QByteArray::replace(const QByteArray &before, const char *c)
-{ return replace(before.constData(), before.size(), c, qstrlen(c)); }
-inline QByteArray &QByteArray::replace(const char *before, const char *after)
-{ return replace(before, qstrlen(before), after, qstrlen(after)); }
inline QByteArray &QByteArray::setNum(short n, int base)
-{ return base == 10 ? setNum(qlonglong(n), base) : setNum(qulonglong(ushort(n)), base); }
+{ return setNum(qlonglong(n), base); }
inline QByteArray &QByteArray::setNum(ushort n, int base)
{ return setNum(qulonglong(n), base); }
inline QByteArray &QByteArray::setNum(int n, int base)
-{ return base == 10 ? setNum(qlonglong(n), base) : setNum(qulonglong(uint(n)), base); }
+{ return setNum(qlonglong(n), base); }
inline QByteArray &QByteArray::setNum(uint n, int base)
{ return setNum(qulonglong(n), base); }
inline QByteArray &QByteArray::setNum(long n, int base)
-{ return base == 10 ? setNum(qlonglong(n), base) : setNum(qulonglong(ulong(n)), base); }
+{ return setNum(qlonglong(n), base); }
inline QByteArray &QByteArray::setNum(ulong n, int base)
{ return setNum(qulonglong(n), base); }
-inline QByteArray &QByteArray::setNum(float n, char f, int prec)
-{ return setNum(double(n),f,prec); }
+inline QByteArray &QByteArray::setNum(float n, char format, int precision)
+{ return setNum(double(n), format, precision); }
-inline std::string QByteArray::toStdString() const
-{ return std::string(constData(), length()); }
-
-inline QByteArray QByteArray::fromStdString(const std::string &s)
-{ return QByteArray(s.data(), int(s.size())); }
+#if QT_CORE_INLINE_IMPL_SINCE(6, 4)
+bool QByteArray::isNull() const noexcept
+{
+ return d->isNull();
+}
+#endif
+#if QT_CORE_INLINE_IMPL_SINCE(6, 7)
+qsizetype QByteArray::indexOf(char ch, qsizetype from) const
+{
+ return qToByteArrayViewIgnoringNull(*this).indexOf(ch, from);
+}
+qsizetype QByteArray::lastIndexOf(char ch, qsizetype from) const
+{
+ return qToByteArrayViewIgnoringNull(*this).lastIndexOf(ch, from);
+}
+#endif
-#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE))
+#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QByteArray &);
Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QByteArray &);
#endif
#ifndef QT_NO_COMPRESS
-Q_CORE_EXPORT QByteArray qCompress(const uchar* data, int nbytes, int compressionLevel = -1);
-Q_CORE_EXPORT QByteArray qUncompress(const uchar* data, int nbytes);
+Q_CORE_EXPORT QByteArray qCompress(const uchar* data, qsizetype nbytes, int compressionLevel = -1);
+Q_CORE_EXPORT QByteArray qUncompress(const uchar* data, qsizetype nbytes);
inline QByteArray qCompress(const QByteArray& data, int compressionLevel = -1)
{ return qCompress(reinterpret_cast<const uchar *>(data.constData()), data.size(), compressionLevel); }
inline QByteArray qUncompress(const QByteArray& data)
@@ -659,8 +741,8 @@ public:
void swap(QByteArray::FromBase64Result &other) noexcept
{
- qSwap(decoded, other.decoded);
- qSwap(decodingStatus, other.decodingStatus);
+ decoded.swap(other.decoded);
+ std::swap(decodingStatus, other.decodingStatus);
}
explicit operator bool() const noexcept { return decodingStatus == QByteArray::Base64DecodingStatus::Ok; }
@@ -673,27 +755,73 @@ public:
QByteArray &operator*() noexcept { return decoded; }
const QByteArray &operator*() const noexcept { return decoded; }
#endif
+
+ friend inline bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
+ {
+ if (lhs.decodingStatus != rhs.decodingStatus)
+ return false;
+
+ if (lhs.decodingStatus == QByteArray::Base64DecodingStatus::Ok && lhs.decoded != rhs.decoded)
+ return false;
+
+ return true;
+ }
+
+ friend inline bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
+ {
+ return !(lhs == rhs);
+ }
};
Q_DECLARE_SHARED(QByteArray::FromBase64Result)
-inline bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
+
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QByteArray::FromBase64Result &key, size_t seed = 0) noexcept;
+
+template <typename T>
+qsizetype erase(QByteArray &ba, const T &t)
+{
+ return ba.removeIf_helper([&t](const auto &e) { return t == e; });
+}
+
+template <typename Predicate>
+qsizetype erase_if(QByteArray &ba, Predicate pred)
+{
+ return ba.removeIf_helper(pred);
+}
+
+//
+// QByteArrayView members that require QByteArray:
+//
+QByteArray QByteArrayView::toByteArray() const
{
- if (lhs.decodingStatus != rhs.decodingStatus)
- return false;
+ return QByteArray(*this);
+}
- if (lhs.decodingStatus == QByteArray::Base64DecodingStatus::Ok && lhs.decoded != rhs.decoded)
- return false;
+namespace Qt {
+inline namespace Literals {
+inline namespace StringLiterals {
- return true;
+inline QByteArray operator""_ba(const char *str, size_t size) noexcept
+{
+ return QByteArray(QByteArrayData(nullptr, const_cast<char *>(str), qsizetype(size)));
}
-inline bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
+} // StringLiterals
+} // Literals
+} // Qt
+
+inline namespace QtLiterals {
+#if QT_DEPRECATED_SINCE(6, 8)
+
+QT_DEPRECATED_VERSION_X_6_8("Use _ba from Qt::StringLiterals namespace instead.")
+inline QByteArray operator""_qba(const char *str, size_t size) noexcept
{
- return !operator==(lhs, rhs);
+ return Qt::StringLiterals::operator""_ba(str, size);
}
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QByteArray::FromBase64Result &key, size_t seed = 0) noexcept;
+#endif // QT_DEPRECATED_SINCE(6, 8)
+} // QtLiterals
QT_END_NAMESPACE
diff --git a/src/corelib/text/qbytearray_p.h b/src/corelib/text/qbytearray_p.h
deleted file mode 100644
index 90552cb442..0000000000
--- a/src/corelib/text/qbytearray_p.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBYTEARRAY_P_H
-#define QBYTEARRAY_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of other Qt classes. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qbytearray.h>
-#include "private/qtools_p.h"
-
-QT_BEGIN_NAMESPACE
-
-// -1 because of the terminating NUL
-constexpr qsizetype MaxByteArraySize = MaxAllocSize - sizeof(std::remove_pointer<QByteArray::DataPointer>::type) - 1;
-constexpr qsizetype MaxStringSize = (MaxAllocSize - sizeof(std::remove_pointer<QByteArray::DataPointer>::type)) / 2 - 1;
-
-QT_END_NAMESPACE
-
-#endif // QBYTEARRAY_P_H
diff --git a/src/corelib/text/qbytearrayalgorithms.h b/src/corelib/text/qbytearrayalgorithms.h
new file mode 100644
index 0000000000..7060161bb4
--- /dev/null
+++ b/src/corelib/text/qbytearrayalgorithms.h
@@ -0,0 +1,148 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QBYTEARRAYALGORITHMS_H
+#define QBYTEARRAYALGORITHMS_H
+
+#include <QtCore/qnamespace.h>
+
+#include <string.h>
+#include <stdarg.h>
+
+#if 0
+#pragma qt_class(QByteArrayAlgorithms)
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QByteArrayView;
+
+namespace QtPrivate {
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
+bool startsWith(QByteArrayView haystack, QByteArrayView needle) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
+bool endsWith(QByteArrayView haystack, QByteArrayView needle) noexcept;
+
+[[nodiscard]] inline
+qsizetype findByteArray(QByteArrayView haystack, qsizetype from, char needle) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
+qsizetype findByteArray(QByteArrayView haystack, qsizetype from, QByteArrayView needle) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
+qsizetype lastIndexOf(QByteArrayView haystack, qsizetype from, char needle) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
+qsizetype lastIndexOf(QByteArrayView haystack, qsizetype from, QByteArrayView needle) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
+qsizetype count(QByteArrayView haystack, QByteArrayView needle) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT int compareMemory(QByteArrayView lhs, QByteArrayView rhs);
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QByteArrayView trimmed(QByteArrayView s) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isValidUtf8(QByteArrayView s) noexcept;
+
+template <typename T>
+class ParsedNumber
+{
+ T m_value;
+ quint32 m_error : 1;
+ quint32 m_reserved : 31;
+ void *m_reserved2 = nullptr;
+public:
+ constexpr ParsedNumber() noexcept : m_value(), m_error(true), m_reserved(0) {}
+ constexpr explicit ParsedNumber(T v) : m_value(v), m_error(false), m_reserved(0) {}
+
+ // minimal optional-like API:
+ explicit operator bool() const noexcept { return !m_error; }
+ T &operator*() { Q_ASSERT(*this); return m_value; }
+ const T &operator*() const { Q_ASSERT(*this); return m_value; }
+ T *operator->() noexcept { return *this ? &m_value : nullptr; }
+ const T *operator->() const noexcept { return *this ? &m_value : nullptr; }
+ template <typename U> // not = T, as that'd allow calls that are incompatible with std::optional
+ T value_or(U &&u) const { return *this ? m_value : T(std::forward<U>(u)); }
+};
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION ParsedNumber<double> toDouble(QByteArrayView a) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION ParsedNumber<float> toFloat(QByteArrayView a) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION ParsedNumber<qlonglong> toSignedInteger(QByteArrayView data, int base);
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION ParsedNumber<qulonglong> toUnsignedInteger(QByteArrayView data, int base);
+
+// QByteArrayView has incomplete type here, and we can't include qbytearrayview.h,
+// since it includes qbytearrayalgorithms.h. Use the ByteArrayView template type as
+// a workaround.
+template <typename T, typename ByteArrayView,
+ typename = std::enable_if_t<std::is_same_v<ByteArrayView, QByteArrayView>>>
+static inline T toIntegral(ByteArrayView data, bool *ok, int base)
+{
+ const auto val = [&] {
+ if constexpr (std::is_unsigned_v<T>)
+ return toUnsignedInteger(data, base);
+ else
+ return toSignedInteger(data, base);
+ }();
+ const bool failed = !val || T(*val) != *val;
+ if (ok)
+ *ok = !failed;
+ if (failed)
+ return 0;
+ return T(*val);
+}
+
+} // namespace QtPrivate
+
+/*****************************************************************************
+ Safe and portable C string functions; extensions to standard string.h
+ *****************************************************************************/
+
+Q_CORE_EXPORT char *qstrdup(const char *);
+
+inline size_t qstrlen(const char *str)
+{
+ QT_WARNING_PUSH
+#if defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 900 && Q_CC_GNU < 1000
+ // spurious compiler warning (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91490#c6)
+ // when Q_DECLARE_METATYPE_TEMPLATE_1ARG is used
+ QT_WARNING_DISABLE_GCC("-Wstringop-overflow")
+#endif
+ return str ? strlen(str) : 0;
+ QT_WARNING_POP
+}
+
+inline size_t qstrnlen(const char *str, size_t maxlen)
+{
+ if (!str)
+ return 0;
+ auto end = static_cast<const char *>(memchr(str, '\0', maxlen));
+ return end ? end - str : maxlen;
+}
+
+// implemented in qbytearray.cpp
+Q_CORE_EXPORT char *qstrcpy(char *dst, const char *src);
+Q_CORE_EXPORT char *qstrncpy(char *dst, const char *src, size_t len);
+
+Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2);
+
+inline int qstrncmp(const char *str1, const char *str2, size_t len)
+{
+ return (str1 && str2) ? strncmp(str1, str2, len)
+ : (str1 ? 1 : (str2 ? -1 : 0));
+}
+Q_CORE_EXPORT int qstricmp(const char *, const char *);
+Q_CORE_EXPORT int qstrnicmp(const char *, const char *, size_t len);
+Q_CORE_EXPORT int qstrnicmp(const char *, qsizetype, const char *, qsizetype = -1);
+
+// implemented in qvsnprintf.cpp
+Q_CORE_EXPORT int qvsnprintf(char *str, size_t n, const char *fmt, va_list ap);
+Q_CORE_EXPORT int qsnprintf(char *str, size_t n, const char *fmt, ...);
+
+// qChecksum: Internet checksum
+Q_CORE_EXPORT quint16 qChecksum(QByteArrayView data, Qt::ChecksumType standard = Qt::ChecksumIso3309);
+
+QT_END_NAMESPACE
+
+#endif // QBYTEARRAYALGORITHMS_H
diff --git a/src/corelib/text/qbytearraylist.cpp b/src/corelib/text/qbytearraylist.cpp
index d04555ed4d..81bb54dfe4 100644
--- a/src/corelib/text/qbytearraylist.cpp
+++ b/src/corelib/text/qbytearraylist.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2014 by Southwest Research Institute (R)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2014 by Southwest Research Institute (R)
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qbytearraylist.h>
@@ -103,16 +67,18 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QByteArray QByteArrayList::join() const
+ \fn QByteArray QByteArrayList::join(const QByteArray &separator) const
- Joins all the byte arrays into a single byte array.
+ Joins all the byte arrays into a single byte array with each
+ element separated by the given \a separator.
*/
/*!
- \fn QByteArray QByteArrayList::join(const QByteArray &separator) const
+ \fn QByteArray QByteArrayList::join(QByteArrayView separator) const
+ \since 6.3
Joins all the byte arrays into a single byte array with each
- element separated by the given \a separator.
+ element separated by the given \a separator, if any.
*/
/*!
@@ -122,12 +88,12 @@ QT_BEGIN_NAMESPACE
element separated by the given \a separator.
*/
-static int QByteArrayList_joinedSize(const QByteArrayList *that, int seplen)
+static qsizetype QByteArrayList_joinedSize(const QByteArrayList *that, qsizetype seplen)
{
- int totalLength = 0;
- const int size = that->size();
+ qsizetype totalLength = 0;
+ const qsizetype size = that->size();
- for (int i = 0; i < size; ++i)
+ for (qsizetype i = 0; i < size; ++i)
totalLength += that->at(i).size();
if (size > 0)
@@ -136,13 +102,13 @@ static int QByteArrayList_joinedSize(const QByteArrayList *that, int seplen)
return totalLength;
}
-QByteArray QtPrivate::QByteArrayList_join(const QByteArrayList *that, const char *sep, int seplen)
+QByteArray QtPrivate::QByteArrayList_join(const QByteArrayList *that, const char *sep, qsizetype seplen)
{
QByteArray res;
- if (const int joinedSize = QByteArrayList_joinedSize(that, seplen))
+ if (const qsizetype joinedSize = QByteArrayList_joinedSize(that, seplen))
res.reserve(joinedSize); // don't call reserve(0) - it allocates one byte for the NUL
- const int size = that->size();
- for (int i = 0; i < size; ++i) {
+ const qsizetype size = that->size();
+ for (qsizetype i = 0; i < size; ++i) {
if (i)
res.append(sep, seplen);
res += that->at(i);
@@ -150,26 +116,4 @@ QByteArray QtPrivate::QByteArrayList_join(const QByteArrayList *that, const char
return res;
}
-/*!
- \fn int QByteArrayList::indexOf(const char *needle, int from) const
-
- Returns the index position of the first occurrence of \a needle in
- the list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- \a needle must be NUL-terminated.
-
- This overload doesn't require creating a QByteArray, thus saving a
- memory allocation and some CPU time.
-
- \since 5.13
- \overload
-*/
-
-int QtPrivate::QByteArrayList_indexOf(const QByteArrayList *that, const char *needle, int from)
-{
- const auto it = std::find_if(that->begin() + from, that->end(), [needle](const QByteArray &item) { return item == needle; });
- return it == that->end() ? -1 : int(std::distance(that->begin(), it));
-}
-
QT_END_NAMESPACE
diff --git a/src/corelib/text/qbytearraylist.h b/src/corelib/text/qbytearraylist.h
index 3f85a24329..f5302884f1 100644
--- a/src/corelib/text/qbytearraylist.h
+++ b/src/corelib/text/qbytearraylist.h
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2014 by Southwest Research Institute (R)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2014 by Southwest Research Institute (R)
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qlist.h>
@@ -46,6 +10,8 @@
#include <QtCore/qbytearray.h>
+#include <limits>
+
QT_BEGIN_NAMESPACE
#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
@@ -53,37 +19,40 @@ typedef QListIterator<QByteArray> QByteArrayListIterator;
typedef QMutableListIterator<QByteArray> QMutableByteArrayListIterator;
#endif
-#ifndef Q_CLANG_QDOC
-typedef QList<QByteArray> QByteArrayList;
+#ifndef Q_QDOC
namespace QtPrivate {
+#if QT_CORE_REMOVED_SINCE(6, 3) && QT_POINTER_SIZE != 4
QByteArray Q_CORE_EXPORT QByteArrayList_join(const QByteArrayList *that, const char *separator, int separatorLength);
- int Q_CORE_EXPORT QByteArrayList_indexOf(const QByteArrayList *that, const char *needle, int from);
+#endif
+ QByteArray Q_CORE_EXPORT QByteArrayList_join(const QByteArrayList *that, const char *sep, qsizetype len);
}
#endif
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
class QByteArrayList : public QList<QByteArray>
#else
-template <> struct QListSpecialMethods<QByteArray>
+template <> struct QListSpecialMethods<QByteArray> : QListSpecialMethodsBase<QByteArray>
#endif
{
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
protected:
~QListSpecialMethods() = default;
#endif
public:
- inline QByteArray join() const
- { return QtPrivate::QByteArrayList_join(self(), nullptr, 0); }
+ using QListSpecialMethodsBase<QByteArray>::indexOf;
+ using QListSpecialMethodsBase<QByteArray>::lastIndexOf;
+ using QListSpecialMethodsBase<QByteArray>::contains;
+
+ QByteArray join(QByteArrayView sep = {}) const
+ {
+ return QtPrivate::QByteArrayList_join(self(), sep.data(), sep.size());
+ }
+ Q_WEAK_OVERLOAD
inline QByteArray join(const QByteArray &sep) const
- { return QtPrivate::QByteArrayList_join(self(), sep.constData(), sep.size()); }
+ { return join(qToByteArrayViewIgnoringNull(sep)); }
inline QByteArray join(char sep) const
- { return QtPrivate::QByteArrayList_join(self(), &sep, 1); }
-
-private:
- typedef QList<QByteArray> Self;
- Self *self() { return static_cast<Self *>(this); }
- const Self *self() const { return static_cast<const Self *>(this); }
+ { return join({&sep, 1}); }
};
QT_END_NAMESPACE
diff --git a/src/corelib/text/qbytearraymatcher.cpp b/src/corelib/text/qbytearraymatcher.cpp
index 650b51d48e..ae38fb584b 100644
--- a/src/corelib/text/qbytearraymatcher.cpp
+++ b/src/corelib/text/qbytearraymatcher.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qbytearraymatcher.h"
@@ -124,15 +88,19 @@ QByteArrayMatcher::QByteArrayMatcher()
}
/*!
- Constructs a byte array matcher from \a pattern. \a pattern
- has the given \a length. \a pattern must remain in scope, but
- the destructor does not delete \a pattern.
- */
-QByteArrayMatcher::QByteArrayMatcher(const char *pattern, int length)
- : d(nullptr)
+ Constructs a byte array matcher from \a pattern. \a pattern
+ has the given \a length. Call indexIn() to perform a search.
+
+ \note the data that \a pattern is referencing must remain valid while this
+ object is used.
+*/
+QByteArrayMatcher::QByteArrayMatcher(const char *pattern, qsizetype length) : d(nullptr)
{
p.p = reinterpret_cast<const uchar *>(pattern);
- p.l = length;
+ if (length < 0)
+ p.l = qstrlen(pattern);
+ else
+ p.l = length;
bm_init_skiptable(p.p, p.l, p.q_skiptable);
}
@@ -149,6 +117,18 @@ QByteArrayMatcher::QByteArrayMatcher(const QByteArray &pattern)
}
/*!
+ \fn QByteArrayMatcher::QByteArrayMatcher(QByteArrayView pattern)
+ \since 6.3
+ \overload
+
+ Constructs a byte array matcher that will search for \a pattern.
+ Call indexIn() to perform a search.
+
+ \note the data that \a pattern is referencing must remain valid while this
+ object is used.
+*/
+
+/*!
Copies the \a other byte array matcher to this byte array matcher.
*/
QByteArrayMatcher::QByteArrayMatcher(const QByteArrayMatcher &other)
@@ -190,32 +170,36 @@ void QByteArrayMatcher::setPattern(const QByteArray &pattern)
}
/*!
- Searches the byte array \a ba, from byte position \a from (default
- 0, i.e. from the first byte), for the byte array pattern() that
- was set in the constructor or in the most recent call to
- setPattern(). Returns the position where the pattern() matched in
- \a ba, or -1 if no match was found.
+ Searches the char string \a str, which has length \a len, from
+ byte position \a from (default 0, i.e. from the first byte), for
+ the byte array pattern() that was set in the constructor or in the
+ most recent call to setPattern(). Returns the position where the
+ pattern() matched in \a str, or -1 if no match was found.
*/
-int QByteArrayMatcher::indexIn(const QByteArray &ba, int from) const
+qsizetype QByteArrayMatcher::indexIn(const char *str, qsizetype len, qsizetype from) const
{
if (from < 0)
from = 0;
- return bm_find(reinterpret_cast<const uchar *>(ba.constData()), ba.size(), from,
+ return bm_find(reinterpret_cast<const uchar *>(str), len, from,
p.p, p.l, p.q_skiptable);
}
/*!
- Searches the char string \a str, which has length \a len, from
- byte position \a from (default 0, i.e. from the first byte), for
- the byte array pattern() that was set in the constructor or in the
- most recent call to setPattern(). Returns the position where the
- pattern() matched in \a str, or -1 if no match was found.
+ \fn qsizetype QByteArrayMatcher::indexIn(QByteArrayView data, qsizetype from) const
+ \since 6.3
+ \overload
+
+ Searches the byte array \a data, from byte position \a from (default
+ 0, i.e. from the first byte), for the byte array pattern() that
+ was set in the constructor or in the most recent call to
+ setPattern(). Returns the position where the pattern() matched in
+ \a data, or -1 if no match was found.
*/
-int QByteArrayMatcher::indexIn(const char *str, int len, int from) const
+qsizetype QByteArrayMatcher::indexIn(QByteArrayView data, qsizetype from) const
{
if (from < 0)
from = 0;
- return bm_find(reinterpret_cast<const uchar *>(str), len, from,
+ return bm_find(reinterpret_cast<const uchar *>(data.data()), data.size(), from,
p.p, p.l, p.q_skiptable);
}
@@ -347,8 +331,7 @@ qsizetype qFindByteArray(
QByteArray::indexOf(), in particular if repeated matching takes place.
Unlike QByteArrayMatcher, this class calculates the internal
- representation at \e{compile-time}, if your compiler supports
- C++14-level \c{constexpr} (C++11 is not sufficient), so it can
+ representation at \e{compile-time}, so it can
even benefit if you are doing one-off byte array matches.
Create the QStaticByteArrayMatcher by calling qMakeStaticByteArrayMatcher(),
@@ -364,16 +347,11 @@ qsizetype qFindByteArray(
Since this class is designed to do all the up-front calculations at compile-time,
it does not offer a setPattern() method.
- \note Qt detects the necessary C++14 compiler support by way of the feature
- test recommendations from
- \l{https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations}
- {C++ Committee's Standing Document 6}.
-
\sa QByteArrayMatcher, QStringMatcher
*/
/*!
- \fn template <uint N> int QStaticByteArrayMatcher<N>::indexIn(const char *haystack, int hlen, int from = 0) const
+ \fn template <size_t N> qsizetype QStaticByteArrayMatcher<N>::indexIn(const char *haystack, qsizetype hlen, qsizetype from = 0) const
Searches the char string \a haystack, which has length \a hlen, from
byte position \a from (default 0, i.e. from the first byte), for
@@ -383,7 +361,7 @@ qsizetype qFindByteArray(
*/
/*!
- \fn template <uint N> int QStaticByteArrayMatcher<N>::indexIn(const QByteArray &haystack, int from = 0) const
+ \fn template <size_t N> qsizetype QStaticByteArrayMatcher<N>::indexIn(const QByteArray &haystack, qsizetype from = 0) const
Searches the char string \a haystack, from byte position \a from
(default 0, i.e. from the first byte), for the byte array pattern()
@@ -393,7 +371,7 @@ qsizetype qFindByteArray(
*/
/*!
- \fn template <uint N> QByteArray QStaticByteArrayMatcher<N>::pattern() const
+ \fn template <size_t N> QByteArray QStaticByteArrayMatcher<N>::pattern() const
Returns the byte array pattern that this byte array matcher will
search for.
@@ -404,7 +382,7 @@ qsizetype qFindByteArray(
/*!
\internal
*/
-int QStaticByteArrayMatcherBase::indexOfIn(const char *needle, uint nlen, const char *haystack, int hlen, int from) const noexcept
+qsizetype QStaticByteArrayMatcherBase::indexOfIn(const char *needle, size_t nlen, const char *haystack, qsizetype hlen, qsizetype from) const noexcept
{
if (from < 0)
from = 0;
@@ -413,12 +391,12 @@ int QStaticByteArrayMatcherBase::indexOfIn(const char *needle, uint nlen, const
}
/*!
- \fn template <uint N> QStaticByteArrayMatcher<N>::QStaticByteArrayMatcher(const char (&pattern)[N])
+ \fn template <size_t N> QStaticByteArrayMatcher<N>::QStaticByteArrayMatcher(const char (&pattern)[N])
\internal
*/
/*!
- \fn template <uint N> QStaticByteArrayMatcher qMakeStaticByteArrayMatcher(const char (&pattern)[N])
+ \fn template <size_t N> QStaticByteArrayMatcher qMakeStaticByteArrayMatcher(const char (&pattern)[N])
\since 5.9
\relates QStaticByteArrayMatcher
@@ -433,3 +411,5 @@ int QStaticByteArrayMatcherBase::indexOfIn(const char *needle, uint nlen, const
QT_END_NAMESPACE
+
+#undef REHASH
diff --git a/src/corelib/text/qbytearraymatcher.h b/src/corelib/text/qbytearraymatcher.h
index c923bd15d5..1de9c23f10 100644
--- a/src/corelib/text/qbytearraymatcher.h
+++ b/src/corelib/text/qbytearraymatcher.h
@@ -1,47 +1,15 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBYTEARRAYMATCHER_H
#define QBYTEARRAYMATCHER_H
#include <QtCore/qbytearray.h>
+#include <QtCore/q20algorithm.h>
+#include <iterator>
+#include <limits>
+
QT_BEGIN_NAMESPACE
@@ -52,7 +20,10 @@ class Q_CORE_EXPORT QByteArrayMatcher
public:
QByteArrayMatcher();
explicit QByteArrayMatcher(const QByteArray &pattern);
- explicit QByteArrayMatcher(const char *pattern, int length);
+ explicit QByteArrayMatcher(QByteArrayView pattern)
+ : QByteArrayMatcher(pattern.data(), pattern.size())
+ {}
+ explicit QByteArrayMatcher(const char *pattern, qsizetype length = -1);
QByteArrayMatcher(const QByteArrayMatcher &other);
~QByteArrayMatcher();
@@ -60,8 +31,15 @@ public:
void setPattern(const QByteArray &pattern);
- int indexIn(const QByteArray &ba, int from = 0) const;
- int indexIn(const char *str, int len, int from = 0) const;
+#if QT_CORE_REMOVED_SINCE(6, 3)
+ qsizetype indexIn(const QByteArray &ba, qsizetype from = 0) const;
+#else
+ Q_WEAK_OVERLOAD
+ qsizetype indexIn(const QByteArray &ba, qsizetype from = 0) const
+ { return indexIn(QByteArrayView{ba}, from); }
+#endif
+ qsizetype indexIn(const char *str, qsizetype len, qsizetype from = 0) const;
+ qsizetype indexIn(QByteArrayView data, qsizetype from = 0) const;
inline QByteArray pattern() const
{
if (q_pattern.isNull())
@@ -75,7 +53,7 @@ private:
struct Data {
uchar q_skiptable[256];
const uchar *p;
- int l;
+ qsizetype l;
};
union {
uint dummy[256];
@@ -90,43 +68,25 @@ class QStaticByteArrayMatcherBase
uchar data[256];
} m_skiptable;
protected:
- explicit Q_DECL_RELAXED_CONSTEXPR QStaticByteArrayMatcherBase(const char *pattern, uint n) noexcept
+ explicit constexpr QStaticByteArrayMatcherBase(const char *pattern, size_t n) noexcept
: m_skiptable(generate(pattern, n)) {}
// compiler-generated copy/more ctors/assignment operators are ok!
- // compiler-generated dtor is ok!
+ ~QStaticByteArrayMatcherBase() = default;
+#if QT_CORE_REMOVED_SINCE(6, 3) && QT_POINTER_SIZE != 4
Q_CORE_EXPORT int indexOfIn(const char *needle, uint nlen, const char *haystack, int hlen, int from) const noexcept;
+#endif
+ Q_CORE_EXPORT qsizetype indexOfIn(const char *needle, size_t nlen,
+ const char *haystack, qsizetype hlen,
+ qsizetype from) const noexcept;
private:
- static Q_DECL_RELAXED_CONSTEXPR Skiptable generate(const char *pattern, uint n) noexcept
+ static constexpr Skiptable generate(const char *pattern, size_t n) noexcept
{
const auto uchar_max = (std::numeric_limits<uchar>::max)();
uchar max = n > uchar_max ? uchar_max : uchar(n);
- Skiptable table = {
- // this verbose initialization code aims to avoid some opaque error messages
- // even on powerful compilers such as GCC 5.3. Even though for GCC a loop
- // format can be found that v5.3 groks, it's probably better to go with this
- // for the time being:
- {
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
-
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- }
- };
+ Skiptable table = {};
+ q20::fill(std::begin(table.data), std::end(table.data), max);
pattern += n - max;
while (max--)
table.data[uchar(*pattern++)] = max;
@@ -134,29 +94,33 @@ private:
}
};
-template <uint N>
+template <size_t N>
class QStaticByteArrayMatcher : QStaticByteArrayMatcherBase
{
char m_pattern[N];
+ // N includes the terminating '\0'!
static_assert(N > 2, "QStaticByteArrayMatcher makes no sense for finding a single-char pattern");
public:
- explicit Q_DECL_RELAXED_CONSTEXPR QStaticByteArrayMatcher(const char (&patternToMatch)[N]) noexcept
+ explicit constexpr QStaticByteArrayMatcher(const char (&patternToMatch)[N]) noexcept
: QStaticByteArrayMatcherBase(patternToMatch, N - 1), m_pattern()
{
- for (uint i = 0; i < N; ++i)
+ for (size_t i = 0; i < N; ++i)
m_pattern[i] = patternToMatch[i];
}
- int indexIn(const QByteArray &haystack, int from = 0) const noexcept
+ Q_WEAK_OVERLOAD
+ qsizetype indexIn(const QByteArray &haystack, qsizetype from = 0) const noexcept
{ return this->indexOfIn(m_pattern, N - 1, haystack.data(), haystack.size(), from); }
- int indexIn(const char *haystack, int hlen, int from = 0) const noexcept
+ qsizetype indexIn(const char *haystack, qsizetype hlen, qsizetype from = 0) const noexcept
{ return this->indexOfIn(m_pattern, N - 1, haystack, hlen, from); }
+ qsizetype indexIn(QByteArrayView haystack, qsizetype from = 0) const noexcept
+ { return this->indexOfIn(m_pattern, N - 1, haystack.data(), haystack.size(), from); }
- QByteArray pattern() const { return QByteArray(m_pattern, int(N - 1)); }
+ QByteArray pattern() const { return QByteArray(m_pattern, qsizetype(N - 1)); }
};
-template <uint N>
-Q_DECL_RELAXED_CONSTEXPR QStaticByteArrayMatcher<N> qMakeStaticByteArrayMatcher(const char (&pattern)[N]) noexcept
+template <size_t N>
+constexpr QStaticByteArrayMatcher<N> qMakeStaticByteArrayMatcher(const char (&pattern)[N]) noexcept
{ return QStaticByteArrayMatcher<N>(pattern); }
QT_END_NAMESPACE
diff --git a/src/corelib/text/qbytearrayview.h b/src/corelib/text/qbytearrayview.h
new file mode 100644
index 0000000000..45ebc812cd
--- /dev/null
+++ b/src/corelib/text/qbytearrayview.h
@@ -0,0 +1,406 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+#ifndef QBYTEARRAYVIEW_H
+#define QBYTEARRAYVIEW_H
+
+#include <QtCore/qbytearrayalgorithms.h>
+#include <QtCore/qcompare.h>
+#include <QtCore/qstringfwd.h>
+#include <QtCore/qarraydata.h>
+
+#include <string>
+#include <string_view>
+#include <QtCore/q20type_traits.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate {
+
+template <typename Byte>
+struct IsCompatibleByteTypeHelper
+ : std::integral_constant<bool,
+ std::is_same_v<Byte, char> ||
+ std::is_same_v<Byte, uchar> ||
+ std::is_same_v<Byte, signed char> ||
+ std::is_same_v<Byte, std::byte>> {};
+
+template <typename Byte>
+struct IsCompatibleByteType
+ : IsCompatibleByteTypeHelper<q20::remove_cvref_t<Byte>> {};
+
+template <typename Pointer>
+struct IsCompatibleByteArrayPointerHelper : std::false_type {};
+template <typename Byte>
+struct IsCompatibleByteArrayPointerHelper<Byte *>
+ : IsCompatibleByteType<Byte> {};
+template<typename Pointer>
+struct IsCompatibleByteArrayPointer
+ : IsCompatibleByteArrayPointerHelper<q20::remove_cvref_t<Pointer>> {};
+
+template <typename T, typename Enable = void>
+struct IsContainerCompatibleWithQByteArrayView : std::false_type {};
+
+template <typename T>
+struct IsContainerCompatibleWithQByteArrayView<T, std::enable_if_t<
+ std::conjunction_v<
+ // lacking concepts and ranges, we accept any T whose std::data yields a suitable
+ // pointer ...
+ IsCompatibleByteArrayPointer<decltype(std::data(std::declval<const T &>()))>,
+ // ... and that has a suitable size ...
+ std::is_convertible<decltype(std::size(std::declval<const T &>())), qsizetype>,
+ // ... and it's a range as it defines an iterator-like API
+ IsCompatibleByteType<typename std::iterator_traits<decltype(
+ std::begin(std::declval<const T &>()))>::value_type>,
+ std::is_convertible<decltype(std::begin(std::declval<const T &>())
+ != std::end(std::declval<const T &>())),
+ bool>,
+
+ // This needs to be treated specially due to the empty vs null distinction
+ std::negation<std::is_same<std::decay_t<T>, QByteArray>>,
+
+ // We handle array literals specially for source compat reasons
+ std::negation<std::is_array<T>>,
+
+ // Don't make an accidental copy constructor
+ std::negation<std::is_same<std::decay_t<T>, QByteArrayView>>>>> : std::true_type {};
+
+// Used by QLatin1StringView too
+template <typename Char>
+static constexpr qsizetype lengthHelperPointer(const Char *data) noexcept
+{
+ return qsizetype(std::char_traits<Char>::length(data));
+}
+
+} // namespace QtPrivate
+
+class Q_CORE_EXPORT QByteArrayView
+{
+public:
+ typedef char storage_type;
+ typedef const char value_type;
+ typedef qptrdiff difference_type;
+ typedef qsizetype size_type;
+ typedef value_type &reference;
+ typedef value_type &const_reference;
+ typedef value_type *pointer;
+ typedef value_type *const_pointer;
+
+ typedef pointer iterator;
+ typedef const_pointer const_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+private:
+ template <typename Byte>
+ using if_compatible_byte =
+ typename std::enable_if_t<QtPrivate::IsCompatibleByteType<Byte>::value, bool>;
+
+ template <typename Pointer>
+ using if_compatible_pointer =
+ typename std::enable_if_t<QtPrivate::IsCompatibleByteArrayPointer<Pointer>::value,
+ bool>;
+
+ template <typename T>
+ using if_compatible_qbytearray_like =
+ typename std::enable_if_t<std::is_same_v<T, QByteArray>, bool>;
+
+ template <typename T>
+ using if_compatible_container =
+ typename std::enable_if_t<QtPrivate::IsContainerCompatibleWithQByteArrayView<T>::value,
+ bool>;
+
+ template <typename Container>
+ static constexpr qsizetype lengthHelperContainer(const Container &c) noexcept
+ {
+ return qsizetype(std::size(c));
+ }
+
+ static constexpr qsizetype lengthHelperCharArray(const char *data, size_t size) noexcept
+ {
+ const auto it = std::char_traits<char>::find(data, size, '\0');
+ const auto end = it ? it : std::next(data, size);
+ return qsizetype(std::distance(data, end));
+ }
+
+ template <typename Byte>
+ static const storage_type *castHelper(const Byte *data) noexcept
+ { return reinterpret_cast<const storage_type*>(data); }
+ static constexpr const storage_type *castHelper(const storage_type *data) noexcept
+ { return data; }
+
+public:
+ constexpr QByteArrayView() noexcept
+ : m_size(0), m_data(nullptr) {}
+ constexpr QByteArrayView(std::nullptr_t) noexcept
+ : QByteArrayView() {}
+
+ template <typename Byte, if_compatible_byte<Byte> = true>
+ constexpr QByteArrayView(const Byte *data, qsizetype len)
+ : m_size((Q_ASSERT(len >= 0), Q_ASSERT(data || !len), len)),
+ m_data(castHelper(data)) {}
+
+ template <typename Byte, if_compatible_byte<Byte> = true>
+ constexpr QByteArrayView(const Byte *first, const Byte *last)
+ : QByteArrayView(first, last - first) {}
+
+#ifdef Q_QDOC
+ template <typename Byte>
+ constexpr QByteArrayView(const Byte *data) noexcept;
+#else
+ template <typename Pointer, if_compatible_pointer<Pointer> = true>
+ constexpr QByteArrayView(const Pointer &data) noexcept
+ : QByteArrayView(
+ data, data ? QtPrivate::lengthHelperPointer(data) : 0) {}
+#endif
+
+#ifdef Q_QDOC
+ QByteArrayView(const QByteArray &data) noexcept;
+#else
+ template <typename ByteArray, if_compatible_qbytearray_like<ByteArray> = true>
+ QByteArrayView(const ByteArray &ba) noexcept
+ : QByteArrayView(ba.isNull() ? nullptr : ba.data(), qsizetype(ba.size())) {}
+#endif
+
+ template <typename Container, if_compatible_container<Container> = true>
+ constexpr QByteArrayView(const Container &c) noexcept
+ : QByteArrayView(std::data(c), lengthHelperContainer(c)) {}
+ template <size_t Size>
+ constexpr QByteArrayView(const char (&data)[Size]) noexcept
+ : QByteArrayView(data, lengthHelperCharArray(data, Size)) {}
+
+ constexpr QByteArrayView(QLatin1StringView v) noexcept; // defined in qlatin1stringview.h
+ constexpr QByteArrayView(QUtf8StringView v) noexcept; // defined in qutf8stringview.h
+
+#ifdef Q_QDOC
+ template <typename Byte, size_t Size>
+#else
+ template <typename Byte, size_t Size, if_compatible_byte<Byte> = true>
+#endif
+ [[nodiscard]] constexpr static QByteArrayView fromArray(const Byte (&data)[Size]) noexcept
+ { return QByteArrayView(data, Size); }
+ [[nodiscard]] inline QByteArray toByteArray() const; // defined in qbytearray.h
+
+ [[nodiscard]] constexpr qsizetype size() const noexcept { return m_size; }
+ [[nodiscard]] constexpr const_pointer data() const noexcept { return m_data; }
+ [[nodiscard]] constexpr const_pointer constData() const noexcept { return data(); }
+
+ [[nodiscard]] constexpr char operator[](qsizetype n) const
+ { verify(n, 1); return m_data[n]; }
+
+ //
+ // QByteArray API
+ //
+ [[nodiscard]] constexpr char at(qsizetype n) const { return (*this)[n]; }
+
+ [[nodiscard]] constexpr QByteArrayView first(qsizetype n) const
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] constexpr QByteArrayView last(qsizetype n) const
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] constexpr QByteArrayView sliced(qsizetype pos) const
+ { verify(pos, 0); return QByteArrayView(data() + pos, size() - pos); }
+ [[nodiscard]] constexpr QByteArrayView sliced(qsizetype pos, qsizetype n) const
+ { verify(pos, n); return QByteArrayView(data() + pos, n); }
+ [[nodiscard]] constexpr QByteArrayView chopped(qsizetype len) const
+ { verify(0, len); return sliced(0, size() - len); }
+
+ [[nodiscard]] constexpr QByteArrayView left(qsizetype n) const
+ { if (n < 0 || n > size()) n = size(); return QByteArrayView(data(), n); }
+ [[nodiscard]] constexpr QByteArrayView right(qsizetype n) const
+ { if (n < 0 || n > size()) n = size(); if (n < 0) n = 0; return QByteArrayView(data() + size() - n, n); }
+ [[nodiscard]] constexpr QByteArrayView mid(qsizetype pos, qsizetype n = -1) const
+ {
+ using namespace QtPrivate;
+ auto result = QContainerImplHelper::mid(size(), &pos, &n);
+ return result == QContainerImplHelper::Null ? QByteArrayView()
+ : QByteArrayView(m_data + pos, n);
+ }
+
+ constexpr void truncate(qsizetype n)
+ { verify(0, n); m_size = n; }
+ constexpr void chop(qsizetype n)
+ { verify(0, n); m_size -= n; }
+
+ // Defined in qbytearray.cpp:
+ [[nodiscard]] QByteArrayView trimmed() const noexcept
+ { return QtPrivate::trimmed(*this); }
+ [[nodiscard]] short toShort(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<short>(*this, ok, base); }
+ [[nodiscard]] ushort toUShort(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<ushort>(*this, ok, base); }
+ [[nodiscard]] int toInt(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<int>(*this, ok, base); }
+ [[nodiscard]] uint toUInt(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<uint>(*this, ok, base); }
+ [[nodiscard]] long toLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<long>(*this, ok, base); }
+ [[nodiscard]] ulong toULong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<ulong>(*this, ok, base); }
+ [[nodiscard]] qlonglong toLongLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<qlonglong>(*this, ok, base); }
+ [[nodiscard]] qulonglong toULongLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<qulonglong>(*this, ok, base); }
+ [[nodiscard]] float toFloat(bool *ok = nullptr) const
+ {
+ const auto r = QtPrivate::toFloat(*this);
+ if (ok)
+ *ok = bool(r);
+ return r.value_or(0.0f);
+ }
+ [[nodiscard]] double toDouble(bool *ok = nullptr) const
+ {
+ const auto r = QtPrivate::toDouble(*this);
+ if (ok)
+ *ok = bool(r);
+ return r.value_or(0.0);
+ }
+
+ [[nodiscard]] bool startsWith(QByteArrayView other) const noexcept
+ { return QtPrivate::startsWith(*this, other); }
+ [[nodiscard]] constexpr bool startsWith(char c) const noexcept
+ { return !empty() && front() == c; }
+
+ [[nodiscard]] bool endsWith(QByteArrayView other) const noexcept
+ { return QtPrivate::endsWith(*this, other); }
+ [[nodiscard]] constexpr bool endsWith(char c) const noexcept
+ { return !empty() && back() == c; }
+
+ [[nodiscard]] qsizetype indexOf(QByteArrayView a, qsizetype from = 0) const noexcept
+ { return QtPrivate::findByteArray(*this, from, a); }
+ [[nodiscard]] qsizetype indexOf(char ch, qsizetype from = 0) const noexcept
+ { return QtPrivate::findByteArray(*this, from, ch); }
+
+ [[nodiscard]] bool contains(QByteArrayView a) const noexcept
+ { return indexOf(a) != qsizetype(-1); }
+ [[nodiscard]] bool contains(char c) const noexcept
+ { return indexOf(c) != qsizetype(-1); }
+
+ [[nodiscard]] qsizetype lastIndexOf(QByteArrayView a) const noexcept
+ { return lastIndexOf(a, size()); }
+ [[nodiscard]] qsizetype lastIndexOf(QByteArrayView a, qsizetype from) const noexcept
+ { return QtPrivate::lastIndexOf(*this, from, a); }
+ [[nodiscard]] qsizetype lastIndexOf(char ch, qsizetype from = -1) const noexcept
+ { return QtPrivate::lastIndexOf(*this, from, ch); }
+
+ [[nodiscard]] qsizetype count(QByteArrayView a) const noexcept
+ { return QtPrivate::count(*this, a); }
+ [[nodiscard]] qsizetype count(char ch) const noexcept
+ { return QtPrivate::count(*this, QByteArrayView(&ch, 1)); }
+
+ inline int compare(QByteArrayView a, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+
+ [[nodiscard]] inline bool isValidUtf8() const noexcept { return QtPrivate::isValidUtf8(*this); }
+
+ //
+ // STL compatibility API:
+ //
+ [[nodiscard]] constexpr const_iterator begin() const noexcept { return data(); }
+ [[nodiscard]] constexpr const_iterator end() const noexcept { return data() + size(); }
+ [[nodiscard]] constexpr const_iterator cbegin() const noexcept { return begin(); }
+ [[nodiscard]] constexpr const_iterator cend() const noexcept { return end(); }
+ [[nodiscard]] constexpr const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ [[nodiscard]] constexpr const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ [[nodiscard]] constexpr const_reverse_iterator crbegin() const noexcept { return rbegin(); }
+ [[nodiscard]] constexpr const_reverse_iterator crend() const noexcept { return rend(); }
+
+ [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; }
+ [[nodiscard]] constexpr char front() const { Q_ASSERT(!empty()); return m_data[0]; }
+ [[nodiscard]] constexpr char back() const { Q_ASSERT(!empty()); return m_data[m_size - 1]; }
+
+ [[nodiscard]] constexpr Q_IMPLICIT operator std::string_view() const noexcept
+ { return std::string_view(m_data, size_t(m_size)); }
+
+ //
+ // Qt compatibility API:
+ //
+ [[nodiscard]] constexpr bool isNull() const noexcept { return !m_data; }
+ [[nodiscard]] constexpr bool isEmpty() const noexcept { return empty(); }
+ [[nodiscard]] constexpr qsizetype length() const noexcept
+ { return size(); }
+ [[nodiscard]] constexpr char first() const { return front(); }
+ [[nodiscard]] constexpr char last() const { return back(); }
+
+private:
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= size());
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= size() - pos);
+ }
+
+ friend bool
+ comparesEqual(const QByteArrayView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ return lhs.size() == rhs.size()
+ && (!lhs.size() || memcmp(lhs.data(), rhs.data(), lhs.size()) == 0);
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QByteArrayView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ const int res = QtPrivate::compareMemory(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QByteArrayView)
+
+ friend bool comparesEqual(const QByteArrayView &lhs, const char *rhs) noexcept
+ { return comparesEqual(lhs, QByteArrayView(rhs)); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QByteArrayView &lhs, const char *rhs) noexcept
+ { return compareThreeWay(lhs, QByteArrayView(rhs)); }
+ Q_DECLARE_STRONGLY_ORDERED(QByteArrayView, const char *)
+
+ // defined in qstring.cpp
+ friend Q_CORE_EXPORT bool
+ comparesEqual(const QByteArrayView &lhs, const QChar &rhs) noexcept;
+ friend Q_CORE_EXPORT Qt::strong_ordering
+ compareThreeWay(const QByteArrayView &lhs, const QChar &rhs) noexcept;
+ friend Q_CORE_EXPORT bool
+ comparesEqual(const QByteArrayView &lhs, char16_t rhs) noexcept;
+ friend Q_CORE_EXPORT Qt::strong_ordering
+ compareThreeWay(const QByteArrayView &lhs, char16_t rhs) noexcept;
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArrayView, QChar, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArrayView, char16_t, QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+
+ qsizetype m_size;
+ const storage_type *m_data;
+};
+Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE);
+
+template<typename QByteArrayLike,
+ std::enable_if_t<std::is_same_v<QByteArrayLike, QByteArray>, bool> = true>
+[[nodiscard]] inline QByteArrayView qToByteArrayViewIgnoringNull(const QByteArrayLike &b) noexcept
+{ return QByteArrayView(b.begin(), b.size()); }
+
+inline int QByteArrayView::compare(QByteArrayView a, Qt::CaseSensitivity cs) const noexcept
+{
+ return cs == Qt::CaseSensitive ? QtPrivate::compareMemory(*this, a) :
+ qstrnicmp(data(), size(), a.data(), a.size());
+}
+
+#if QT_DEPRECATED_SINCE(6, 0)
+QT_DEPRECATED_VERSION_X_6_0("Use the QByteArrayView overload.")
+inline quint16 qChecksum(const char *s, qsizetype len,
+ Qt::ChecksumType standard = Qt::ChecksumIso3309)
+{ return qChecksum(QByteArrayView(s, len), standard); }
+#endif
+
+qsizetype QtPrivate::findByteArray(QByteArrayView haystack, qsizetype from, char needle) noexcept
+{
+ if (from < 0)
+ from = qMax(from + haystack.size(), qsizetype(0));
+ if (from < haystack.size()) {
+ const char *const b = haystack.data();
+ if (const auto n = static_cast<const char *>(
+ memchr(b + from, needle, static_cast<size_t>(haystack.size() - from)))) {
+ return n - b;
+ }
+ }
+ return -1;
+}
+
+QT_END_NAMESPACE
+
+#endif // QBYTEARRAYVIEW_H
diff --git a/src/corelib/text/qbytearrayview.qdoc b/src/corelib/text/qbytearrayview.qdoc
new file mode 100644
index 0000000000..eb890917eb
--- /dev/null
+++ b/src/corelib/text/qbytearrayview.qdoc
@@ -0,0 +1,1056 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \class QByteArrayView
+ \inmodule QtCore
+ \brief The QByteArrayView class provides a view on an array of bytes with a read-only
+ subset of the QByteArray API.
+ \since 6.0
+
+ \ingroup tools
+ \ingroup shared
+ \ingroup string-processing
+
+ \reentrant
+
+ \compares strong
+ \compareswith strong QByteArray {const char *}
+ \endcompareswith
+ \compareswith strong QString QStringView QUtf8StringView QLatin1StringView \
+ QChar char16_t
+ When comparing with string and Unicode character types, the content is
+ interpreted as UTF-8.
+ \endcompareswith
+
+ A QByteArrayView references a contiguous portion of raw bytes it does
+ not own. It acts as an interface type to all kinds of byte-array-like data,
+ without the need to construct a QByteArray first.
+
+ The byte array data may be represented as an array (or an array-compatible
+ data-structure such as QByteArray, std::basic_string, etc.) of \c char,
+ \c{signed char}, \c{unsigned char} or \c std::byte.
+
+ QByteArrayView is designed as an interface type; its main use-case is
+ as a function parameter type. When QByteArrayViews are used as automatic
+ variables or data members, care must be taken to ensure that the referenced
+ data (for example, owned by a QByteArray) outlives the QByteArrayView on all
+ code paths, lest the byte array view ends up referencing deleted data.
+
+ When used as an interface type, QByteArrayView allows a single function to accept
+ a wide variety of byte-array-like data sources. One function accepting QByteArrayView
+ thus replaces several function overloads (taking, for example, QByteArray, const char *,
+ etc.) while at the same time enabling even more byte array data sources to be passed
+ to the function.
+
+ QByteArrayView should be passed by value, not by reference-to-const:
+ \snippet code/src_corelib_text_qbytearrayview.cpp 0
+
+ If you want to give your users maximum freedom in what type of data they
+ can pass to your function, accompany the QByteArrayView overload with
+ overloads for
+
+ \list
+ \li \e char: this overload can delegate to the QByteArrayView version:
+ \snippet code/src_corelib_text_qbytearrayview.cpp 1
+ even though, for technical reasons, QByteArrayView cannot provide a
+ char constructor by itself.
+ \li \e QByteArray: if you store an unmodified copy of the byte array and
+ thus would like to take advantage of QByteArray's implicit sharing.
+ \endlist
+
+ QByteArrayView can also be used as the return value of a function. If you call a
+ function returning QByteArrayView, take extra care to not keep the QByteArrayView
+ around longer than the function promises to keep the referenced data alive.
+ If in doubt, obtain a strong reference to the data by calling toByteArray() to convert
+ the QByteArrayView into a QByteArray.
+
+ The methods supported by QByteArrayView reflect those of \l QByteArray. In
+ particular, to the limited degree that it ascribes semantics (such as
+ character case, spacing, digits of numbers) to the character data viewed, it
+ uses the C locale and ASCII encoding. See \l {C locale and ASCII functions}
+ for details and the limitations on these methods.
+
+ \section1 Compatible Byte Types
+
+ QByteArrayView can be constructed on any container of bytes, where the byte type
+ is one of:
+
+ \list
+ \li \c char (both signed and unsigned)
+ \li \c std::byte
+ \endlist
+
+ \sa QByteArray, QStringView
+*/
+
+/*!
+ \typedef QByteArrayView::storage_type
+
+ Alias for \c char.
+*/
+
+/*!
+ \typedef QByteArrayView::value_type
+
+ Alias for \c{const char}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QByteArrayView::difference_type
+
+ Alias for \c{std::ptrdiff_t}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QByteArrayView::size_type
+
+ Alias for qsizetype. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QByteArrayView::reference
+
+ Alias for \c{value_type &}. Provided for compatibility with the STL.
+
+ QByteArrayView does not support mutable references, so this is the same
+ as const_reference.
+*/
+
+/*!
+ \typedef QByteArrayView::const_reference
+
+ Alias for \c{value_type &}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QByteArrayView::pointer
+
+ Alias for \c{value_type *}. Provided for compatibility with the STL.
+
+ QByteArrayView does not support mutable pointers, so this is the same
+ as const_pointer.
+*/
+
+/*!
+ \typedef QByteArrayView::const_pointer
+
+ Alias for \c{value_type *}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QByteArrayView::iterator
+
+ This typedef provides an STL-style const iterator for QByteArrayView.
+
+ QByteArrayView does not support mutable iterators, so this is the same
+ as const_iterator.
+
+ \sa const_iterator, reverse_iterator
+*/
+
+/*!
+ \typedef QByteArrayView::const_iterator
+
+ This typedef provides an STL-style const iterator for QByteArrayView.
+
+ \sa iterator, const_reverse_iterator
+*/
+
+/*!
+ \typedef QByteArrayView::reverse_iterator
+
+ This typedef provides an STL-style const reverse iterator for QByteArrayView.
+
+ QByteArrayView does not support mutable reverse iterators, so this is the
+ same as const_reverse_iterator.
+
+ \sa const_reverse_iterator, iterator
+*/
+
+/*!
+ \typedef QByteArrayView::const_reverse_iterator
+
+ This typedef provides an STL-style const reverse iterator for QByteArrayView.
+
+ \sa reverse_iterator, const_iterator
+*/
+
+/*!
+ \fn QByteArrayView::QByteArrayView()
+
+ Constructs a null byte array view.
+
+ \sa isNull()
+*/
+
+/*!
+ \fn QByteArrayView::QByteArrayView(std::nullptr_t)
+
+ Constructs a null byte array view.
+
+ \sa isNull()
+*/
+
+/*!
+ \fn template <typename Byte, QByteArrayView::if_compatible_byte<Byte> = true> QByteArrayView::QByteArrayView(const Byte *data, qsizetype len)
+
+ Constructs a byte array view on \a data with length \a len.
+
+ The range \c{[data,len)} must remain valid for the lifetime of this QByteArrayView.
+
+ Passing \nullptr as \a data is safe if \a len is 0, too, and results in a null
+ byte array view.
+
+ The behavior is undefined if \a len is negative or, when positive, if \a data is \nullptr.
+
+ This constructor only participates in overload resolution if \c Byte is a compatible
+ byte type.
+
+ \sa {Compatible Byte Types}
+*/
+
+/*!
+ \fn template <typename Byte, QByteArrayView::if_compatible_byte<Byte> = true> QByteArrayView::QByteArrayView(const Byte *first, const Byte *last)
+
+ Constructs a byte array view on \a first with length (\a last - \a first).
+
+ The range \c{[first,last)} must remain valid for the lifetime of
+ this QByteArrayView.
+
+ Passing \c \nullptr as \a first is safe if \a last is \nullptr, too,
+ and results in a null byte array view.
+
+ The behavior is undefined if \a last precedes \a first, or \a first
+ is \nullptr and \a last is not.
+
+ This constructor only participates in overload resolution if \c Byte is
+ a compatible byte type.
+
+ \sa {Compatible Byte Types}
+*/
+
+/*!
+ \fn template <typename Byte> QByteArrayView::QByteArrayView(const Byte *data)
+
+ Constructs a byte array view on \a data. The length is determined
+ by scanning for the first \c{Byte(0)}.
+
+ \a data must remain valid for the lifetime of this byte array view object.
+
+ Passing \nullptr as \a data is safe and results in a null byte array view.
+
+ This constructor only participates in overload resolution if \a data is not
+ an array and if \c Byte is a compatible byte type.
+
+ \sa {Compatible Byte Types}
+*/
+
+/*!
+ \fn template <size_t Size> QByteArrayView::QByteArrayView(const char (&data)[Size])
+
+ Constructs a byte array view on the char array \a data.
+ The view covers the array until the first \c{'\0'} is encountered,
+ or \c Size, whichever comes first.
+ If you need the full array, use fromArray() instead.
+
+ \a data must remain valid for the lifetime of this byte array view
+ object.
+
+ \note This constructor is only available for char array literals.
+ The reasoning behind that is for compatibility with C-libraries
+ which predefine "large-enough" arrays, but only use some of the
+ preallocated space. To support this in an intuitive way in an
+ implicit constructor overload, we need to stop at the first
+ \c{char(0)}. This is logical for a char array, but not
+ for a \c{std::byte} array.
+
+ \sa fromArray
+*/
+
+/*!
+ \fn QByteArrayView::QByteArrayView(const QByteArray &byteArray)
+
+ Constructs a byte array view on \a byteArray.
+
+ \c{byteArray.data()} must remain valid for the lifetime of this byte array view object.
+
+ The byte array view will be null if and only if \c{byteArray.isNull()}.
+*/
+
+/*!
+ \fn template <typename Container, QByteArrayView::if_compatible_container<Container> = true> QByteArrayView::QByteArrayView(const Container &c)
+
+ Constructs a byte array view on the array-like container \a c. The length and data
+ are set via \c{std::size(c)} and \c{std::data(c)} respectively.
+
+ The container's data must remain valid for the lifetime of this byte array view object.
+
+ This constructor participates in overload resolution if \a c is any contiguous
+ container with elements of a compatible byte type.
+
+ \sa {Compatible Byte Types}
+*/
+
+/*!
+ \fn template <typename Byte, size_t Size> QByteArrayView QByteArrayView::fromArray(const Byte (&data)[Size])
+
+ Constructs a byte array view on the array literal \a data. The view covers the full
+ array. That includes the trailing null-terminator of \c{char} array literals.
+ If you don't want the null-terminator included in the view, you can chop() it off
+ when you are certain it is at the end. Alternatively you can use the constructor
+ overload taking a char array literal which will create a view up to, but not including,
+ the first null-terminator in the data.
+
+ This function will work with any array literal of a compatible byte type.
+
+ \sa {Compatible Byte Types}, QByteArrayView
+*/
+
+/*!
+ \fn QByteArray QByteArrayView::toByteArray() const
+
+ Returns a deep copy of this byte array view's data as a QByteArray.
+
+ The return value will be a null QByteArray if and only if this byte array
+ view is null.
+*/
+
+/*!
+ \fn const char *QByteArrayView::data() const
+
+ Returns a const \c char pointer to the first byte in the byte array view.
+
+ \note The character array represented by the return value is \e not guaranteed
+ to be null-terminated. The returned pointer is only safe to use for accessing
+ bytes at indices that are less than this byte array view's size().
+
+ \sa begin(), end()
+*/
+
+/*!
+ \fn const char *QByteArrayView::constData() const
+
+ Returns a const \c char pointer to the first byte in the byte array view.
+
+ \note The character array represented by the return value is \e not guaranteed
+ to be null-terminated. The returned pointer is only safe to use for accessing
+ bytes at indices that are less than this byte array view's size().
+
+ \sa data(), begin(), end()
+*/
+
+/*! //! friend
+ \fn int QByteArrayView::operator==(const QByteArrayView &lhs, const QByteArrayView &rhs)
+ \fn int QByteArrayView::operator!=(const QByteArrayView &lhs, const QByteArrayView &rhs)
+ \fn int QByteArrayView::operator< (const QByteArrayView &lhs, const QByteArrayView &rhs)
+ \fn int QByteArrayView::operator<=(const QByteArrayView &lhs, const QByteArrayView &rhs)
+ \fn int QByteArrayView::operator> (const QByteArrayView &lhs, const QByteArrayView &rhs)
+ \fn int QByteArrayView::operator>=(const QByteArrayView &lhs, const QByteArrayView &rhs)
+
+ Comparison operators for QByteArrayView.
+*/
+
+/*!
+ \fn int QByteArrayView::compare(QByteArrayView bv, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \since 6.2
+
+ Returns an integer less than, equal to, or greater than zero depending on
+ whether this QByteArrayView sorts before, at the same position as, or after
+ the QByteArrayView \a bv. The comparison is performed according to case
+ sensitivity \a cs.
+
+ \sa operator==()
+*/
+
+/*!
+ \fn QByteArrayView::isValidUtf8() const
+
+ Returns \c true if this byte array view contains valid UTF-8 encoded data,
+ or \c false otherwise.
+
+ \since 6.3
+*/
+
+/*!
+ \fn QByteArrayView::const_iterator QByteArrayView::begin() const
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the
+ first byte in the byte array view.
+
+ This function is provided for STL compatibility.
+
+ \sa end(), cbegin(), rbegin(), data()
+*/
+
+/*!
+ \fn QByteArrayView::const_iterator QByteArrayView::cbegin() const
+
+ Same as begin().
+
+ This function is provided for STL compatibility.
+
+ \sa cend(), begin(), crbegin(), data()
+*/
+
+/*!
+ \fn QByteArrayView::const_iterator QByteArrayView::end() const
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing
+ just after the last byte in the byte array view.
+
+ This function is provided for STL compatibility.
+
+ \sa begin(), cend(), rend()
+*/
+
+/*! \fn QByteArrayView::const_iterator QByteArrayView::cend() const
+
+ Same as end().
+
+ This function is provided for STL compatibility.
+
+ \sa cbegin(), end(), crend()
+*/
+
+/*!
+ \fn QByteArrayView::const_reverse_iterator QByteArrayView::rbegin() const
+
+ Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing
+ to the first byte in the byte array view, in reverse order.
+
+ This function is provided for STL compatibility.
+
+ \sa rend(), crbegin(), begin()
+*/
+
+/*!
+ \fn QByteArrayView::const_reverse_iterator QByteArrayView::crbegin() const
+
+ Same as rbegin().
+
+ This function is provided for STL compatibility.
+
+ \sa crend(), rbegin(), cbegin()
+*/
+
+/*!
+ \fn QByteArrayView::const_reverse_iterator QByteArrayView::rend() const
+
+ Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
+ the last byte in the byte array view, in reverse order.
+
+ This function is provided for STL compatibility.
+
+ \sa rbegin(), crend(), end()
+*/
+
+/*!
+ \fn QByteArrayView::const_reverse_iterator QByteArrayView::crend() const
+
+ Same as rend().
+
+ This function is provided for STL compatibility.
+
+ \sa crbegin(), rend(), cend()
+*/
+
+/*!
+ \fn bool QByteArrayView::empty() const
+
+ Returns \c true if this byte array view is empty - that is, \c{size() == 0}.
+
+ This function is provided for STL compatibility.
+
+ \sa isEmpty(), isNull(), size()
+*/
+
+/*!
+ \fn bool QByteArrayView::isEmpty() const
+
+ Returns \c true if this byte array view is empty - that is, \c{size() == 0}.
+
+ \sa empty(), isNull(), size()
+*/
+
+/*!
+ \fn bool QByteArrayView::isNull() const
+
+ Returns \c true if this byte array view is null - that is, \c{data() == nullptr}.
+
+ \sa empty(), isEmpty(), size()
+*/
+
+/*!
+ \fn qsizetype QByteArrayView::size() const
+
+ Returns the number of bytes in this byte array view.
+
+ \sa empty(), isEmpty(), isNull()
+*/
+
+/*!
+ \fn QByteArrayView::length() const
+
+ Same as size().
+
+ \sa empty(), isEmpty(), isNull(), size()
+*/
+
+/*!
+ \fn char QByteArrayView::operator[](qsizetype n) const
+
+ Returns the character at position \a n in this byte array view.
+
+ The behavior is undefined if \a n is negative or not less than size().
+
+ \sa at(), front(), back()
+*/
+
+/*!
+ \fn char QByteArrayView::at(qsizetype n) const
+
+ Returns the character at position \a n in this byte array view.
+
+ The behavior is undefined if \a n is negative or not less than size().
+
+ \sa operator[](), front(), back()
+*/
+
+/*!
+ \fn char QByteArrayView::front() const
+
+ Returns the first byte in the byte array view.
+
+ This function is provided for STL compatibility.
+
+ \warning Calling this function on an empty byte array view constitutes
+ undefined behavior.
+
+ \sa back()
+*/
+
+/*!
+ \fn char QByteArrayView::back() const
+
+ Returns the last byte in the byte array view.
+
+ This function is provided for STL compatibility.
+
+ \warning Calling this function on an empty byte array view constitutes
+ undefined behavior.
+
+ \sa front()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::first(qsizetype n) const
+
+ Returns a byte array view that points to the first \a n bytes
+ of this byte array view. Equivalent to \c{sliced(0, n)}.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa last(), startsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::last(qsizetype n) const
+
+ Returns a byte array view that points to the last \a n bytes
+ of this byte array view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa first(), endsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::sliced(qsizetype pos, qsizetype n) const
+
+ Returns a byte array view that points to \a n bytes of this byte array
+ view, starting at position \a pos.
+
+//! [UB-sliced-index-length]
+ \note The behavior is undefined when \a pos < 0, \a n < 0,
+ or \a pos + \a n > size().
+//! [UB-sliced-index-length]
+
+ \sa first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::sliced(qsizetype pos) const
+
+ Returns a byte array view starting at position \a pos in this object,
+ and extending to its end.
+
+//! [UB-sliced-index-only]
+ \note The behavior is undefined when \a pos < 0 or \a pos > size().
+//! [UB-sliced-index-only]
+
+ \sa first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::chopped(qsizetype length) const
+
+ Returns a copy of this byte array view that omits its last \a length bytes.
+ In other words, returns a byte array view of length size() - \a length starting
+ at the beginning of this object.
+
+ Same as \c{first(size() - length)}.
+
+ \note The behavior is undefined when \a length < 0 or \a length > size().
+
+ \sa first(), last(), sliced(), chop(), truncate()
+*/
+
+/*!
+ \fn void QByteArrayView::truncate(qsizetype length)
+
+ Truncates this byte array view to length \a length.
+
+ Same as \c{*this = first(length)}.
+
+ \note The behavior is undefined when \a length < 0 or \a length > size().
+
+ \sa first(), last(), sliced(), chopped(), chop()
+*/
+
+/*!
+ \fn void QByteArrayView::chop(qsizetype length)
+
+ Truncates this byte array view by \a length characters.
+
+ Same as \c{*this = first(size() - length)}.
+
+ \note The behavior is undefined when \a length < 0 or \a length > size().
+
+ \sa sliced(), first(), last(), chopped(), truncate()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::mid(qsizetype start, qsizetype length) const
+ \since 6.5
+
+ \deprecated Use sliced() instead in new code.
+
+ Returns the subarray of length \a length starting at position
+ \a start in this object.
+
+ Returns an empty byte array view if \a start exceeds the
+ length of the byte array view. If there are less than \a length characters
+ available in the byte array view starting at \a start, or if
+ \a length is negative (default), the function returns all characters that
+ are available from \a start.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::left(qsizetype length) const
+ \since 6.5
+
+ \deprecated Use first() instead in new code.
+
+ Returns the subarray of length \a length starting at position
+ 0 in this object.
+
+ The entire byte array view is returned if \a length is greater than or equal
+ to size(), or less than zero.
+
+ \sa first(), last(), sliced(), startsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::right(qsizetype length) const
+ \since 6.5
+
+ \deprecated Use last() instead in new code.
+
+ Returns the subarray of length \a length starting at position
+ size() - \a length in this object.
+
+ The entire byte array view is returned if \a length is greater than or equal
+ to size(), or less than zero.
+
+ \sa first(), last(), sliced(), endsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::trimmed() const noexcept
+ \since 6.3
+
+ Returns a copy of this byte array view with spacing characters
+ removed from the start and end.
+
+ The spacing characters are those for which the standard C++ \c isspace()
+ function returns \c true in the C locale; these are the ASCII characters
+ tabulation '\\t', line feed '\\n', carriage return '\\r', vertical
+ tabulation '\\v', form feed '\\f', and space ' '.
+
+ \sa QChar::SpecialCharacter, {QByteArray#Spacing Characters}{Spacing Characters}
+*/
+
+/*!
+ \fn qlonglong QByteArrayView::toLongLong(bool *ok, int base) const
+ \since 6.3
+
+ Returns this byte array view converted to a \c {long long} using base \a
+ base, which is ten by default. Bases 0 and 2 through 36 are supported, using
+ letters for digits beyond 9; A is ten, B is eleven and so on.
+
+ If \a base is 0, the base is determined automatically using the following
+ rules: if the byte array view begins with "0x", the rest of it is read as
+ hexadecimal (base 16); otherwise, if it begins with "0", the rest of it is
+ read as octal (base 8); otherwise it is read as decimal.
+
+ Returns 0 if the conversion fails.
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+*/
+
+/*!
+ \fn qulonglong QByteArrayView::toULongLong(bool *ok, int base) const
+ \since 6.3
+
+ Returns this byte array view converted to an \c {unsigned long long} using
+ base \a base, which is ten by default. Bases 0 and 2 through 36 are
+ supported, using letters for digits beyond 9; A is ten, B is eleven and so
+ on.
+
+ If \a base is 0, the base is determined automatically using the following
+ rules: if the byte array view begins with "0x", the rest of it is read as
+ hexadecimal (base 16); otherwise, if it begins with "0", the rest of it is
+ read as octal (base 8); otherwise it is read as decimal.
+
+ Returns 0 if the conversion fails.
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+*/
+
+/*!
+ \fn int QByteArrayView::toInt(bool *ok, int base) const
+ \since 6.3
+
+ Returns this byte array view converted to an \c int using base \a base,
+ which is ten by default. Bases 0 and 2 through 36 are supported, using
+ letters for digits beyond 9; A is ten, B is eleven and so on.
+
+ If \a base is 0, the base is determined automatically using the following
+ rules: if the byte array view begins with "0x", the rest of it is read as
+ hexadecimal (base 16); otherwise, if it begins with "0", the rest of it is
+ read as octal (base 8); otherwise it is read as decimal.
+
+ Returns 0 if the conversion fails.
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \snippet code/src_corelib_text_qbytearrayview.cpp 2
+
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+*/
+
+/*!
+ \fn uint QByteArrayView::toUInt(bool *ok, int base) const
+ \since 6.3
+
+ Returns this byte array view converted to an \c {unsigned int} using base \a
+ base, which is ten by default. Bases 0 and 2 through 36 are supported, using
+ letters for digits beyond 9; A is ten, B is eleven and so on.
+
+ If \a base is 0, the base is determined automatically using the following
+ rules: if the byte array view begins with "0x", the rest of it is read as
+ hexadecimal (base 16); otherwise, if it begins with "0", the rest of it is
+ read as octal (base 8); otherwise it is read as decimal.
+
+ Returns 0 if the conversion fails.
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+*/
+
+/*!
+ \fn long QByteArrayView::toLong(bool *ok, int base) const
+ \since 6.3
+
+ Returns this byte array view converted to a \c long int using base \a base,
+ which is ten by default. Bases 0 and 2 through 36 are supported, using
+ letters for digits beyond 9; A is ten, B is eleven and so on.
+
+ If \a base is 0, the base is determined automatically using the following
+ rules: if the byte array view begins with "0x", the rest of it is read as
+ hexadecimal (base 16); otherwise, if it begins with "0", the rest of it is
+ read as octal (base 8); otherwise it is read as decimal.
+
+ Returns 0 if the conversion fails.
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \snippet code/src_corelib_text_qbytearrayview.cpp 3
+
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+*/
+
+/*!
+ \fn ulong QByteArrayView::toULong(bool *ok, int base) const
+ \since 6.3
+
+ Returns this byte array view converted to an \c {unsigned long int} using
+ base \a base, which is ten by default. Bases 0 and 2 through 36 are
+ supported, using letters for digits beyond 9; A is ten, B is eleven and so
+ on.
+
+ If \a base is 0, the base is determined automatically using the following
+ rules: if the byte array view begins with "0x", the rest of it is read as
+ hexadecimal (base 16); otherwise, if it begins with "0", the rest of it is
+ read as octal (base 8); otherwise it is read as decimal.
+
+ Returns 0 if the conversion fails.
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+*/
+
+/*!
+ \fn short QByteArrayView::toShort(bool *ok, int base) const
+ \since 6.3
+
+ Returns this byte array view converted to a \c short using base \a base,
+ which is ten by default. Bases 0 and 2 through 36 are supported, using
+ letters for digits beyond 9; A is ten, B is eleven and so on.
+
+ If \a base is 0, the base is determined automatically using the following
+ rules: if the byte array view begins with "0x", the rest of it is read as
+ hexadecimal (base 16); otherwise, if it begins with "0", the rest of it is
+ read as octal (base 8); otherwise it is read as decimal.
+
+ Returns 0 if the conversion fails.
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+*/
+
+/*!
+ \fn ushort QByteArrayView::toUShort(bool *ok, int base) const
+ \since 6.3
+
+ Returns this byte array view converted to an \c {unsigned short} using base
+ \a base, which is ten by default. Bases 0 and 2 through 36 are supported,
+ using letters for digits beyond 9; A is ten, B is eleven and so on.
+
+ If \a base is 0, the base is determined automatically using the following
+ rules: if the byte array view begins with "0x", the rest of it is read as
+ hexadecimal (base 16); otherwise, if it begins with "0", the rest of it is
+ read as octal (base 8); otherwise it is read as decimal.
+
+ Returns 0 if the conversion fails.
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+*/
+
+/*!
+ \fn double QByteArrayView::toDouble(bool *ok) const
+ \since 6.3
+
+ Returns this byte array view converted to a \c double value.
+
+ Returns an infinity if the conversion overflows or 0.0 if the
+ conversion fails for other reasons (e.g. underflow).
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \warning The QByteArrayView content may only contain valid numerical
+ characters which includes the plus/minus sign, the character e used in
+ scientific notation, and the decimal point. Including the unit or additional
+ characters leads to a conversion error.
+
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+
+ This function ignores leading and trailing spacing characters.
+*/
+
+/*!
+ \fn float QByteArrayView::toFloat(bool *ok) const
+ \since 6.3
+
+ Returns this byte array view converted to a \c float value.
+
+ Returns an infinity if the conversion overflows or 0.0 if the
+ conversion fails for other reasons (e.g. underflow).
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \snippet code/src_corelib_text_qbytearrayview.cpp 4
+
+ \warning The QByteArrayView content may only contain valid numerical
+ characters which includes the plus/minus sign, the character e used in
+ scientific notation, and the decimal point. Including the unit or additional
+ characters leads to a conversion error.
+
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+
+ This function ignores leading and trailing whitespace.
+*/
+
+/*!
+ \fn bool QByteArrayView::startsWith(QByteArrayView bv) const
+ \fn bool QByteArrayView::startsWith(char ch) const
+
+ Returns \c true if this byte array view starts with byte array view \a bv
+ or character \a ch, respectively; otherwise returns \c false.
+
+ \sa endsWith()
+*/
+
+/*!
+ \fn bool QByteArrayView::endsWith(QByteArrayView bv) const
+ \fn bool QByteArrayView::endsWith(char ch) const
+
+ Returns \c true if this byte array view ends with byte array view \a bv
+ or character \a ch, respectively; otherwise returns \c false.
+
+ \sa startsWith()
+*/
+
+/*!
+ \fn qsizetype QByteArrayView::indexOf(QByteArrayView bv, qsizetype from = 0) const
+ \fn qsizetype QByteArrayView::indexOf(char ch, qsizetype from = 0) const
+
+ Returns the index position of either the start of the first occurrence of
+ the sequence of bytes viewed by \a bv or the first occurrence of byte \a ch,
+ respectively, in this byte array view, searching forward from index position
+ \a from.Returns -1 if no match is found.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ \sa lastIndexOf(), contains()
+*/
+
+/*!
+ \fn bool QByteArrayView::contains(QByteArrayView bv) const
+ \fn bool QByteArrayView::contains(char ch) const
+
+ Returns \c true if this byte array view contains an occurrence of the sequence
+ of bytes viewed by \a bv or character \a ch, respectively; otherwise returns
+ \c false.
+
+ \sa indexOf(), lastIndexOf()
+*/
+
+/*!
+ \fn qsizetype QByteArrayView::lastIndexOf(QByteArrayView bv, qsizetype from) const
+ \fn qsizetype QByteArrayView::lastIndexOf(char ch, qsizetype from = -1) const
+
+ Returns the index position of either the start of the last occurrence of
+ the sequence of bytes viewed by \a bv or the last occurrence of byte \a ch,
+ respectively, in this byte array view, searching backward from index position
+ \a from.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if no match is found.
+
+ \note When searching for a 0-length \a bv, the match at the end of
+ the data is excluded from the search by a negative \a from, even
+ though \c{-1} is normally thought of as searching from the end of
+ the view: the match at the end is \e after the last character, so
+ it is excluded. To include such a final empty match, either give a
+ positive value for \a from or omit the \a from parameter entirely.
+
+ \sa indexOf(), contains()
+*/
+
+/*!
+ \fn qsizetype QByteArrayView::lastIndexOf(QByteArrayView bv) const
+ \since 6.2
+ \overload
+
+ Returns the index position of the start of the last
+ occurrence of the sequence of bytes viewed by \a bv in this byte
+ array view, searching backward from the end of this byte array
+ view. Returns -1 if no match is found.
+
+ \sa indexOf(), contains()
+*/
+
+/*!
+ \fn qsizetype QByteArrayView::count(QByteArrayView bv) const
+
+ Returns the number of (potentially overlapping) occurrences of the
+ sequence of bytes viewed by \a bv in this byte array view.
+
+ \sa contains(), indexOf()
+*/
+
+/*!
+ \fn bool QByteArrayView::count(char ch) const
+ \overload
+
+ Returns the number of occurrences of byte \a ch in this byte array view.
+
+ \sa contains(), indexOf()
+*/
+
+/*!
+ \fn QByteArrayView qToByteArrayViewIgnoringNull(const QByteArray &b);
+ \internal
+
+ Convert \a b to a QByteArrayView ignoring \c{b.isNull()}.
+
+ Returns a byte array view that references \a{b}'s data, but is never null.
+
+ This is a faster way to convert a QByteArray to a QByteArrayView,
+ if null QByteArray can legitimately be treated as empty ones.
+
+ \sa QByteArray::isNull(), QByteArrayView
+*/
+
+/*!
+ \fn QByteArrayView::operator std::string_view() const
+ \since 6.7
+
+ Converts this QByteArrayView object to a \c{std::string_view} object.
+ The returned view will have the same data pointer and length of
+ this view.
+*/
diff --git a/src/corelib/text/qbytedata_p.h b/src/corelib/text/qbytedata_p.h
index 108aec72ac..fcbf82d6ce 100644
--- a/src/corelib/text/qbytedata_p.h
+++ b/src/corelib/text/qbytedata_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBYTEDATA_P_H
#define QBYTEDATA_P_H
@@ -53,6 +17,9 @@
#include <QtCore/private/qglobal_p.h>
#include <qbytearray.h>
+#include <QtCore/qlist.h>
+
+#include <climits>
QT_BEGIN_NAMESPACE
@@ -90,31 +57,55 @@ public:
popFront(buffers[bufferCount() - other.bufferCount()], other.firstPos);
}
+ inline void append(QByteDataBuffer &&other)
+ {
+ if (other.isEmpty())
+ return;
+
+ auto otherBufferCount = other.bufferCount();
+ auto otherByteAmount = other.byteAmount();
+ buffers.append(std::move(other.buffers));
+ bufferCompleteSize += otherByteAmount;
+
+ if (other.firstPos > 0)
+ popFront(buffers[bufferCount() - otherBufferCount], other.firstPos);
+ }
inline void append(const QByteArray& bd)
{
+ append(QByteArray(bd));
+ }
+
+ inline void append(QByteArray &&bd)
+ {
if (bd.isEmpty())
return;
- buffers.append(bd);
bufferCompleteSize += bd.size();
+ buffers.append(std::move(bd));
}
inline void prepend(const QByteArray& bd)
{
+ prepend(QByteArray(bd));
+ }
+
+ inline void prepend(QByteArray &&bd)
+ {
if (bd.isEmpty())
return;
squeezeFirst();
- buffers.prepend(bd);
bufferCompleteSize += bd.size();
+ buffers.prepend(std::move(bd));
}
// return the first QByteData. User of this function has to free() its .data!
// preferably use this function to read data.
inline QByteArray read()
{
+ Q_ASSERT(!isEmpty());
squeezeFirst();
bufferCompleteSize -= buffers.first().size();
return buffers.takeFirst();
@@ -132,8 +123,15 @@ public:
inline QByteArray read(qint64 amount)
{
amount = qMin(byteAmount(), amount);
+ if constexpr (sizeof(qsizetype) == sizeof(int)) { // 32-bit
+ // While we cannot overall have more than INT_MAX memory allocated,
+ // the QByteArrays we hold may be shared copies of each other,
+ // causing byteAmount() to exceed INT_MAX.
+ if (amount > INT_MAX)
+ qBadAlloc(); // what resize() would do if it saw past the truncation
+ }
QByteArray byteData;
- byteData.resize(amount);
+ byteData.resize(qsizetype(amount));
read(byteData.data(), byteData.size());
return byteData;
}
@@ -169,8 +167,59 @@ public:
return originalAmount;
}
+ /*!
+ \internal
+ Returns a view into the first QByteArray contained inside,
+ ignoring any already read data. Call advanceReadPointer()
+ to advance the view forward. When a QByteArray is exhausted
+ the view returned by this function will view into another
+ QByteArray if any. Returns a default constructed view if
+ no data is available.
+
+ \sa advanceReadPointer
+ */
+ QByteArrayView readPointer() const
+ {
+ if (isEmpty())
+ return {};
+ return { buffers.first().constData() + qsizetype(firstPos),
+ buffers.first().size() - qsizetype(firstPos) };
+ }
+
+ /*!
+ \internal
+ Advances the read pointer by \a distance.
+
+ \sa readPointer
+ */
+ void advanceReadPointer(qint64 distance)
+ {
+ qint64 newPos = firstPos + distance;
+ if (isEmpty()) {
+ newPos = 0;
+ } else if (auto size = buffers.first().size(); newPos >= size) {
+ while (newPos >= size) {
+ bufferCompleteSize -= (size - firstPos);
+ newPos -= size;
+ buffers.pop_front();
+ if (isEmpty()) {
+ size = 0;
+ newPos = 0;
+ break;
+ }
+ size = buffers.front().size();
+ }
+ bufferCompleteSize -= newPos;
+ } else {
+ bufferCompleteSize -= newPos - firstPos;
+ }
+ firstPos = newPos;
+ }
+
inline char getChar()
{
+ Q_ASSERT_X(!isEmpty(), "QByteDataBuffer::getChar",
+ "Cannot read a char from an empty buffer!");
char c;
read(&c, 1);
return c;
@@ -190,9 +239,9 @@ public:
}
// the number of QByteArrays
- inline int bufferCount() const
+ qsizetype bufferCount() const
{
- return buffers.length();
+ return buffers.size();
}
inline bool isEmpty() const
@@ -202,13 +251,13 @@ public:
inline qint64 sizeNextBlock() const
{
- if(buffers.isEmpty())
+ if (buffers.isEmpty())
return 0;
else
return buffers.first().size() - firstPos;
}
- inline QByteArray& operator[](int i)
+ QByteArray &operator[](qsizetype i)
{
if (i == 0)
squeezeFirst();
@@ -217,13 +266,13 @@ public:
}
inline bool canReadLine() const {
- int i = 0;
- if (i < buffers.length()) {
+ qsizetype i = 0;
+ if (i < buffers.size()) {
if (buffers.at(i).indexOf('\n', firstPos) != -1)
return true;
++i;
- for (; i < buffers.length(); i++)
+ for (; i < buffers.size(); i++)
if (buffers.at(i).contains('\n'))
return true;
}
diff --git a/src/corelib/text/qchar.cpp b/src/corelib/text/qchar.cpp
index 628d4ab370..63296a92de 100644
--- a/src/corelib/text/qchar.cpp
+++ b/src/corelib/text/qchar.cpp
@@ -1,50 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-// Don't define it while compiling this module, or USERS of Qt will
-// not be able to link.
-#ifdef QT_NO_CAST_FROM_ASCII
-# undef QT_NO_CAST_FROM_ASCII
-#endif
-#ifdef QT_NO_CAST_TO_ASCII
-# undef QT_NO_CAST_TO_ASCII
-#endif
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
#include "qchar.h"
#include "qdatastream.h"
@@ -68,7 +24,7 @@ QT_BEGIN_NAMESPACE
This class is only useful to construct a QChar with 8-bit character.
- \sa QChar, QLatin1String, QString
+ \sa QChar, QLatin1StringView, QString
*/
/*!
@@ -99,6 +55,13 @@ QT_BEGIN_NAMESPACE
\ingroup string-processing
\reentrant
+ \compares strong
+ \compareswith strong char16_t QString QStringView QLatin1StringView QUtf8StringView
+ \endcompareswith
+ \compareswith strong {const char *} QByteArray QByteArrayView
+ The contents of the byte array is interpreted as utf-8.
+ \endcompareswith
+
In Qt, Unicode characters are 16-bit entities without any markup
or structure. This class represents such an entity. It is
lightweight, so it can be used everywhere. Most compilers treat
@@ -158,8 +121,14 @@ QT_BEGIN_NAMESPACE
to construct a QChar from an 8-bit \c char, and you will need to
call toLatin1() to get the 8-bit value back.
+ Starting with Qt 6.0, most QChar constructors are \c explicit. This
+ is done to avoid dangerous mistakes when accidentally mixing
+ integral types and strings. You can opt-out (and make these
+ constructors implicit) by defining the macro \c
+ QT_IMPLICIT_QCHAR_CONSTRUCTION.
+
For more information see
- \l{http://www.unicode.org/ucd/}{"About the Unicode Character Database"}.
+ \l{https://www.unicode.org/ucd/}{"About the Unicode Character Database"}.
\sa Unicode, QString, QLatin1Char
*/
@@ -167,8 +136,8 @@ QT_BEGIN_NAMESPACE
/*!
\enum QChar::UnicodeVersion
- Specifies which version of the \l{http://www.unicode.org/}{Unicode standard}
- introduced a certain character.
+ Specifies which version of the \l{Unicode standard} introduced a certain
+ character.
\value Unicode_1_1 Version 1.1
\value Unicode_2_0 Version 2.0
@@ -184,15 +153,18 @@ QT_BEGIN_NAMESPACE
\value Unicode_6_0 Version 6.0
\value Unicode_6_1 Version 6.1
\value Unicode_6_2 Version 6.2
- \value Unicode_6_3 Version 6.3 Since Qt 5.3
- \value Unicode_7_0 Version 7.0 Since Qt 5.5
- \value Unicode_8_0 Version 8.0 Since Qt 5.6
- \value Unicode_9_0 Version 9.0 Since Qt 5.11
- \value Unicode_10_0 Version 10.0 Since Qt 5.11
- \value Unicode_11_0 Version 11.0 Since Qt 5.15
- \value Unicode_12_0 Version 12.0 Since Qt 5.15
- \value Unicode_12_1 Version 12.1 Since Qt 5.15
- \value Unicode_13_0 Version 13.0 Since Qt 5.15
+ \value [since 5.3] Unicode_6_3 Version 6.3
+ \value [since 5.5] Unicode_7_0 Version 7.0
+ \value [since 5.6] Unicode_8_0 Version 8.0
+ \value [since 5.11] Unicode_9_0 Version 9.0
+ \value [since 5.11] Unicode_10_0 Version 10.0
+ \value [since 5.15] Unicode_11_0 Version 11.0
+ \value [since 5.15] Unicode_12_0 Version 12.0
+ \value [since 5.15] Unicode_12_1 Version 12.1
+ \value [since 5.15] Unicode_13_0 Version 13.0
+ \value [since 6.3] Unicode_14_0 Version 14.0
+ \value [since 6.5] Unicode_15_0 Version 15.0
+ \value [since 6.8] Unicode_15_1 Version 15.1
\value Unicode_Unassigned The value is not assigned to any character
in version 8.0 of Unicode.
@@ -279,7 +251,7 @@ QT_BEGIN_NAMESPACE
This enum type defines the Unicode script property values.
For details about the Unicode script property values see
- \l{http://www.unicode.org/reports/tr24/}{Unicode Standard Annex #24}.
+ \l{https://www.unicode.org/reports/tr24/}{Unicode Standard Annex #24}.
In order to conform to C/C++ naming conventions "Script_" is prepended
to the codes used in the Unicode Standard.
@@ -292,18 +264,18 @@ QT_BEGIN_NAMESPACE
\value Script_Common For characters that may be used with multiple scripts
and that do not inherit their script from the preceding characters.
- \value Script_Adlam Since Qt 5.11
- \value Script_Ahom Since Qt 5.6
- \value Script_AnatolianHieroglyphs Since Qt 5.6
+ \value [since 5.11] Script_Adlam
+ \value [since 5.6] Script_Ahom
+ \value [since 5.6] Script_AnatolianHieroglyphs
\value Script_Arabic
\value Script_Armenian
\value Script_Avestan
\value Script_Balinese
\value Script_Bamum
- \value Script_BassaVah Since Qt 5.5
+ \value [since 5.5] Script_BassaVah
\value Script_Batak
\value Script_Bengali
- \value Script_Bhaiksuki Since Qt 5.11
+ \value [since 5.11] Script_Bhaiksuki
\value Script_Bopomofo
\value Script_Brahmi
\value Script_Braille
@@ -311,37 +283,38 @@ QT_BEGIN_NAMESPACE
\value Script_Buhid
\value Script_CanadianAboriginal
\value Script_Carian
- \value Script_CaucasianAlbanian Since Qt 5.5
+ \value [since 5.5] Script_CaucasianAlbanian
\value Script_Chakma
\value Script_Cham
\value Script_Cherokee
- \value Script_Chorasmian Since Qt 5.15
+ \value [since 5.15] Script_Chorasmian
\value Script_Coptic
\value Script_Cuneiform
\value Script_Cypriot
+ \value [since 6.3] Script_CyproMinoan
\value Script_Cyrillic
\value Script_Deseret
\value Script_Devanagari
- \value Script_DivesAkuru Since Qt 5.15
- \value Script_Dogra Since Qt 5.15
- \value Script_Duployan Since Qt 5.5
+ \value [since 5.15] Script_DivesAkuru
+ \value [since 5.15] Script_Dogra
+ \value [since 5.5] Script_Duployan
\value Script_EgyptianHieroglyphs
- \value Script_Elbasan Since Qt 5.5
- \value Script_Elymaic Since Qt 5.15
+ \value [since 5.5] Script_Elbasan
+ \value [since 5.15] Script_Elymaic
\value Script_Ethiopic
\value Script_Georgian
\value Script_Glagolitic
\value Script_Gothic
- \value Script_Grantha Since Qt 5.5
+ \value [since 5.5] Script_Grantha
\value Script_Greek
\value Script_Gujarati
- \value Script_GunjalaGondi Since Qt 5.15
+ \value [since 5.15] Script_GunjalaGondi
\value Script_Gurmukhi
\value Script_Han
\value Script_Hangul
- \value Script_HanifiRohingya Since Qt 5.15
+ \value [since 5.15] Script_HanifiRohingya
\value Script_Hanunoo
- \value Script_Hatran Since Qt 5.6
+ \value [since 5.6] Script_Hatran
\value Script_Hebrew
\value Script_Hiragana
\value Script_ImperialAramaic
@@ -351,77 +324,80 @@ QT_BEGIN_NAMESPACE
\value Script_Kaithi
\value Script_Kannada
\value Script_Katakana
+ \value [since 6.5] Script_Kawi
\value Script_KayahLi
\value Script_Kharoshthi
- \value Script_KhitanSmallScript Since Qt 5.15
+ \value [since 5.15] Script_KhitanSmallScript
\value Script_Khmer
- \value Script_Khojki Since Qt 5.5
- \value Script_Khudawadi Since Qt 5.5
+ \value [since 5.5] Script_Khojki
+ \value [since 5.5] Script_Khudawadi
\value Script_Lao
\value Script_Latin
\value Script_Lepcha
\value Script_Limbu
- \value Script_LinearA Since Qt 5.5
+ \value [since 5.5] Script_LinearA
\value Script_LinearB
\value Script_Lisu
\value Script_Lycian
\value Script_Lydian
- \value Script_Mahajani Since Qt 5.5
- \value Script_Makasar Since Qt 5.15
+ \value [since 5.5] Script_Mahajani
+ \value [since 5.15] Script_Makasar
\value Script_Malayalam
\value Script_Mandaic
- \value Script_Manichaean Since Qt 5.5
- \value Script_Marchen Since Qt 5.11
- \value Script_MasaramGondi Since Qt 5.11
- \value Script_Medefaidrin Since Qt 5.15
+ \value [since 5.5] Script_Manichaean
+ \value [since 5.11] Script_Marchen
+ \value [since 5.11] Script_MasaramGondi
+ \value [since 5.15] Script_Medefaidrin
\value Script_MeeteiMayek
- \value Script_MendeKikakui Since Qt 5.5
+ \value [since 5.5] Script_MendeKikakui
\value Script_MeroiticCursive
\value Script_MeroiticHieroglyphs
\value Script_Miao
- \value Script_Modi Since Qt 5.5
+ \value [since 5.5] Script_Modi
\value Script_Mongolian
- \value Script_Mro Since Qt 5.5
- \value Script_Multani Since Qt 5.6
+ \value [since 5.5] Script_Mro
+ \value [since 5.6] Script_Multani
\value Script_Myanmar
- \value Script_Nabataean Since Qt 5.5
- \value Script_Nandinagari Since Qt 5.15
- \value Script_Newa Since Qt 5.11
+ \value [since 5.5] Script_Nabataean
+ \value [since 6.3] Script_NagMundari
+ \value [since 5.15] Script_Nandinagari
+ \value [since 5.11] Script_Newa
\value Script_NewTaiLue
\value Script_Nko
- \value Script_Nushu Since Qt 5.11
- \value Script_NyiakengPuachueHmong Since Qt 5.15
+ \value [since 5.11] Script_Nushu
+ \value [since 5.15] Script_NyiakengPuachueHmong
\value Script_Ogham
\value Script_OlChiki
- \value Script_OldHungarian Since Qt 5.6
+ \value [since 5.6] Script_OldHungarian
\value Script_OldItalic
- \value Script_OldNorthArabian Since Qt 5.5
- \value Script_OldPermic Since Qt 5.5
+ \value [since 5.5] Script_OldNorthArabian
+ \value [since 5.5] Script_OldPermic
\value Script_OldPersian
- \value Script_OldSogdian Since Qt 5.15
+ \value [since 5.15] Script_OldSogdian
\value Script_OldSouthArabian
\value Script_OldTurkic
+ \value [since 6.3] Script_OldUyghur
\value Script_Oriya
- \value Script_Osage Since Qt 5.11
+ \value [since 5.11] Script_Osage
\value Script_Osmanya
- \value Script_PahawhHmong Since Qt 5.5
- \value Script_Palmyrene Since Qt 5.5
- \value Script_PauCinHau Since Qt 5.5
+ \value [since 5.5] Script_PahawhHmong
+ \value [since 5.5] Script_Palmyrene
+ \value [since 5.5] Script_PauCinHau
\value Script_PhagsPa
\value Script_Phoenician
- \value Script_PsalterPahlavi Since Qt 5.5
+ \value [since 5.5] Script_PsalterPahlavi
\value Script_Rejang
\value Script_Runic
\value Script_Samaritan
\value Script_Saurashtra
\value Script_Sharada
\value Script_Shavian
- \value Script_Siddham Since Qt 5.5
- \value Script_SignWriting Since Qt 5.6
+ \value [since 5.5] Script_Siddham
+ \value [since 5.6] Script_SignWriting
\value Script_Sinhala
- \value Script_Sogdian Since Qt 5.15
+ \value [since 5.15] Script_Sogdian
\value Script_SoraSompeng
- \value Script_Soyombo Since Qt 5.11
+ \value [since 5.11] Script_Soyombo
\value Script_Sundanese
\value Script_SylotiNagri
\value Script_Syriac
@@ -432,20 +408,23 @@ QT_BEGIN_NAMESPACE
\value Script_TaiViet
\value Script_Takri
\value Script_Tamil
- \value Script_Tangut Since Qt 5.11
+ \value [since 5.11] Script_Tangut
+ \value [since 6.3] Script_Tangsa
\value Script_Telugu
\value Script_Thaana
\value Script_Thai
\value Script_Tibetan
\value Script_Tifinagh
- \value Script_Tirhuta Since Qt 5.5
+ \value [since 5.5] Script_Tirhuta
+ \value [since 6.3] Script_Toto
\value Script_Ugaritic
\value Script_Vai
- \value Script_Wancho Since Qt 5.15
- \value Script_WarangCiti Since Qt 5.5
- \value Script_Yezidi Since Qt 5.15
+ \value [since 6.3] Script_Vithkuqi
+ \value [since 5.15] Script_Wancho
+ \value [since 5.5] Script_WarangCiti
+ \value [since 5.15] Script_Yezidi
\value Script_Yi
- \value Script_ZanabazarSquare Since Qt 5.11
+ \value [since 5.11] Script_ZanabazarSquare
\omitvalue ScriptCount
@@ -456,8 +435,8 @@ QT_BEGIN_NAMESPACE
\enum QChar::Direction
This enum type defines the Unicode direction attributes. See the
- \l{http://www.unicode.org/reports/tr9/tr9-35.html#Table_Bidirectional_Character_Types}{Unicode Standard} for a description
- of the values.
+ \l{https://www.unicode.org/reports/tr9/tr9-35.html#Table_Bidirectional_Character_Types}{Unicode
+ Standard} for a description of the values.
In order to conform to C/C++ naming conventions "Dir" is prepended
to the codes used in the Unicode Standard.
@@ -470,18 +449,18 @@ QT_BEGIN_NAMESPACE
\value DirEN
\value DirES
\value DirET
- \value DirFSI Since Qt 5.3
+ \value [since 5.3] DirFSI
\value DirL
\value DirLRE
- \value DirLRI Since Qt 5.3
+ \value [since 5.3] DirLRI
\value DirLRO
\value DirNSM
\value DirON
\value DirPDF
- \value DirPDI Since Qt 5.3
+ \value [since 5.3] DirPDI
\value DirR
\value DirRLE
- \value DirRLI Since Qt 5.3
+ \value [since 5.3] DirRLI
\value DirRLO
\value DirS
\value DirWS
@@ -493,8 +472,7 @@ QT_BEGIN_NAMESPACE
\enum QChar::Decomposition
This enum type defines the Unicode decomposition attributes. See
- the \l{http://www.unicode.org/}{Unicode Standard} for a
- description of the values.
+ the \l{Unicode standard} for a description of the values.
\value NoDecomposition
\value Canonical
@@ -523,7 +501,7 @@ QT_BEGIN_NAMESPACE
since 5.3
This enum type defines the Unicode joining type attributes. See the
- \l{http://www.unicode.org/}{Unicode Standard} for a description of the values.
+ \l{Unicode standard} for a description of the values.
In order to conform to C/C++ naming conventions "Joining_" is prepended
to the codes used in the Unicode Standard.
@@ -538,32 +516,13 @@ QT_BEGIN_NAMESPACE
\sa joiningType()
*/
-#if QT_DEPRECATED_SINCE(5, 3)
-/*!
- \enum QChar::Joining
- \deprecated in 5.3, use JoiningType instead.
-
- This enum type defines the Unicode joining attributes. See the
- \l{http://www.unicode.org/}{Unicode Standard} for a description
- of the values.
-
- \value Center
- \value Dual
- \value OtherJoining
- \value Right
-
- \sa joining()
-*/
-#endif
-
/*!
\enum QChar::CombiningClass
\internal
This enum type defines names for some of the Unicode combining
- classes. See the \l{http://www.unicode.org/}{Unicode Standard}
- for a description of the values.
+ classes. See the \l{Unicode Standard} for a description of the values.
\value Combining_Above
\value Combining_AboveAttached
@@ -607,6 +566,7 @@ QT_BEGIN_NAMESPACE
\value ByteOrderSwapped
\value ParagraphSeparator
\value LineSeparator
+ \value [since 6.2] VisualTabCharacter Used to represent a tabulation as a horizontal arrow.
\value LastValidCodePoint
*/
@@ -1270,38 +1230,6 @@ QChar::JoiningType QChar::joiningType(char32_t ucs4) noexcept
return QChar::JoiningType(qGetProp(ucs4)->joining);
}
-#if QT_DEPRECATED_SINCE(5, 3)
-/*!
- \fn QChar::Joining QChar::joining() const
- \deprecated in 5.3, use joiningType() instead.
-
- Returns information about the joining properties of the character
- (needed for certain languages such as Arabic).
-*/
-
-/*!
- \overload
- \deprecated in 5.3, use joiningType() instead.
-
- Returns information about the joining properties of the UCS-4-encoded
- character specified by \a ucs4 (needed for certain languages such as Arabic).
-
- \note Before Qt 6, this function took a \c uint argument.
-*/
-QChar::Joining QChar::joining(char32_t ucs4) noexcept
-{
- if (ucs4 > LastValidCodePoint)
- return QChar::OtherJoining;
- switch (qGetProp(ucs4)->joining) {
- case QChar::Joining_Causing: return QChar::Center;
- case QChar::Joining_Dual: return QChar::Dual;
- case QChar::Joining_Right: return QChar::Right;
- default: break;
- }
- return QChar::OtherJoining;
-}
-#endif
-
/*!
\fn bool QChar::hasMirrored() const
@@ -1423,31 +1351,28 @@ char32_t QChar::mirroredChar(char32_t ucs4) noexcept
return ucs4 + qGetProp(ucs4)->mirrorDiff;
}
-
-// constants for Hangul (de)composition, see UAX #15
-enum {
- Hangul_SBase = 0xac00,
- Hangul_LBase = 0x1100,
- Hangul_VBase = 0x1161,
- Hangul_TBase = 0x11a7,
- Hangul_LCount = 19,
- Hangul_VCount = 21,
- Hangul_TCount = 28,
- Hangul_NCount = Hangul_VCount * Hangul_TCount,
- Hangul_SCount = Hangul_LCount * Hangul_NCount
-};
+// Constants for Hangul (de)composition, see UAX #15:
+static constexpr char32_t Hangul_SBase = 0xac00;
+static constexpr char32_t Hangul_LBase = 0x1100;
+static constexpr char32_t Hangul_VBase = 0x1161;
+static constexpr char32_t Hangul_TBase = 0x11a7;
+static constexpr quint32 Hangul_LCount = 19;
+static constexpr quint32 Hangul_VCount = 21;
+static constexpr quint32 Hangul_TCount = 28;
+static constexpr quint32 Hangul_NCount = Hangul_VCount * Hangul_TCount;
+static constexpr quint32 Hangul_SCount = Hangul_LCount * Hangul_NCount;
// buffer has to have a length of 3. It's needed for Hangul decomposition
-static const unsigned short * QT_FASTCALL decompositionHelper
- (uint ucs4, int *length, int *tag, unsigned short *buffer)
+static const QChar * QT_FASTCALL decompositionHelper(
+ char32_t ucs4, qsizetype *length, QChar::Decomposition *tag, QChar *buffer)
{
if (ucs4 >= Hangul_SBase && ucs4 < Hangul_SBase + Hangul_SCount) {
// compute Hangul syllable decomposition as per UAX #15
- const uint SIndex = ucs4 - Hangul_SBase;
- buffer[0] = Hangul_LBase + SIndex / Hangul_NCount; // L
- buffer[1] = Hangul_VBase + (SIndex % Hangul_NCount) / Hangul_TCount; // V
- buffer[2] = Hangul_TBase + SIndex % Hangul_TCount; // T
- *length = buffer[2] == Hangul_TBase ? 2 : 3;
+ const char32_t SIndex = ucs4 - Hangul_SBase;
+ buffer[0] = QChar(Hangul_LBase + SIndex / Hangul_NCount); // L
+ buffer[1] = QChar(Hangul_VBase + (SIndex % Hangul_NCount) / Hangul_TCount); // V
+ buffer[2] = QChar(Hangul_TBase + SIndex % Hangul_TCount); // T
+ *length = buffer[2].unicode() == Hangul_TBase ? 2 : 3;
*tag = QChar::Canonical;
return buffer;
}
@@ -1460,9 +1385,9 @@ static const unsigned short * QT_FASTCALL decompositionHelper
}
const unsigned short *decomposition = uc_decomposition_map+index;
- *tag = (*decomposition) & 0xff;
+ *tag = QChar::Decomposition((*decomposition) & 0xff);
*length = (*decomposition) >> 8;
- return decomposition+1;
+ return reinterpret_cast<const QChar *>(decomposition + 1);
}
/*!
@@ -1483,11 +1408,11 @@ QString QChar::decomposition() const
*/
QString QChar::decomposition(char32_t ucs4)
{
- unsigned short buffer[3];
- int length;
- int tag;
- const unsigned short *d = decompositionHelper(ucs4, &length, &tag, buffer);
- return QString(reinterpret_cast<const QChar *>(d), length);
+ QChar buffer[3];
+ qsizetype length;
+ QChar::Decomposition tag;
+ const QChar *d = decompositionHelper(ucs4, &length, &tag, buffer);
+ return QString(d, length);
}
/*!
@@ -1603,6 +1528,7 @@ static auto fullConvertCase(char32_t uc, QUnicodeTables::Case which) noexcept
auto data() const { return chars; }
auto size() const { return sz; }
} result;
+ Q_ASSERT(uc <= QChar::LastValidCodePoint);
auto pp = result.chars;
@@ -1615,7 +1541,7 @@ static auto fullConvertCase(char32_t uc, QUnicodeTables::Case which) noexcept
while (length--)
*pp++ = *specialCase++;
} else {
- // so far, case convertion never changes planes (guaranteed by the qunicodetables generator)
+ // so far, case conversion never changes planes (guaranteed by the qunicodetables generator)
for (char16_t c : QChar::fromUcs4(uc + caseDiff))
*pp++ = c;
}
@@ -1774,38 +1700,6 @@ char32_t QChar::toCaseFolded(char32_t ucs4) noexcept
\sa toLatin1(), unicode()
*/
-/*!
- \fn char QChar::toAscii() const
- \deprecated
-
- Returns the Latin-1 character value of the QChar, or 0 if the character is not
- representable.
-
- The main purpose of this function is to preserve ASCII characters used
- in C strings. This is mainly useful for developers of non-internationalized
- software.
-
- \note It is not possible to distinguish a non-Latin 1 character from an ASCII 0
- (NUL) character. Prefer to use unicode(), which does not have this ambiguity.
-
- \note This function does not check whether the character value is inside
- the valid range of US-ASCII.
-
- \sa toLatin1(), unicode()
-*/
-
-/*!
- \fn QChar QChar::fromAscii(char)
- \deprecated
-
- Converts the ASCII character \a c to it's equivalent QChar. This
- is mainly useful for non-internationalized software.
-
- An alternative is to use QLatin1Char.
-
- \sa fromLatin1(), unicode()
-*/
-
#ifndef QT_NO_DATASTREAM
/*!
\relates QChar
@@ -1853,75 +1747,80 @@ QDataStream &operator>>(QDataStream &in, QChar &chr)
*****************************************************************************/
/*!
- \fn bool operator==(QChar c1, QChar c2)
-
- \relates QChar
+ \fn bool QChar::operator==(const QChar &c1, const QChar &c2)
Returns \c true if \a c1 and \a c2 are the same Unicode character;
otherwise returns \c false.
*/
/*!
- \fn int operator!=(QChar c1, QChar c2)
-
- \relates QChar
+ \fn bool QChar::operator!=(const QChar &c1, const QChar &c2)
Returns \c true if \a c1 and \a c2 are not the same Unicode
character; otherwise returns \c false.
*/
/*!
- \fn int operator<=(QChar c1, QChar c2)
-
- \relates QChar
+ \fn bool QChar::operator<=(const QChar &c1, const QChar &c2)
Returns \c true if the numeric Unicode value of \a c1 is less than
or equal to that of \a c2; otherwise returns \c false.
*/
/*!
- \fn int operator>=(QChar c1, QChar c2)
-
- \relates QChar
+ \fn bool QChar::operator>=(const QChar &c1, const QChar &c2)
Returns \c true if the numeric Unicode value of \a c1 is greater than
or equal to that of \a c2; otherwise returns \c false.
*/
/*!
- \fn int operator<(QChar c1, QChar c2)
-
- \relates QChar
+ \fn bool QChar::operator<(const QChar &c1, const QChar &c2)
Returns \c true if the numeric Unicode value of \a c1 is less than
that of \a c2; otherwise returns \c false.
*/
/*!
- \fn int operator>(QChar c1, QChar c2)
-
- \relates QChar
+ \fn bool QChar::operator>(const QChar &c1, const QChar &c2)
Returns \c true if the numeric Unicode value of \a c1 is greater than
that of \a c2; otherwise returns \c false.
*/
+/*!
+ \fn Qt::Literals::StringLiterals::operator""_L1(char ch)
+
+ \relates QLatin1Char
+ \since 6.4
+
+ Literal operator that creates a QLatin1Char out of \a ch.
+
+ The following code creates a QLatin1Char:
+ \code
+ using namespace Qt::Literals::StringLiterals;
+
+ auto ch = 'a'_L1;
+ \endcode
+
+ \sa Qt::Literals::StringLiterals
+*/
// ---------------------------------------------------------------------------
-static void decomposeHelper(QString *str, bool canonical, QChar::UnicodeVersion version, int from)
+static void decomposeHelper(QString *str, bool canonical, QChar::UnicodeVersion version, qsizetype from)
{
- int length;
- int tag;
- unsigned short buffer[3];
+ qsizetype length;
+ QChar::Decomposition tag;
+ QChar buffer[3];
QString &s = *str;
const unsigned short *utf16 = reinterpret_cast<unsigned short *>(s.data());
- const unsigned short *uc = utf16 + s.length();
+ const unsigned short *uc = utf16 + s.size();
while (uc != utf16 + from) {
- uint ucs4 = *(--uc);
+ char32_t ucs4 = *(--uc);
if (QChar(ucs4).isLowSurrogate() && uc != utf16) {
ushort high = *(uc - 1);
if (QChar(high).isHighSurrogate()) {
@@ -1933,12 +1832,12 @@ static void decomposeHelper(QString *str, bool canonical, QChar::UnicodeVersion
if (QChar::unicodeVersion(ucs4) > version)
continue;
- const unsigned short *d = decompositionHelper(ucs4, &length, &tag, buffer);
+ const QChar *d = decompositionHelper(ucs4, &length, &tag, buffer);
if (!d || (canonical && tag != QChar::Canonical))
continue;
- int pos = uc - utf16;
- s.replace(pos, QChar::requiresSurrogates(ucs4) ? 2 : 1, reinterpret_cast<const QChar *>(d), length);
+ qsizetype pos = uc - utf16;
+ s.replace(pos, QChar::requiresSurrogates(ucs4) ? 2 : 1, d, length);
// since the replace invalidates the pointers and we do decomposition recursive
utf16 = reinterpret_cast<unsigned short *>(s.data());
uc = utf16 + pos + length;
@@ -1965,27 +1864,27 @@ struct UCS2SurrogatePair {
inline bool operator<(const UCS2SurrogatePair &ligature1, const UCS2SurrogatePair &ligature2)
{ return QChar::surrogateToUcs4(ligature1.p1.u1, ligature1.p1.u2) < QChar::surrogateToUcs4(ligature2.p1.u1, ligature2.p1.u2); }
-inline bool operator<(uint u1, const UCS2SurrogatePair &ligature)
+inline bool operator<(char32_t u1, const UCS2SurrogatePair &ligature)
{ return u1 < QChar::surrogateToUcs4(ligature.p1.u1, ligature.p1.u2); }
-inline bool operator<(const UCS2SurrogatePair &ligature, uint u1)
+inline bool operator<(const UCS2SurrogatePair &ligature, char32_t u1)
{ return QChar::surrogateToUcs4(ligature.p1.u1, ligature.p1.u2) < u1; }
-static uint inline ligatureHelper(uint u1, uint u2)
+static char32_t inline ligatureHelper(char32_t u1, char32_t u2)
{
- if (u1 >= Hangul_LBase && u1 <= Hangul_SBase + Hangul_SCount) {
+ if (u1 >= Hangul_LBase && u1 < Hangul_SBase + Hangul_SCount) {
// compute Hangul syllable composition as per UAX #15
// hangul L-V pair
- const uint LIndex = u1 - Hangul_LBase;
+ const char32_t LIndex = u1 - Hangul_LBase;
if (LIndex < Hangul_LCount) {
- const uint VIndex = u2 - Hangul_VBase;
+ const char32_t VIndex = u2 - Hangul_VBase;
if (VIndex < Hangul_VCount)
return Hangul_SBase + (LIndex * Hangul_VCount + VIndex) * Hangul_TCount;
}
// hangul LV-T pair
- const uint SIndex = u1 - Hangul_SBase;
+ const char32_t SIndex = u1 - Hangul_SBase;
if (SIndex < Hangul_SCount && (SIndex % Hangul_TCount) == 0) {
- const uint TIndex = u2 - Hangul_TBase;
- if (TIndex <= Hangul_TCount)
+ const char32_t TIndex = u2 - Hangul_TBase;
+ if (TIndex < Hangul_TCount && TIndex)
return u1 + TIndex;
}
}
@@ -2010,23 +1909,23 @@ static uint inline ligatureHelper(uint u1, uint u2)
return 0;
}
-static void composeHelper(QString *str, QChar::UnicodeVersion version, int from)
+static void composeHelper(QString *str, QChar::UnicodeVersion version, qsizetype from)
{
QString &s = *str;
- if (from < 0 || s.length() - from < 2)
+ if (from < 0 || s.size() - from < 2)
return;
- uint stcode = 0; // starter code point
- int starter = -1; // starter position
- int next = -1; // to prevent i == next
+ char32_t stcode = 0; // starter code point
+ qsizetype starter = -1; // starter position
+ qsizetype next = -1; // to prevent i == next
int lastCombining = 255; // to prevent combining > lastCombining
- int pos = from;
- while (pos < s.length()) {
- int i = pos;
+ qsizetype pos = from;
+ while (pos < s.size()) {
+ qsizetype i = pos;
char32_t uc = s.at(pos).unicode();
- if (QChar(uc).isHighSurrogate() && pos < s.length()-1) {
+ if (QChar(uc).isHighSurrogate() && pos < s.size()-1) {
ushort low = s.at(pos+1).unicode();
if (QChar(low).isLowSurrogate()) {
uc = QChar::surrogateToUcs4(uc, low);
@@ -2046,12 +1945,12 @@ static void composeHelper(QString *str, QChar::UnicodeVersion version, int from)
int combining = p->combiningClass;
if ((i == next || combining > lastCombining) && starter >= from) {
// allowed to form ligature with S
- uint ligature = ligatureHelper(stcode, uc);
+ char32_t ligature = ligatureHelper(stcode, uc);
if (ligature) {
stcode = ligature;
QChar *d = s.data();
// ligatureHelper() never changes planes
- int j = 0;
+ qsizetype j = 0;
for (QChar ch : QChar::fromUcs4(ligature))
d[starter + j++] = ch;
s.remove(i, j);
@@ -2070,17 +1969,17 @@ static void composeHelper(QString *str, QChar::UnicodeVersion version, int from)
}
-static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, int from)
+static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, qsizetype from)
{
QString &s = *str;
- const int l = s.length()-1;
+ const qsizetype l = s.size()-1;
char32_t u1, u2;
char16_t c1, c2;
- int pos = from;
+ qsizetype pos = from;
while (pos < l) {
- int p2 = pos+1;
+ qsizetype p2 = pos+1;
u1 = s.at(pos).unicode();
if (QChar::isHighSurrogate(u1)) {
const char16_t low = s.at(p2).unicode();
@@ -2122,7 +2021,7 @@ static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, in
if (c1 > c2) {
QChar *uc = s.data();
- int p = pos;
+ qsizetype p = pos;
// exchange characters
for (QChar ch : QChar::fromUcs4(u2))
uc[p++] = ch;
@@ -2152,7 +2051,7 @@ static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, in
// returns true if the text is in a desired Normalization Form already; false otherwise.
// sets lastStable to the position of the last stable code point
-static bool normalizationQuickCheckHelper(QString *str, QString::NormalizationForm mode, int from, int *lastStable)
+static bool normalizationQuickCheckHelper(QString *str, QString::NormalizationForm mode, qsizetype from, qsizetype *lastStable)
{
static_assert(QString::NormalizationForm_D == 0);
static_assert(QString::NormalizationForm_C == 1);
@@ -2161,16 +2060,16 @@ static bool normalizationQuickCheckHelper(QString *str, QString::NormalizationFo
enum { NFQC_YES = 0, NFQC_NO = 1, NFQC_MAYBE = 3 };
- const ushort *string = reinterpret_cast<const ushort *>(str->constData());
- int length = str->length();
+ const auto *string = reinterpret_cast<const char16_t *>(str->constData());
+ qsizetype length = str->size();
// this avoids one out of bounds check in the loop
while (length > from && QChar::isHighSurrogate(string[length - 1]))
--length;
uchar lastCombining = 0;
- for (int i = from; i < length; ++i) {
- int pos = i;
+ for (qsizetype i = from; i < length; ++i) {
+ qsizetype pos = i;
char32_t uc = string[i];
if (uc < 0x80) {
// ASCII characters are stable code points
@@ -2205,10 +2104,57 @@ static bool normalizationQuickCheckHelper(QString *str, QString::NormalizationFo
*lastStable = pos;
}
- if (length != str->length()) // low surrogate parts at the end of text
- *lastStable = str->length() - 1;
+ if (length != str->size()) // low surrogate parts at the end of text
+ *lastStable = str->size() - 1;
return true;
}
+/*!
+ \macro QT_IMPLICIT_QCHAR_CONSTRUCTION
+ \since 6.0
+ \relates QChar
+
+ Defining this macro makes certain QChar constructors implicit
+ rather than explicit. This is done to enforce safe conversions:
+
+ \badcode
+
+ QString str = getString();
+ if (str == 123) {
+ // Oops, meant str == "123". By default does not compile,
+ // *unless* this macro is defined, in which case, it's interpreted
+ // as `if (str == QChar(123))`, that is, `if (str == '{')`.
+ // Likely, not what we meant.
+ }
+
+ \endcode
+
+ This macro is provided to keep existing code working; it is
+ recommended to instead use explicit conversions and/or QLatin1Char.
+ For instance:
+
+ \code
+
+ QChar c1 = 'x'; // OK, unless QT_NO_CAST_FROM_ASCII is defined
+ QChar c2 = u'x'; // always OK, recommended
+ QChar c3 = QLatin1Char('x'); // always OK, recommended
+
+ // from int to 1 UTF-16 code unit: must guarantee that the input is <= 0xFFFF
+ QChar c4 = 120; // compile error, unless QT_IMPLICIT_QCHAR_CONSTRUCTION is defined
+ QChar c5(120); // OK (direct initialization)
+ auto c6 = QChar(120); // ditto
+
+ // from int/char32_t to 1/2 UTF-16 code units:
+ // 𝄞 'MUSICAL SYMBOL G CLEF' (U+1D11E)
+ auto c7 = QChar(0x1D11E); // compiles, but undefined behavior at runtime
+ auto c8 = QChar::fromUcs4(0x1D11E); // always OK
+ auto c9 = QChar::fromUcs4(U'\U0001D11E'); // always OK
+ // => use c8/c9 as QStringView objects
+
+ \endcode
+
+ \sa QLatin1Char, QChar::fromUcs4, QT_NO_CAST_FROM_ASCII
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/text/qchar.h b/src/corelib/text/qchar.h
index 056101325e..c0c53664c2 100644
--- a/src/corelib/text/qchar.h
+++ b/src/corelib/text/qchar.h
@@ -1,46 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCHAR_H
#define QCHAR_H
#include <QtCore/qglobal.h>
+#include <QtCore/qcompare.h>
#include <functional> // for std::hash
@@ -52,29 +17,31 @@ class QString;
struct QLatin1Char
{
public:
- Q_DECL_CONSTEXPR inline explicit QLatin1Char(char c) noexcept : ch(c) {}
- Q_DECL_CONSTEXPR inline char toLatin1() const noexcept { return ch; }
- Q_DECL_CONSTEXPR inline char16_t unicode() const noexcept { return char16_t(uchar(ch)); }
+ constexpr inline explicit QLatin1Char(char c) noexcept : ch(c) {}
+ constexpr inline char toLatin1() const noexcept { return ch; }
+ constexpr inline char16_t unicode() const noexcept { return char16_t(uchar(ch)); }
+
+ friend constexpr bool
+ comparesEqual(const QLatin1Char &lhs, const QLatin1Char &rhs) noexcept
+ { return lhs.ch == rhs.ch; }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QLatin1Char &lhs, const QLatin1Char &rhs) noexcept
+ { return Qt::compareThreeWay(uchar(lhs.ch), uchar(rhs.ch)); }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QLatin1Char)
+
+ friend constexpr bool comparesEqual(const QLatin1Char &lhs, char rhs) noexcept
+ { return lhs.toLatin1() == rhs; }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QLatin1Char &lhs, char rhs) noexcept
+ { return Qt::compareThreeWay(uchar(lhs.toLatin1()), uchar(rhs)); }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QLatin1Char, char)
private:
char ch;
};
-Q_DECL_CONSTEXPR inline bool operator==(char lhs, QLatin1Char rhs) noexcept { return lhs == rhs.toLatin1(); }
-Q_DECL_CONSTEXPR inline bool operator!=(char lhs, QLatin1Char rhs) noexcept { return lhs != rhs.toLatin1(); }
-Q_DECL_CONSTEXPR inline bool operator<=(char lhs, QLatin1Char rhs) noexcept { return lhs <= rhs.toLatin1(); }
-Q_DECL_CONSTEXPR inline bool operator>=(char lhs, QLatin1Char rhs) noexcept { return lhs >= rhs.toLatin1(); }
-Q_DECL_CONSTEXPR inline bool operator< (char lhs, QLatin1Char rhs) noexcept { return lhs < rhs.toLatin1(); }
-Q_DECL_CONSTEXPR inline bool operator> (char lhs, QLatin1Char rhs) noexcept { return lhs > rhs.toLatin1(); }
-
-Q_DECL_CONSTEXPR inline bool operator==(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() == rhs; }
-Q_DECL_CONSTEXPR inline bool operator!=(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() != rhs; }
-Q_DECL_CONSTEXPR inline bool operator<=(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() <= rhs; }
-Q_DECL_CONSTEXPR inline bool operator>=(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() >= rhs; }
-Q_DECL_CONSTEXPR inline bool operator< (QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() < rhs; }
-Q_DECL_CONSTEXPR inline bool operator> (QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() > rhs; }
-
-class Q_CORE_EXPORT QChar {
+#define QT_CHAR_FASTCALL QT7_ONLY(Q_CORE_EXPORT) QT_FASTCALL
+class QT6_ONLY(Q_CORE_EXPORT) QChar {
public:
enum SpecialCharacter {
Null = 0x0000,
@@ -91,36 +58,39 @@ public:
ByteOrderSwapped = 0xfffe,
ParagraphSeparator = 0x2029,
LineSeparator = 0x2028,
+ VisualTabCharacter = 0x2192,
LastValidCodePoint = 0x10ffff
};
- Q_DECL_CONSTEXPR QChar() noexcept : ucs(0) {}
- Q_DECL_CONSTEXPR QChar(ushort rc) noexcept : ucs(rc) {}
- Q_DECL_CONSTEXPR QChar(uchar c, uchar r) noexcept : ucs(char16_t((r << 8) | c)) {}
- Q_DECL_CONSTEXPR QChar(short rc) noexcept : ucs(char16_t(rc)) {}
- Q_DECL_CONSTEXPR QChar(uint rc) noexcept : ucs(char16_t(rc & 0xffff)) {}
- Q_DECL_CONSTEXPR QChar(int rc) noexcept : ucs(char16_t(rc & 0xffff)) {}
- Q_DECL_CONSTEXPR QChar(SpecialCharacter s) noexcept : ucs(char16_t(s)) {} // implicit
- Q_DECL_CONSTEXPR QChar(QLatin1Char ch) noexcept : ucs(ch.unicode()) {} // implicit
-#if defined(Q_COMPILER_UNICODE_STRINGS)
- Q_DECL_CONSTEXPR QChar(char16_t ch) noexcept : ucs(ch) {} // implicit
+#ifdef QT_IMPLICIT_QCHAR_CONSTRUCTION
+#define QCHAR_MAYBE_IMPLICIT Q_IMPLICIT
+#else
+#define QCHAR_MAYBE_IMPLICIT explicit
#endif
-#if defined(Q_OS_WIN)
- static_assert(sizeof(wchar_t) == sizeof(char16_t));
-#endif
-#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
-# if !defined(_WCHAR_T_DEFINED) || defined(_NATIVE_WCHAR_T_DEFINED)
- Q_DECL_CONSTEXPR QChar(wchar_t ch) noexcept : ucs(char16_t(ch)) {} // implicit
-# endif
+
+ constexpr Q_IMPLICIT QChar() noexcept : ucs(0) {}
+ constexpr Q_IMPLICIT QChar(ushort rc) noexcept : ucs(rc) {}
+ constexpr QCHAR_MAYBE_IMPLICIT QChar(uchar c, uchar r) noexcept : ucs(char16_t((r << 8) | c)) {}
+ constexpr Q_IMPLICIT QChar(short rc) noexcept : ucs(char16_t(rc)) {}
+ constexpr QCHAR_MAYBE_IMPLICIT QChar(uint rc) noexcept : ucs((Q_ASSERT(rc <= 0xffff), char16_t(rc))) {}
+ constexpr QCHAR_MAYBE_IMPLICIT QChar(int rc) noexcept : QChar(uint(rc)) {}
+ constexpr Q_IMPLICIT QChar(SpecialCharacter s) noexcept : ucs(char16_t(s)) {}
+ constexpr Q_IMPLICIT QChar(QLatin1Char ch) noexcept : ucs(ch.unicode()) {}
+ constexpr Q_IMPLICIT QChar(char16_t ch) noexcept : ucs(ch) {}
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
+ constexpr Q_IMPLICIT QChar(wchar_t ch) noexcept : ucs(char16_t(ch)) {}
#endif
#ifndef QT_NO_CAST_FROM_ASCII
- QT_ASCII_CAST_WARN Q_DECL_CONSTEXPR QChar(char c) noexcept : ucs(uchar(c)) { }
+ // Always implicit -- allow for 'x' => QChar conversions
+ QT_ASCII_CAST_WARN constexpr Q_IMPLICIT QChar(char c) noexcept : ucs(uchar(c)) { }
#ifndef QT_RESTRICTED_CAST_FROM_ASCII
- QT_ASCII_CAST_WARN Q_DECL_CONSTEXPR QChar(uchar c) noexcept : ucs(c) { }
+ QT_ASCII_CAST_WARN constexpr QCHAR_MAYBE_IMPLICIT QChar(uchar c) noexcept : ucs(c) { }
#endif
#endif
+#undef QCHAR_MAYBE_IMPLICIT
+
static constexpr QChar fromUcs2(char16_t c) noexcept { return QChar{c}; }
static constexpr inline auto fromUcs4(char32_t c) noexcept;
@@ -353,6 +323,17 @@ public:
Script_KhitanSmallScript,
Script_Yezidi,
+ // Unicode 14.0 additions
+ Script_CyproMinoan,
+ Script_OldUyghur,
+ Script_Tangsa,
+ Script_Toto,
+ Script_Vithkuqi,
+
+ // Unicode 15.0 additions
+ Script_Kawi,
+ Script_NagMundari,
+
ScriptCount
};
@@ -394,13 +375,6 @@ public:
Joining_Transparent
};
-#if QT_DEPRECATED_SINCE(5, 3)
- enum Joining
- {
- OtherJoining, Dual, Right, Center
- };
-#endif
-
enum CombiningClass
{
Combining_BelowLeftAttached = 200,
@@ -450,26 +424,15 @@ public:
Unicode_11_0,
Unicode_12_0,
Unicode_12_1,
- Unicode_13_0
+ Unicode_13_0,
+ Unicode_14_0,
+ Unicode_15_0,
+ Unicode_15_1,
};
inline Category category() const noexcept { return QChar::category(ucs); }
inline Direction direction() const noexcept { return QChar::direction(ucs); }
inline JoiningType joiningType() const noexcept { return QChar::joiningType(ucs); }
-#if QT_DEPRECATED_SINCE(5, 3)
- QT_DEPRECATED inline Joining joining() const noexcept
- {
- switch (QChar::joiningType(ucs)) {
- case QChar::Joining_Causing: return QChar::Center;
- case QChar::Joining_Dual: return QChar::Dual;
- case QChar::Joining_Right: return QChar::Right;
- case QChar::Joining_None:
- case QChar::Joining_Left:
- case QChar::Joining_Transparent:
- default: return QChar::OtherJoining;
- }
- }
-#endif
inline unsigned char combiningClass() const noexcept { return QChar::combiningClass(ucs); }
inline QChar mirroredChar() const noexcept { return QChar(QChar::mirroredChar(ucs)); }
@@ -488,186 +451,199 @@ public:
inline UnicodeVersion unicodeVersion() const noexcept { return QChar::unicodeVersion(ucs); }
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED Q_DECL_CONSTEXPR inline char toAscii() const noexcept { return toLatin1(); }
-#endif
- Q_DECL_CONSTEXPR inline char toLatin1() const noexcept { return ucs > 0xff ? '\0' : char(ucs); }
- Q_DECL_CONSTEXPR inline char16_t unicode() const noexcept { return ucs; }
- Q_DECL_RELAXED_CONSTEXPR inline char16_t &unicode() noexcept { return ucs; }
+ constexpr inline char toLatin1() const noexcept { return ucs > 0xff ? '\0' : char(ucs); }
+ constexpr inline char16_t unicode() const noexcept { return ucs; }
+ constexpr inline char16_t &unicode() noexcept { return ucs; }
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED static Q_DECL_CONSTEXPR inline QChar fromAscii(char c) noexcept
- { return fromLatin1(c); }
-#endif
- static Q_DECL_CONSTEXPR QChar fromLatin1(char c) noexcept { return QLatin1Char(c); }
+ static constexpr QChar fromLatin1(char c) noexcept { return QLatin1Char(c); }
- Q_DECL_CONSTEXPR inline bool isNull() const noexcept { return ucs == 0; }
+ constexpr inline bool isNull() const noexcept { return ucs == 0; }
inline bool isPrint() const noexcept { return QChar::isPrint(ucs); }
- Q_DECL_CONSTEXPR inline bool isSpace() const noexcept { return QChar::isSpace(ucs); }
+ constexpr inline bool isSpace() const noexcept { return QChar::isSpace(ucs); }
inline bool isMark() const noexcept { return QChar::isMark(ucs); }
inline bool isPunct() const noexcept { return QChar::isPunct(ucs); }
inline bool isSymbol() const noexcept { return QChar::isSymbol(ucs); }
- Q_DECL_CONSTEXPR inline bool isLetter() const noexcept { return QChar::isLetter(ucs); }
- Q_DECL_CONSTEXPR inline bool isNumber() const noexcept { return QChar::isNumber(ucs); }
- Q_DECL_CONSTEXPR inline bool isLetterOrNumber() const noexcept { return QChar::isLetterOrNumber(ucs); }
- Q_DECL_CONSTEXPR inline bool isDigit() const noexcept { return QChar::isDigit(ucs); }
- Q_DECL_CONSTEXPR inline bool isLower() const noexcept { return QChar::isLower(ucs); }
- Q_DECL_CONSTEXPR inline bool isUpper() const noexcept { return QChar::isUpper(ucs); }
- Q_DECL_CONSTEXPR inline bool isTitleCase() const noexcept { return QChar::isTitleCase(ucs); }
-
- Q_DECL_CONSTEXPR inline bool isNonCharacter() const noexcept { return QChar::isNonCharacter(ucs); }
- Q_DECL_CONSTEXPR inline bool isHighSurrogate() const noexcept { return QChar::isHighSurrogate(ucs); }
- Q_DECL_CONSTEXPR inline bool isLowSurrogate() const noexcept { return QChar::isLowSurrogate(ucs); }
- Q_DECL_CONSTEXPR inline bool isSurrogate() const noexcept { return QChar::isSurrogate(ucs); }
-
- Q_DECL_CONSTEXPR inline uchar cell() const noexcept { return uchar(ucs & 0xff); }
- Q_DECL_CONSTEXPR inline uchar row() const noexcept { return uchar((ucs>>8)&0xff); }
- Q_DECL_RELAXED_CONSTEXPR inline void setCell(uchar acell) noexcept { ucs = char16_t((ucs & 0xff00) + acell); }
- Q_DECL_RELAXED_CONSTEXPR inline void setRow(uchar arow) noexcept { ucs = char16_t((char16_t(arow)<<8) + (ucs&0xff)); }
-
- static Q_DECL_CONSTEXPR inline bool isNonCharacter(char32_t ucs4) noexcept
+ constexpr inline bool isLetter() const noexcept { return QChar::isLetter(ucs); }
+ constexpr inline bool isNumber() const noexcept { return QChar::isNumber(ucs); }
+ constexpr inline bool isLetterOrNumber() const noexcept { return QChar::isLetterOrNumber(ucs); }
+ constexpr inline bool isDigit() const noexcept { return QChar::isDigit(ucs); }
+ constexpr inline bool isLower() const noexcept { return QChar::isLower(ucs); }
+ constexpr inline bool isUpper() const noexcept { return QChar::isUpper(ucs); }
+ constexpr inline bool isTitleCase() const noexcept { return QChar::isTitleCase(ucs); }
+
+ constexpr inline bool isNonCharacter() const noexcept { return QChar::isNonCharacter(ucs); }
+ constexpr inline bool isHighSurrogate() const noexcept { return QChar::isHighSurrogate(ucs); }
+ constexpr inline bool isLowSurrogate() const noexcept { return QChar::isLowSurrogate(ucs); }
+ constexpr inline bool isSurrogate() const noexcept { return QChar::isSurrogate(ucs); }
+
+ constexpr inline uchar cell() const noexcept { return uchar(ucs & 0xff); }
+ constexpr inline uchar row() const noexcept { return uchar((ucs>>8)&0xff); }
+ constexpr inline void setCell(uchar acell) noexcept { ucs = char16_t((ucs & 0xff00) + acell); }
+ constexpr inline void setRow(uchar arow) noexcept { ucs = char16_t((char16_t(arow)<<8) + (ucs&0xff)); }
+
+ static constexpr inline bool isNonCharacter(char32_t ucs4) noexcept
{
return ucs4 >= 0xfdd0 && (ucs4 <= 0xfdef || (ucs4 & 0xfffe) == 0xfffe);
}
- static Q_DECL_CONSTEXPR inline bool isHighSurrogate(char32_t ucs4) noexcept
+ static constexpr inline bool isHighSurrogate(char32_t ucs4) noexcept
{
- return ((ucs4 & 0xfffffc00) == 0xd800);
+ return (ucs4 & 0xfffffc00) == 0xd800; // 0xd800 + up to 1023 (0x3ff)
}
- static Q_DECL_CONSTEXPR inline bool isLowSurrogate(char32_t ucs4) noexcept
+ static constexpr inline bool isLowSurrogate(char32_t ucs4) noexcept
{
- return ((ucs4 & 0xfffffc00) == 0xdc00);
+ return (ucs4 & 0xfffffc00) == 0xdc00; // 0xdc00 + up to 1023 (0x3ff)
}
- static Q_DECL_CONSTEXPR inline bool isSurrogate(char32_t ucs4) noexcept
+ static constexpr inline bool isSurrogate(char32_t ucs4) noexcept
{
return (ucs4 - 0xd800u < 2048u);
}
- static Q_DECL_CONSTEXPR inline bool requiresSurrogates(char32_t ucs4) noexcept
+ static constexpr inline bool requiresSurrogates(char32_t ucs4) noexcept
{
return (ucs4 >= 0x10000);
}
- static Q_DECL_CONSTEXPR inline char32_t surrogateToUcs4(char16_t high, char16_t low) noexcept
+ static constexpr inline char32_t surrogateToUcs4(char16_t high, char16_t low) noexcept
{
+ // 0x010000 through 0x10ffff, provided params are actual high, low surrogates.
+ // 0x010000 + ((high - 0xd800) << 10) + (low - 0xdc00), optimized:
return (char32_t(high)<<10) + low - 0x35fdc00;
}
- static Q_DECL_CONSTEXPR inline char32_t surrogateToUcs4(QChar high, QChar low) noexcept
+ static constexpr inline char32_t surrogateToUcs4(QChar high, QChar low) noexcept
{
return surrogateToUcs4(high.ucs, low.ucs);
}
- static Q_DECL_CONSTEXPR inline char16_t highSurrogate(char32_t ucs4) noexcept
+ static constexpr inline char16_t highSurrogate(char32_t ucs4) noexcept
{
return char16_t((ucs4>>10) + 0xd7c0);
}
- static Q_DECL_CONSTEXPR inline char16_t lowSurrogate(char32_t ucs4) noexcept
+ static constexpr inline char16_t lowSurrogate(char32_t ucs4) noexcept
{
return char16_t(ucs4%0x400 + 0xdc00);
}
- static Category QT_FASTCALL category(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static Direction QT_FASTCALL direction(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static JoiningType QT_FASTCALL joiningType(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
-#if QT_DEPRECATED_SINCE(5, 3)
- QT_DEPRECATED static Joining QT_FASTCALL joining(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
-#endif
- static unsigned char QT_FASTCALL combiningClass(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static Category QT_CHAR_FASTCALL category(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static Direction QT_CHAR_FASTCALL direction(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static JoiningType QT_CHAR_FASTCALL joiningType(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static unsigned char QT_CHAR_FASTCALL combiningClass(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static char32_t QT_FASTCALL mirroredChar(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL hasMirrored(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static char32_t QT_CHAR_FASTCALL mirroredChar(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL hasMirrored(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static QString QT_FASTCALL decomposition(char32_t ucs4);
- static Decomposition QT_FASTCALL decompositionTag(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static QString QT_CHAR_FASTCALL decomposition(char32_t ucs4);
+ static Decomposition QT_CHAR_FASTCALL decompositionTag(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static int QT_FASTCALL digitValue(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static char32_t QT_FASTCALL toLower(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static char32_t QT_FASTCALL toUpper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static char32_t QT_FASTCALL toTitleCase(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static char32_t QT_FASTCALL toCaseFolded(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static int QT_CHAR_FASTCALL digitValue(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static char32_t QT_CHAR_FASTCALL toLower(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static char32_t QT_CHAR_FASTCALL toUpper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static char32_t QT_CHAR_FASTCALL toTitleCase(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static char32_t QT_CHAR_FASTCALL toCaseFolded(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static Script QT_FASTCALL script(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static Script QT_CHAR_FASTCALL script(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static UnicodeVersion QT_FASTCALL unicodeVersion(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static UnicodeVersion QT_CHAR_FASTCALL unicodeVersion(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static UnicodeVersion QT_FASTCALL currentUnicodeVersion() noexcept Q_DECL_CONST_FUNCTION;
+ static UnicodeVersion QT_CHAR_FASTCALL currentUnicodeVersion() noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isPrint(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static Q_DECL_CONSTEXPR inline bool isSpace(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
+ static bool QT_CHAR_FASTCALL isPrint(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static constexpr inline bool isSpace(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{
// note that [0x09..0x0d] + 0x85 are exceptional Cc-s and must be handled explicitly
return ucs4 == 0x20 || (ucs4 <= 0x0d && ucs4 >= 0x09)
|| (ucs4 > 127 && (ucs4 == 0x85 || ucs4 == 0xa0 || QChar::isSpace_helper(ucs4)));
}
- static bool QT_FASTCALL isMark(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isPunct(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isSymbol(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static Q_DECL_CONSTEXPR inline bool isLetter(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
+ static bool QT_CHAR_FASTCALL isMark(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isPunct(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isSymbol(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static constexpr inline bool isLetter(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{
return (ucs4 >= 'A' && ucs4 <= 'z' && (ucs4 >= 'a' || ucs4 <= 'Z'))
|| (ucs4 > 127 && QChar::isLetter_helper(ucs4));
}
- static Q_DECL_CONSTEXPR inline bool isNumber(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
+ static constexpr inline bool isNumber(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{ return (ucs4 <= '9' && ucs4 >= '0') || (ucs4 > 127 && QChar::isNumber_helper(ucs4)); }
- static Q_DECL_CONSTEXPR inline bool isLetterOrNumber(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
+ static constexpr inline bool isLetterOrNumber(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{
return (ucs4 >= 'A' && ucs4 <= 'z' && (ucs4 >= 'a' || ucs4 <= 'Z'))
|| (ucs4 >= '0' && ucs4 <= '9')
|| (ucs4 > 127 && QChar::isLetterOrNumber_helper(ucs4));
}
- static Q_DECL_CONSTEXPR inline bool isDigit(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
+ static constexpr inline bool isDigit(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{ return (ucs4 <= '9' && ucs4 >= '0') || (ucs4 > 127 && QChar::category(ucs4) == Number_DecimalDigit); }
- static Q_DECL_CONSTEXPR inline bool isLower(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
+ static constexpr inline bool isLower(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{ return (ucs4 <= 'z' && ucs4 >= 'a') || (ucs4 > 127 && QChar::category(ucs4) == Letter_Lowercase); }
- static Q_DECL_CONSTEXPR inline bool isUpper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
+ static constexpr inline bool isUpper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{ return (ucs4 <= 'Z' && ucs4 >= 'A') || (ucs4 > 127 && QChar::category(ucs4) == Letter_Uppercase); }
- static Q_DECL_CONSTEXPR inline bool isTitleCase(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
+ static constexpr inline bool isTitleCase(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{ return ucs4 > 127 && QChar::category(ucs4) == Letter_Titlecase; }
+ friend constexpr bool comparesEqual(const QChar &lhs, const QChar &rhs) noexcept
+ { return lhs.ucs == rhs.ucs; }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QChar &lhs, const QChar &rhs) noexcept
+ { return Qt::compareThreeWay(lhs.ucs, rhs.ucs); }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QChar)
+
+ friend constexpr bool comparesEqual(const QChar &lhs, std::nullptr_t) noexcept
+ { return lhs.isNull(); }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QChar &lhs, std::nullptr_t) noexcept
+ { return lhs.isNull() ? Qt::strong_ordering::equivalent : Qt::strong_ordering::greater; }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QChar, std::nullptr_t)
+
private:
- static bool QT_FASTCALL isSpace_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isLetter_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isNumber_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isLetterOrNumber_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isSpace_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isLetter_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isNumber_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isLetterOrNumber_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+
+ // defined in qstring.cpp, because we need to go via QUtf8StringView
+ static bool QT_CHAR_FASTCALL
+ equal_helper(QChar lhs, const char *rhs) noexcept Q_DECL_CONST_FUNCTION;
+ static int QT_CHAR_FASTCALL
+ compare_helper(QChar lhs, const char *rhs) noexcept Q_DECL_CONST_FUNCTION;
+
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ Q_WEAK_OVERLOAD
+ friend bool comparesEqual(const QChar &lhs, const char *rhs) noexcept
+ { return equal_helper(lhs, rhs); }
+ Q_WEAK_OVERLOAD
+ friend Qt::strong_ordering compareThreeWay(const QChar &lhs, const char *rhs) noexcept
+ {
+ const int res = compare_helper(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QChar, const char *, Q_WEAK_OVERLOAD QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
#ifdef QT_NO_CAST_FROM_ASCII
- QChar(char c) noexcept;
- QChar(uchar c) noexcept;
+ QChar(char c) = delete;
+ QChar(uchar c) = delete;
#endif
- friend Q_DECL_CONSTEXPR bool operator==(QChar, QChar) noexcept;
- friend Q_DECL_CONSTEXPR bool operator< (QChar, QChar) noexcept;
char16_t ucs;
};
+#undef QT_CHAR_FASTCALL
-Q_DECLARE_TYPEINFO(QChar, Q_MOVABLE_TYPE);
-
-Q_DECL_CONSTEXPR inline bool operator==(QChar c1, QChar c2) noexcept { return c1.ucs == c2.ucs; }
-Q_DECL_CONSTEXPR inline bool operator< (QChar c1, QChar c2) noexcept { return c1.ucs < c2.ucs; }
-
-Q_DECL_CONSTEXPR inline bool operator!=(QChar c1, QChar c2) noexcept { return !operator==(c1, c2); }
-Q_DECL_CONSTEXPR inline bool operator>=(QChar c1, QChar c2) noexcept { return !operator< (c1, c2); }
-Q_DECL_CONSTEXPR inline bool operator> (QChar c1, QChar c2) noexcept { return operator< (c2, c1); }
-Q_DECL_CONSTEXPR inline bool operator<=(QChar c1, QChar c2) noexcept { return !operator< (c2, c1); }
-
-
-Q_DECL_CONSTEXPR inline bool operator==(QChar lhs, std::nullptr_t) noexcept { return lhs.isNull(); }
-Q_DECL_CONSTEXPR inline bool operator< (QChar, std::nullptr_t) noexcept { return false; }
-Q_DECL_CONSTEXPR inline bool operator==(std::nullptr_t, QChar rhs) noexcept { return rhs.isNull(); }
-Q_DECL_CONSTEXPR inline bool operator< (std::nullptr_t, QChar rhs) noexcept { return !rhs.isNull(); }
-
-Q_DECL_CONSTEXPR inline bool operator!=(QChar lhs, std::nullptr_t) noexcept { return !operator==(lhs, nullptr); }
-Q_DECL_CONSTEXPR inline bool operator>=(QChar lhs, std::nullptr_t) noexcept { return !operator< (lhs, nullptr); }
-Q_DECL_CONSTEXPR inline bool operator> (QChar lhs, std::nullptr_t) noexcept { return operator< (nullptr, lhs); }
-Q_DECL_CONSTEXPR inline bool operator<=(QChar lhs, std::nullptr_t) noexcept { return !operator< (nullptr, lhs); }
-
-Q_DECL_CONSTEXPR inline bool operator!=(std::nullptr_t, QChar rhs) noexcept { return !operator==(nullptr, rhs); }
-Q_DECL_CONSTEXPR inline bool operator>=(std::nullptr_t, QChar rhs) noexcept { return !operator< (nullptr, rhs); }
-Q_DECL_CONSTEXPR inline bool operator> (std::nullptr_t, QChar rhs) noexcept { return operator< (rhs, nullptr); }
-Q_DECL_CONSTEXPR inline bool operator<=(std::nullptr_t, QChar rhs) noexcept { return !operator< (rhs, nullptr); }
+Q_DECLARE_TYPEINFO(QChar, Q_PRIMITIVE_TYPE);
#ifndef QT_NO_DATASTREAM
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QChar);
Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QChar &);
#endif
+namespace Qt {
+inline namespace Literals {
+inline namespace StringLiterals {
+
+constexpr inline QLatin1Char operator""_L1(char ch) noexcept
+{
+ return QLatin1Char(ch);
+}
+
+} // StringLiterals
+} // Literals
+} // Qt
+
QT_END_NAMESPACE
namespace std {
diff --git a/src/corelib/text/qcollator.cpp b/src/corelib/text/qcollator.cpp
index 4bef356044..1f7e7459e7 100644
--- a/src/corelib/text/qcollator.cpp
+++ b/src/corelib/text/qcollator.cpp
@@ -1,50 +1,39 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcollator_p.h"
#include "qstringlist.h"
#include "qstring.h"
#include "qdebug.h"
+#include "qlocale_p.h"
+#include "qthreadstorage.h"
QT_BEGIN_NAMESPACE
+QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QCollatorSortKeyPrivate)
+
+namespace {
+struct GenerationalCollator
+{
+ QCollator theCollator;
+ int generation = QLocalePrivate::s_generation.loadRelaxed();
+public:
+ GenerationalCollator() = default;
+ GenerationalCollator(const QCollator &copy) : theCollator(copy) {}
+ QCollator &collator()
+ {
+ int currentGeneration = QLocalePrivate::s_generation.loadRelaxed();
+ if (Q_UNLIKELY(generation != currentGeneration)) {
+ // reinitialize the collator
+ generation = currentGeneration;
+ theCollator = QCollator();
+ }
+ return theCollator;
+ }
+};
+}
+Q_GLOBAL_STATIC(QThreadStorage<GenerationalCollator>, defaultCollator)
/*!
\class QCollator
@@ -58,35 +47,60 @@ QT_BEGIN_NAMESPACE
\ingroup string-processing
\ingroup shared
- QCollator is initialized with a QLocale and an optional collation strategy.
- It tries to initialize the collator with the specified values. The collator
- can then be used to compare and sort strings in a locale dependent fashion.
+ QCollator is initialized with a QLocale. It can then be used to compare and
+ sort strings by using the ordering appropriate for that locale.
+
+ A QCollator object can be used together with template-based sorting
+ algorithms, such as std::sort(), to sort a list with QString entries.
+
+ \snippet code/src_corelib_text_qcollator.cpp 0
+
+ In addition to the locale, several optional flags can be set that influence
+ the result of the collation.
+
+ \section1 POSIX fallback implementation
+
+ On Unix systems, Qt is normally compiled to use ICU (except for \macos,
+ where Qt defaults to using an equivalent Apple API). However, if ICU was
+ not available at compile time or explicitly disabled, Qt will use a
+ fallback backend that uses the POSIX API only. This backend has several
+ limitations:
- A QCollator object can be used together with template based sorting
- algorithms such as std::sort to sort a list of QStrings.
+ \list
+ \li Only the QLocale::c() and QLocale::system() locales are supported.
+ Consult the POSIX and C Standard Library manuals for the
+ \c{<locale.h>} header for more information on the system locale.
+ \li caseSensitivity() is not supported: only case-sensitive collation
+ can be performed.
+ \li numericMode() and ignorePunctuation() are not supported.
+ \endlist
- In addition to the locale and collation strategy, several optional flags can
- be set that influence the result of the collation.
+ The use of any of the unsupported options will cause a warning to be
+ printed to the application's output.
*/
/*!
\since 5.13
- Constructs a QCollator using the system's default collation locale.
+ Constructs a QCollator using the default locale's collation locale.
- \sa setLocale(), QLocale::collation()
+ The system locale, when used as default locale, may have a collation locale
+ other than itself (e.g. on Unix, if LC_COLLATE is set differently to LANG in
+ the environment). All other locales are their own collation locales.
+
+ \sa setLocale(), QLocale::collation(), QLocale::setDefault()
*/
QCollator::QCollator()
- : d(new QCollatorPrivate(QLocale::system().collation()))
+ : d(new QCollatorPrivate(QLocale().collation()))
{
d->init();
}
/*!
- Constructs a QCollator from \a locale.
+ Constructs a QCollator using the given \a locale.
\sa setLocale()
- */
+*/
QCollator::QCollator(const QLocale &locale)
: d(new QCollatorPrivate(locale))
{
@@ -94,21 +108,20 @@ QCollator::QCollator(const QLocale &locale)
/*!
Creates a copy of \a other.
- */
+*/
QCollator::QCollator(const QCollator &other)
: d(other.d)
{
if (d) {
// Ensure clean, lest both copies try to init() at the same time:
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
d->ref.ref();
}
}
/*!
- Destroys the collator.
- */
+ Destroys this collator.
+*/
QCollator::~QCollator()
{
if (d && !d->ref.deref())
@@ -117,7 +130,7 @@ QCollator::~QCollator()
/*!
Assigns \a other to this collator.
- */
+*/
QCollator &QCollator::operator=(const QCollator &other)
{
if (this != &other) {
@@ -126,8 +139,7 @@ QCollator &QCollator::operator=(const QCollator &other)
d = other.d;
if (d) {
// Ensure clean, lest both copies try to init() at the same time:
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
d->ref.ref();
}
}
@@ -139,19 +151,19 @@ QCollator &QCollator::operator=(const QCollator &other)
Move constructor. Moves from \a other into this collator.
- Note that a moved-from QCollator can only be destroyed or assigned to.
- The effect of calling other functions than the destructor or one of the
- assignment operators is undefined.
+//! [partially-formed]
+ \note The moved-from object \a other is placed in a partially-formed state,
+ in which the only valid operations are destruction and assignment of a new
+ value.
+//! [partially-formed]
*/
/*!
\fn QCollator & QCollator::operator=(QCollator && other)
- Move-assigns from \a other to this collator.
+ Move-assigns \a other to this QCollator instance.
- Note that a moved-from QCollator can only be destroyed or assigned to.
- The effect of calling other functions than the destructor or one of the
- assignment operators is undefined.
+ \include qcollator.cpp partially-formed
*/
/*!
@@ -163,7 +175,7 @@ QCollator &QCollator::operator=(const QCollator &other)
/*!
\internal
- */
+*/
void QCollator::detach()
{
if (d->ref.loadRelaxed() != 1) {
@@ -178,7 +190,9 @@ void QCollator::detach()
/*!
Sets the locale of the collator to \a locale.
- */
+
+ \sa locale()
+*/
void QCollator::setLocale(const QLocale &locale)
{
if (locale == d->locale)
@@ -190,19 +204,22 @@ void QCollator::setLocale(const QLocale &locale)
/*!
Returns the locale of the collator.
- */
+
+ Unless supplied to the constructor or by calling setLocale(), the system's
+ default collation locale is used.
+
+ \sa setLocale(), QLocale::collation()
+*/
QLocale QCollator::locale() const
{
return d->locale;
}
/*!
- \fn void QCollator::setCaseSensitivity(Qt::CaseSensitivity sensitivity)
-
- Sets the case \a sensitivity of the collator.
+ Sets the case-sensitivity of the collator to \a cs.
\sa caseSensitivity()
- */
+*/
void QCollator::setCaseSensitivity(Qt::CaseSensitivity cs)
{
if (d->caseSensitivity == cs)
@@ -213,29 +230,27 @@ void QCollator::setCaseSensitivity(Qt::CaseSensitivity cs)
}
/*!
- \fn Qt::CaseSensitivity QCollator::caseSensitivity() const
-
Returns case sensitivity of the collator.
+ This defaults to case-sensitive until set.
+
+ \note In the C locale, when case-sensitive, all lower-case letters sort
+ after all upper-case letters, where most locales sort each lower-case letter
+ either immediately before or immediately after its upper-case partner. Thus
+ "Zap" sorts before "ape" in the C locale but after in most others.
+
\sa setCaseSensitivity()
- */
+*/
Qt::CaseSensitivity QCollator::caseSensitivity() const
{
return d->caseSensitivity;
}
/*!
- \fn void QCollator::setNumericMode(bool on)
-
- Enables numeric sorting mode when \a on is set to true.
-
- This will enable proper sorting of numeric digits, so that e.g. 100 sorts
- after 99.
-
- By default this mode is off.
+ Enables numeric sorting mode when \a on is \c true.
\sa numericMode()
- */
+*/
void QCollator::setNumericMode(bool on)
{
if (d->numericMode == on)
@@ -246,30 +261,25 @@ void QCollator::setNumericMode(bool on)
}
/*!
- \fn bool QCollator::numericMode() const
+ Returns \c true if numeric sorting is enabled, \c false otherwise.
- Returns \c true if numeric sorting is enabled, false otherwise.
+ When \c true, numerals are recognized as numbers and sorted in arithmetic
+ order; for example, 100 sortes after 99. When \c false, numbers are sorted
+ in lexical order, so that 100 sorts before 99 (because 1 is before 9). By
+ default, this option is disabled.
\sa setNumericMode()
- */
+*/
bool QCollator::numericMode() const
{
return d->numericMode;
}
/*!
- \fn void QCollator::setIgnorePunctuation(bool on)
-
- If \a on is set to true, punctuation characters and symbols are ignored when
- determining sort order.
-
- The default is locale dependent.
-
- \note This method is not currently supported if Qt is configured to not use
- ICU on Linux.
+ Ignores punctuation and symbols if \a on is \c true, attends to them if \c false.
\sa ignorePunctuation()
- */
+*/
void QCollator::setIgnorePunctuation(bool on)
{
if (d->ignorePunctuation == on)
@@ -280,13 +290,13 @@ void QCollator::setIgnorePunctuation(bool on)
}
/*!
- \fn bool QCollator::ignorePunctuation() const
+ Returns whether punctuation and symbols are ignored when collating.
- Returns \c true if punctuation characters and symbols are ignored when
- determining sort order.
+ When \c true, strings are compared as if all punctuation and symbols were
+ removed from each string.
\sa setIgnorePunctuation()
- */
+*/
bool QCollator::ignorePunctuation() const
{
return d->ignorePunctuation;
@@ -295,7 +305,11 @@ bool QCollator::ignorePunctuation() const
/*!
\since 5.13
\fn bool QCollator::operator()(QStringView s1, QStringView s2) const
- \internal
+
+ A QCollator can be used as the comparison function of a sorting algorithm.
+ It returns \c true if \a s1 sorts before \a s2, otherwise \c false.
+
+ \sa compare()
*/
/*!
@@ -304,42 +318,64 @@ bool QCollator::ignorePunctuation() const
Compares \a s1 with \a s2.
- Returns an integer less than, equal to, or greater than zero depending on
- whether \a s1 sorts before, with or after \a s2.
+ Returns a negative integer if \a s1 is less than \a s2, a positive integer
+ if it is greater than \a s2, and zero if they are equal.
*/
-#if QT_STRINGVIEW_LEVEL < 2
+
/*!
\fn bool QCollator::operator()(const QString &s1, const QString &s2) const
- \internal
+ \overload
+ \since 5.2
*/
/*!
+ \fn int QCollator::compare(const QString &s1, const QString &s2) const
\overload
+ \since 5.2
+*/
- Compares \a s1 with \a s2.
+/*!
+ \fn int QCollator::compare(const QChar *s1, qsizetype len1, const QChar *s2, qsizetype len2) const
+ \overload
+ \since 5.2
- Returns an integer less than, equal to, or greater than zero depending on
- whether \a s1 sorts before, with or after \a s2.
+ Compares \a s1 with \a s2. \a len1 and \a len2 specify the lengths of the
+ QChar arrays pointed to by \a s1 and \a s2.
+
+ Returns a negative integer if \a s1 is less than \a s2, a positive integer
+ if it is greater than \a s2, and zero if they are equal.
+
+
+ \note In Qt versions prior to 6.4, the length arguments were of type
+ \c{int}, not \c{qsizetype}.
*/
-int QCollator::compare(const QString &s1, const QString &s2) const
+
+/*!
+ \since 6.3
+
+ Compares the strings \a s1 and \a s2, returning their sorting order. This
+ function performs the same operation as compare() on a default-constructed
+ QCollator object.
+
+ \sa compare(), defaultSortKey()
+*/
+int QCollator::defaultCompare(QStringView s1, QStringView s2)
{
- return compare(QStringView(s1), QStringView(s2));
+ return defaultCollator->localData().collator().compare(s1, s2);
}
/*!
- \overload
+ \since 6.3
- Compares \a s1 with \a s2. \a len1 and \a len2 specify the lengths of the
- QChar arrays pointed to by \a s1 and \a s2.
+ Returns the sort key for the string \a key. This function performs the same
+ operation as sortKey() on a default-constructed QCollator object.
- Returns an integer less than, equal to, or greater than zero depending on
- whether \a s1 sorts before, with or after \a s2.
+ \sa sortKey(), defaultCompare()
*/
-int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const
+QCollatorSortKey QCollator::defaultSortKey(QStringView key)
{
- return compare(QStringView(s1, len1), QStringView(s2, len2));
+ return defaultCollator->localData().collator().sortKey(key.toString());
}
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\fn QCollatorSortKey QCollator::sortKey(const QString &string) const
@@ -352,7 +388,7 @@ int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) con
keys for each string and then sort using the keys.
\note Not supported with the C (a.k.a. POSIX) locale on Darwin.
- */
+*/
/*!
\class QCollatorSortKey
@@ -369,12 +405,12 @@ int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) con
\ingroup string-processing
\ingroup shared
- \sa QCollator, QCollator::sortKey()
+ \sa QCollator, QCollator::sortKey(), compare()
*/
/*!
\internal
- */
+*/
QCollatorSortKey::QCollatorSortKey(QCollatorSortKeyPrivate *d)
: d(d)
{
@@ -389,15 +425,23 @@ QCollatorSortKey::QCollatorSortKey(const QCollatorSortKey &other)
}
/*!
+ \since 6.8
+ \fn QCollatorSortKey::QCollatorSortKey(QCollatorSortKey &&other)
+ Move-constructs a new QCollatorSortKey from \a other.
+
+ \include qcollator.cpp partially-formed
+*/
+
+/*!
Destroys the collator key.
- */
+*/
QCollatorSortKey::~QCollatorSortKey()
{
}
/*!
Assigns \a other to this collator key.
- */
+*/
QCollatorSortKey& QCollatorSortKey::operator=(const QCollatorSortKey &other)
{
if (this != &other) {
@@ -409,18 +453,20 @@ QCollatorSortKey& QCollatorSortKey::operator=(const QCollatorSortKey &other)
/*!
\fn QCollatorSortKey &QCollatorSortKey::operator=(QCollatorSortKey && other)
- Move-assigns \a other to this collator key.
+ Move-assigns \a other to this QCollatorSortKey instance.
+
+ \include qcollator.cpp partially-formed
*/
/*!
- \fn bool operator<(const QCollatorSortKey &lhs, const QCollatorSortKey &rhs)
- \relates QCollatorSortKey
+ \fn bool QCollatorSortKey::operator<(const QCollatorSortKey &lhs, const QCollatorSortKey &rhs)
- According to the QCollator that created the keys, returns \c true if \a lhs
- should be sorted before \a rhs; otherwise returns \c false.
+ Both keys must have been created by the same QCollator's sortKey(). Returns
+ \c true if \a lhs should be sorted before \a rhs, according to the QCollator
+ that created them; otherwise returns \c false.
\sa QCollatorSortKey::compare()
- */
+*/
/*!
\fn void QCollatorSortKey::swap(QCollatorSortKey & other)
@@ -431,13 +477,14 @@ QCollatorSortKey& QCollatorSortKey::operator=(const QCollatorSortKey &other)
/*!
\fn int QCollatorSortKey::compare(const QCollatorSortKey &otherKey) const
- Compares this key to \a otherKey.
+ Compares this key to \a otherKey, which must have been created by the same
+ QCollator's sortKey() as this key. The comparison is performed in accordance
+ with that QCollator's sort order.
- Returns a negative value if the key is less than \a otherKey, 0 if the key
- is equal to \a otherKey or a positive value if the key is greater than \a
- otherKey.
+ Returns a negative value if this key sorts before \a otherKey, 0 if the two
+ keys are equal or a positive value if this key sorts after \a otherKey.
\sa operator<()
- */
+*/
QT_END_NAMESPACE
diff --git a/src/corelib/text/qcollator.h b/src/corelib/text/qcollator.h
index de8c8b7e3c..9f61cfc22a 100644
--- a/src/corelib/text/qcollator.h
+++ b/src/corelib/text/qcollator.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOLLATOR_H
#define QCOLLATOR_H
@@ -49,20 +13,23 @@ QT_BEGIN_NAMESPACE
class QCollatorPrivate;
class QCollatorSortKeyPrivate;
+QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QCollatorSortKeyPrivate, Q_CORE_EXPORT)
class Q_CORE_EXPORT QCollatorSortKey
{
friend class QCollator;
public:
QCollatorSortKey(const QCollatorSortKey &other);
+ QCollatorSortKey(QCollatorSortKey &&other) noexcept = default;
~QCollatorSortKey();
QCollatorSortKey &operator=(const QCollatorSortKey &other);
- inline QCollatorSortKey &operator=(QCollatorSortKey &&other) noexcept
- { swap(other); return *this; }
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QCollatorSortKey)
void swap(QCollatorSortKey &other) noexcept
{ d.swap(other.d); }
int compare(const QCollatorSortKey &key) const;
+ friend bool operator<(const QCollatorSortKey &lhs, const QCollatorSortKey &rhs)
+ { return lhs.compare(rhs) < 0; }
protected:
QCollatorSortKey(QCollatorSortKeyPrivate*);
@@ -73,11 +40,6 @@ private:
QCollatorSortKey();
};
-inline bool operator<(const QCollatorSortKey &lhs, const QCollatorSortKey &rhs)
-{
- return lhs.compare(rhs) < 0;
-}
-
class Q_CORE_EXPORT QCollator
{
public:
@@ -88,11 +50,10 @@ public:
QCollator &operator=(const QCollator &);
QCollator(QCollator &&other) noexcept
: d(other.d) { other.d = nullptr; }
- QCollator &operator=(QCollator &&other) noexcept
- { swap(other); return *this; }
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QCollator)
void swap(QCollator &other) noexcept
- { qSwap(d, other.d); }
+ { qt_ptr_swap(d, other.d); }
void setLocale(const QLocale &locale);
QLocale locale() const;
@@ -106,13 +67,17 @@ public:
void setIgnorePunctuation(bool on);
bool ignorePunctuation() const;
-#if QT_STRINGVIEW_LEVEL < 2
- int compare(const QString &s1, const QString &s2) const;
- int compare(const QChar *s1, int len1, const QChar *s2, int len2) const;
+ int compare(const QString &s1, const QString &s2) const
+ { return compare(QStringView(s1), QStringView(s2)); }
+#if QT_CORE_REMOVED_SINCE(6, 4) && QT_POINTER_SIZE != 4
+ int compare(const QChar *s1, int len1, const QChar *s2, int len2) const
+ { return compare(QStringView(s1, len1), QStringView(s2, len2)); }
+#endif
+ int compare(const QChar *s1, qsizetype len1, const QChar *s2, qsizetype len2) const
+ { return compare(QStringView(s1, len1), QStringView(s2, len2)); }
bool operator()(const QString &s1, const QString &s2) const
{ return compare(s1, s2) < 0; }
-#endif
int compare(QStringView s1, QStringView s2) const;
bool operator()(QStringView s1, QStringView s2) const
@@ -120,6 +85,9 @@ public:
QCollatorSortKey sortKey(const QString &string) const;
+ static int defaultCompare(QStringView s1, QStringView s2);
+ static QCollatorSortKey defaultSortKey(QStringView key);
+
private:
QCollatorPrivate *d;
diff --git a/src/corelib/text/qcollator_icu.cpp b/src/corelib/text/qcollator_icu.cpp
index 0dca1ee9c9..84f9c51537 100644
--- a/src/corelib/text/qcollator_icu.cpp
+++ b/src/corelib/text/qcollator_icu.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcollator_p.h"
#include "qlocale_p.h"
@@ -114,29 +78,28 @@ int QCollator::compare(QStringView s1, QStringView s2) const
if (!s2.size())
return +1;
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
if (d->collator) {
+ // truncating sizes (QTBUG-105038)
return ucol_strcoll(d->collator,
reinterpret_cast<const UChar *>(s1.data()), s1.size(),
reinterpret_cast<const UChar *>(s2.data()), s2.size());
}
- return QString::compare_helper(s1.data(), s1.size(),
- s2.data(), s2.size(),
- d->caseSensitivity);
+ return QtPrivate::compareStrings(s1, s2, d->caseSensitivity);
}
QCollatorSortKey QCollator::sortKey(const QString &string) const
{
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
+
if (d->isC())
return QCollatorSortKey(new QCollatorSortKeyPrivate(string.toUtf8()));
if (d->collator) {
QByteArray result(16 + string.size() + (string.size() >> 2), Qt::Uninitialized);
+ // truncating sizes (QTBUG-105038)
int size = ucol_getSortKey(d->collator, (const UChar *)string.constData(),
string.size(), (uint8_t *)result.data(), result.size());
if (size > result.size()) {
diff --git a/src/corelib/text/qcollator_macx.cpp b/src/corelib/text/qcollator_macx.cpp
index 62b3a904a0..23c23bd53a 100644
--- a/src/corelib/text/qcollator_macx.cpp
+++ b/src/corelib/text/qcollator_macx.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcollator_p.h"
#include "qlocale_p.h"
@@ -99,8 +63,8 @@ int QCollator::compare(QStringView s1, QStringView s2) const
if (!s2.size())
return +1;
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
+
if (!d->collator)
return s1.compare(s2, caseSensitivity());
@@ -118,25 +82,27 @@ int QCollator::compare(QStringView s1, QStringView s2) const
QCollatorSortKey QCollator::sortKey(const QString &string) const
{
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
+
if (!d->collator) {
// What should (or even *can*) we do here ? (See init()'s comment.)
qWarning("QCollator doesn't support sort keys for the C locale on Darwin");
return QCollatorSortKey(nullptr);
}
- //Documentation recommends having it 5 times as big as the input
+ auto text = reinterpret_cast<const UniChar *>(string.constData());
+ // Documentation recommends having it 5 times as big as the input
QList<UCCollationValue> ret(string.size() * 5);
ItemCount actualSize;
- int status = UCGetCollationKey(d->collator,
- reinterpret_cast<const UniChar *>(string.constData()),
- string.count(), ret.size(), &actualSize, ret.data());
+ int status = UCGetCollationKey(d->collator, text, string.size(),
+ ret.size(), &actualSize, ret.data());
ret.resize(actualSize + 1);
if (status == kUCOutputBufferTooSmall) {
- UCGetCollationKey(d->collator, reinterpret_cast<const UniChar *>(string.constData()),
- string.count(), ret.size(), &actualSize, ret.data());
+ status = UCGetCollationKey(d->collator, text, string.size(),
+ ret.size(), &actualSize, ret.data());
+ Q_ASSERT(status != kUCOutputBufferTooSmall);
+ Q_ASSERT(ret.size() == qsizetype(actualSize + 1));
}
ret[actualSize] = 0;
return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(ret)));
@@ -150,7 +116,7 @@ int QCollatorSortKey::compare(const QCollatorSortKey &key) const
SInt32 order;
UCCompareCollationKeys(d->m_key.data(), d->m_key.size(),
key.d->m_key.data(), key.d->m_key.size(),
- 0, &order);
+ nullptr, &order);
return order;
}
diff --git a/src/corelib/text/qcollator_p.h b/src/corelib/text/qcollator_p.h
index b1a483c4e2..b96cdbaa32 100644
--- a/src/corelib/text/qcollator_p.h
+++ b/src/corelib/text/qcollator_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOLLATOR_P_H
#define QCOLLATOR_P_H
@@ -92,12 +56,8 @@ public:
QAtomicInt ref = 1;
QLocale locale;
#if defined(Q_OS_WIN) && !QT_CONFIG(icu)
-#ifdef USE_COMPARESTRINGEX
- QString localeName;
-#else
LCID localeID;
#endif
-#endif
Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive;
bool numericMode = false;
bool ignorePunctuation = false;
@@ -114,6 +74,12 @@ public:
collator = NoCollator;
}
+ void ensureInitialized()
+ {
+ if (dirty)
+ init();
+ }
+
// Implemented by each back-end, in its own way:
void init();
void cleanup();
diff --git a/src/corelib/text/qcollator_posix.cpp b/src/corelib/text/qcollator_posix.cpp
index 92148fa315..5ed80c1b8e 100644
--- a/src/corelib/text/qcollator_posix.cpp
+++ b/src/corelib/text/qcollator_posix.cpp
@@ -1,45 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcollator_p.h"
#include "qstringlist.h"
#include "qstring.h"
+#include "qvarlengtharray.h"
#include <cstring>
#include <cwchar>
@@ -49,8 +15,10 @@ QT_BEGIN_NAMESPACE
void QCollatorPrivate::init()
{
if (!isC()) {
- if (locale != QLocale())
- qWarning("Only C and default locale supported with the posix collation implementation");
+ if (locale != QLocale::system().collation()) {
+ qWarning("Only the C and system collation locales are supported "
+ "with the POSIX collation implementation");
+ }
if (caseSensitivity != Qt::CaseSensitive)
qWarning("Case insensitive sorting unsupported in the posix collation implementation");
}
@@ -68,7 +36,7 @@ void QCollatorPrivate::cleanup()
static void stringToWCharArray(QVarLengthArray<wchar_t> &ret, QStringView string)
{
ret.resize(string.length());
- int len = string.toWCharArray(ret.data());
+ qsizetype len = string.toWCharArray(ret.data());
ret.resize(len+1);
ret[len] = 0;
}
@@ -82,8 +50,8 @@ int QCollator::compare(QStringView s1, QStringView s2) const
if (d->isC())
return s1.compare(s2, caseSensitivity());
- if (d->dirty)
- d->init();
+
+ d->ensureInitialized();
QVarLengthArray<wchar_t> array1, array2;
stringToWCharArray(array1, s1);
@@ -93,8 +61,7 @@ int QCollator::compare(QStringView s1, QStringView s2) const
QCollatorSortKey QCollator::sortKey(const QString &string) const
{
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
QVarLengthArray<wchar_t> original;
stringToWCharArray(original, string);
@@ -102,13 +69,19 @@ QCollatorSortKey QCollator::sortKey(const QString &string) const
if (d->isC()) {
std::copy(original.cbegin(), original.cend(), result.begin());
} else {
- size_t size = std::wcsxfrm(result.data(), original.constData(), string.size());
- if (size > uint(result.size())) {
- result.resize(size+1);
- size = std::wcsxfrm(result.data(), original.constData(), string.size());
+ auto availableSizeIncludingNullTerminator = result.size();
+ size_t neededSizeExcludingNullTerminator = std::wcsxfrm(
+ result.data(), original.constData(), availableSizeIncludingNullTerminator);
+ if (neededSizeExcludingNullTerminator > size_t(availableSizeIncludingNullTerminator - 1)) {
+ result.resize(neededSizeExcludingNullTerminator + 1);
+ availableSizeIncludingNullTerminator = result.size();
+ neededSizeExcludingNullTerminator = std::wcsxfrm(result.data(), original.constData(),
+ availableSizeIncludingNullTerminator);
+ Q_ASSERT(neededSizeExcludingNullTerminator
+ == size_t(availableSizeIncludingNullTerminator - 1));
}
- result.resize(size+1);
- result[size] = 0;
+ result.resize(neededSizeExcludingNullTerminator + 1);
+ result[neededSizeExcludingNullTerminator] = 0;
}
return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(result)));
}
diff --git a/src/corelib/text/qcollator_win.cpp b/src/corelib/text/qcollator_win.cpp
index 54f57f1d24..b588f5ff46 100644
--- a/src/corelib/text/qcollator_win.cpp
+++ b/src/corelib/text/qcollator_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcollator_p.h"
#include "qlocale_p.h"
@@ -63,11 +27,7 @@ void QCollatorPrivate::init()
if (isC())
return;
-#ifndef USE_COMPARESTRINGEX
localeID = qt_inIsoNametoLCID(QLocalePrivate::get(locale)->bcp47Name().constData());
-#else
- localeName = locale.bcp47Name();
-#endif
if (caseSensitivity == Qt::CaseInsensitive)
collator |= NORM_IGNORECASE;
@@ -97,8 +57,7 @@ int QCollator::compare(QStringView s1, QStringView s2) const
if (d->isC())
return s1.compare(s2, d->caseSensitivity);
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
//* from Windows documentation *
// Returns one of the following values if successful. To maintain the C
@@ -108,16 +67,9 @@ int QCollator::compare(QStringView s1, QStringView s2) const
// [...] The function returns 0 if it does not succeed.
// https://docs.microsoft.com/en-us/windows/desktop/api/stringapiset/nf-stringapiset-comparestringex#return-value
-#ifndef USE_COMPARESTRINGEX
const int ret = CompareString(d->localeID, d->collator,
reinterpret_cast<const wchar_t *>(s1.data()), s1.size(),
reinterpret_cast<const wchar_t *>(s2.data()), s2.size());
-#else
- const int ret = CompareStringEx(LPCWSTR(d->localeName.utf16()), d->collator,
- reinterpret_cast<LPCWSTR>(s1.data()), s1.size(),
- reinterpret_cast<LPCWSTR>(s2.data()), s2.size(),
- nullptr, nullptr, 0);
-#endif
if (Q_LIKELY(ret))
return ret - 2;
@@ -139,31 +91,20 @@ int QCollator::compare(QStringView s1, QStringView s2) const
QCollatorSortKey QCollator::sortKey(const QString &string) const
{
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
+
if (d->isC())
return QCollatorSortKey(new QCollatorSortKeyPrivate(string));
-#ifndef USE_COMPARESTRINGEX
+ // truncating sizes (QTBUG-105038)
int size = LCMapStringW(d->localeID, LCMAP_SORTKEY | d->collator,
reinterpret_cast<const wchar_t*>(string.constData()), string.size(),
0, 0);
-#else
- int size = LCMapStringEx(LPCWSTR(d->localeName.utf16()), LCMAP_SORTKEY | d->collator,
- reinterpret_cast<LPCWSTR>(string.constData()), string.size(),
- 0, 0, NULL, NULL, 0);
-#endif
+
QString ret(size, Qt::Uninitialized);
-#ifndef USE_COMPARESTRINGEX
int finalSize = LCMapStringW(d->localeID, LCMAP_SORTKEY | d->collator,
reinterpret_cast<const wchar_t*>(string.constData()), string.size(),
reinterpret_cast<wchar_t*>(ret.data()), ret.size());
-#else
- int finalSize = LCMapStringEx(LPCWSTR(d->localeName.utf16()), LCMAP_SORTKEY | d->collator,
- reinterpret_cast<LPCWSTR>(string.constData()), string.size(),
- reinterpret_cast<LPWSTR>(ret.data()), ret.size(),
- NULL, NULL, 0);
-#endif
if (finalSize == 0) {
qWarning()
<< "there were problems when generating the ::sortKey by LCMapStringW with error:"
diff --git a/src/corelib/text/qdoublescanprint_p.h b/src/corelib/text/qdoublescanprint_p.h
index 3865c69a99..b098cc4082 100644
--- a/src/corelib/text/qdoublescanprint_p.h
+++ b/src/corelib/text/qdoublescanprint_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDOUBLESCANPRINT_P_H
#define QDOUBLESCANPRINT_P_H
@@ -51,7 +15,7 @@
// We mean it.
//
-#include <qglobal.h>
+#include <private/qglobal_p.h>
#if defined(Q_CC_MSVC) && (defined(QT_BOOTSTRAPPED) || defined(QT_NO_DOUBLECONVERSION))
# include <stdio.h>
diff --git a/src/corelib/text/qlatin1stringmatcher.cpp b/src/corelib/text/qlatin1stringmatcher.cpp
new file mode 100644
index 0000000000..68bf97db5c
--- /dev/null
+++ b/src/corelib/text/qlatin1stringmatcher.cpp
@@ -0,0 +1,201 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qlatin1stringmatcher.h"
+#include <limits.h>
+
+QT_BEGIN_NAMESPACE
+
+/*! \class QLatin1StringMatcher
+ \inmodule QtCore
+ \brief Optimized search for substring in Latin-1 text.
+
+ A QLatin1StringMatcher can search for one QLatin1StringView
+ as a substring of another, either ignoring case or taking it into
+ account.
+
+ \since 6.5
+ \ingroup tools
+ \ingroup string-processing
+
+ This class is useful when you have a Latin-1 encoded string that
+ you want to repeatedly search for in some QLatin1StringViews
+ (perhaps in a loop), or when you want to search for all
+ instances of it in a given QLatin1StringView. Using a matcher
+ object and indexIn() is faster than matching a plain
+ QLatin1StringView with QLatin1StringView::indexOf() if repeated
+ matching takes place. This class offers no benefit if you are
+ doing one-off matches. The string to be searched for must not
+ be destroyed or changed before the matcher object is destroyed,
+ as the matcher accesses the string when searching for it.
+
+ Create a QLatin1StringMatcher for the QLatin1StringView
+ you want to search for and the case sensitivity. Then call
+ indexIn() with the QLatin1StringView that you want to search
+ within.
+
+ \sa QLatin1StringView, QStringMatcher, QByteArrayMatcher
+*/
+
+/*!
+ Construct an empty Latin-1 string matcher.
+ This will match at each position in any string.
+ \sa setPattern(), setCaseSensitivity(), indexIn()
+*/
+QLatin1StringMatcher::QLatin1StringMatcher() noexcept
+ : m_pattern(),
+ m_cs(Qt::CaseSensitive),
+ m_caseSensitiveSearcher(m_pattern.data(), m_pattern.data())
+{
+}
+
+/*!
+ Constructs a Latin-1 string matcher that searches for the given \a pattern
+ with given case sensitivity \a cs. The \a pattern argument must
+ not be destroyed before this matcher object. Call indexIn()
+ to find the \a pattern in the given QLatin1StringView.
+*/
+QLatin1StringMatcher::QLatin1StringMatcher(QLatin1StringView pattern,
+ Qt::CaseSensitivity cs) noexcept
+ : m_pattern(pattern), m_cs(cs)
+{
+ setSearcher();
+}
+
+/*!
+ Destroys the Latin-1 string matcher.
+*/
+QLatin1StringMatcher::~QLatin1StringMatcher() noexcept
+{
+ freeSearcher();
+}
+
+/*!
+ \internal
+*/
+void QLatin1StringMatcher::setSearcher() noexcept
+{
+ if (m_cs == Qt::CaseSensitive) {
+ new (&m_caseSensitiveSearcher) CaseSensitiveSearcher(m_pattern.data(), m_pattern.end());
+ } else {
+ QtPrivate::QCaseInsensitiveLatin1Hash foldCase;
+ qsizetype bufferSize = std::min(m_pattern.size(), qsizetype(sizeof m_foldBuffer));
+ for (qsizetype i = 0; i < bufferSize; ++i)
+ m_foldBuffer[i] = static_cast<char>(foldCase(m_pattern[i].toLatin1()));
+
+ new (&m_caseInsensitiveSearcher)
+ CaseInsensitiveSearcher(m_foldBuffer, &m_foldBuffer[bufferSize]);
+ }
+}
+
+/*!
+ \internal
+*/
+void QLatin1StringMatcher::freeSearcher() noexcept
+{
+ if (m_cs == Qt::CaseSensitive)
+ m_caseSensitiveSearcher.~CaseSensitiveSearcher();
+ else
+ m_caseInsensitiveSearcher.~CaseInsensitiveSearcher();
+}
+
+/*!
+ Sets the \a pattern to search for. The string pointed to by the
+ QLatin1StringView must not be destroyed before the matcher is
+ destroyed, unless it is set to point to a different \a pattern
+ with longer lifetime first.
+
+ \sa pattern(), indexIn()
+*/
+void QLatin1StringMatcher::setPattern(QLatin1StringView pattern) noexcept
+{
+ if (m_pattern.latin1() == pattern.latin1() && m_pattern.size() == pattern.size())
+ return; // Same address and size
+
+ freeSearcher();
+ m_pattern = pattern;
+ setSearcher();
+}
+
+/*!
+ Returns the Latin-1 pattern that the matcher searches for.
+
+ \sa setPattern(), indexIn()
+*/
+QLatin1StringView QLatin1StringMatcher::pattern() const noexcept
+{
+ return m_pattern;
+}
+
+/*!
+ Sets the case sensitivity to \a cs.
+
+ \sa caseSensitivity(), indexIn()
+*/
+void QLatin1StringMatcher::setCaseSensitivity(Qt::CaseSensitivity cs) noexcept
+{
+ if (m_cs == cs)
+ return;
+
+ freeSearcher();
+ m_cs = cs;
+ setSearcher();
+}
+
+/*!
+ Returns the case sensitivity the matcher uses.
+
+ \sa setCaseSensitivity(), indexIn()
+*/
+Qt::CaseSensitivity QLatin1StringMatcher::caseSensitivity() const noexcept
+{
+ return m_cs;
+}
+
+/*!
+ Searches for the pattern in the given \a haystack starting from
+ \a from.
+
+ \sa caseSensitivity(), pattern()
+*/
+qsizetype QLatin1StringMatcher::indexIn(QLatin1StringView haystack, qsizetype from) const noexcept
+{
+ if (m_pattern.isEmpty() && from == haystack.size())
+ return from;
+ if (from < 0) // Historical behavior (see QString::indexOf and co.)
+ from += haystack.size();
+ if (from >= haystack.size())
+ return -1;
+
+ auto begin = haystack.begin() + from;
+ auto end = haystack.end();
+ auto found = begin;
+ if (m_cs == Qt::CaseSensitive) {
+ found = m_caseSensitiveSearcher(begin, end, m_pattern.begin(), m_pattern.end()).begin;
+ if (found == end)
+ return -1;
+ } else {
+ const qsizetype bufferSize = std::min(m_pattern.size(), qsizetype(sizeof m_foldBuffer));
+ const QLatin1StringView restNeedle = m_pattern.sliced(bufferSize);
+ const bool needleLongerThanBuffer = restNeedle.size() > 0;
+ QLatin1StringView restHaystack = haystack;
+ do {
+ found = m_caseInsensitiveSearcher(found, end, m_foldBuffer, &m_foldBuffer[bufferSize])
+ .begin;
+ if (found == end) {
+ return -1;
+ } else if (!needleLongerThanBuffer) {
+ break;
+ }
+ restHaystack = haystack.sliced(
+ qMin(haystack.size(),
+ bufferSize + qsizetype(std::distance(haystack.begin(), found))));
+ if (restHaystack.startsWith(restNeedle, Qt::CaseInsensitive))
+ break;
+ ++found;
+ } while (true);
+ }
+ return std::distance(haystack.begin(), found);
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/text/qlatin1stringmatcher.h b/src/corelib/text/qlatin1stringmatcher.h
new file mode 100644
index 0000000000..3b8c24fc92
--- /dev/null
+++ b/src/corelib/text/qlatin1stringmatcher.h
@@ -0,0 +1,172 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QLATIN1STRINGMATCHER_H
+#define QLATIN1STRINGMATCHER_H
+
+#include <functional>
+#include <iterator>
+#include <limits>
+
+#include <QtCore/q20algorithm.h>
+#include <QtCore/qstring.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate {
+template<class RandomIt1,
+ class Hash = std::hash<typename std::iterator_traits<RandomIt1>::value_type>,
+ class BinaryPredicate = std::equal_to<>>
+class q_boyer_moore_searcher_hashed_needle
+{
+public:
+ constexpr q_boyer_moore_searcher_hashed_needle(RandomIt1 pat_first, RandomIt1 pat_last)
+ : m_skiptable{}
+ {
+ const size_t n = std::distance(pat_first, pat_last);
+ constexpr auto uchar_max = (std::numeric_limits<uchar>::max)();
+ uchar max = n > uchar_max ? uchar_max : uchar(n);
+ q20::fill(std::begin(m_skiptable), std::end(m_skiptable), max);
+
+ RandomIt1 pattern = pat_first;
+ pattern += n - max;
+ while (max--)
+ m_skiptable[uchar(*pattern++)] = max;
+ }
+
+ template<class RandomIt2>
+ constexpr auto operator()(RandomIt2 first, RandomIt2 last, RandomIt1 pat_first,
+ RandomIt1 pat_last) const
+ {
+ struct R
+ {
+ RandomIt2 begin, end;
+ };
+ Hash hf;
+ BinaryPredicate pred;
+ auto pat_length = std::distance(pat_first, pat_last);
+ if (pat_length == 0)
+ return R{ first, first };
+
+ const qsizetype pl_minus_one = qsizetype(pat_length - 1);
+ RandomIt2 current = first + pl_minus_one;
+
+ while (current < last) {
+ qsizetype skip = m_skiptable[hf(*current)];
+ if (!skip) {
+ // possible match
+ while (skip < pat_length) {
+ if (!pred(hf(*(current - skip)), uchar(pat_first[pl_minus_one - skip])))
+ break;
+ skip++;
+ }
+ if (skip > pl_minus_one) { // we have a match
+ auto match = current - skip + 1;
+ return R{ match, match + pat_length };
+ }
+
+ // If we don't have a match we are a bit inefficient as we only skip by one
+ // when we have the non matching char in the string.
+ if (m_skiptable[hf(*(current - skip))] == pat_length)
+ skip = pat_length - skip;
+ else
+ skip = 1;
+ }
+ current += skip;
+ }
+
+ return R{ last, last };
+ }
+
+private:
+ alignas(16) uchar m_skiptable[256];
+};
+
+struct QCaseSensitiveLatin1Hash
+{
+ constexpr QCaseSensitiveLatin1Hash() = default;
+
+ constexpr std::size_t operator()(char c) const noexcept { return std::size_t(uchar(c)); }
+};
+
+struct QCaseInsensitiveLatin1Hash
+{
+ constexpr QCaseInsensitiveLatin1Hash() = default;
+
+ constexpr std::size_t operator()(char c) const noexcept
+ {
+ return std::size_t(latin1Lower[uchar(c)]);
+ }
+
+ static int difference(char lhs, char rhs)
+ {
+ return int(latin1Lower[uchar(lhs)]) - int(latin1Lower[uchar(rhs)]);
+ }
+
+ static auto matcher(char ch)
+ {
+ return [sought = latin1Lower[uchar(ch)]](char other) {
+ return latin1Lower[uchar(other)] == sought;
+ };
+ }
+
+private:
+ static constexpr uchar latin1Lower[256] = {
+ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+ 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
+ 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
+ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+ 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
+ 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x5e,0x5f,
+ 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
+ 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
+ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
+ 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
+ 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
+ 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
+ // 0xd7 (multiplication sign) and 0xdf (sz ligature) complicate life
+ 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
+ 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xd7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xdf,
+ 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
+ 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
+ };
+};
+}
+
+class QLatin1StringMatcher
+{
+public:
+ Q_CORE_EXPORT QLatin1StringMatcher() noexcept;
+ Q_CORE_EXPORT explicit QLatin1StringMatcher(
+ QLatin1StringView pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+ Q_CORE_EXPORT ~QLatin1StringMatcher() noexcept;
+
+ Q_CORE_EXPORT void setPattern(QLatin1StringView pattern) noexcept;
+ Q_CORE_EXPORT QLatin1StringView pattern() const noexcept;
+ Q_CORE_EXPORT void setCaseSensitivity(Qt::CaseSensitivity cs) noexcept;
+ Q_CORE_EXPORT Qt::CaseSensitivity caseSensitivity() const noexcept;
+
+ Q_CORE_EXPORT qsizetype indexIn(QLatin1StringView haystack, qsizetype from = 0) const noexcept;
+
+private:
+ void setSearcher() noexcept;
+ void freeSearcher() noexcept;
+
+ QLatin1StringView m_pattern;
+ Qt::CaseSensitivity m_cs;
+ typedef QtPrivate::q_boyer_moore_searcher_hashed_needle<const char *,
+ QtPrivate::QCaseSensitiveLatin1Hash>
+ CaseSensitiveSearcher;
+ typedef QtPrivate::q_boyer_moore_searcher_hashed_needle<const char *,
+ QtPrivate::QCaseInsensitiveLatin1Hash>
+ CaseInsensitiveSearcher;
+ union {
+ CaseSensitiveSearcher m_caseSensitiveSearcher;
+ CaseInsensitiveSearcher m_caseInsensitiveSearcher;
+ };
+ char m_foldBuffer[256];
+};
+
+QT_END_NAMESPACE
+
+#endif // QLATIN1MATCHER_H
diff --git a/src/corelib/text/qlatin1stringview.h b/src/corelib/text/qlatin1stringview.h
new file mode 100644
index 0000000000..91392d9540
--- /dev/null
+++ b/src/corelib/text/qlatin1stringview.h
@@ -0,0 +1,375 @@
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// Copyright (C) 2019 Mail.ru Group.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QLATIN1STRINGVIEW_H
+#define QLATIN1STRINGVIEW_H
+
+#include <QtCore/qchar.h>
+#include <QtCore/qcompare.h>
+#include <QtCore/qnamespace.h>
+#include <QtCore/qtversionchecks.h>
+#include <QtCore/qstringview.h>
+
+#if 0
+// Workaround for generating forward headers
+#pragma qt_class(QLatin1String)
+#pragma qt_class(QLatin1StringView)
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QString;
+
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED) || defined(Q_QDOC)
+# define Q_L1S_VIEW_IS_PRIMARY
+class QLatin1StringView
+#else
+class QLatin1String
+#endif
+{
+public:
+#ifdef Q_L1S_VIEW_IS_PRIMARY
+ constexpr QLatin1StringView() noexcept {}
+ constexpr QLatin1StringView(std::nullptr_t) noexcept : QLatin1StringView() {}
+ constexpr explicit QLatin1StringView(const char *s) noexcept
+ : QLatin1StringView(s, s ? qsizetype(QtPrivate::lengthHelperPointer(s)) : 0) {}
+ constexpr QLatin1StringView(const char *f, const char *l)
+ : QLatin1StringView(f, qsizetype(l - f)) {}
+ constexpr QLatin1StringView(const char *s, qsizetype sz) noexcept : m_data(s), m_size(sz) {}
+ explicit QLatin1StringView(const QByteArray &s) noexcept
+ : QLatin1StringView(s.constData(), s.size()) {}
+ constexpr explicit QLatin1StringView(QByteArrayView s) noexcept
+ : QLatin1StringView(s.constData(), s.size()) {}
+#else
+ constexpr QLatin1String() noexcept : m_size(0), m_data(nullptr) {}
+ Q_WEAK_OVERLOAD
+ constexpr QLatin1String(std::nullptr_t) noexcept : QLatin1String() {}
+ constexpr explicit QLatin1String(const char *s) noexcept
+ : m_size(s ? qsizetype(QtPrivate::lengthHelperPointer(s)) : 0), m_data(s) {}
+ constexpr QLatin1String(const char *f, const char *l)
+ : QLatin1String(f, qsizetype(l - f)) {}
+ constexpr QLatin1String(const char *s, qsizetype sz) noexcept : m_size(sz), m_data(s) {}
+ explicit QLatin1String(const QByteArray &s) noexcept : m_size(s.size()), m_data(s.constData()) {}
+ constexpr explicit QLatin1String(QByteArrayView s) noexcept : m_size(s.size()), m_data(s.data()) {}
+#endif // !Q_L1S_VIEW_IS_PRIMARY
+
+ inline QString toString() const;
+
+ constexpr const char *latin1() const noexcept { return m_data; }
+ constexpr qsizetype size() const noexcept { return m_size; }
+ constexpr const char *data() const noexcept { return m_data; }
+ [[nodiscard]] constexpr const char *constData() const noexcept { return data(); }
+ [[nodiscard]] constexpr const char *constBegin() const noexcept { return begin(); }
+ [[nodiscard]] constexpr const char *constEnd() const noexcept { return end(); }
+
+ [[nodiscard]] constexpr QLatin1Char first() const { return front(); }
+ [[nodiscard]] constexpr QLatin1Char last() const { return back(); }
+
+ [[nodiscard]] constexpr qsizetype length() const noexcept { return size(); }
+
+ constexpr bool isNull() const noexcept { return !data(); }
+ constexpr bool isEmpty() const noexcept { return !size(); }
+
+ [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; }
+
+ template <typename...Args>
+ [[nodiscard]] inline QString arg(Args &&...args) const;
+
+ [[nodiscard]] constexpr QLatin1Char at(qsizetype i) const
+ {
+ Q_ASSERT(i >= 0);
+ Q_ASSERT(i < size());
+ return QLatin1Char(m_data[i]);
+ }
+ [[nodiscard]] constexpr QLatin1Char operator[](qsizetype i) const { return at(i); }
+
+ [[nodiscard]] constexpr QLatin1Char front() const { return at(0); }
+ [[nodiscard]] constexpr QLatin1Char back() const { return at(size() - 1); }
+
+ [[nodiscard]] int compare(QStringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::compareStrings(*this, other, cs); }
+ [[nodiscard]] int compare(QLatin1StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::compareStrings(*this, other, cs); }
+ [[nodiscard]] inline int compare(QUtf8StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] constexpr int compare(QChar c) const noexcept
+ { return isEmpty() ? -1 : front() == c ? int(size() > 1) : uchar(m_data[0]) - c.unicode(); }
+ [[nodiscard]] int compare(QChar c, Qt::CaseSensitivity cs) const noexcept
+ { return QtPrivate::compareStrings(*this, QStringView(&c, 1), cs); }
+
+ [[nodiscard]] bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::startsWith(*this, s, cs); }
+ [[nodiscard]] bool startsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::startsWith(*this, s, cs); }
+ [[nodiscard]] constexpr bool startsWith(QChar c) const noexcept
+ { return !isEmpty() && front() == c; }
+ [[nodiscard]] bool startsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
+ { return QtPrivate::startsWith(*this, QStringView(&c, 1), cs); }
+
+ [[nodiscard]] bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::endsWith(*this, s, cs); }
+ [[nodiscard]] bool endsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::endsWith(*this, s, cs); }
+ [[nodiscard]] constexpr bool endsWith(QChar c) const noexcept
+ { return !isEmpty() && back() == c; }
+ [[nodiscard]] bool endsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
+ { return QtPrivate::endsWith(*this, QStringView(&c, 1), cs); }
+
+ [[nodiscard]] qsizetype indexOf(QStringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::findString(*this, from, s, cs); }
+ [[nodiscard]] qsizetype indexOf(QLatin1StringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::findString(*this, from, s, cs); }
+ [[nodiscard]] qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::findString(*this, from, QStringView(&c, 1), cs); }
+
+ [[nodiscard]] bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return indexOf(s, 0, cs) != -1; }
+ [[nodiscard]] bool contains(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return indexOf(s, 0, cs) != -1; }
+ [[nodiscard]] bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return indexOf(QStringView(&c, 1), 0, cs) != -1; }
+
+ [[nodiscard]] qsizetype lastIndexOf(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(s, size(), cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QStringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::lastIndexOf(*this, from, s, cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(s, size(), cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::lastIndexOf(*this, from, s, cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(c, -1, cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::lastIndexOf(*this, from, QStringView(&c, 1), cs); }
+
+ [[nodiscard]] qsizetype count(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ { return QtPrivate::count(*this, str, cs); }
+ [[nodiscard]] qsizetype count(QLatin1StringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ { return QtPrivate::count(*this, str, cs); }
+ [[nodiscard]] qsizetype count(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::count(*this, ch, cs); }
+
+ [[nodiscard]] short toShort(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<short>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] ushort toUShort(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<ushort>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] int toInt(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<int>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] uint toUInt(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<uint>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] long toLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<long>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] ulong toULong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<ulong>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] qlonglong toLongLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<qlonglong>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] qulonglong toULongLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<qulonglong>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] float toFloat(bool *ok = nullptr) const
+ {
+ const auto r = QtPrivate::toFloat(*this);
+ if (ok)
+ *ok = bool(r);
+ return r.value_or(0.0f);
+ }
+ [[nodiscard]] double toDouble(bool *ok = nullptr) const
+ {
+ const auto r = QtPrivate::toDouble(*this);
+ if (ok)
+ *ok = bool(r);
+ return r.value_or(0.0);
+ }
+
+ using value_type = const char;
+ using pointer = value_type*;
+ using const_pointer = pointer;
+ using reference = value_type&;
+ using const_reference = reference;
+ using iterator = value_type*;
+ using const_iterator = iterator;
+ using difference_type = qsizetype; // violates Container concept requirements
+ using size_type = qsizetype; // violates Container concept requirements
+
+ constexpr const_iterator begin() const noexcept { return data(); }
+ constexpr const_iterator cbegin() const noexcept { return data(); }
+ constexpr const_iterator end() const noexcept { return data() + size(); }
+ constexpr const_iterator cend() const noexcept { return data() + size(); }
+
+ using reverse_iterator = std::reverse_iterator<iterator>;
+ using const_reverse_iterator = reverse_iterator;
+
+ const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
+
+ [[nodiscard]] constexpr QLatin1StringView mid(qsizetype pos, qsizetype n = -1) const
+ {
+ using namespace QtPrivate;
+ auto result = QContainerImplHelper::mid(size(), &pos, &n);
+ return result == QContainerImplHelper::Null ? QLatin1StringView()
+ : QLatin1StringView(m_data + pos, n);
+ }
+ [[nodiscard]] constexpr QLatin1StringView left(qsizetype n) const
+ {
+ if (size_t(n) >= size_t(size()))
+ n = size();
+ return {m_data, n};
+ }
+ [[nodiscard]] constexpr QLatin1StringView right(qsizetype n) const
+ {
+ if (size_t(n) >= size_t(size()))
+ n = size();
+ return {m_data + m_size - n, n};
+ }
+
+ [[nodiscard]] constexpr QLatin1StringView sliced(qsizetype pos) const
+ { verify(pos, 0); return {m_data + pos, m_size - pos}; }
+ [[nodiscard]] constexpr QLatin1StringView sliced(qsizetype pos, qsizetype n) const
+ { verify(pos, n); return {m_data + pos, n}; }
+ [[nodiscard]] constexpr QLatin1StringView first(qsizetype n) const
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] constexpr QLatin1StringView last(qsizetype n) const
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] constexpr QLatin1StringView chopped(qsizetype n) const
+ { verify(0, n); return sliced(0, size() - n); }
+
+ constexpr void chop(qsizetype n)
+ { verify(0, n); m_size -= n; }
+ constexpr void truncate(qsizetype n)
+ { verify(0, n); m_size = n; }
+
+ [[nodiscard]] QLatin1StringView trimmed() const noexcept { return QtPrivate::trimmed(*this); }
+
+ template <typename Needle, typename...Flags>
+ [[nodiscard]] constexpr auto tokenize(Needle &&needle, Flags...flags) const
+ noexcept(noexcept(qTokenize(std::declval<const QLatin1StringView &>(),
+ std::forward<Needle>(needle), flags...)))
+ -> decltype(qTokenize(*this, std::forward<Needle>(needle), flags...))
+ { return qTokenize(*this, std::forward<Needle>(needle), flags...); }
+
+ friend bool comparesEqual(const QLatin1StringView &s1, const QLatin1StringView &s2) noexcept
+ { return s1.size() == s2.size() && QtPrivate::equalStrings(s1, s2); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QLatin1StringView &s1, const QLatin1StringView &s2) noexcept
+ {
+ const int res = QtPrivate::compareStrings(s1, s2);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView)
+
+ // QChar <> QLatin1StringView
+ friend bool comparesEqual(const QLatin1StringView &lhs, QChar rhs) noexcept
+ { return lhs.size() == 1 && rhs == lhs.front(); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QLatin1StringView &lhs, QChar rhs) noexcept
+ {
+ // negate, as the helper function expects QChar as lhs
+ const int res = -compare_helper(&rhs, 1, lhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView, QChar)
+
+ // QStringView <> QLatin1StringView
+ friend bool comparesEqual(const QLatin1StringView &lhs, const QStringView &rhs) noexcept
+ { return lhs.size() == rhs.size() && QtPrivate::equalStrings(lhs, rhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QLatin1StringView &lhs, const QStringView &rhs) noexcept
+ {
+ const int res = QtPrivate::compareStrings(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView, QStringView)
+
+ // Reversed helper methods for QStringView <> QLatin1StringView comparison.
+ // If we do not provide them explicitly, QStringView <> QByteArrayView
+ // overloads will be selected, which will provide wrong results, because
+ // they will convert from utf-8
+ friend bool comparesEqual(const QStringView &lhs, const QLatin1StringView &rhs) noexcept
+ { return comparesEqual(rhs, lhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QStringView &lhs, const QLatin1StringView &rhs) noexcept
+ { return QtOrderingPrivate::reversed(compareThreeWay(rhs, lhs)); }
+
+private:
+ friend bool comparesEqual(const QLatin1StringView &lhs, const QByteArrayView &rhs) noexcept
+ { return equal_helper(lhs, rhs.data(), rhs.size()); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QLatin1StringView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ const int res = compare_helper(lhs, rhs.data(), rhs.size());
+ return Qt::compareThreeWay(res, 0);
+ }
+
+ // Reversed helper methods for QByteArrayView <> QLatin1StringView comparison.
+ // If we do not provide them explicitly, QByteArrayView <> QByteArrayView
+ // overloads will be selected, which will provide wrong results
+ friend bool comparesEqual(const QByteArrayView &lhs, const QLatin1StringView &rhs) noexcept
+ { return comparesEqual(rhs, lhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QByteArrayView &lhs, const QLatin1StringView &rhs) noexcept
+ { return QtOrderingPrivate::reversed(compareThreeWay(rhs, lhs)); }
+
+public:
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView, QByteArrayView, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView, QByteArray, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView, const char *, QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+
+private:
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= size());
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= size() - pos);
+ }
+ static int compare_helper(const QLatin1StringView &s1, const char *s2) noexcept
+ { return compare_helper(s1, s2, qstrlen(s2)); }
+ Q_CORE_EXPORT static bool equal_helper(QLatin1StringView s1, const char *s2, qsizetype len) noexcept;
+ Q_CORE_EXPORT static int compare_helper(const QLatin1StringView &s1, const char *s2, qsizetype len) noexcept;
+ Q_CORE_EXPORT static int compare_helper(const QChar *data1, qsizetype length1,
+ QLatin1StringView s2,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+ const char *m_data = nullptr;
+ qsizetype m_size = 0;
+#else
+ qsizetype m_size;
+ const char *m_data;
+#endif
+};
+#ifdef Q_L1S_VIEW_IS_PRIMARY
+Q_DECLARE_TYPEINFO(QLatin1StringView, Q_RELOCATABLE_TYPE);
+#else
+Q_DECLARE_TYPEINFO(QLatin1String, Q_RELOCATABLE_TYPE);
+#endif
+
+constexpr QByteArrayView::QByteArrayView(QLatin1StringView v) noexcept
+ : QByteArrayView(v.data(), v.size())
+{}
+
+namespace Qt {
+inline namespace Literals {
+inline namespace StringLiterals {
+
+constexpr inline QLatin1StringView operator""_L1(const char *str, size_t size) noexcept
+{
+ return {str, qsizetype(size)};
+}
+
+} // StringLiterals
+} // Literals
+} // Qt
+
+QT_END_NAMESPACE
+
+#ifdef Q_L1S_VIEW_IS_PRIMARY
+# undef Q_L1S_VIEW_IS_PRIMARY
+#endif
+
+#endif // QLATIN1STRINGVIEW_H
diff --git a/src/corelib/text/qlatin1stringview.qdoc b/src/corelib/text/qlatin1stringview.qdoc
new file mode 100644
index 0000000000..711057767b
--- /dev/null
+++ b/src/corelib/text/qlatin1stringview.qdoc
@@ -0,0 +1,1295 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// Copyright (C) 2019 Mail.ru Group.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*! \class QLatin1StringView
+ \inmodule QtCore
+ \brief The QLatin1StringView class provides a thin wrapper around
+ a US-ASCII/Latin-1 encoded string literal.
+
+ \ingroup string-processing
+ \reentrant
+
+ \compares strong
+ \compareswith strong char16_t QChar QStringView QUtf8StringView QString \
+ {const char16_t *}
+ \endcompareswith
+ \compareswith strong {const char *} QByteArray QByteArrayView
+ The byte array data is interpreted as utf-8.
+ \endcompareswith
+
+ Many of QString's member functions are overloaded to accept
+ \c{const char *} instead of QString. This includes the copy
+ constructor, the assignment operator, the comparison operators,
+ and various other functions such as \l{QString::insert()}{insert()},
+ \l{QString::append()}{append()}, and \l{QString::prepend()}{prepend()}.
+ Some of these functions are optimized to avoid constructing a
+ QString object for the \c{const char *} data. For example,
+ assuming \c str is a QString,
+
+ \snippet code/src_corelib_text_qstring.cpp 3
+
+ is much faster than
+
+ \snippet code/src_corelib_text_qstring.cpp 4
+
+ because it doesn't construct four temporary QString objects and
+ make a deep copy of the character data.
+
+ However, that is not true for all QString member functions that take
+ \c{const char *} and therefore applications should assume a temporary will
+ be created, such as in
+
+ \snippet code/src_corelib_text_qstring.cpp 4bis
+
+ Applications that define \l QT_NO_CAST_FROM_ASCII (as explained
+ in the QString documentation) don't have access to QString's
+ \c{const char *} API. To provide an efficient way of specifying
+ constant Latin-1 strings, Qt provides the QLatin1StringView, which is
+ just a very thin wrapper around a \c{const char *}. Using
+ QLatin1StringView, the example code above becomes
+
+ \snippet code/src_corelib_text_qstring.cpp 5
+
+ This is a bit longer to type, but it provides exactly the same
+ benefits as the first version of the code, and is faster than
+ converting the Latin-1 strings using QString::fromLatin1().
+
+ Thanks to the QString(QLatin1StringView) constructor,
+ QLatin1StringView can be used everywhere a QString is expected. For
+ example:
+
+ \snippet code/src_corelib_text_qstring.cpp 6
+
+ \note If the function you're calling with a QLatin1StringView
+ argument isn't actually overloaded to take QLatin1StringView, the
+ implicit conversion to QString will trigger a memory allocation,
+ which is usually what you want to avoid by using QLatin1StringView
+ in the first place. In those cases, using QStringLiteral may be
+ the better option.
+
+ \sa QString, QLatin1Char, {QStringLiteral()}{QStringLiteral},
+ QT_NO_CAST_FROM_ASCII
+*/
+
+/*!
+ \class QLatin1String
+ \inmodule QtCore
+ \brief QLatin1String is the same as QLatin1StringView.
+
+ QLatin1String is a view to a Latin-1 string. It's the same as
+ QLatin1StringView and is kept for compatibility reasons. It is
+ recommended to use QLatin1StringView instead.
+
+ Please see the QLatin1StringView documentation for details.
+*/
+
+/*!
+ \typedef QLatin1StringView::value_type
+ \since 5.10
+
+ Alias for \c{const char}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QLatin1StringView::difference_type
+ \since 5.10
+
+ Alias for \c{qsizetype}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QLatin1StringView::size_type
+ \since 5.10
+
+ Alias for \c{qsizetype}. Provided for compatibility with the STL.
+
+ \note In version prior to Qt 6, this was an alias for \c{int},
+ restricting the amount of data that could be held in a QLatin1StringView
+ on 64-bit architectures.
+*/
+
+/*!
+ \typedef QLatin1StringView::pointer
+ \typedef QLatin1StringView::const_pointer
+ \since 6.7
+
+ Alias for \c{value_type *}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QLatin1StringView::reference
+ \since 5.10
+
+ Alias for \c{value_type &}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QLatin1StringView::const_reference
+ \since 5.11
+
+ Alias for \c{reference}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QLatin1StringView::iterator
+ \since 5.10
+
+ QLatin1StringView does not support mutable iterators, so this is the same
+ as const_iterator.
+
+ \sa const_iterator, reverse_iterator
+*/
+
+/*!
+ \typedef QLatin1StringView::const_iterator
+ \since 5.10
+
+ \sa iterator, const_reverse_iterator
+*/
+
+/*!
+ \typedef QLatin1StringView::reverse_iterator
+ \since 5.10
+
+ QLatin1StringView does not support mutable reverse iterators, so this is the
+ same as const_reverse_iterator.
+
+ \sa const_reverse_iterator, iterator
+*/
+
+/*!
+ \typedef QLatin1StringView::const_reverse_iterator
+ \since 5.10
+
+ \sa reverse_iterator, const_iterator
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView()
+ \since 5.6
+
+ Constructs a QLatin1StringView object that stores a \nullptr.
+
+ \sa data(), isEmpty(), isNull(), {Distinction Between Null and Empty Strings}
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView(std::nullptr_t)
+ \since 6.4
+
+ Constructs a QLatin1StringView object that stores a \nullptr.
+
+ \sa data(), isEmpty(), isNull(), {Distinction Between Null and Empty Strings}
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView(const char *str)
+
+ Constructs a QLatin1StringView object that stores \a str.
+
+ The string data is \e not copied. The caller must be able to
+ guarantee that \a str will not be deleted or modified as long as
+ the QLatin1StringView object exists.
+
+ \sa latin1()
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView(const char *str, qsizetype size)
+
+ Constructs a QLatin1StringView object that stores \a str with \a size.
+
+ The string data is \e not copied. The caller must be able to
+ guarantee that \a str will not be deleted or modified as long as
+ the QLatin1StringView object exists.
+
+ \note: any null ('\\0') bytes in the byte array will be included in this
+ string, which will be converted to Unicode null characters (U+0000) if this
+ string is used by QString. This behavior is different from Qt 5.x.
+
+ \sa latin1()
+*/
+
+/*!
+ \fn QLatin1StringView::QLatin1StringView(const char *first, const char *last)
+ \since 5.10
+
+ Constructs a QLatin1StringView object that stores \a first with length
+ (\a last - \a first).
+
+ The range \c{[first,last)} must remain valid for the lifetime of
+ this Latin-1 string object.
+
+ Passing \nullptr as \a first is safe if \a last is \nullptr,
+ too, and results in a null Latin-1 string.
+
+ The behavior is undefined if \a last precedes \a first, \a first
+ is \nullptr and \a last is not, or if \c{last - first >
+ INT_MAX}.
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView(const QByteArray &str)
+
+ Constructs a QLatin1StringView object as a view on \a str.
+
+ The string data is \e not copied. The caller must be able to
+ guarantee that \a str will not be deleted or modified as long as
+ the QLatin1StringView object exists.
+
+ \sa latin1()
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView(QByteArrayView str)
+ \since 6.3
+
+ Constructs a QLatin1StringView object as a view on \a str.
+
+ The string data is \e not copied. The caller must be able to
+ guarantee that the data which \a str is pointing to will not
+ be deleted or modified as long as the QLatin1StringView object
+ exists. The size is obtained from \a str as-is, without checking
+ for a null-terminator.
+
+ \note: any null ('\\0') bytes in the byte array will be included in this
+ string, which will be converted to Unicode null characters (U+0000) if this
+ string is used by QString.
+
+ \sa latin1()
+*/
+
+/*!
+ \fn QString QLatin1StringView::toString() const
+ \since 6.0
+
+ Converts this Latin-1 string into a QString. Equivalent to
+ \code
+ return QString(*this);
+ \endcode
+*/
+
+/*! \fn const char *QLatin1StringView::latin1() const
+
+ Returns the start of the Latin-1 string referenced by this object.
+*/
+
+/*! \fn const char *QLatin1StringView::data() const
+
+ Returns the start of the Latin-1 string referenced by this object.
+*/
+
+/*! \fn const char *QLatin1StringView::constData() const
+ \since 6.4
+
+ Returns the start of the Latin-1 string referenced by this object.
+
+ This function is provided for compatibility with other Qt containers.
+
+ \sa data()
+*/
+
+/*! \fn qsizetype QLatin1StringView::size() const
+
+ Returns the size of the Latin-1 string referenced by this object.
+
+ \note In version prior to Qt 6, this function returned \c{int},
+ restricting the amount of data that could be held in a QLatin1StringView
+ on 64-bit architectures.
+*/
+
+/*! \fn qsizetype QLatin1StringView::length() const
+ \since 6.4
+
+ Same as size().
+
+ This function is provided for compatibility with other Qt containers.
+*/
+
+/*! \fn bool QLatin1StringView::isNull() const
+ \since 5.10
+
+ Returns whether the Latin-1 string referenced by this object is null
+ (\c{data() == nullptr}) or not.
+
+ \sa isEmpty(), data()
+*/
+
+/*! \fn bool QLatin1StringView::isEmpty() const
+ \since 5.10
+
+ Returns whether the Latin-1 string referenced by this object is empty
+ (\c{size() == 0}) or not.
+
+ \sa isNull(), size()
+*/
+
+/*! \fn bool QLatin1StringView::empty() const
+ \since 6.4
+
+ Returns whether the Latin-1 string referenced by this object is empty
+ (\c{size() == 0}) or not.
+
+ This function is provided for STL compatibility.
+
+ \sa isEmpty(), isNull(), size()
+*/
+
+/*! \fn QLatin1Char QLatin1StringView::at(qsizetype pos) const
+ \since 5.8
+
+ Returns the character at position \a pos in this object.
+
+ \note This function performs no error checking.
+ The behavior is undefined when \a pos < 0 or \a pos >= size().
+
+ \sa operator[]()
+*/
+
+/*! \fn QLatin1Char QLatin1StringView::operator[](qsizetype pos) const
+ \since 5.8
+
+ Returns the character at position \a pos in this object.
+
+ \note This function performs no error checking.
+ The behavior is undefined when \a pos < 0 or \a pos >= size().
+
+ \sa at()
+*/
+
+/*!
+ \fn QLatin1Char QLatin1StringView::front() const
+ \since 5.10
+
+ Returns the first character in the string.
+ Same as \c{at(0)}.
+
+ This function is provided for STL compatibility.
+
+ \warning Calling this function on an empty string constitutes
+ undefined behavior.
+
+ \sa back(), at(), operator[]()
+*/
+
+/*!
+ \fn QLatin1Char QLatin1StringView::first() const
+ \since 6.4
+
+ Returns the first character in the string.
+ Same as \c{at(0)} or front().
+
+ This function is provided for compatibility with other Qt containers.
+
+ \warning Calling this function on an empty string constitutes
+ undefined behavior.
+
+ \sa last(), front(), back()
+*/
+
+/*!
+ \fn QLatin1Char QLatin1StringView::back() const
+ \since 5.10
+
+ Returns the last character in the string.
+ Same as \c{at(size() - 1)}.
+
+ This function is provided for STL compatibility.
+
+ \warning Calling this function on an empty string constitutes
+ undefined behavior.
+
+ \sa front(), at(), operator[]()
+*/
+
+/*!
+ \fn QLatin1Char QLatin1StringView::last() const
+ \since 6.4
+
+ Returns the last character in the string.
+ Same as \c{at(size() - 1)} or back().
+
+ This function is provided for compatibility with other Qt containers.
+
+ \warning Calling this function on an empty string constitutes
+ undefined behavior.
+
+ \sa first(), back(), front()
+*/
+
+/*!
+ \fn int QLatin1StringView::compare(QStringView str, Qt::CaseSensitivity cs) const
+ \fn int QLatin1StringView::compare(QLatin1StringView l1, Qt::CaseSensitivity cs) const
+ \fn int QLatin1StringView::compare(QChar ch) const
+ \fn int QLatin1StringView::compare(QChar ch, Qt::CaseSensitivity cs) const
+ \since 5.14
+
+ Compares this string view with UTF-16 string view \a str, Latin-1 string view \a l1,
+ or the character \a ch, respectively. Returns a negative integer if this
+ string is less than \a str, \a l1 or \a ch, returns a positive integer if it
+ is greater than \a str, \a l1 or \a ch, and zero if they are equal.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa operator==(), operator<(), operator>()
+*/
+
+/*!
+ \fn int QLatin1StringView::compare(QUtf8StringView str, Qt::CaseSensitivity cs) const
+ \since 6.5
+
+ Compares this string view with \a str and returns a negative integer if
+ this string view is less than \a str, a positive integer if it is greater than
+ \a str, and zero if they are equal.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
+
+ \sa operator==(), operator<(), operator>()
+*/
+
+
+/*!
+ \fn bool QLatin1StringView::startsWith(QStringView str, Qt::CaseSensitivity cs) const
+ \since 5.10
+ \fn bool QLatin1StringView::startsWith(QLatin1StringView l1, Qt::CaseSensitivity cs) const
+ \since 5.10
+ \fn bool QLatin1StringView::startsWith(QChar ch) const
+ \since 5.10
+ \fn bool QLatin1StringView::startsWith(QChar ch, Qt::CaseSensitivity cs) const
+ \since 5.10
+
+ Returns \c true if this Latin-1 string view starts with the UTF-16
+ string viewed by \a str, the Latin-1 string viewed by \a l1, or the
+ character \a ch, respectively; otherwise returns \c false.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa endsWith()
+*/
+
+/*!
+ \fn bool QLatin1StringView::endsWith(QStringView str, Qt::CaseSensitivity cs) const
+ \since 5.10
+ \fn bool QLatin1StringView::endsWith(QLatin1StringView l1, Qt::CaseSensitivity cs) const
+ \since 5.10
+ \fn bool QLatin1StringView::endsWith(QChar ch) const
+ \since 5.10
+ \fn bool QLatin1StringView::endsWith(QChar ch, Qt::CaseSensitivity cs) const
+ \since 5.10
+
+ Returns \c true if this Latin-1 string view ends with the UTF-16 string
+ viewed \a str, the Latin-1 string viewed by \a l1, or the character \a ch,
+ respectively; otherwise returns \c false.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa startsWith()
+*/
+
+/*!
+ \fn qsizetype QLatin1StringView::indexOf(QStringView str, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QLatin1StringView::indexOf(QLatin1StringView l1, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QLatin1StringView::indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \since 5.14
+
+ Returns the index position in this Latin-1 string view of the first
+ occurrence of the UTF-16 string viewed by \a str, the Latin-1 string
+ viewed by \a l1, or the character \a ch, respectively, searching forward
+ from index position \a from. Returns -1 if \a str, \a l1 or \a c is not
+ found, respectively.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ \sa QString::indexOf()
+*/
+
+/*!
+ \fn bool QLatin1StringView::contains(QStringView str, Qt::CaseSensitivity cs) const
+ \fn bool QLatin1StringView::contains(QLatin1StringView l1, Qt::CaseSensitivity cs) const
+ \fn bool QLatin1StringView::contains(QChar c, Qt::CaseSensitivity cs) const
+ \since 5.14
+
+ Returns \c true if this Latin-1 string view contains an occurrence of the
+ UTF-16 string viewed by \a str, the Latin-1 string viewed by \a l1, or the
+ character \a ch, respectively; otherwise returns \c false.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa indexOf(), QStringView::contains(), QStringView::indexOf(),
+ QString::indexOf()
+*/
+
+/*!
+ \fn qsizetype QLatin1StringView::lastIndexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QLatin1StringView::lastIndexOf(QLatin1StringView l1, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QLatin1StringView::lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs) const
+ \since 5.14
+
+ Returns the index position in this Latin-1 string view of the last
+ occurrence of the UTF-16 string viewed by \a str, the Latin-1 string
+ viewed by \a l1, or the character \a ch, respectively, searching backward
+ from index position \a from; returns -1 if \a str, \a l1 or \a ch is not
+ found, respectively.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \note When searching for a 0-length \a str or \a l1, the match at
+ the end of the data is excluded from the search by a negative \a
+ from, even though \c{-1} is normally thought of as searching from
+ the end of the string: the match at the end is \e after the last
+ character, so it is excluded. To include such a final empty match,
+ either give a positive value for \a from or omit the \a from
+ parameter entirely.
+
+ \sa indexOf(), QStringView::lastIndexOf(), QStringView::indexOf(),
+ QString::indexOf()
+*/
+
+/*!
+ \fn qsizetype QLatin1StringView::lastIndexOf(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QLatin1StringView::lastIndexOf(QLatin1StringView l1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \since 6.2
+ \overload lastIndexOf()
+
+ Returns the index position in this Latin-1 string view of the last
+ occurrence of the UTF-16 string viewed by \a str or the Latin-1 string
+ viewed by \a l1, respectively. Returns -1 if \a str or \a l1 is not found,
+ respectively.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+*/
+
+/*!
+ \fn qsizetype QLatin1StringView::lastIndexOf(QChar ch, Qt::CaseSensitivity cs) const
+ \since 6.3
+ \overload
+*/
+
+/*!
+ \fn qsizetype QLatin1StringView::count(QStringView str, Qt::CaseSensitivity cs) const
+ \fn qsizetype QLatin1StringView::count(QLatin1StringView l1, Qt::CaseSensitivity cs) const
+ \fn qsizetype QLatin1StringView::count(QChar ch, Qt::CaseSensitivity cs) const
+ \since 6.4
+
+ Returns the number of (potentially overlapping) occurrences of the
+ UTF-16 string viewed by \a str, the Latin-1 string viewed by \a l1,
+ or the character \a ch, respectively, in this string view.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa contains(), indexOf()
+*/
+
+/*!
+ \fn QLatin1StringView::const_iterator QLatin1StringView::begin() const
+ \since 5.10
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the
+ first character in the string.
+
+ This function is provided for STL compatibility.
+
+ \sa end(), cbegin(), rbegin(), data()
+*/
+
+/*!
+ \fn QLatin1StringView::const_iterator QLatin1StringView::cbegin() const
+ \since 5.10
+
+ Same as begin().
+
+ This function is provided for STL compatibility.
+
+ \sa cend(), begin(), crbegin(), data()
+*/
+
+/*!
+ \fn QLatin1StringView::const_iterator QLatin1StringView::constBegin() const
+ \since 6.4
+
+ Same as begin().
+
+ This function is provided for compatibility with other Qt containers.
+
+ \sa constEnd(), begin(), cbegin(), data()
+*/
+
+/*!
+ \fn QLatin1StringView::const_iterator QLatin1StringView::end() const
+ \since 5.10
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing just
+ after the last character in the string.
+
+ This function is provided for STL compatibility.
+
+ \sa begin(), cend(), rend()
+*/
+
+/*! \fn QLatin1StringView::const_iterator QLatin1StringView::cend() const
+ \since 5.10
+
+ Same as end().
+
+ This function is provided for STL compatibility.
+
+ \sa cbegin(), end(), crend()
+*/
+
+/*! \fn QLatin1StringView::const_iterator QLatin1StringView::constEnd() const
+ \since 6.4
+
+ Same as end().
+
+ This function is provided for compatibility with other Qt containers.
+
+ \sa constBegin(), end(), cend(), crend()
+*/
+
+/*!
+ \fn QLatin1StringView::const_reverse_iterator QLatin1StringView::rbegin() const
+ \since 5.10
+
+ Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing
+ to the first character in the string, in reverse order.
+
+ This function is provided for STL compatibility.
+
+ \sa rend(), crbegin(), begin()
+*/
+
+/*!
+ \fn QLatin1StringView::const_reverse_iterator QLatin1StringView::crbegin() const
+ \since 5.10
+
+ Same as rbegin().
+
+ This function is provided for STL compatibility.
+
+ \sa crend(), rbegin(), cbegin()
+*/
+
+/*!
+ \fn QLatin1StringView::const_reverse_iterator QLatin1StringView::rend() const
+ \since 5.10
+
+ Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing just
+ after the last character in the string, in reverse order.
+
+ This function is provided for STL compatibility.
+
+ \sa rbegin(), crend(), end()
+*/
+
+/*!
+ \fn QLatin1StringView::const_reverse_iterator QLatin1StringView::crend() const
+ \since 5.10
+
+ Same as rend().
+
+ This function is provided for STL compatibility.
+
+ \sa crbegin(), rend(), cend()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::mid(qsizetype start, qsizetype length) const
+ \since 5.8
+
+ Returns the substring of length \a length starting at position
+ \a start in this Latin-1 string view.
+
+ If you know that \a start and \a length cannot be out of bounds, use
+ sliced() instead in new code, because it is faster.
+
+ Returns an empty Latin-1 string view if \a start exceeds the length
+ of this string view. If there are less than \a length characters available
+ in this string view starting at \a start, or if \a length is negative
+ (default), the function returns all characters that are available from
+ \a start.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::left(qsizetype length) const
+ \since 5.8
+
+ If you know that \a length cannot be out of bounds, use first() instead in
+ new code, because it is faster.
+
+ Returns the substring of length \a length starting at position
+ 0 in this Latin-1 string view.
+
+ The entire Latin-1 string view is returned if \a length is greater
+ than or equal to size(), or less than zero.
+
+ \sa first(), last(), sliced(), startsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::right(qsizetype length) const
+ \since 5.8
+
+ If you know that \a length cannot be out of bounds, use last() instead in
+ new code, because it is faster.
+
+ Returns the substring of length \a length starting at position
+ size() - \a length in this Latin-1 string view.
+
+ The entire Latin-1 string view is returned if \a length is greater
+ than or equal to size(), or less than zero.
+
+ \sa first(), last(), sliced(), endsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::first(qsizetype n) const
+ \since 6.0
+
+ Returns a Latin-1 string view that contains the first \a n characters
+ of this string view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa last(), startsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::last(qsizetype n) const
+ \since 6.0
+
+ Returns a Latin-1 string view that contains the last \a n characters
+ of this string view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa first(), endsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::sliced(qsizetype pos, qsizetype n) const
+ \since 6.0
+
+ Returns a Latin-1 string view that points to \a n characters of this
+ string view, starting at position \a pos.
+
+//! [UB-sliced-index-length]
+ \note The behavior is undefined when \a pos < 0, \a n < 0,
+ or \c{pos + n > size()}.
+//! [UB-sliced-index-length]
+
+ \sa first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::sliced(qsizetype pos) const
+ \since 6.0
+
+ Returns a Latin-1 string view starting at position \a pos in this
+ string view, and extending to its end.
+
+//! [UB-sliced-index-only]
+ \note The behavior is undefined when \a pos < 0 or \a pos > size().
+//! [UB-sliced-index-only]
+
+ \sa first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::chopped(qsizetype length) const
+ \since 5.10
+
+ Returns the substring of length size() - \a length starting at the
+ beginning of this object.
+
+ Same as \c{left(size() - length)}.
+
+ \note The behavior is undefined when \a length < 0 or \a length > size().
+
+ \sa sliced(), first(), last(), chop(), truncate()
+*/
+
+/*!
+ \fn void QLatin1StringView::truncate(qsizetype length)
+ \since 5.10
+
+ Truncates this string to length \a length.
+
+ Same as \c{*this = left(length)}.
+
+ \note The behavior is undefined when \a length < 0 or \a length > size().
+
+ \sa sliced(), first(), last(), chopped(), chop()
+*/
+
+/*!
+ \fn void QLatin1StringView::chop(qsizetype length)
+ \since 5.10
+
+ Truncates this string by \a length characters.
+
+ Same as \c{*this = left(size() - length)}.
+
+ \note The behavior is undefined when \a length < 0 or \a length > size().
+
+ \sa sliced(), first(), last(), chopped(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::trimmed() const
+ \since 5.10
+
+ Strips leading and trailing whitespace and returns the result.
+
+ Whitespace means any character for which QChar::isSpace() returns
+ \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
+ '\\f', '\\r', and ' '.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator==(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is equal to const char pointer \a rhs;
+ otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator==(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator!=(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is not equal to const char pointer \a rhs;
+ otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator!=(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload operator!=()
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator>(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is lexically greater than const char pointer
+ \a rhs; otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
+ when you compile your applications. This can be useful if you want
+ to ensure that all user-visible strings go through QObject::tr(),
+ for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator>(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
+ when you compile your applications. This can be useful if you want
+ to ensure that all user-visible strings go through QObject::tr(),
+ for example.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator<(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is lexically less than const char pointer
+ \a rhs; otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator<(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator>=(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is lexically greater than or equal to
+ const char pointer \a rhs; otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator>=(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator<=(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is lexically less than or equal to
+ const char pointer \a rhs; otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator<=(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically not equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically less than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically less than or equal to
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than or equal
+ to string \a rhs; otherwise returns \c false.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const QChar &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if char \a lhs is lexically equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const QChar &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if char \a lhs is lexically less than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const QChar &lhs, const QLatin1StringView &rhs)
+ Returns \c true if char \a lhs is lexically greater than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const QChar &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if char \a lhs is lexically not equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const QChar &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if char \a lhs is lexically less than or equal to
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const QChar &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if char \a lhs is lexically greater than or equal to
+ string \a rhs; otherwise returns \c false.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically equal to char \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically less than char \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than char \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically not equal to char \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically less than or equal to
+ char \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than or equal to
+ char \a rhs; otherwise returns \c false.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically less than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically greater than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically not equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically less than or equal to
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically greater than or equal to
+ string \a rhs; otherwise returns \c false.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically equal to string view \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically less than string view \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than string view \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically not equal to string view \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically less than or equal to
+ string view \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than or equal to
+ string view \a rhs; otherwise returns \c false.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically equal to
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically less than
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically greater than
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically not equal to
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically less than or
+ equal to string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically greater than or
+ equal to string \a rhs; otherwise returns \c false.
+*/
+
+/*!
+ \fn qlonglong QLatin1StringView::toLongLong(bool *ok, int base) const
+ \fn qulonglong QLatin1StringView::toULongLong(bool *ok, int base) const
+ \fn int QLatin1StringView::toInt(bool *ok, int base) const
+ \fn uint QLatin1StringView::toUInt(bool *ok, int base) const
+ \fn long QLatin1StringView::toLong(bool *ok, int base) const
+ \fn ulong QLatin1StringView::toULong(bool *ok, int base) const
+ \fn short QLatin1StringView::toShort(bool *ok, int base) const
+ \fn ushort QLatin1StringView::toUShort(bool *ok, int base) const
+
+ \since 6.4
+
+ Returns this QLatin1StringView converted to a corresponding numeric value using
+ base \a base, which is ten by default. Bases 0 and 2 through 36 are supported,
+ using letters for digits beyond 9; A is ten, B is eleven and so on.
+
+ If \a base is 0, the base is determined automatically using the following
+ rules (in this order), if the Latin-1 string view begins with:
+
+ \list
+ \li \c "0x", the rest of it is read as hexadecimal (base 16)
+ \li \c "0b", the rest of it is read as binary (base 2)
+ \li \c "0", the rest of it is read as octal (base 8)
+ \li otherwise it is read as decimal
+ \endlist
+
+ Returns 0 if the conversion fails.
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+//! [latin1-numeric-conversion-note]
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+
+ This function ignores leading and trailing spacing characters.
+//! [latin1-numeric-conversion-note]
+
+ \note Support for the "0b" prefix was added in Qt 6.4.
+*/
+
+/*!
+ \fn double QLatin1StringView::toDouble(bool *ok) const
+ \fn float QLatin1StringView::toFloat(bool *ok) const
+ \since 6.4
+
+ Returns this QLatin1StringView converted to a corresponding floating-point value.
+
+ Returns an infinity if the conversion overflows or 0.0 if the
+ conversion fails for other reasons (e.g. underflow).
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \warning The QLatin1StringView content may only contain valid numerical
+ characters which includes the plus/minus sign, the character e used in
+ scientific notation, and the decimal point. Including the unit or additional
+ characters leads to a conversion error.
+
+ \include qlatin1stringview.qdoc latin1-numeric-conversion-note
+*/
+
+/*!
+ \fn Qt::Literals::StringLiterals::operator""_L1(const char *str, size_t size)
+
+ \relates QLatin1StringView
+ \since 6.4
+
+ Literal operator that creates a QLatin1StringView out of the first \a size
+ characters in the char string literal \a str.
+
+ The following code creates a QLatin1StringView:
+ \code
+ using namespace Qt::Literals::StringLiterals;
+
+ auto str = "hello"_L1;
+ \endcode
+
+ \sa Qt::Literals::StringLiterals
+*/
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp
index 40defe386f..ab95b300eb 100644
--- a/src/corelib/text/qlocale.cpp
+++ b/src/corelib/text/qlocale.cpp
@@ -1,46 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
-#if !defined(QWS) && defined(Q_OS_MAC)
+#if (defined(QT_STATIC) || defined(QT_BOOTSTRAPPED)) && defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 1000
+QT_WARNING_DISABLE_GCC("-Wfree-nonheap-object") // false positive tracking
+#endif
+
+#if defined(Q_OS_MACOS)
# include "private/qcore_mac_p.h"
# include <CoreFoundation/CoreFoundation.h>
#endif
@@ -54,6 +22,7 @@
#include "qlocale.h"
#include "qlocale_p.h"
#include "qlocale_tools_p.h"
+#include <private/qtools_p.h>
#if QT_CONFIG(datetimeparser)
#include "private/qdatetimeparser_p.h"
#endif
@@ -61,8 +30,13 @@
#include "qdatetime.h"
#include "qstringlist.h"
#include "qvariant.h"
+#include "qvarlengtharray.h"
#include "qstringbuilder.h"
+#if QT_CONFIG(timezone)
+# include "qtimezone.h"
+#endif
#include "private/qnumeric_p.h"
+#include "private/qtools_p.h"
#include <cmath>
#ifndef QT_NO_SYSTEMLOCALE
# include "qmutex.h"
@@ -76,20 +50,40 @@
#include "private/qgregoriancalendar_p.h"
#include "qcalendar.h"
+#include <q20iterator.h>
+
QT_BEGIN_NAMESPACE
+constexpr int QLocale::DefaultTwoDigitBaseYear;
+
+QT_IMPL_METATYPE_EXTERN_TAGGED(QList<Qt::DayOfWeek>, QList_Qt__DayOfWeek)
#ifndef QT_NO_SYSTEMLOCALE
-static QSystemLocale *_systemLocale = nullptr;
-class QSystemLocaleSingleton: public QSystemLocale
-{
-public:
- QSystemLocaleSingleton() : QSystemLocale(true) {}
-};
+QT_IMPL_METATYPE_EXTERN_TAGGED(QSystemLocale::CurrencyToStringArgument,
+ QSystemLocale__CurrencyToStringArgument)
+#endif
+
+using namespace Qt::StringLiterals;
+using namespace QtMiscUtils;
-Q_GLOBAL_STATIC(QSystemLocaleSingleton, QSystemLocale_globalSystemLocale)
-static QLocaleData globalLocaleData;
+#ifndef QT_NO_SYSTEMLOCALE
+Q_CONSTINIT static QSystemLocale *_systemLocale = nullptr;
+Q_CONSTINIT static QLocaleData systemLocaleData = {};
#endif
+static_assert(ascii_isspace(' '));
+static_assert(ascii_isspace('\t'));
+static_assert(ascii_isspace('\n'));
+static_assert(ascii_isspace('\v'));
+static_assert(ascii_isspace('\f'));
+static_assert(ascii_isspace('\r'));
+static_assert(!ascii_isspace('\0'));
+static_assert(!ascii_isspace('\a'));
+static_assert(!ascii_isspace('a'));
+static_assert(!ascii_isspace('\177'));
+static_assert(!ascii_isspace(uchar('\200')));
+static_assert(!ascii_isspace(uchar('\xA0'))); // NBSP (is a space but Latin 1, not ASCII)
+static_assert(!ascii_isspace(uchar('\377')));
+
/******************************************************************************
** Helpers for accessing Qt locale database
*/
@@ -98,39 +92,67 @@ QT_BEGIN_INCLUDE_NAMESPACE
#include "qlocale_data_p.h"
QT_END_INCLUDE_NAMESPACE
-QLocale::Language QLocalePrivate::codeToLanguage(QStringView code) noexcept
+QLocale::Language QLocalePrivate::codeToLanguage(QStringView code,
+ QLocale::LanguageCodeTypes codeTypes) noexcept
{
const auto len = code.size();
if (len != 2 && len != 3)
- return QLocale::C;
- ushort uc1 = code[0].toLower().unicode();
- ushort uc2 = code[1].toLower().unicode();
- ushort uc3 = len > 2 ? code[2].toLower().unicode() : 0;
+ return QLocale::AnyLanguage;
- const unsigned char *c = language_code_list;
- for (; *c != 0; c += 3) {
- if (uc1 == c[0] && uc2 == c[1] && uc3 == c[2])
- return QLocale::Language((c - language_code_list)/3);
+ const char16_t uc1 = code[0].toLower().unicode();
+ const char16_t uc2 = code[1].toLower().unicode();
+ const char16_t uc3 = len > 2 ? code[2].toLower().unicode() : 0;
+
+ // All language codes are ASCII.
+ if (uc1 > 0x7F || uc2 > 0x7F || uc3 > 0x7F)
+ return QLocale::AnyLanguage;
+
+ const AlphaCode codeBuf = { char(uc1), char(uc2), char(uc3) };
+
+ auto searchCode = [codeBuf](auto f) {
+ return std::find_if(languageCodeList.begin(), languageCodeList.end(),
+ [=](LanguageCodeEntry i) { return f(i) == codeBuf; });
+ };
+
+ if (codeTypes.testFlag(QLocale::ISO639Part1) && uc3 == 0) {
+ auto i = searchCode([](LanguageCodeEntry i) { return i.part1; });
+ if (i != languageCodeList.end())
+ return QLocale::Language(std::distance(languageCodeList.begin(), i));
}
- if (uc3 == 0) {
- // legacy codes
- if (uc1 == 'n' && uc2 == 'o') { // no -> nb
- static_assert(QLocale::Norwegian == QLocale::NorwegianBokmal);
- return QLocale::Norwegian;
+ if (uc3 != 0) {
+ if (codeTypes.testFlag(QLocale::ISO639Part2B)) {
+ auto i = searchCode([](LanguageCodeEntry i) { return i.part2B; });
+ if (i != languageCodeList.end())
+ return QLocale::Language(std::distance(languageCodeList.begin(), i));
}
- if (uc1 == 't' && uc2 == 'l') { // tl -> fil
- static_assert(QLocale::Tagalog == QLocale::Filipino);
- return QLocale::Tagalog;
- }
- if (uc1 == 's' && uc2 == 'h') { // sh -> sr[_Latn]
- static_assert(QLocale::SerboCroatian == QLocale::Serbian);
- return QLocale::SerboCroatian;
+
+ // Optimization: Part 2T code if present is always the same as Part 3 code.
+ // This is asserted in iso639_3.LanguageCodeData.
+ if (codeTypes.testFlag(QLocale::ISO639Part2T)
+ && !codeTypes.testFlag(QLocale::ISO639Part3)) {
+ auto i = searchCode([](LanguageCodeEntry i) { return i.part2T; });
+ if (i != languageCodeList.end())
+ return QLocale::Language(std::distance(languageCodeList.begin(), i));
}
- if (uc1 == 'm' && uc2 == 'o') { // mo -> ro
- static_assert(QLocale::Moldavian == QLocale::Romanian);
- return QLocale::Moldavian;
+
+ if (codeTypes.testFlag(QLocale::ISO639Part3)) {
+ auto i = searchCode([](LanguageCodeEntry i) { return i.part3; });
+ if (i != languageCodeList.end())
+ return QLocale::Language(std::distance(languageCodeList.begin(), i));
}
+ }
+
+ if (codeTypes.testFlag(QLocale::LegacyLanguageCode) && uc3 == 0) {
+ // legacy codes
+ if (uc1 == 'n' && uc2 == 'o') // no -> nb
+ return QLocale::NorwegianBokmal;
+ if (uc1 == 't' && uc2 == 'l') // tl -> fil
+ return QLocale::Filipino;
+ if (uc1 == 's' && uc2 == 'h') // sh -> sr[_Latn]
+ return QLocale::Serbian;
+ if (uc1 == 'm' && uc2 == 'o') // mo -> ro
+ return QLocale::Romanian;
// Android uses the following deprecated codes
if (uc1 == 'i' && uc2 == 'w') // iw -> he
return QLocale::Hebrew;
@@ -139,7 +161,7 @@ QLocale::Language QLocalePrivate::codeToLanguage(QStringView code) noexcept
if (uc1 == 'j' && uc2 == 'i') // ji -> yi
return QLocale::Yiddish;
}
- return QLocale::C;
+ return QLocale::AnyLanguage;
}
QLocale::Script QLocalePrivate::codeToScript(QStringView code) noexcept
@@ -155,118 +177,203 @@ QLocale::Script QLocalePrivate::codeToScript(QStringView code) noexcept
unsigned char c3 = code[3].toLower().toLatin1();
const unsigned char *c = script_code_list;
- for (int i = 0; i < QLocale::LastScript; ++i, c += 4) {
+ for (qsizetype i = 0; i < QLocale::LastScript; ++i, c += 4) {
if (c0 == c[0] && c1 == c[1] && c2 == c[2] && c3 == c[3])
return QLocale::Script(i);
}
return QLocale::AnyScript;
}
-QLocale::Country QLocalePrivate::codeToCountry(QStringView code) noexcept
+QLocale::Territory QLocalePrivate::codeToTerritory(QStringView code) noexcept
{
const auto len = code.size();
if (len != 2 && len != 3)
- return QLocale::AnyCountry;
+ return QLocale::AnyTerritory;
- ushort uc1 = code[0].toUpper().unicode();
- ushort uc2 = code[1].toUpper().unicode();
- ushort uc3 = len > 2 ? code[2].toUpper().unicode() : 0;
+ char16_t uc1 = code[0].toUpper().unicode();
+ char16_t uc2 = code[1].toUpper().unicode();
+ char16_t uc3 = len > 2 ? code[2].toUpper().unicode() : 0;
- const unsigned char *c = country_code_list;
+ const unsigned char *c = territory_code_list;
for (; *c != 0; c += 3) {
if (uc1 == c[0] && uc2 == c[1] && uc3 == c[2])
- return QLocale::Country((c - country_code_list)/3);
+ return QLocale::Territory((c - territory_code_list)/3);
}
- return QLocale::AnyCountry;
+ return QLocale::AnyTerritory;
}
-QLatin1String QLocalePrivate::languageToCode(QLocale::Language language)
+std::array<char, 4> QLocalePrivate::languageToCode(QLocale::Language language,
+ QLocale::LanguageCodeTypes codeTypes)
{
- if (language == QLocale::AnyLanguage)
- return QLatin1String();
+ if (language == QLocale::AnyLanguage || language > QLocale::LastLanguage)
+ return {};
if (language == QLocale::C)
- return QLatin1String("C");
+ return {'C'};
+
+ const LanguageCodeEntry &i = languageCodeList[language];
+
+ if (codeTypes.testFlag(QLocale::ISO639Part1) && i.part1.isValid())
+ return i.part1.decode();
- const unsigned char *c = language_code_list + 3*(uint(language));
+ if (codeTypes.testFlag(QLocale::ISO639Part2B) && i.part2B.isValid())
+ return i.part2B.decode();
- return QLatin1String(reinterpret_cast<const char*>(c), c[2] == 0 ? 2 : 3);
+ if (codeTypes.testFlag(QLocale::ISO639Part2T) && i.part2T.isValid())
+ return i.part2T.decode();
+ if (codeTypes.testFlag(QLocale::ISO639Part3))
+ return i.part3.decode();
+
+ return {};
}
-QLatin1String QLocalePrivate::scriptToCode(QLocale::Script script)
+QLatin1StringView QLocalePrivate::scriptToCode(QLocale::Script script)
{
if (script == QLocale::AnyScript || script > QLocale::LastScript)
- return QLatin1String();
- const unsigned char *c = script_code_list + 4*(uint(script));
- return QLatin1String(reinterpret_cast<const char *>(c), 4);
+ return {};
+ const unsigned char *c = script_code_list + 4 * script;
+ return {reinterpret_cast<const char *>(c), 4};
}
-QLatin1String QLocalePrivate::countryToCode(QLocale::Country country)
+QLatin1StringView QLocalePrivate::territoryToCode(QLocale::Territory territory)
{
- if (country == QLocale::AnyCountry)
- return QLatin1String();
-
- const unsigned char *c = country_code_list + 3*(uint(country));
+ if (territory == QLocale::AnyTerritory || territory > QLocale::LastTerritory)
+ return {};
- return QLatin1String(reinterpret_cast<const char*>(c), c[2] == 0 ? 2 : 3);
+ const unsigned char *c = territory_code_list + 3 * territory;
+ return {reinterpret_cast<const char*>(c), c[2] == 0 ? 2 : 3};
}
-// http://www.unicode.org/reports/tr35/#Likely_Subtags
-static bool addLikelySubtags(QLocaleId &localeId)
+namespace {
+struct LikelyPair
{
- // ### optimize with bsearch
- const int likely_subtags_count = sizeof(likely_subtags) / sizeof(likely_subtags[0]);
- const QLocaleId *p = likely_subtags;
- const QLocaleId *const e = p + likely_subtags_count;
- for ( ; p < e; p += 2) {
- if (localeId == p[0]) {
- localeId = p[1];
- return true;
- }
- }
- return false;
-}
+ QLocaleId key; // Search key.
+ QLocaleId value = QLocaleId { 0, 0, 0 };
+};
+
+bool operator<(LikelyPair lhs, LikelyPair rhs)
+{
+ // Must match the comparison LocaleDataWriter.likelySubtags() uses when
+ // sorting, see qtbase/util/locale_database.qlocalexml2cpp.py
+ const auto compare = [](int lhs, int rhs) {
+ // 0 sorts after all other values; lhs and rhs are passed ushort values.
+ const int huge = 0x10000;
+ return (lhs ? lhs : huge) - (rhs ? rhs : huge);
+ };
+ const auto &left = lhs.key;
+ const auto &right = rhs.key;
+ // Comparison order: language, region, script:
+ if (int cmp = compare(left.language_id, right.language_id))
+ return cmp < 0;
+ if (int cmp = compare(left.territory_id, right.territory_id))
+ return cmp < 0;
+ return compare(left.script_id, right.script_id) < 0;
+}
+} // anonymous namespace
+/*!
+ Fill in blank fields of a locale ID.
+
+ An ID in which some fields are zero stands for any locale that agrees with
+ it in its non-zero fields. CLDR's likely-subtag data is meant to help us
+ chose which candidate to prefer. (Note, however, that CLDR does have some
+ cases where it maps an ID to a "best match" for which CLDR does not provide
+ data, even though there are locales for which CLDR does provide data that do
+ match the given ID. It's telling us, unhelpfully but truthfully, what
+ locale would (most likely) be meant by (someone using) the combination
+ requested, even when that locale isn't yet supported.) It may also map an
+ obsolete or generic tag to a modern or more specific replacement, possibly
+ filling in some of the other fields in the process (presently only for
+ countries). Note that some fields of the result may remain blank, but there
+ is no more specific recommendation available.
+
+ For the formal specification, see
+ https://www.unicode.org/reports/tr35/#Likely_Subtags
+
+ \note We also search und_script_region and und_region; they're not mentioned
+ in the spec, but the examples clearly presume them and CLDR does provide
+ such likely matches.
+*/
QLocaleId QLocaleId::withLikelySubtagsAdded() const
{
- // language_script_region
- if (language_id || script_id || country_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, script_id, country_id);
- if (addLikelySubtags(id))
- return id;
- }
- // language_region
- if (script_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, 0, country_id);
- if (addLikelySubtags(id)) {
- id.script_id = script_id;
- return id;
+ /* Each pattern that appears in a comments below, language_script_region and
+ similar, indicates which of this's fields (even if blank) are being
+ attended to in a given search; for fields left out of the pattern, the
+ search uses 0 regardless of whether this has specified the field.
+
+ If a key matches what we're searching for (possibly with a wildcard in
+ the key matching a non-wildcard in our search), the tags from this that
+ are specified in the key are replaced by the match (even if different);
+ but the other tags of this replace what's in the match (even when the
+ match does specify a value).
+ */
+ static_assert(std::size(likely_subtags) % 2 == 0);
+ auto *pairs = reinterpret_cast<const LikelyPair *>(likely_subtags);
+ auto *const afterPairs = pairs + std::size(likely_subtags) / 2;
+ LikelyPair sought { *this };
+ // Our array is sorted in the order that puts all candidate matches in the
+ // order we would want them; ones we should prefer appear before the others.
+ if (language_id) {
+ // language_script_region, language_region, language_script, language:
+ pairs = std::lower_bound(pairs, afterPairs, sought);
+ // Single language's block isn't long enough to warrant more binary
+ // chopping within it - just traverse it all:
+ for (; pairs < afterPairs && pairs->key.language_id == language_id; ++pairs) {
+ const QLocaleId &key = pairs->key;
+ if (key.territory_id && key.territory_id != territory_id)
+ continue;
+ if (key.script_id && key.script_id != script_id)
+ continue;
+ QLocaleId value = pairs->value;
+ if (territory_id && !key.territory_id)
+ value.territory_id = territory_id;
+ if (script_id && !key.script_id)
+ value.script_id = script_id;
+ return value;
}
}
- // language_script
- if (country_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, script_id, 0);
- if (addLikelySubtags(id)) {
- id.country_id = country_id;
- return id;
+ // und_script_region or und_region (in that order):
+ if (territory_id) {
+ sought.key = QLocaleId { 0, script_id, territory_id };
+ pairs = std::lower_bound(pairs, afterPairs, sought);
+ // Again, individual und_?_region block isn't long enough to make binary
+ // chop a win:
+ for (; pairs < afterPairs && pairs->key.territory_id == territory_id; ++pairs) {
+ const QLocaleId &key = pairs->key;
+ Q_ASSERT(!key.language_id);
+ if (key.script_id && key.script_id != script_id)
+ continue;
+ QLocaleId value = pairs->value;
+ if (language_id)
+ value.language_id = language_id;
+ if (script_id && !key.script_id)
+ value.script_id = script_id;
+ return value;
}
}
- // language
- if (script_id && country_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, 0, 0);
- if (addLikelySubtags(id)) {
- id.script_id = script_id;
- id.country_id = country_id;
- return id;
+ // und_script:
+ if (script_id) {
+ sought.key = QLocaleId { 0, script_id, 0 };
+ pairs = std::lower_bound(pairs, afterPairs, sought);
+ if (pairs < afterPairs && pairs->key.script_id == script_id) {
+ Q_ASSERT(!pairs->key.language_id && !pairs->key.territory_id);
+ QLocaleId value = pairs->value;
+ if (language_id)
+ value.language_id = language_id;
+ if (territory_id)
+ value.territory_id = territory_id;
+ return value;
}
}
- // und_script
- if (language_id) {
- QLocaleId id = QLocaleId::fromIds(0, script_id, 0);
- if (addLikelySubtags(id)) {
- id.language_id = language_id;
- return id;
+ if (matchesAll()) { // Skipped all of the above.
+ // CLDR has no match-all at v37, but might get one some day ...
+ pairs = std::lower_bound(pairs, afterPairs, sought);
+ if (pairs < afterPairs) {
+ // All other keys are < match-all.
+ Q_ASSERT(pairs + 1 == afterPairs);
+ Q_ASSERT(pairs->key.matchesAll());
+ return pairs->value;
}
}
return *this;
@@ -277,19 +384,19 @@ QLocaleId QLocaleId::withLikelySubtagsRemoved() const
QLocaleId max = withLikelySubtagsAdded();
// language
{
- QLocaleId id = QLocaleId::fromIds(language_id, 0, 0);
+ QLocaleId id { language_id, 0, 0 };
if (id.withLikelySubtagsAdded() == max)
return id;
}
// language_region
- if (country_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, 0, country_id);
+ if (territory_id) {
+ QLocaleId id { language_id, 0, territory_id };
if (id.withLikelySubtagsAdded() == max)
return id;
}
// language_script
if (script_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, script_id, 0);
+ QLocaleId id { language_id, script_id, 0 };
if (id.withLikelySubtagsAdded() == max)
return id;
}
@@ -303,19 +410,34 @@ QByteArray QLocaleId::name(char separator) const
if (language_id == QLocale::C)
return QByteArrayLiteral("C");
- const unsigned char *lang = language_code_list + 3 * language_id;
+ const LanguageCodeEntry &language = languageCodeList[language_id];
+ AlphaCode lang;
+ qsizetype langLen;
+
+ if (language.part1.isValid()) {
+ lang = language.part1;
+ langLen = 2;
+ } else {
+ lang = language.part2B.isValid() ? language.part2B : language.part3;
+ langLen = 3;
+ }
+
const unsigned char *script =
(script_id != QLocale::AnyScript ? script_code_list + 4 * script_id : nullptr);
const unsigned char *country =
- (country_id != QLocale::AnyCountry ? country_code_list + 3 * country_id : nullptr);
- char len = (lang[2] != 0 ? 3 : 2) + (script ? 4 + 1 : 0)
- + (country ? (country[2] != 0 ? 3 : 2) + 1 : 0);
+ (territory_id != QLocale::AnyTerritory
+ ? territory_code_list + 3 * territory_id : nullptr);
+ qsizetype len = langLen + (script ? 4 + 1 : 0) + (country ? (country[2] != 0 ? 3 : 2) + 1 : 0);
QByteArray name(len, Qt::Uninitialized);
char *uc = name.data();
- *uc++ = lang[0];
- *uc++ = lang[1];
- if (lang[2] != 0)
- *uc++ = lang[2];
+
+ auto langArray = lang.decode();
+
+ *uc++ = langArray[0];
+ *uc++ = langArray[1];
+ if (langLen > 2)
+ *uc++ = langArray[2];
+
if (script) {
*uc++ = separator;
*uc++ = script[0];
@@ -340,275 +462,186 @@ QByteArray QLocalePrivate::bcp47Name(char separator) const
if (m_data->m_language_id == QLocale::C)
return QByteArrayLiteral("en");
- QLocaleId localeId = QLocaleId::fromIds(m_data->m_language_id, m_data->m_script_id,
- m_data->m_country_id);
- return localeId.withLikelySubtagsRemoved().name(separator);
+ return m_data->id().withLikelySubtagsRemoved().name(separator);
}
-/*!
- \internal
- */
-QByteArray QLocalePrivate::rawName(char separator) const
+static qsizetype findLocaleIndexById(QLocaleId localeId)
{
- QByteArrayList parts;
- if (m_data->m_language_id != QLocale::AnyLanguage)
- parts.append(languageCode().latin1());
- if (m_data->m_script_id != QLocale::AnyScript)
- parts.append(scriptCode().latin1());
- if (m_data->m_country_id != QLocale::AnyCountry)
- parts.append(countryCode().latin1());
-
- return parts.join(separator);
-}
-
-
-static const QLocaleData *findLocaleDataById(const QLocaleId &lid)
-{
- QLocaleId localeId = lid.withLikelySubtagsAdded();
-
- const uint idx = locale_index[localeId.language_id];
-
- const QLocaleData *data = locale_data + idx;
-
- if (idx == 0) // default language has no associated script or country
- return data;
+ qsizetype idx = locale_index[localeId.language_id];
+ // If there are no locales for specified language (so we we've got the
+ // default language, which has no associated script or country), give up:
+ if (localeId.language_id && idx == 0)
+ return idx;
- Q_ASSERT(data->m_language_id == localeId.language_id);
+ Q_ASSERT(localeId.acceptLanguage(locale_data[idx].m_language_id));
- if (localeId.script_id == QLocale::AnyScript && localeId.country_id == QLocale::AnyCountry)
- return data;
+ do {
+ if (localeId.acceptScriptTerritory(locale_data[idx].id()))
+ return idx;
+ ++idx;
+ } while (localeId.acceptLanguage(locale_data[idx].m_language_id));
- if (localeId.script_id == QLocale::AnyScript) {
- do {
- if (data->m_country_id == localeId.country_id)
- return data;
- ++data;
- } while (data->m_language_id && data->m_language_id == localeId.language_id);
- } else if (localeId.country_id == QLocale::AnyCountry) {
- do {
- if (data->m_script_id == localeId.script_id)
- return data;
- ++data;
- } while (data->m_language_id && data->m_language_id == localeId.language_id);
- } else {
- do {
- if (data->m_script_id == localeId.script_id
- && data->m_country_id == localeId.country_id) {
- return data;
- }
- ++data;
- } while (data->m_language_id && data->m_language_id == localeId.language_id);
- }
-
- return nullptr;
+ return -1;
}
-const QLocaleData *QLocaleData::findLocaleData(QLocale::Language language, QLocale::Script script,
- QLocale::Country country)
+qsizetype QLocaleData::findLocaleIndex(QLocaleId lid)
{
- QLocaleId localeId = QLocaleId::fromIds(language, script, country);
+ QLocaleId localeId = lid;
QLocaleId likelyId = localeId.withLikelySubtagsAdded();
-
- const uint idx = locale_index[likelyId.language_id];
+ const ushort fallback = likelyId.language_id;
// Try a straight match with the likely data:
- if (const QLocaleData *const data = findLocaleDataById(likelyId))
- return data;
- QList<QLocaleId> tried;
+ qsizetype index = findLocaleIndexById(likelyId);
+ if (index >= 0)
+ return index;
+ QVarLengthArray<QLocaleId, 6> tried;
tried.push_back(likelyId);
+#define CheckCandidate(id) do { \
+ if (!tried.contains(id)) { \
+ index = findLocaleIndexById(id); \
+ if (index >= 0) \
+ return index; \
+ tried.push_back(id); \
+ } \
+ } while (false) // end CheckCandidate
+
// No match; try again with raw data:
- if (!tried.contains(localeId)) {
- if (const QLocaleData *const data = findLocaleDataById(localeId))
- return data;
- tried.push_back(localeId);
- }
+ CheckCandidate(localeId);
- // No match; try again with likely country
- if (country != QLocale::AnyCountry
- && (language != QLocale::AnyLanguage || script != QLocale::AnyScript)) {
- localeId = QLocaleId::fromIds(language, script, QLocale::AnyCountry);
+ // No match; try again with likely country for language_script
+ if (lid.territory_id && (lid.language_id || lid.script_id)) {
+ localeId.territory_id = 0;
likelyId = localeId.withLikelySubtagsAdded();
- if (!tried.contains(likelyId)) {
- if (const QLocaleData *const data = findLocaleDataById(likelyId))
- return data;
- tried.push_back(likelyId);
- }
+ CheckCandidate(likelyId);
// No match; try again with any country
- if (!tried.contains(localeId)) {
- if (const QLocaleData *const data = findLocaleDataById(localeId))
- return data;
- tried.push_back(localeId);
- }
+ CheckCandidate(localeId);
}
- // No match; try again with likely script
- if (script != QLocale::AnyScript
- && (language != QLocale::AnyLanguage || country != QLocale::AnyCountry)) {
- localeId = QLocaleId::fromIds(language, QLocale::AnyScript, country);
+ // No match; try again with likely script for language_region
+ if (lid.script_id && (lid.language_id || lid.territory_id)) {
+ localeId = QLocaleId { lid.language_id, 0, lid.territory_id };
likelyId = localeId.withLikelySubtagsAdded();
- if (!tried.contains(likelyId)) {
- if (const QLocaleData *const data = findLocaleDataById(likelyId))
- return data;
- tried.push_back(likelyId);
- }
+ CheckCandidate(likelyId);
// No match; try again with any script
- if (!tried.contains(localeId)) {
- if (const QLocaleData *const data = findLocaleDataById(localeId))
- return data;
- tried.push_back(localeId);
- }
+ CheckCandidate(localeId);
}
+#undef CheckCandidate
- // No match; return data at original index
- return locale_data + idx;
+ // No match; return base index for initial likely language:
+ return locale_index[fallback];
}
-uint QLocaleData::findLocaleOffset(QLocale::Language language, QLocale::Script script,
- QLocale::Country country)
+static QStringView findTag(QStringView name) noexcept
{
- return findLocaleData(language, script, country) - locale_data;
+ const std::u16string_view v(name.utf16(), size_t(name.size()));
+ const auto i = v.find_first_of(u"_-.@");
+ if (i == std::string_view::npos)
+ return name;
+ return name.first(qsizetype(i));
}
-static bool parse_locale_tag(const QString &input, int &i, QString *result,
- const QString &separators)
+static bool validTag(QStringView tag)
{
- *result = QString(8, Qt::Uninitialized); // worst case according to BCP47
- QChar *pch = result->data();
- const QChar *uc = input.data() + i;
- const int l = input.length();
- int size = 0;
- for (; i < l && size < 8; ++i, ++size) {
- if (separators.contains(*uc))
- break;
- if (! ((uc->unicode() >= 'a' && uc->unicode() <= 'z') ||
- (uc->unicode() >= 'A' && uc->unicode() <= 'Z') ||
- (uc->unicode() >= '0' && uc->unicode() <= '9')) ) // latin only
+ // Is tag is a non-empty sequence of ASCII letters and/or digits ?
+ for (QChar uc : tag) {
+ const char16_t ch = uc.unicode();
+ if (!isAsciiLetterOrNumber(ch))
return false;
- *pch++ = *uc++;
}
- result->truncate(size);
- return true;
+ return tag.size() > 0;
}
-bool qt_splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry)
+static bool isScript(QStringView tag)
{
- const int length = name.length();
-
- lang = script = cntry = QString();
+ // Every script name is 4 characters, a capital followed by three lower-case;
+ // so a search for tag in allScripts *can* only match if it's aligned.
+ static const QString allScripts =
+ QString::fromLatin1(reinterpret_cast<const char *>(script_code_list),
+ sizeof(script_code_list) - 1);
+ return tag.size() == 4 && allScripts.indexOf(tag) % 4 == 0;
+}
- const QString separators = QStringLiteral("_-.@");
+bool qt_splitLocaleName(QStringView name, QStringView *lang, QStringView *script, QStringView *land)
+{
+ // Assume each of lang, script and land is nullptr or points to an empty QStringView.
enum ParserState { NoState, LangState, ScriptState, CountryState };
ParserState state = LangState;
- for (int i = 0; i < length && state != NoState; ) {
- QString value;
- if (!parse_locale_tag(name, i, &value, separators) ||value.isEmpty())
+ while (name.size() && state != NoState) {
+ const QStringView tag = findTag(name);
+ if (!validTag(tag))
break;
- QChar sep = i < length ? name.at(i) : QChar();
+ name = name.sliced(tag.size());
+ const bool sep = name.size() > 0;
+ if (sep) // tag wasn't all that remained; there was a separator
+ name = name.sliced(1);
+
switch (state) {
case LangState:
- if (!sep.isNull() && !separators.contains(sep)) {
- state = NoState;
- break;
- }
- lang = value;
- if (i == length) {
- // just language was specified
- state = NoState;
- break;
- }
- state = ScriptState;
+ if (tag.size() != 2 && tag.size() != 3)
+ return false;
+ if (lang)
+ *lang = tag;
+ state = sep ? ScriptState : NoState;
break;
- case ScriptState: {
- QString scripts = QString::fromLatin1((const char *)script_code_list,
- sizeof(script_code_list) - 1);
- if (value.length() == 4 && scripts.indexOf(value) % 4 == 0) {
- // script name is always 4 characters
- script = value;
- state = CountryState;
- } else {
- // it wasn't a script, maybe it is a country then?
- cntry = value;
- state = NoState;
+ case ScriptState:
+ if (isScript(tag)) {
+ if (script)
+ *script = tag;
+ state = sep ? CountryState : NoState;
+ break;
}
- break;
- }
+ // It wasn't a script, assume it's a country.
+ Q_FALLTHROUGH();
case CountryState:
- cntry = value;
+ if (land)
+ *land = tag;
state = NoState;
break;
- case NoState:
- // shouldn't happen
- qWarning("QLocale: This should never happen");
+ case NoState: // Precluded by loop condition !
+ Q_UNREACHABLE();
break;
}
- ++i;
}
- return lang.length() == 2 || lang.length() == 3;
+ return state != LangState;
}
-void QLocalePrivate::getLangAndCountry(const QString &name, QLocale::Language &lang,
- QLocale::Script &script, QLocale::Country &cntry)
+QLocaleId QLocaleId::fromName(QStringView name)
{
- lang = QLocale::C;
- script = QLocale::AnyScript;
- cntry = QLocale::AnyCountry;
+ QStringView lang;
+ QStringView script;
+ QStringView land;
+ if (!qt_splitLocaleName(name, &lang, &script, &land))
+ return { QLocale::C, 0, 0 };
- QString lang_code;
- QString script_code;
- QString cntry_code;
- if (!qt_splitLocaleName(name, lang_code, script_code, cntry_code))
- return;
-
- lang = QLocalePrivate::codeToLanguage(lang_code);
- if (lang == QLocale::C)
- return;
- script = QLocalePrivate::codeToScript(script_code);
- cntry = QLocalePrivate::codeToCountry(cntry_code);
+ QLocale::Language langId = QLocalePrivate::codeToLanguage(lang);
+ if (langId == QLocale::AnyLanguage)
+ return { QLocale::C, 0, 0 };
+ return { langId, QLocalePrivate::codeToScript(script), QLocalePrivate::codeToTerritory(land) };
}
-static const QLocaleData *findLocaleData(const QString &name)
+QString qt_readEscapedFormatString(QStringView format, qsizetype *idx)
{
- QLocale::Language lang;
- QLocale::Script script;
- QLocale::Country cntry;
- QLocalePrivate::getLangAndCountry(name, lang, script, cntry);
-
- return QLocaleData::findLocaleData(lang, script, cntry);
-}
+ qsizetype &i = *idx;
-static uint findLocaleOffset(const QString &name)
-{
- QLocale::Language lang;
- QLocale::Script script;
- QLocale::Country cntry;
- QLocalePrivate::getLangAndCountry(name, lang, script, cntry);
-
- return QLocaleData::findLocaleOffset(lang, script, cntry);
-}
-
-QString qt_readEscapedFormatString(QStringView format, int *idx)
-{
- int &i = *idx;
-
- Q_ASSERT(format.at(i) == QLatin1Char('\''));
+ Q_ASSERT(format.at(i) == u'\'');
++i;
if (i == format.size())
return QString();
- if (format.at(i).unicode() == '\'') { // "''" outside of a quoted stirng
+ if (format.at(i).unicode() == '\'') { // "''" outside of a quoted string
++i;
- return QLatin1String("'");
+ return "'"_L1;
}
QString result;
while (i < format.size()) {
if (format.at(i).unicode() == '\'') {
- if (format.mid(i + 1).startsWith(QLatin1Char('\''))) {
+ if (format.mid(i + 1).startsWith(u'\'')) {
// "''" inside a quoted string
- result.append(QLatin1Char('\''));
+ result.append(u'\'');
i += 2;
} else {
break;
@@ -639,7 +672,7 @@ QString qt_readEscapedFormatString(QStringView format, int *idx)
qt_repeatCount(u"aab"); // == 2
\endcode
*/
-int qt_repeatCount(QStringView s)
+qsizetype qt_repeatCount(QStringView s)
{
if (s.isEmpty())
return 0;
@@ -647,60 +680,66 @@ int qt_repeatCount(QStringView s)
qsizetype j = 1;
while (j < s.size() && s.at(j) == c)
++j;
- return int(j);
+ return j;
}
-static const QLocaleData *default_data = nullptr;
+Q_CONSTINIT static const QLocaleData *default_data = nullptr;
+Q_CONSTINIT QBasicAtomicInt QLocalePrivate::s_generation = Q_BASIC_ATOMIC_INITIALIZER(0);
-static const QLocaleData *const c_data = locale_data;
static QLocalePrivate *c_private()
{
- static QLocalePrivate c_locale{
- c_data, Q_BASIC_ATOMIC_INITIALIZER(1), 0, QLocale::OmitGroupSeparator };
+ static QLocalePrivate c_locale(locale_data, 0, QLocale::OmitGroupSeparator, 1);
return &c_locale;
}
-static const QLocaleData *systemData();
-Q_GLOBAL_STATIC_WITH_ARGS(QExplicitlySharedDataPointer<QLocalePrivate>, systemLocalePrivate,
- (QLocalePrivate::create(systemData())))
-
#ifndef QT_NO_SYSTEMLOCALE
/******************************************************************************
** Default system locale behavior
*/
/*!
- Constructs a QSystemLocale object.
-
- The constructor will automatically install this object as the system locale,
- if there's not one active. It also resets the flag that'll prompt
- QLocale::system() to re-initialize its data, so that instantiating a
- QSystemLocale transiently (doesn't install the transient as system locale if
- there was one already and) triggers an update to the system locale's data.
+ \internal
+ Constructs a QSystemLocale object.
+
+ The constructor will automatically install this object as the system locale.
+ It and the destructor maintain a stack of system locales, with the
+ most-recently-created instance (that hasn't yet been deleted) used as the
+ system locale. This is only intended as a way to let a platform plugin
+ install its own system locale, overriding what might otherwise be provided
+ for its class of platform (as Android does, differing from Linux), and to
+ let tests transiently override the system or plugin-supplied one. As such,
+ there should not be diverse threads creating and destroying QSystemLocale
+ instances concurrently, so no attempt is made at thread-safety in managing
+ the stack.
+
+ This constructor also resets the flag that'll prompt QLocale::system() to
+ re-initialize its data, so that instantiating a QSystemLocale (even
+ transiently) triggers a refresh of the system locale's data. This is
+ exploited by some test code.
*/
-QSystemLocale::QSystemLocale()
+QSystemLocale::QSystemLocale() : next(_systemLocale)
{
- if (!_systemLocale)
- _systemLocale = this;
+ _systemLocale = this;
- globalLocaleData.m_language_id = 0;
+ systemLocaleData.m_language_id = 0;
}
/*!
\internal
-*/
-QSystemLocale::QSystemLocale(bool)
-{ }
-
-/*!
- Deletes the object.
+ Deletes the object.
*/
QSystemLocale::~QSystemLocale()
{
if (_systemLocale == this) {
- _systemLocale = nullptr;
+ _systemLocale = next;
- globalLocaleData.m_language_id = 0;
+ // Change to system locale => force refresh.
+ systemLocaleData.m_language_id = 0;
+ } else {
+ for (QSystemLocale *p = _systemLocale; p; p = p->next) {
+ if (p->next == this)
+ p->next = next;
+ }
}
}
@@ -708,7 +747,12 @@ static const QSystemLocale *systemLocale()
{
if (_systemLocale)
return _systemLocale;
- return QSystemLocale_globalSystemLocale();
+
+ // As this is only ever instantiated with _systemLocale null, it is
+ // necessarily the ->next-most in any chain that may subsequently develop;
+ // and it won't be destructed until exit()-time.
+ static QSystemLocale globalInstance;
+ return &globalInstance;
}
static void updateSystemPrivate()
@@ -719,48 +763,69 @@ static void updateSystemPrivate()
const QSystemLocale *sys_locale = systemLocale();
// tell the object that the system locale has changed.
- sys_locale->query(QSystemLocale::LocaleChanged, QVariant());
+ sys_locale->query(QSystemLocale::LocaleChanged);
- // Populate global with fallback as basis:
- globalLocaleData = *sys_locale->fallbackUiLocaleData();
+ // Populate system locale with fallback as basis
+ systemLocaleData = locale_data[sys_locale->fallbackLocaleIndex()];
- QVariant res = sys_locale->query(QSystemLocale::LanguageId, QVariant());
+ QVariant res = sys_locale->query(QSystemLocale::LanguageId);
if (!res.isNull()) {
- globalLocaleData.m_language_id = res.toInt();
- globalLocaleData.m_script_id = QLocale::AnyScript; // default for compatibility
+ systemLocaleData.m_language_id = res.toInt();
+ systemLocaleData.m_script_id = QLocale::AnyScript; // default for compatibility
}
- res = sys_locale->query(QSystemLocale::CountryId, QVariant());
+ res = sys_locale->query(QSystemLocale::TerritoryId);
if (!res.isNull()) {
- globalLocaleData.m_country_id = res.toInt();
- globalLocaleData.m_script_id = QLocale::AnyScript; // default for compatibility
+ systemLocaleData.m_territory_id = res.toInt();
+ systemLocaleData.m_script_id = QLocale::AnyScript; // default for compatibility
}
- res = sys_locale->query(QSystemLocale::ScriptId, QVariant());
+ res = sys_locale->query(QSystemLocale::ScriptId);
if (!res.isNull())
- globalLocaleData.m_script_id = res.toInt();
+ systemLocaleData.m_script_id = res.toInt();
// Should we replace Any values based on likely sub-tags ?
+
+ // If system locale is default locale, update the default collator's generation:
+ if (default_data == &systemLocaleData)
+ QLocalePrivate::s_generation.fetchAndAddRelaxed(1);
}
#endif // !QT_NO_SYSTEMLOCALE
-static const QLocaleData *systemData()
+static const QLocaleData *systemData(qsizetype *sysIndex = nullptr)
{
#ifndef QT_NO_SYSTEMLOCALE
/*
Copy over the information from the fallback locale and modify.
- This modifies (cross-thread) global state, so take care to only call it in
- one thread.
+ If sysIndex is passed, it should be the m_index of the system locale's
+ QLocalePrivate, which we'll update if it needs it.
+
+ This modifies (cross-thread) global state, so is mutex-protected.
*/
{
- static QBasicMutex systemDataMutex;
+ Q_CONSTINIT static QLocaleId sysId;
+ bool updated = false;
+
+ Q_CONSTINIT static QBasicMutex systemDataMutex;
systemDataMutex.lock();
- if (globalLocaleData.m_language_id == 0)
+ if (systemLocaleData.m_language_id == 0) {
updateSystemPrivate();
+ updated = true;
+ }
+ // Initialization of system private has *sysIndex == -1 to hit this.
+ if (sysIndex && (updated || *sysIndex < 0)) {
+ const QLocaleId nowId = systemLocaleData.id();
+ if (sysId != nowId || *sysIndex < 0) {
+ // This look-up may be expensive:
+ *sysIndex = QLocaleData::findLocaleIndex(nowId);
+ sysId = nowId;
+ }
+ }
systemDataMutex.unlock();
}
- return &globalLocaleData;
+ return &systemLocaleData;
#else
+ Q_UNUSED(sysIndex);
return locale_data;
#endif
}
@@ -772,10 +837,26 @@ static const QLocaleData *defaultData()
return default_data;
}
+static qsizetype defaultIndex()
+{
+ const QLocaleData *const data = defaultData();
+#ifndef QT_NO_SYSTEMLOCALE
+ if (data == &systemLocaleData) {
+ // Work out a suitable index matching the system data, for use when
+ // accessing calendar data, when not fetched from system.
+ return QLocaleData::findLocaleIndex(data->id());
+ }
+#endif
+
+ using QtPrivate::q_points_into_range;
+ Q_ASSERT(q_points_into_range(data, locale_data));
+ return data - locale_data;
+}
+
const QLocaleData *QLocaleData::c()
{
Q_ASSERT(locale_index[QLocale::C] == 0);
- return c_data;
+ return locale_data;
}
#ifndef QT_NO_DATASTREAM
@@ -794,66 +875,79 @@ QDataStream &operator>>(QDataStream &ds, QLocale &l)
}
#endif // QT_NO_DATASTREAM
+static constexpr qsizetype locale_data_size = q20::ssize(locale_data) - 1; // trailing guard
-static const int locale_data_size = sizeof(locale_data)/sizeof(QLocaleData) - 1;
+Q_GLOBAL_STATIC(QSharedDataPointer<QLocalePrivate>, defaultLocalePrivate,
+ new QLocalePrivate(defaultData(), defaultIndex()))
-Q_GLOBAL_STATIC_WITH_ARGS(QSharedDataPointer<QLocalePrivate>, defaultLocalePrivate,
- (QLocalePrivate::create(defaultData())))
-
-static QLocalePrivate *localePrivateByName(const QString &name)
+static QLocalePrivate *localePrivateByName(QStringView name)
{
- if (name == QLatin1String("C"))
+ if (name == u"C")
return c_private();
- // TODO: Remove this version, and use offset everywhere
- const QLocaleData *data = findLocaleData(name);
- return QLocalePrivate::create(data, findLocaleOffset(name),
- data->m_language_id == QLocale::C
- ? QLocale::OmitGroupSeparator : QLocale::DefaultNumberOptions);
+ const qsizetype index = QLocaleData::findLocaleIndex(QLocaleId::fromName(name));
+ Q_ASSERT(index >= 0 && index < locale_data_size);
+ return new QLocalePrivate(locale_data + index, index,
+ locale_data[index].m_language_id == QLocale::C
+ ? QLocale::OmitGroupSeparator : QLocale::DefaultNumberOptions);
}
static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Script script,
- QLocale::Country country)
+ QLocale::Territory territory)
{
if (language == QLocale::C)
return c_private();
- // TODO: Remove pointer, use index instead
- const QLocaleData *data = QLocaleData::findLocaleData(language, script, country);
- const uint offset = QLocaleData::findLocaleOffset(language, script, country);
+ qsizetype index = QLocaleData::findLocaleIndex(QLocaleId { language, script, territory });
+ Q_ASSERT(index >= 0 && index < locale_data_size);
+ const QLocaleData *data = locale_data + index;
QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions;
- // If not found, should default to system
+ // If not found, should use default locale:
if (data->m_language_id == QLocale::C) {
if (defaultLocalePrivate.exists())
numberOptions = defaultLocalePrivate->data()->m_numberOptions;
data = defaultData();
+ index = defaultIndex();
}
- return QLocalePrivate::create(data, offset, numberOptions);
+ return new QLocalePrivate(data, index, numberOptions);
}
-QString QLocaleData::decimalPoint() const
+static std::optional<QString>
+systemLocaleString(const QLocaleData *that, QSystemLocale::QueryType type)
{
#ifndef QT_NO_SYSTEMLOCALE
- if (this == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::DecimalPoint, QVariant());
- if (!res.isNull())
- return res.toString();
- }
+ if (that != &systemLocaleData)
+ return std::nullopt;
+
+ QVariant v = systemLocale()->query(type);
+ if (v.metaType() != QMetaType::fromType<QString>())
+ return std::nullopt;
+
+ return v.toString();
+#else
+ Q_UNUSED(that)
+ Q_UNUSED(type)
+ return std::nullopt;
#endif
- return decimalSeparator().getData(single_character_data);
+}
+
+static QString localeString(const QLocaleData *that, QSystemLocale::QueryType type,
+ QLocaleData::DataRange range)
+{
+ if (auto opt = systemLocaleString(that, type))
+ return *opt;
+ return range.getData(single_character_data);
+}
+
+QString QLocaleData::decimalPoint() const
+{
+ return localeString(this, QSystemLocale::DecimalPoint, decimalSeparator());
}
QString QLocaleData::groupSeparator() const
{
-#ifndef QT_NO_SYSTEMLOCALE
- if (this == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::GroupSeparator, QVariant());
- if (!res.isNull())
- return res.toString();
- }
-#endif
- return groupDelim().getData(single_character_data);
+ return localeString(this, QSystemLocale::GroupSeparator, groupDelim());
}
QString QLocaleData::percentSign() const
@@ -868,23 +962,15 @@ QString QLocaleData::listSeparator() const
QString QLocaleData::zeroDigit() const
{
-#ifndef QT_NO_SYSTEMLOCALE
- if (this == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::ZeroDigit, QVariant());
- if (!res.isNull())
- return res.toString();
- }
-#endif
- return zero().getData(single_character_data);
+ return localeString(this, QSystemLocale::ZeroDigit, zero());
}
-uint QLocaleData::zeroUcs() const
+char32_t QLocaleData::zeroUcs() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (this == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::ZeroDigit, QVariant());
- if (!res.isNull()) {
- const QString text = res.toString();
+ if (this == &systemLocaleData) {
+ const auto text = systemLocale()->query(QSystemLocale::ZeroDigit).toString();
+ if (!text.isEmpty()) {
if (text.size() == 1 && !text.at(0).isSurrogate())
return text.at(0).unicode();
if (text.size() == 2 && text.at(0).isHighSurrogate())
@@ -897,26 +983,12 @@ uint QLocaleData::zeroUcs() const
QString QLocaleData::negativeSign() const
{
-#ifndef QT_NO_SYSTEMLOCALE
- if (this == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::NegativeSign, QVariant());
- if (!res.isNull())
- return res.toString();
- }
-#endif
- return minus().getData(single_character_data);
+ return localeString(this, QSystemLocale::NegativeSign, minus());
}
QString QLocaleData::positiveSign() const
{
-#ifndef QT_NO_SYSTEMLOCALE
- if (this == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::PositiveSign, QVariant());
- if (!res.isNull())
- return res.toString();
- }
-#endif
- return plus().getData(single_character_data);
+ return localeString(this, QSystemLocale::PositiveSign, plus());
}
QString QLocaleData::exponentSeparator() const
@@ -931,108 +1003,115 @@ QLocale::QLocale(QLocalePrivate &dd)
: d(&dd)
{}
+/*!
+ \variable QLocale::DefaultTwoDigitBaseYear
+ \since 6.7
+
+ \brief The default start year of the century within which a format taking
+ a two-digit year will select. The value of the constant is \c {1900}.
+
+ Some locales use, particularly for ShortFormat, only the last two digits of
+ the year. Proir to 6.7 the year 1900 was always used as a base year for
+ such cases. Now various QLocale and QDate functions have the overloads that
+ allow callers to specify the base year, and this constant is used as its
+ default value.
+
+ \sa toDate(), toDateTime(), QDate::fromString(), QDateTime::fromString()
+*/
/*!
- Constructs a QLocale object with the specified \a name,
- which has the format
- "language[_script][_country][.codeset][@modifier]" or "C", where:
+ \since 6.3
- \list
- \li language is a lowercase, two-letter, ISO 639 language code (also some
- three-letter codes),
- \li script is a titlecase, four-letter, ISO 15924 script code,
- \li country is an uppercase, two-letter, ISO 3166 country code
- (also "419" as defined by United Nations),
- \li and codeset and modifier are ignored.
- \endlist
+ Constructs a QLocale object with the specified \a name.
- The separator can be either underscore or a minus sign.
+ The name has the format "language[_script][_territory][.codeset][@modifier]"
+ or "C", where:
- If the string violates the locale format, or language is not
- a valid ISO 639 code, the "C" locale is used instead. If country
- is not present, or is not a valid ISO 3166 code, the most
- appropriate country is chosen for the specified language.
+ \list
+ \li language is a lowercase, two-letter, ISO 639 language code (some
+ three-letter codes are also recognized),
+ \li script is a capitalized, four-letter, ISO 15924 script code,
+ \li territory is an uppercase, two-letter, ISO 3166 territory code
+ (some numeric codes are also recognized), and
+ \li codeset and modifier are ignored.
+ \endlist
- The language, script and country codes are converted to their respective
- \c Language, \c Script and \c Country enums. After this conversion is
- performed, the constructor behaves exactly like QLocale(Country, Script,
- Language).
+ The separator can be either underscore \c{'_'} (U+005F, "low line") or a
+ dash \c{'-'} (U+002D, "hyphen-minus"). If QLocale has no data for the
+ specified combination of language, script, and territory, then it uses the
+ most suitable match it can find instead. If the string violates the locale
+ format, or no suitable data can be found for the specified keys, the "C"
+ locale is used instead.
- This constructor is much slower than QLocale(Country, Script, Language).
+ This constructor is much slower than QLocale(Language, Script, Territory) or
+ QLocale(Language, Territory).
- \sa bcp47Name()
+ \sa bcp47Name(), {Matching combinations of language, script and territory}
*/
-
-QLocale::QLocale(const QString &name)
+QLocale::QLocale(QStringView name)
: d(localePrivateByName(name))
{
}
/*!
- Constructs a QLocale object initialized with the default locale. If
- no default locale was set using setDefault(), this locale will
- be the same as the one returned by system().
+ \fn QLocale::QLocale(const QString &name)
+ \overload
+*/
+
+/*!
+ Constructs a QLocale object initialized with the default locale.
- \sa setDefault()
+ If no default locale was set using setDefault(), this locale will be the
+ same as the one returned by system().
+
+ \sa setDefault(), system()
*/
QLocale::QLocale()
: d(*defaultLocalePrivate)
{
- // Make sure system data is up to date
+ // Make sure system data is up to date:
systemData();
}
/*!
- Constructs a QLocale object with the specified \a language and \a
- country.
+ Constructs a QLocale object for the specified \a language and \a territory.
- \list
- \li If the language/country pair is found in the database, it is used.
- \li If the language is found but the country is not, or if the country
- is \c AnyCountry, the language is used with the most
- appropriate available country (for example, Germany for German),
- \li If neither the language nor the country are found, QLocale
- defaults to the default locale (see setDefault()).
- \endlist
-
- The language and country that are actually used can be queried
- using language() and country().
+ If there is more than one script in use for this combination, a likely
+ script will be selected. If QLocale has no data for the specified \a
+ language, the default locale is used. If QLocale has no data for the
+ specified combination of \a language and \a territory, an alternative
+ territory may be used instead.
- \sa setDefault(), language(), country()
+ \sa setDefault(), {Matching combinations of language, script and territory}
*/
-QLocale::QLocale(Language language, Country country)
- : d(findLocalePrivate(language, QLocale::AnyScript, country))
+QLocale::QLocale(Language language, Territory territory)
+ : d(findLocalePrivate(language, AnyScript, territory))
{
}
/*!
\since 4.8
- Constructs a QLocale object with the specified \a language, \a script and
- \a country.
+ Constructs a QLocale object for the specified \a language, \a script and \a
+ territory.
+
+ If QLocale does not have data for the given combination, it will find data
+ for as good a match as it can. It falls back on the default locale if
\list
- \li If the language/script/country is found in the database, it is used.
- \li If both \a script is AnyScript and \a country is AnyCountry, the
- language is used with the most appropriate available script and country
- (for example, Germany for German),
- \li If either \a script is AnyScript or \a country is AnyCountry, the
- language is used with the first locale that matches the given \a script
- and \a country.
- \li If neither the language nor the country are found, QLocale
- defaults to the default locale (see setDefault()).
+ \li \a language is \c AnyLanguage and no language can be inferred from \a
+ script and \a territory
+ \li QLocale has no data for the language, either given as \a language or
+ inferred as above.
\endlist
- The language, script and country that are actually used can be queried
- using language(), script() and country().
-
- \sa setDefault(), language(), script(), country()
+ \sa setDefault(), {Matching combinations of language, script and territory}
*/
-QLocale::QLocale(Language language, Script script, Country country)
- : d(findLocalePrivate(language, script, country))
+QLocale::QLocale(Language language, Script script, Territory territory)
+ : d(findLocalePrivate(language, script, territory))
{
}
@@ -1040,10 +1119,7 @@ QLocale::QLocale(Language language, Script script, Country country)
Constructs a QLocale object as a copy of \a other.
*/
-QLocale::QLocale(const QLocale &other)
-{
- d = other.d;
-}
+QLocale::QLocale(const QLocale &other) noexcept = default;
/*!
Destructor
@@ -1058,20 +1134,16 @@ QLocale::~QLocale()
to this QLocale object.
*/
-QLocale &QLocale::operator=(const QLocale &other)
-{
- d = other.d;
- return *this;
-}
+QLocale &QLocale::operator=(const QLocale &other) noexcept = default;
-bool QLocale::operator==(const QLocale &other) const
-{
- return d->m_data == other.d->m_data && d->m_numberOptions == other.d->m_numberOptions;
-}
+/*!
+ \internal
+ Equality comparison.
+*/
-bool QLocale::operator!=(const QLocale &other) const
+bool QLocale::equals(const QLocale &other) const
{
- return d->m_data != other.d->m_data || d->m_numberOptions != other.d->m_numberOptions;
+ return d->m_data == other.d->m_data && d->m_numberOptions == other.d->m_numberOptions;
}
/*!
@@ -1100,7 +1172,7 @@ size_t qHash(const QLocale &key, size_t seed) noexcept
Sets the \a options related to number conversions for this
QLocale instance.
- \sa numberOptions()
+ \sa numberOptions(), FloatingPointPrecisionOption
*/
void QLocale::setNumberOptions(NumberOptions options)
{
@@ -1116,7 +1188,7 @@ void QLocale::setNumberOptions(NumberOptions options)
By default, no options are set for the standard locales, except
for the "C" locale, which has OmitGroupSeparator set by default.
- \sa setNumberOptions(), toString(), groupSeparator()
+ \sa setNumberOptions(), toString(), groupSeparator(), FloatingPointPrecisionOption
*/
QLocale::NumberOptions QLocale::numberOptions() const
{
@@ -1140,12 +1212,12 @@ QLocale::NumberOptions QLocale::numberOptions() const
QString QLocale::quoteString(QStringView str, QuotationStyle style) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QVariant res;
- if (style == QLocale::AlternateQuotation)
+ if (style == AlternateQuotation)
res = systemLocale()->query(QSystemLocale::StringToAlternateQuotation,
QVariant::fromValue(str));
- if (res.isNull() || style == QLocale::StandardQuotation)
+ if (res.isNull() || style == StandardQuotation)
res = systemLocale()->query(QSystemLocale::StringToStandardQuotation,
QVariant::fromValue(str));
if (!res.isNull())
@@ -1154,7 +1226,7 @@ QString QLocale::quoteString(QStringView str, QuotationStyle style) const
#endif
QLocaleData::DataRange start, end;
- if (style == QLocale::StandardQuotation) {
+ if (style == StandardQuotation) {
start = d->m_data->quoteStart();
end = d->m_data->quoteEnd();
} else {
@@ -1173,8 +1245,9 @@ QString QLocale::quoteString(QStringView str, QuotationStyle style) const
*/
QString QLocale::createSeparatedList(const QStringList &list) const
{
+ // May be empty if list is empty or sole entry is empty.
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QVariant res =
systemLocale()->query(QSystemLocale::ListToSeparatedString, QVariant::fromValue(list));
@@ -1183,7 +1256,7 @@ QString QLocale::createSeparatedList(const QStringList &list) const
}
#endif
- const int size = list.size();
+ const qsizetype size = list.size();
if (size < 1)
return QString();
@@ -1198,7 +1271,7 @@ QString QLocale::createSeparatedList(const QStringList &list) const
QStringView formatMid = d->m_data->midListPattern().viewData(list_pattern_part_data);
QStringView formatEnd = d->m_data->endListPattern().viewData(list_pattern_part_data);
QString result = formatStart.arg(list.at(0), list.at(1));
- for (int i = 2; i < size - 1; ++i)
+ for (qsizetype i = 2; i < size - 1; ++i)
result = formatMid.arg(result, list.at(i));
result = formatEnd.arg(result, list.at(size - 1));
return result;
@@ -1233,12 +1306,13 @@ void QLocale::setDefault(const QLocale &locale)
// update the cached private
*defaultLocalePrivate = locale.d;
+ QLocalePrivate::s_generation.fetchAndAddRelaxed(1);
}
/*!
Returns the language of this locale.
- \sa script(), country(), languageToString(), bcp47Name()
+ \sa script(), territory(), languageToString(), bcp47Name()
*/
QLocale::Language QLocale::language() const
{
@@ -1250,7 +1324,7 @@ QLocale::Language QLocale::language() const
Returns the script of this locale.
- \sa language(), country(), languageToString(), scriptToString(), bcp47Name()
+ \sa language(), territory(), languageToString(), scriptToString(), bcp47Name()
*/
QLocale::Script QLocale::script() const
{
@@ -1258,61 +1332,120 @@ QLocale::Script QLocale::script() const
}
/*!
- Returns the country of this locale.
+ \since 6.2
- \sa language(), script(), countryToString(), bcp47Name()
+ Returns the territory of this locale.
+
+ \sa language(), script(), territoryToString(), bcp47Name()
*/
-QLocale::Country QLocale::country() const
+QLocale::Territory QLocale::territory() const
{
- return Country(d->countryId());
+ return Territory(d->territoryId());
}
+#if QT_DEPRECATED_SINCE(6, 6)
/*!
- Returns the language and country of this locale as a
- string of the form "language_country", where
- language is a lowercase, two-letter ISO 639 language code,
- and country is an uppercase, two- or three-letter ISO 3166 country code.
+ \deprecated [6.6] Use \l territory() instead.
- Note that even if QLocale object was constructed with an explicit script,
- name() will not contain it for compatibility reasons. Use bcp47Name() instead
- if you need a full locale name.
+ Returns the territory of this locale.
- \sa QLocale(), language(), script(), country(), bcp47Name()
+ \sa language(), script(), territoryToString(), bcp47Name()
*/
-
-QString QLocale::name() const
+QLocale::Country QLocale::country() const
{
- Language l = language();
- if (l == C)
- return d->languageCode();
-
- Country c = country();
- if (c == AnyCountry)
- return d->languageCode();
-
- return d->languageCode() + QLatin1Char('_') + d->countryCode();
+ return territory();
}
+#endif
-static qlonglong toIntegral_helper(const QLocaleData *d, QStringView str, bool *ok,
- QLocale::NumberOptions mode, qlonglong)
+/*!
+ \since 6.7
+ \enum QLocale::TagSeparator
+
+ Indicate how to combine the parts that make up a locale identifier.
+
+ A locale identifier may be made up of several tags, indicating language,
+ script and territory (plus, potentially, other details), joined together to
+ form the identifier. Various standards and conventional forms use either a
+ dash (the Unicode HYPHEN-MINUS, U+002D) or an underscore (LOW LINE, U+005F).
+ Different clients of QLocale may thus need one or the other.
+
+ \value Dash Use \c{'-'}, the dash or hyphen character.
+ \value Underscore Use \c{'_'}, the underscore character.
+
+ \note Although dash and underscore are the only separators used in public
+ standards (as at 2023), it is possible to cast any \l
+ {https://en.cppreference.com/w/cpp/language/ascii} {ASCII} character to this
+ type if a non-standard ASCII separator is needed. Casting a non-ASCII
+ character (with decimal value above 127) is not supported: such values are
+ reserved for future use as enum members if some public standard ever uses a
+ non-ASCII separator. It is, of course, possible to use QString::replace() to
+ replace the separator used by a function taking a parameter of this type
+ with an arbitrary Unicode character or string.
+*/
+
+Q_DECL_COLD_FUNCTION static void badSeparatorWarning(const char *method, char sep)
{
- return d->stringToLongLong(str, 10, ok, mode);
+ qWarning("QLocale::%s(): Using non-ASCII separator '%c' (%02x) is unsupported",
+ method, sep, uint(uchar(sep)));
}
-static qulonglong toIntegral_helper(const QLocaleData *d, QStringView str, bool *ok,
- QLocale::NumberOptions mode, qulonglong)
+/*!
+ \brief The short name of this locale.
+
+ Returns the language and territory of this locale as a string of the form
+ "language_territory", where language is a lowercase, two-letter ISO 639
+ language code, and territory is an uppercase, two- or three-letter ISO 3166
+ territory code. If the locale has no specified territory, only the language
+ name is returned. Since Qt 6.7 an optional \a separator parameter can be
+ supplied to override the default underscore character separating the two
+ tags.
+
+ Even if the QLocale object was constructed with an explicit script, name()
+ will not contain it for compatibility reasons. Use \l bcp47Name() instead if
+ you need a full locale name, or construct the string you want to identify a
+ locale by from those returned by passing its \l language() to \l
+ languageToCode() and similar for the script and territory.
+
+ \sa QLocale(), language(), script(), territory(), bcp47Name(), uiLanguages()
+*/
+
+QString QLocale::name(TagSeparator separator) const
{
- return d->stringToUnsLongLong(str, 10, ok, mode);
+ const char sep = char(separator);
+ if (uchar(sep) > 0x7f) {
+ badSeparatorWarning("name", sep);
+ return {};
+ }
+ const auto code = d->languageCode();
+ QLatin1StringView view{code.data()};
+
+ Language l = language();
+ if (l == C)
+ return view;
+
+ Territory c = territory();
+ if (c == AnyTerritory)
+ return view;
+
+ return view + QLatin1Char(sep) + d->territoryCode();
}
template <typename T> static inline
T toIntegral_helper(const QLocalePrivate *d, QStringView str, bool *ok)
{
- using Int64 =
- typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;
+ constexpr bool isUnsigned = std::is_unsigned_v<T>;
+ using Int64 = typename std::conditional_t<isUnsigned, quint64, qint64>;
+
+ QSimpleParsedNumber<Int64> r{};
+ if constexpr (isUnsigned)
+ r = d->m_data->stringToUnsLongLong(str, 10, d->m_numberOptions);
+ else
+ r = d->m_data->stringToLongLong(str, 10, d->m_numberOptions);
- // we select the right overload by the last, unused parameter
- Int64 val = toIntegral_helper(d->m_data, str, ok, d->m_numberOptions, Int64());
+ if (ok)
+ *ok = r.ok();
+
+ Int64 val = r.result;
if (T(val) != val) {
if (ok != nullptr)
*ok = false;
@@ -1325,64 +1458,229 @@ T toIntegral_helper(const QLocalePrivate *d, QStringView str, bool *ok)
/*!
\since 4.8
- Returns the dash-separated language, script and country (and possibly other
- BCP47 fields) of this locale as a string.
+ \brief Returns the BCP47 field names joined with dashes.
+
+ This combines as many of language, script and territory (and possibly other
+ BCP47 fields) for this locale as are needed to uniquely specify it. Note
+ that fields may be omitted if the Unicode consortium's \l {Matching
+ combinations of language, script and territory}{Likely Subtag Rules} imply
+ the omitted fields when given those retained. See \l name() for how to
+ construct a string from individual fields, if some other format is needed.
+
+ Unlike uiLanguages(), the value returned by bcp47Name() represents the
+ locale name of the QLocale data; this need not be the language the
+ user-interface should be in.
+
+ This function tries to conform the locale name to the IETF Best Common
+ Practice 47, defined by RFC 5646. Since Qt 6.7, it supports an optional \a
+ separator parameter which can be used to override the BCP47-specified use of
+ a hyphen to separate the tags. For use in IETF-defined protocols, however,
+ the default, QLocale::TagSeparator::Dash, should be retained.
+
+ \sa name(), language(), territory(), script(), uiLanguages()
+*/
+QString QLocale::bcp47Name(TagSeparator separator) const
+{
+ const char sep = char(separator);
+ if (uchar(sep) > 0x7f) {
+ badSeparatorWarning("bcp47Name", sep);
+ return {};
+ }
+ return QString::fromLatin1(d->bcp47Name(sep));
+}
+
+/*!
+ Returns the two- or three-letter language code for \a language, as defined
+ in the ISO 639 standards.
+
+ If specified, \a codeTypes selects which set of codes to consider. The first
+ code from the set that is defined for \a language is returned. Otherwise,
+ all ISO-639 codes are considered. The codes are considered in the following
+ order: \c ISO639Part1, \c ISO639Part2B, \c ISO639Part2T, \c ISO639Part3.
+ \c LegacyLanguageCode is ignored by this function.
+
+ \note For \c{QLocale::C} the function returns \c{"C"}.
+ For \c QLocale::AnyLanguage an empty string is returned.
+ If the language has no code in any selected code set, an empty string
+ is returned.
+
+ \since 6.3
+ \sa codeToLanguage(), language(), name(), bcp47Name(), territoryToCode(), scriptToCode()
+*/
+QString QLocale::languageToCode(Language language, LanguageCodeTypes codeTypes)
+{
+ const auto code = QLocalePrivate::languageToCode(language, codeTypes);
+ return QLatin1StringView{code.data()};
+}
+
+/*!
+ Returns the QLocale::Language enum corresponding to the two- or three-letter
+ \a languageCode, as defined in the ISO 639 standards.
+
+ If specified, \a codeTypes selects which set of codes to consider for
+ conversion. By default all codes known to Qt are considered. The codes are
+ matched in the following order: \c ISO639Part1, \c ISO639Part2B,
+ \c ISO639Part2T, \c ISO639Part3, \c LegacyLanguageCode.
+
+ If the code is invalid or not known \c QLocale::AnyLanguage is returned.
+
+ \since 6.3
+ \sa languageToCode(), codeToTerritory(), codeToScript()
+*/
+QLocale::Language QLocale::codeToLanguage(QStringView languageCode,
+ LanguageCodeTypes codeTypes) noexcept
+{
+ return QLocalePrivate::codeToLanguage(languageCode, codeTypes);
+}
+
+/*!
+ \since 6.2
+
+ Returns the two-letter territory code for \a territory, as defined
+ in the ISO 3166 standard.
+
+ \note For \c{QLocale::AnyTerritory} an empty string is returned.
+
+ \sa codeToTerritory(), territory(), name(), bcp47Name(), languageToCode(), scriptToCode()
+*/
+QString QLocale::territoryToCode(QLocale::Territory territory)
+{
+ return QLocalePrivate::territoryToCode(territory);
+}
+
+/*!
+ \since 6.2
+
+ Returns the QLocale::Territory enum corresponding to the two-letter or
+ three-digit \a territoryCode, as defined in the ISO 3166 standard.
+
+ If the code is invalid or not known QLocale::AnyTerritory is returned.
+
+ \sa territoryToCode(), codeToLanguage(), codeToScript()
+*/
+QLocale::Territory QLocale::codeToTerritory(QStringView territoryCode) noexcept
+{
+ return QLocalePrivate::codeToTerritory(territoryCode);
+}
+
+#if QT_DEPRECATED_SINCE(6, 6)
+/*!
+ \deprecated [6.6] Use \l territoryToCode() instead.
- Unlike the uiLanguages() the returned value of the bcp47Name() represents
- the locale name of the QLocale data but not the language the user-interface
- should be in.
+ Returns the two-letter territory code for \a country, as defined
+ in the ISO 3166 standard.
- This function tries to conform the locale name to BCP47.
+ \note For \c{QLocale::AnyTerritory} or \c{QLocale::AnyCountry} an empty string is returned.
- \sa language(), country(), script(), uiLanguages()
+ \sa codeToTerritory(), territory(), name(), bcp47Name(), languageToCode(), scriptToCode()
*/
-QString QLocale::bcp47Name() const
+QString QLocale::countryToCode(Country country)
{
- return QString::fromLatin1(d->bcp47Name());
+ return territoryToCode(country);
+}
+
+/*!
+ Returns the QLocale::Territory enum corresponding to the two-letter or
+ three-digit \a countryCode, as defined in the ISO 3166 standard.
+
+ If the code is invalid or not known QLocale::AnyTerritory is returned.
+
+ \deprecated [6.6] Use codeToTerritory(QStringView) instead.
+ \since 6.1
+ \sa territoryToCode(), codeToLanguage(), codeToScript()
+*/
+QLocale::Country QLocale::codeToCountry(QStringView countryCode) noexcept
+{
+ return QLocalePrivate::codeToTerritory(countryCode);
+}
+#endif
+
+/*!
+ Returns the four-letter script code for \a script, as defined in the
+ ISO 15924 standard.
+
+ \note For \c{QLocale::AnyScript} an empty string is returned.
+
+ \since 6.1
+ \sa script(), name(), bcp47Name(), languageToCode(), territoryToCode()
+*/
+QString QLocale::scriptToCode(Script script)
+{
+ return QLocalePrivate::scriptToCode(script);
+}
+
+/*!
+ Returns the QLocale::Script enum corresponding to the four-letter script
+ \a scriptCode, as defined in the ISO 15924 standard.
+
+ If the code is invalid or not known QLocale::AnyScript is returned.
+
+ \since 6.1
+ \sa scriptToCode(), codeToLanguage(), codeToTerritory()
+*/
+QLocale::Script QLocale::codeToScript(QStringView scriptCode) noexcept
+{
+ return QLocalePrivate::codeToScript(scriptCode);
}
/*!
Returns a QString containing the name of \a language.
- \sa countryToString(), scriptToString(), bcp47Name()
+ \sa territoryToString(), scriptToString(), bcp47Name()
*/
QString QLocale::languageToString(Language language)
{
- if (uint(language) > uint(QLocale::LastLanguage))
- return QLatin1String("Unknown");
- return QLatin1String(language_name_list + language_name_index[language]);
+ if (language > LastLanguage)
+ return "Unknown"_L1;
+ return QString::fromUtf8(language_name_list + language_name_index[language]);
}
/*!
- Returns a QString containing the name of \a country.
+ \since 6.2
+
+ Returns a QString containing the name of \a territory.
- \sa languageToString(), scriptToString(), country(), bcp47Name()
+ \sa languageToString(), scriptToString(), territory(), bcp47Name()
*/
+QString QLocale::territoryToString(Territory territory)
+{
+ if (territory > LastTerritory)
+ return "Unknown"_L1;
+ return QString::fromUtf8(territory_name_list + territory_name_index[territory]);
+}
+
+#if QT_DEPRECATED_SINCE(6, 6)
+/*!
+ \deprecated [6.6] Use \l territoryToString() instead.
+
+ Returns a QString containing the name of \a country.
+ \sa languageToString(), scriptToString(), territory(), bcp47Name()
+*/
QString QLocale::countryToString(Country country)
{
- if (uint(country) > uint(QLocale::LastCountry))
- return QLatin1String("Unknown");
- return QLatin1String(country_name_list + country_name_index[country]);
+ return territoryToString(country);
}
+#endif
/*!
\since 4.8
Returns a QString containing the name of \a script.
- \sa languageToString(), countryToString(), script(), bcp47Name()
+ \sa languageToString(), territoryToString(), script(), bcp47Name()
*/
-QString QLocale::scriptToString(QLocale::Script script)
+QString QLocale::scriptToString(Script script)
{
- if (uint(script) > uint(QLocale::LastScript))
- return QLatin1String("Unknown");
- return QLatin1String(script_name_list + script_name_index[script]);
+ if (script > LastScript)
+ return "Unknown"_L1;
+ return QString::fromUtf8(script_name_list + script_name_index[script]);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
+ \fn short QLocale::toShort(const QString &s, bool *ok) const
+
Returns the short int represented by the localized string \a s.
If the conversion fails the function returns 0.
@@ -1395,12 +1693,9 @@ QString QLocale::scriptToString(QLocale::Script script)
\sa toUShort(), toString()
*/
-short QLocale::toShort(const QString &s, bool *ok) const
-{
- return toIntegral_helper<short>(d, s, ok);
-}
-
/*!
+ \fn ushort QLocale::toUShort(const QString &s, bool *ok) const
+
Returns the unsigned short int represented by the localized string \a s.
If the conversion fails the function returns 0.
@@ -1413,12 +1708,8 @@ short QLocale::toShort(const QString &s, bool *ok) const
\sa toShort(), toString()
*/
-ushort QLocale::toUShort(const QString &s, bool *ok) const
-{
- return toIntegral_helper<ushort>(d, s, ok);
-}
-
/*!
+ \fn int QLocale::toInt(const QString &s, bool *ok) const
Returns the int represented by the localized string \a s.
If the conversion fails the function returns 0.
@@ -1431,12 +1722,8 @@ ushort QLocale::toUShort(const QString &s, bool *ok) const
\sa toUInt(), toString()
*/
-int QLocale::toInt(const QString &s, bool *ok) const
-{
- return toIntegral_helper<int>(d, s, ok);
-}
-
/*!
+ \fn uint QLocale::toUInt(const QString &s, bool *ok) const
Returns the unsigned int represented by the localized string \a s.
If the conversion fails the function returns 0.
@@ -1449,54 +1736,41 @@ int QLocale::toInt(const QString &s, bool *ok) const
\sa toInt(), toString()
*/
-uint QLocale::toUInt(const QString &s, bool *ok) const
-{
- return toIntegral_helper<uint>(d, s, ok);
-}
-
/*!
- Returns the long int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
+ \since 5.13
+ \fn long QLocale::toLong(const QString &s, bool *ok) const
- This function ignores leading and trailing whitespace.
+ Returns the long int represented by the localized string \a s.
- \sa toInt(), toULong(), toDouble(), toString()
+ If the conversion fails the function returns 0.
- \since 5.13
- */
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+ This function ignores leading and trailing whitespace.
-long QLocale::toLong(const QString &s, bool *ok) const
-{
- return toIntegral_helper<long>(d, s, ok);
-}
+ \sa toInt(), toULong(), toDouble(), toString()
+*/
/*!
- Returns the unsigned long int represented by the localized
- string \a s.
+ \since 5.13
+ \fn ulong QLocale::toULong(const QString &s, bool *ok) const
- If the conversion fails the function returns 0.
+ Returns the unsigned long int represented by the localized
+ string \a s.
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
+ If the conversion fails the function returns 0.
- This function ignores leading and trailing whitespace.
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
- \sa toLong(), toInt(), toDouble(), toString()
+ This function ignores leading and trailing whitespace.
- \since 5.13
+ \sa toLong(), toInt(), toDouble(), toString()
*/
-ulong QLocale::toULong(const QString &s, bool *ok) const
-{
- return toIntegral_helper<ulong>(d, s, ok);
-}
-
/*!
+ \fn qlonglong QLocale::toLongLong(const QString &s, bool *ok) const
Returns the long long int represented by the localized string \a s.
If the conversion fails the function returns 0.
@@ -1509,13 +1783,9 @@ ulong QLocale::toULong(const QString &s, bool *ok) const
\sa toInt(), toULongLong(), toDouble(), toString()
*/
-
-qlonglong QLocale::toLongLong(const QString &s, bool *ok) const
-{
- return toIntegral_helper<qlonglong>(d, s, ok);
-}
-
/*!
+ \fn qulonglong QLocale::toULongLong(const QString &s, bool *ok) const
+
Returns the unsigned long long int represented by the localized
string \a s.
@@ -1529,12 +1799,9 @@ qlonglong QLocale::toLongLong(const QString &s, bool *ok) const
\sa toLongLong(), toInt(), toDouble(), toString()
*/
-qulonglong QLocale::toULongLong(const QString &s, bool *ok) const
-{
- return toIntegral_helper<qulonglong>(d, s, ok);
-}
-
/*!
+ \fn float QLocale::toFloat(const QString &s, bool *ok) const
+
Returns the float represented by the localized string \a s.
Returns an infinity if the conversion overflows or 0.0 if the
@@ -1543,20 +1810,13 @@ qulonglong QLocale::toULongLong(const QString &s, bool *ok) const
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- This function does not fall back to the 'C' locale if the string
- cannot be interpreted in this locale.
-
This function ignores leading and trailing whitespace.
\sa toDouble(), toInt(), toString()
*/
-float QLocale::toFloat(const QString &s, bool *ok) const
-{
- return QLocaleData::convertDoubleToFloat(toDouble(s, ok), ok);
-}
-
/*!
+ \fn double QLocale::toDouble(const QString &s, bool *ok) const
Returns the double represented by the localized string \a s.
Returns an infinity if the conversion overflows or 0.0 if the
@@ -1565,9 +1825,6 @@ float QLocale::toFloat(const QString &s, bool *ok) const
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- This function does not fall back to the 'C' locale if the string
- cannot be interpreted in this locale.
-
\snippet code/src_corelib_text_qlocale.cpp 3
Notice that the last conversion returns 1234.0, because '.' is the
@@ -1578,12 +1835,6 @@ float QLocale::toFloat(const QString &s, bool *ok) const
\sa toFloat(), toInt(), toString()
*/
-double QLocale::toDouble(const QString &s, bool *ok) const
-{
- return d->m_data->stringToDouble(s, ok, d->m_numberOptions);
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
-
/*!
Returns the short int represented by the localized string \a s.
@@ -1665,20 +1916,18 @@ uint QLocale::toUInt(QStringView s, bool *ok) const
}
/*!
- Returns the long int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
+ \since 5.13
+ Returns the long int represented by the localized string \a s.
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
+ If the conversion fails the function returns 0.
- \sa toInt(), toULong(), toDouble(), toString()
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
- \since 5.13
- */
+ This function ignores leading and trailing whitespace.
+ \sa toInt(), toULong(), toDouble(), toString()
+*/
long QLocale::toLong(QStringView s, bool *ok) const
{
@@ -1686,20 +1935,19 @@ long QLocale::toLong(QStringView s, bool *ok) const
}
/*!
- Returns the unsigned long int represented by the localized
- string \a s.
-
- If the conversion fails the function returns 0.
+ \since 5.13
+ Returns the unsigned long int represented by the localized
+ string \a s.
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
+ If the conversion fails the function returns 0.
- This function ignores leading and trailing whitespace.
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
- \sa toLong(), toInt(), toDouble(), toString()
+ This function ignores leading and trailing whitespace.
- \since 5.13
- */
+ \sa toLong(), toInt(), toDouble(), toString()
+*/
ulong QLocale::toULong(QStringView s, bool *ok) const
{
@@ -1778,10 +2026,6 @@ float QLocale::toFloat(QStringView s, bool *ok) const
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- Unlike QString::toDouble(), this function does not fall back to
- the "C" locale if the string cannot be interpreted in this
- locale.
-
\snippet code/src_corelib_text_qlocale.cpp 3-qstringview
Notice that the last conversion returns 1234.0, because '.' is the
@@ -1807,10 +2051,8 @@ double QLocale::toDouble(QStringView s, bool *ok) const
QString QLocale::toString(qlonglong i) const
{
- int flags = d->m_numberOptions & OmitGroupSeparator
- ? 0
- : (d->m_data->m_country_id == Country::India)
- ? QLocaleData::IndianNumberGrouping : QLocaleData::ThousandsGroup;
+ int flags = (d->m_numberOptions & OmitGroupSeparator
+ ? 0 : QLocaleData::GroupDigits);
return d->m_data->longLongToString(i, -1, 10, -1, flags);
}
@@ -1823,15 +2065,12 @@ QString QLocale::toString(qlonglong i) const
QString QLocale::toString(qulonglong i) const
{
- int flags = d->m_numberOptions & OmitGroupSeparator
- ? 0
- : (d->m_data->m_country_id == Country::India)
- ? QLocaleData::IndianNumberGrouping : QLocaleData::ThousandsGroup;
+ int flags = (d->m_numberOptions & OmitGroupSeparator
+ ? 0 : QLocaleData::GroupDigits);
return d->m_data->unsLongLongToString(i, -1, 10, -1, flags);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a localized string representation of the given \a date in the
specified \a format.
@@ -1842,39 +2081,97 @@ QString QLocale::toString(qulonglong i) const
QString QLocale::toString(QDate date, const QString &format) const
{
- return QCalendar().dateTimeToString(format, QDateTime(), date, QTime(), *this);
+ return toString(date, qToStringViewIgnoringNull(format));
}
-#endif
/*!
- \since 5.10
+ Returns a localized string representation of the given \a time according
+ to the specified \a format.
+ If \a format is an empty string, an empty string is returned.
+
+ \sa QTime::toString()
+*/
+
+QString QLocale::toString(QTime time, const QString &format) const
+{
+ return toString(time, qToStringViewIgnoringNull(format));
+}
+
+/*!
+ \since 4.4
+ \fn QString QLocale::toString(const QDateTime &dateTime, const QString &format) const
+
+ Returns a localized string representation of the given \a dateTime according
+ to the specified \a format.
+ If \a format is an empty string, an empty string is returned.
+
+ \sa QDateTime::toString(), QDate::toString(), QTime::toString()
+*/
+
+/*!
+ \since 5.14
Returns a localized string representation of the given \a date in the
- specified \a format.
+ specified \a format, optionally for a specified calendar \a cal.
If \a format is an empty string, an empty string is returned.
\sa QDate::toString()
*/
+QString QLocale::toString(QDate date, QStringView format, QCalendar cal) const
+{
+ return cal.dateTimeToString(format, QDateTime(), date, QTime(), *this);
+}
+
+/*!
+ \since 5.10
+ \overload
+*/
QString QLocale::toString(QDate date, QStringView format) const
{
return QCalendar().dateTimeToString(format, QDateTime(), date, QTime(), *this);
}
/*!
+ \since 5.14
+
Returns a localized string representation of the given \a date according
- to the specified \a format (see dateFormat()).
+ to the specified \a format (see dateFormat()), optionally for a specified
+ calendar \a cal.
\note Some locales may use formats that limit the range of years they can
represent.
*/
+QString QLocale::toString(QDate date, FormatType format, QCalendar cal) const
+{
+ if (!date.isValid())
+ return QString();
+#ifndef QT_NO_SYSTEMLOCALE
+ if (cal.isGregorian() && d->m_data == &systemLocaleData) {
+ QVariant res = systemLocale()->query(format == LongFormat
+ ? QSystemLocale::DateToStringLong
+ : QSystemLocale::DateToStringShort,
+ date);
+ if (!res.isNull())
+ return res.toString();
+ }
+#endif
+
+ QString format_str = dateFormat(format);
+ return toString(date, format_str, cal);
+}
+
+/*!
+ \since 4.5
+ \overload
+*/
QString QLocale::toString(QDate date, FormatType format) const
{
if (!date.isValid())
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::DateToStringLong
: QSystemLocale::DateToStringShort,
@@ -1890,7 +2187,7 @@ QString QLocale::toString(QDate date, FormatType format) const
static bool timeFormatContainsAP(QStringView format)
{
- int i = 0;
+ qsizetype i = 0;
while (i < format.size()) {
if (format.at(i).unicode() == '\'') {
qt_readEscapedFormatString(format, &i);
@@ -1905,22 +2202,8 @@ static bool timeFormatContainsAP(QStringView format)
return false;
}
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- Returns a localized string representation of the given \a time according
- to the specified \a format.
- If \a format is an empty string, an empty string is returned.
-
- \sa QTime::toString()
-*/
-QString QLocale::toString(QTime time, const QString &format) const
-{
- return QCalendar().dateTimeToString(format, QDateTime(), QDate(), time, *this);
-}
-#endif
-
/*!
- \since 5.10
+ \since 4.5
Returns a localized string representation of the given \a time according
to the specified \a format.
@@ -1933,70 +2216,46 @@ QString QLocale::toString(QTime time, QStringView format) const
return QCalendar().dateTimeToString(format, QDateTime(), QDate(), time, *this);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
- \since 4.4
+ \since 5.14
Returns a localized string representation of the given \a dateTime according
- to the specified \a format.
+ to the specified \a format, optionally for a specified calendar \a cal.
If \a format is an empty string, an empty string is returned.
\sa QDateTime::toString(), QDate::toString(), QTime::toString()
*/
-
-QString QLocale::toString(const QDateTime &dateTime, const QString &format) const
+QString QLocale::toString(const QDateTime &dateTime, QStringView format, QCalendar cal) const
{
- return QCalendar().dateTimeToString(format, dateTime, QDate(), QTime(), *this);
+ return cal.dateTimeToString(format, dateTime, QDate(), QTime(), *this);
}
-#endif
/*!
\since 5.10
-
- Returns a localized string representation of the given \a dateTime according
- to the specified \a format.
- If \a format is an empty string, an empty string is returned.
-
- \sa QDateTime::toString(), QDate::toString(), QTime::toString()
+ \overload
*/
QString QLocale::toString(const QDateTime &dateTime, QStringView format) const
{
return QCalendar().dateTimeToString(format, dateTime, QDate(), QTime(), *this);
}
-QString QLocale::toString(QDate date, QStringView format, QCalendar cal) const
-{
- return cal.dateTimeToString(format, QDateTime(), date, QTime(), *this);
-}
-
-QString QLocale::toString(QDate date, QLocale::FormatType format, QCalendar cal) const
-{
- if (!date.isValid())
- return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
- if (cal.isGregorian() && d->m_data == systemData()) {
- QVariant res = systemLocale()->query(format == LongFormat
- ? QSystemLocale::DateToStringLong
- : QSystemLocale::DateToStringShort,
- date);
- if (!res.isNull())
- return res.toString();
- }
-#endif
+/*!
+ \since 5.14
- QString format_str = dateFormat(format);
- return toString(date, format_str, cal);
-}
+ Returns a localized string representation of the given \a dateTime according
+ to the specified \a format (see dateTimeFormat()), optionally for a
+ specified calendar \a cal.
-QString QLocale::toString(const QDateTime &dateTime, QLocale::FormatType format,
- QCalendar cal) const
+ \note Some locales may use formats that limit the range of years they can
+ represent.
+*/
+QString QLocale::toString(const QDateTime &dateTime, FormatType format, QCalendar cal) const
{
if (!dateTime.isValid())
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (cal.isGregorian() && d->m_data == systemData()) {
+ if (cal.isGregorian() && d->m_data == &systemLocaleData) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::DateTimeToStringLong
: QSystemLocale::DateTimeToStringShort,
@@ -2010,28 +2269,17 @@ QString QLocale::toString(const QDateTime &dateTime, QLocale::FormatType format,
return toString(dateTime, format_str, cal);
}
-QString QLocale::toString(const QDateTime &dateTime, QStringView format, QCalendar cal) const
-{
- return cal.dateTimeToString(format, dateTime, QDate(), QTime(), *this);
-}
-
/*!
\since 4.4
-
- Returns a localized string representation of the given \a dateTime according
- to the specified \a format (see dateTimeFormat()).
-
- \note Some locales may use formats that limit the range of years they can
- represent.
+ \overload
*/
-
QString QLocale::toString(const QDateTime &dateTime, FormatType format) const
{
if (!dateTime.isValid())
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::DateTimeToStringLong
: QSystemLocale::DateTimeToStringShort,
@@ -2057,7 +2305,7 @@ QString QLocale::toString(QTime time, FormatType format) const
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::TimeToStringLong
: QSystemLocale::TimeToStringShort,
@@ -2086,7 +2334,7 @@ QString QLocale::toString(QTime time, FormatType format) const
QString QLocale::dateFormat(FormatType format) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::DateFormatLong
: QSystemLocale::DateFormatShort,
@@ -2117,7 +2365,7 @@ QString QLocale::dateFormat(FormatType format) const
QString QLocale::timeFormat(FormatType format) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::TimeFormatLong
: QSystemLocale::TimeFormatShort,
@@ -2148,7 +2396,7 @@ QString QLocale::timeFormat(FormatType format) const
QString QLocale::dateTimeFormat(FormatType format) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QVariant res = systemLocale()->query(format == LongFormat
? QSystemLocale::DateTimeFormatLong
: QSystemLocale::DateTimeFormatShort,
@@ -2158,16 +2406,20 @@ QString QLocale::dateTimeFormat(FormatType format) const
}
}
#endif
- return dateFormat(format) + QLatin1Char(' ') + timeFormat(format);
+ return dateFormat(format) + u' ' + timeFormat(format);
}
#if QT_CONFIG(datestring)
/*!
\since 4.4
- Parses the time string given in \a string and returns the
- time. The format of the time string is chosen according to the
- \a format parameter (see timeFormat()).
+ Reads \a string as a time in a locale-specific \a format.
+
+ Parses \a string and returns the time it represents. The format of the time
+ string is chosen according to the \a format parameter (see timeFormat()).
+
+ \note Any am/pm indicators used must match \l amText() or \l pmText(),
+ ignoring case.
If the time could not be parsed, returns an invalid time.
@@ -2178,76 +2430,89 @@ QTime QLocale::toTime(const QString &string, FormatType format) const
return toTime(string, timeFormat(format));
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \since 5.14
- \overload
- \deprecated
-*/
-QTime QLocale::toTime(const QString &string, FormatType format, QCalendar cal) const
-{
-QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
- return toTime(string, timeFormat(format), cal);
-QT_WARNING_POP
-}
-#endif
-
/*!
\since 4.4
- Parses the date string given in \a string and returns the
- date. The format of the date string is chosen according to the
- \a format parameter (see dateFormat()).
+ Reads \a string as a date in a locale-specific \a format.
+
+ Parses \a string and returns the date it represents. The format of the date
+ string is chosen according to the \a format parameter (see dateFormat()).
+
+//! [base-year-for-short]
+ Some locales use, particularly for ShortFormat, only the last two digits of
+ the year. In such a case, the 100 years starting at \a baseYear are the
+ candidates first considered. Prior to 6.7 there was no \a baseYear parameter
+ and 1900 was always used. This is the default for \a baseYear, selecting a
+ year from then to 1999. In some cases, other fields may lead to the next or
+ previous century being selected, to get a result consistent with all fields
+ given. See \l QDate::fromString() for details.
+//! [base-year-for-short]
+
+ \note Month and day names, where used, must be given in the locale's
+ language.
If the date could not be parsed, returns an invalid date.
\sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
*/
-QDate QLocale::toDate(const QString &string, FormatType format) const
+QDate QLocale::toDate(const QString &string, FormatType format, int baseYear) const
{
- return toDate(string, dateFormat(format));
+ return toDate(string, dateFormat(format), baseYear);
}
/*!
\since 5.14
\overload
*/
-QDate QLocale::toDate(const QString &string, FormatType format, QCalendar cal) const
+QDate QLocale::toDate(const QString &string, FormatType format, QCalendar cal, int baseYear) const
{
- return toDate(string, dateFormat(format), cal);
+ return toDate(string, dateFormat(format), cal, baseYear);
}
/*!
\since 4.4
- Parses the date/time string given in \a string and returns the
- time. The format of the date/time string is chosen according to the
- \a format parameter (see dateTimeFormat()).
+ Reads \a string as a date-time in a locale-specific \a format.
+
+ Parses \a string and returns the date-time it represents. The format of the
+ date string is chosen according to the \a format parameter (see
+ dateFormat()).
+
+ \include qlocale.cpp base-year-for-short
+
+ \note Month and day names, where used, must be given in the locale's
+ language. Any am/pm indicators used must match \l amText() or \l pmText(),
+ ignoring case.
If the string could not be parsed, returns an invalid QDateTime.
\sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
*/
-QDateTime QLocale::toDateTime(const QString &string, FormatType format) const
+QDateTime QLocale::toDateTime(const QString &string, FormatType format, int baseYear) const
{
- return toDateTime(string, dateTimeFormat(format));
+ return toDateTime(string, dateTimeFormat(format), baseYear);
}
/*!
\since 5.14
\overload
*/
-QDateTime QLocale::toDateTime(const QString &string, FormatType format, QCalendar cal) const
+QDateTime QLocale::toDateTime(const QString &string, FormatType format, QCalendar cal,
+ int baseYear) const
{
- return toDateTime(string, dateTimeFormat(format), cal);
+ return toDateTime(string, dateTimeFormat(format), cal, baseYear);
}
/*!
\since 4.4
- Parses the time string given in \a string and returns the
- time. See QTime::fromString() for information on what is a valid
- format string.
+ Reads \a string as a time in the given \a format.
+
+ Parses \a string and returns the time it represents. See QTime::fromString()
+ for the interpretation of \a format.
+
+ \note Any am/pm indicators used must match \l amText() or \l pmText(),
+ ignoring case.
If the time could not be parsed, returns an invalid time.
@@ -2268,63 +2533,52 @@ QTime QLocale::toTime(const QString &string, const QString &format) const
return time;
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \since 5.14
- \overload
- \deprecated
-*/
-QTime QLocale::toTime(const QString &string, const QString &format, QCalendar cal) const
-{
- QTime time;
-#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QMetaType::QTime, QDateTimeParser::FromString, cal);
- dt.setDefaultLocale(*this);
- if (dt.parseFormat(format))
- dt.fromString(string, nullptr, &time);
-#else
- Q_UNUSED(cal);
- Q_UNUSED(string);
- Q_UNUSED(format);
-#endif
- return time;
-}
-#endif
-
/*!
\since 4.4
- Parses the date string given in \a string and returns the
- date. See QDate::fromString() for information on the expressions
- that can be used with this function.
+ Reads \a string as a date in the given \a format.
- This function searches month names and the names of the days of
- the week in the current locale.
+ Parses \a string and returns the date it represents. See QDate::fromString()
+ for the interpretation of \a format.
+
+//! [base-year-for-two-digit]
+ When \a format only specifies the last two digits of a year, the 100 years
+ starting at \a baseYear are the candidates first considered. Prior to 6.7
+ there was no \a baseYear parameter and 1900 was always used. This is the
+ default for \a baseYear, selecting a year from then to 1999. In some cases,
+ other fields may lead to the next or previous century being selected, to get
+ a result consistent with all fields given. See \l QDate::fromString() for
+ details.
+//! [base-year-for-two-digit]
+
+ \note Month and day names, where used, must be given in the locale's
+ language.
If the date could not be parsed, returns an invalid date.
\sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
*/
-QDate QLocale::toDate(const QString &string, const QString &format) const
+QDate QLocale::toDate(const QString &string, const QString &format, int baseYear) const
{
- return toDate(string, format, QCalendar());
+ return toDate(string, format, QCalendar(), baseYear);
}
/*!
\since 5.14
\overload
*/
-QDate QLocale::toDate(const QString &string, const QString &format, QCalendar cal) const
+QDate QLocale::toDate(const QString &string, const QString &format, QCalendar cal, int baseYear) const
{
QDate date;
#if QT_CONFIG(datetimeparser)
QDateTimeParser dt(QMetaType::QDate, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(*this);
if (dt.parseFormat(format))
- dt.fromString(string, &date, nullptr);
+ dt.fromString(string, &date, nullptr, baseYear);
#else
Q_UNUSED(string);
Q_UNUSED(format);
+ Q_UNUSED(baseYear);
Q_UNUSED(cal);
#endif
return date;
@@ -2333,38 +2587,51 @@ QDate QLocale::toDate(const QString &string, const QString &format, QCalendar ca
/*!
\since 4.4
- Parses the date/time string given in \a string and returns the
- time. See QDateTime::fromString() for information on the expressions
- that can be used with this function.
+ Reads \a string as a date-time in the given \a format.
- \note The month and day names used must be given in the user's local
- language.
+ Parses \a string and returns the date-time it represents. See
+ QDateTime::fromString() for the interpretation of \a format.
- If the string could not be parsed, returns an invalid QDateTime.
+ \include qlocale.cpp base-year-for-two-digit
+
+ \note Month and day names, where used, must be given in the locale's
+ language. Any am/pm indicators used must match \l amText() or \l pmText(),
+ ignoring case.
+
+ If the string could not be parsed, returns an invalid QDateTime. If the
+ string can be parsed and represents an invalid date-time (e.g. in a gap
+ skipped by a time-zone transition), an invalid QDateTime is returned, whose
+ toMSecsSinceEpoch() represents a near-by date-time that is valid. Passing
+ that to fromMSecsSinceEpoch() will produce a valid date-time that isn't
+ faithfully represented by the string parsed.
\sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
*/
-QDateTime QLocale::toDateTime(const QString &string, const QString &format) const
+QDateTime QLocale::toDateTime(const QString &string, const QString &format, int baseYear) const
{
- return toDateTime(string, format, QCalendar());
+ return toDateTime(string, format, QCalendar(), baseYear);
}
/*!
\since 5.14
\overload
*/
-QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCalendar cal) const
+QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCalendar cal,
+ int baseYear) const
{
#if QT_CONFIG(datetimeparser)
QDateTime datetime;
QDateTimeParser dt(QMetaType::QDateTime, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(*this);
- if (dt.parseFormat(format) && dt.fromString(string, &datetime))
+ if (dt.parseFormat(format) && (dt.fromString(string, &datetime, baseYear)
+ || !datetime.isValid())) {
return datetime;
+ }
#else
Q_UNUSED(string);
Q_UNUSED(format);
+ Q_UNUSED(baseYear);
Q_UNUSED(cal);
#endif
return QDateTime();
@@ -2374,7 +2641,14 @@ QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCal
/*!
\since 4.1
- Returns the decimal point character of this locale.
+ Returns the fractional part separator for this locale.
+
+ This is the token that separates the whole number part from the fracional
+ part in the representation of a number which has a fractional part. This is
+ commonly called the "decimal point character" - even though, in many
+ locales, it is not a "point" (or similar dot). It is (since Qt 6.0) returned
+ as a string in case some locale needs more than one UTF-16 code-point to
+ represent its separator.
\sa groupSeparator(), toString()
*/
@@ -2386,7 +2660,14 @@ QString QLocale::decimalPoint() const
/*!
\since 4.1
- Returns the group separator character of this locale.
+ Returns the digit-grouping separator for this locale.
+
+ This is a token used to break up long sequences of digits, in the
+ representation of a number, to make it easier to read. In some locales it
+ may be empty, indicating that digits should not be broken up into groups in
+ this way. In others it may be a spacing character. It is (since Qt 6.0)
+ returned as a string in case some locale needs more than one UTF-16
+ code-point to represent its separator.
\sa decimalPoint(), toString()
*/
@@ -2398,7 +2679,12 @@ QString QLocale::groupSeparator() const
/*!
\since 4.1
- Returns the percent character of this locale.
+ Returns the percent marker of this locale.
+
+ This is a token presumed to be appended to a number to indicate a
+ percentage. It is (since Qt 6.0) returned as a string because, in some
+ locales, it is not a single character - for example, because it includes a
+ text-direction-control character.
\sa toString()
*/
@@ -2412,6 +2698,13 @@ QString QLocale::percent() const
Returns the zero digit character of this locale.
+ This is a single Unicode character but may be encoded as a surrogate pair,
+ so is (since Qt 6.0) returned as a string. In most locales, other digits
+ follow it in Unicode ordering - however, some number systems, notably those
+ using U+3007 as zero, do not have contiguous digits. Use toString() to
+ obtain suitable representations of numbers, rather than trying to construct
+ them from this zero digit.
+
\sa toString()
*/
QString QLocale::zeroDigit() const
@@ -2422,7 +2715,12 @@ QString QLocale::zeroDigit() const
/*!
\since 4.1
- Returns the negative sign character of this locale.
+ Returns the negative sign indicator of this locale.
+
+ This is a token presumed to be used as a prefix to a number to indicate that
+ it is negative. It is (since Qt 6.0) returned as a string because, in some
+ locales, it is not a single character - for example, because it includes a
+ text-direction-control character.
\sa positiveSign(), toString()
*/
@@ -2434,7 +2732,12 @@ QString QLocale::negativeSign() const
/*!
\since 4.5
- Returns the positive sign character of this locale.
+ Returns the positive sign indicator of this locale.
+
+ This is a token presumed to be used as a prefix to a number to indicate that
+ it is positive. It is (since Qt 6.0) returned as a string because, in some
+ locales, it is not a single character - for example, because it includes a
+ text-direction-control character.
\sa negativeSign(), toString()
*/
@@ -2446,8 +2749,13 @@ QString QLocale::positiveSign() const
/*!
\since 4.1
- Returns the exponential character of this locale, used to separate exponent
- from mantissa in some floating-point numeric representations.
+ Returns the exponent separator for this locale.
+
+ This is a token used to separate mantissa from exponent in some
+ floating-point numeric representations. It is (since Qt 6.0) returned as a
+ string because, in some locales, it is not a single character - for example,
+ it may consist of a multiplication sign and a representation of the "ten to
+ the power" operator.
\sa toString(double, char, int)
*/
@@ -2456,57 +2764,66 @@ QString QLocale::exponential() const
return d->m_data->exponentSeparator();
}
-static bool qIsUpper(char c)
-{
- return c >= 'A' && c <= 'Z';
-}
-
-static char qToLower(char c)
-{
- if (c >= 'A' && c <= 'Z')
- return c - 'A' + 'a';
- else
- return c;
-}
-
/*!
\overload
-
- \a f and \a prec have the same meaning as in QString::number(double, char, int).
-
- \sa toDouble(), numberOptions(), exponential(), decimalPoint(), zeroDigit(), positiveSign(), percent()
+ Returns a string representing the floating-point number \a f.
+
+ The form of the representation is controlled by the \a format and \a
+ precision parameters.
+
+ The \a format defaults to \c{'g'}. It can be any of the following:
+
+ \table
+ \header \li Format \li Meaning \li Meaning of \a precision
+ \row \li \c 'e' \li format as [-]9.9e[+|-]999 \li number of digits \e after the decimal point
+ \row \li \c 'E' \li format as [-]9.9E[+|-]999 \li "
+ \row \li \c 'f' \li format as [-]9.9 \li "
+ \row \li \c 'F' \li same as \c 'f' except for INF and NAN (see below) \li "
+ \row \li \c 'g' \li use \c 'e' or \c 'f' format, whichever is more concise \li maximum number of significant digits (trailing zeroes are omitted)
+ \row \li \c 'G' \li use \c 'E' or \c 'F' format, whichever is more concise \li "
+ \endtable
+
+ The special \a precision value QLocale::FloatingPointShortest selects the
+ shortest representation that, when read as a number, gets back the original floating-point
+ value. Aside from that, any negative \a precision is ignored in favor of the
+ default, 6.
+
+ For the \c 'e', \c 'f' and \c 'g' formats, positive infinity is represented
+ as "inf", negative infinity as "-inf" and floating-point NaN (not-a-number)
+ values are represented as "nan". For the \c 'E', \c 'F' and \c 'G' formats,
+ "INF" and "NAN" are used instead. This does not vary with locale.
+
+ \sa toDouble(), numberOptions(), exponential(), decimalPoint(), zeroDigit(),
+ positiveSign(), percent(), toCurrencyString(), formattedDataSize(),
+ QLocale::FloatingPointPrecisionOption
*/
-QString QLocale::toString(double i, char f, int prec) const
+QString QLocale::toString(double f, char format, int precision) const
{
QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- uint flags = 0;
+ uint flags = isAsciiUpper(format) ? QLocaleData::CapitalEorX : 0;
- if (qIsUpper(f))
- flags = QLocaleData::CapitalEorX;
- f = qToLower(f);
-
- switch (f) {
- case 'f':
- form = QLocaleData::DFDecimal;
- break;
- case 'e':
- form = QLocaleData::DFExponent;
- break;
- case 'g':
- form = QLocaleData::DFSignificantDigits;
- break;
- default:
- break;
+ switch (QtMiscUtils::toAsciiLower(format)) {
+ case 'f':
+ form = QLocaleData::DFDecimal;
+ break;
+ case 'e':
+ form = QLocaleData::DFExponent;
+ break;
+ case 'g':
+ form = QLocaleData::DFSignificantDigits;
+ break;
+ default:
+ break;
}
if (!(d->m_numberOptions & OmitGroupSeparator))
- flags |= QLocaleData::ThousandsGroup;
+ flags |= QLocaleData::GroupDigits;
if (!(d->m_numberOptions & OmitLeadingZeroInExponent))
flags |= QLocaleData::ZeroPadExponent;
if (d->m_numberOptions & IncludeTrailingZeroesAfterDot)
flags |= QLocaleData::AddTrailingZeroes;
- return d->m_data->doubleToString(i, prec, form, -1, flags);
+ return d->m_data->doubleToString(f, precision, form, -1, flags);
}
/*!
@@ -2531,66 +2848,87 @@ QString QLocale::toString(double i, char f, int prec) const
/*!
Returns a QLocale object initialized to the system locale.
- On Windows and Mac, this locale will use the decimal/grouping characters and
- date/time formats specified in the system configuration panel.
+ The system locale may use system-specific sources for locale data, where
+ available, otherwise falling back on QLocale's built-in database entry for
+ the language, script and territory the system reports.
+
+ For example, on Windows and Mac, this locale will use the decimal/grouping
+ characters and date/time formats specified in the system configuration
+ panel.
\sa c()
*/
QLocale QLocale::system()
{
- QT_PREPEND_NAMESPACE(systemData)(); // trigger updating of the system data if necessary
- if (systemLocalePrivate.isDestroyed())
- return QLocale(QLocale::C);
- return QLocale(*systemLocalePrivate->data());
-}
+ constexpr auto sysData = []() {
+ // Same return as systemData(), but leave the setup to the actual call to it.
+#ifdef QT_NO_SYSTEMLOCALE
+ return locale_data;
+#else
+ return &systemLocaleData;
+#endif
+ };
+ Q_CONSTINIT static QLocalePrivate locale(sysData(), -1, DefaultNumberOptions, 1);
+ // Calling systemData() ensures system data is up to date; we also need it
+ // to ensure that locale's index stays up to date:
+ systemData(&locale.m_index);
+ Q_ASSERT(locale.m_index >= 0 && locale.m_index < locale_data_size);
+ return QLocale(locale);
+}
/*!
- \since 4.8
-
Returns a list of valid locale objects that match the given \a language, \a
- script and \a country.
+ script and \a territory.
Getting a list of all locales:
QList<QLocale> allLocales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript,
- QLocale::AnyCountry);
+ QLocale::AnyTerritory);
Getting a list of locales suitable for Russia:
QList<QLocale> locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript,
QLocale::Russia);
*/
-QList<QLocale> QLocale::matchingLocales(QLocale::Language language,
- QLocale::Script script,
- QLocale::Country country)
+QList<QLocale> QLocale::matchingLocales(Language language, Script script, Territory territory)
{
- if (uint(language) > QLocale::LastLanguage || uint(script) > QLocale::LastScript ||
- uint(country) > QLocale::LastCountry)
+ const QLocaleId filter { language, script, territory };
+ if (!filter.isValid())
return QList<QLocale>();
- if (language == QLocale::C)
- return QList<QLocale>() << QLocale(QLocale::C);
+ if (language == C)
+ return QList<QLocale>{QLocale(C)};
QList<QLocale> result;
- if (language == QLocale::AnyLanguage && script == QLocale::AnyScript
- && country == QLocale::AnyCountry) {
+ if (filter.matchesAll())
result.reserve(locale_data_size);
- }
- const QLocaleData *data = locale_data + locale_index[language];
- while ( (data != locale_data + locale_data_size)
- && (language == QLocale::AnyLanguage || data->m_language_id == uint(language))) {
- if ((script == QLocale::AnyScript || data->m_script_id == uint(script))
- && (country == QLocale::AnyCountry || data->m_country_id == uint(country))) {
- result.append(QLocale(*(data->m_language_id == C ? c_private()
- : QLocalePrivate::create(data))));
+
+ quint16 index = locale_index[language];
+ // There may be no matches, for some languages (e.g. Abkhazian at CLDR v39).
+ while (filter.acceptLanguage(locale_data[index].m_language_id)) {
+ const QLocaleId id = locale_data[index].id();
+ if (filter.acceptScriptTerritory(id)) {
+ result.append(QLocale(*(id.language_id == C ? c_private()
+ : new QLocalePrivate(locale_data + index, index))));
}
- ++data;
+ ++index;
}
+
+ // Add current system locale, if it matches
+ const auto syslocaledata = systemData();
+
+ if (filter.acceptLanguage(syslocaledata->m_language_id)) {
+ const QLocaleId id = syslocaledata->id();
+ if (filter.acceptScriptTerritory(id))
+ result.append(system());
+ }
+
return result;
}
+#if QT_DEPRECATED_SINCE(6, 6)
/*!
- \obsolete
+ \deprecated [6.6] Use \l matchingLocales() instead and consult the \l territory() of each.
\since 4.3
Returns the list of countries that have entries for \a language in Qt's locale
@@ -2601,23 +2939,14 @@ QList<QLocale> QLocale::matchingLocales(QLocale::Language language,
*/
QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
{
+ const auto locales = matchingLocales(language, AnyScript, AnyCountry);
QList<Country> result;
- if (language == C) {
- result << AnyCountry;
- return result;
- }
-
- unsigned language_id = language;
- const QLocaleData *data = locale_data + locale_index[language_id];
- while (data->m_language_id == language_id) {
- const QLocale::Country country = static_cast<Country>(data->m_country_id);
- if (!result.contains(country))
- result.append(country);
- ++data;
- }
-
+ result.reserve(locales.size());
+ for (const auto &locale : locales)
+ result.append(locale.territory());
return result;
}
+#endif
/*!
\since 4.2
@@ -2689,6 +3018,14 @@ QString QLocale::standaloneDayName(int day, FormatType type) const
// Calendar look-up of month and day names:
+// Only used in assertions
+[[maybe_unused]] static bool sameLocale(const QLocaleData *locale, const QCalendarLocale &calendar)
+{
+ return locale->m_language_id == calendar.m_language_id
+ && locale->m_script_id == calendar.m_script_id
+ && locale->m_territory_id == calendar.m_territory_id;
+}
+
/*!
\internal
*/
@@ -2797,20 +3134,30 @@ QString QCalendarBackend::monthName(const QLocale &locale, int month, int,
QLocale::FormatType format) const
{
Q_ASSERT(month >= 1 && month <= maximumMonthsInYear());
- return rawMonthName(localeMonthIndexData()[locale.d->m_data_offset],
- localeMonthData(), month, format);
+ const QCalendarLocale &monthly = localeMonthIndexData()[locale.d->m_index];
+ Q_ASSERT(sameLocale(locale.d->m_data, monthly));
+ return rawMonthName(monthly, localeMonthData(), month, format);
}
-QString QGregorianCalendar::monthName(const QLocale &locale, int month, int year,
- QLocale::FormatType format) const
+QString QRomanCalendar::monthName(const QLocale &locale, int month, int year,
+ QLocale::FormatType format) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (locale.d->m_data == systemData()) {
+ if (locale.d->m_data == &systemLocaleData) {
Q_ASSERT(month >= 1 && month <= 12);
- QVariant res = systemLocale()->query(format == QLocale::LongFormat
- ? QSystemLocale::MonthNameLong
- : QSystemLocale::MonthNameShort,
- month);
+ QSystemLocale::QueryType queryType = QSystemLocale::MonthNameLong;
+ switch (format) {
+ case QLocale::LongFormat:
+ queryType = QSystemLocale::MonthNameLong;
+ break;
+ case QLocale::ShortFormat:
+ queryType = QSystemLocale::MonthNameShort;
+ break;
+ case QLocale::NarrowFormat:
+ queryType = QSystemLocale::MonthNameNarrow;
+ break;
+ }
+ QVariant res = systemLocale()->query(queryType, month);
if (!res.isNull())
return res.toString();
}
@@ -2823,20 +3170,30 @@ QString QCalendarBackend::standaloneMonthName(const QLocale &locale, int month,
QLocale::FormatType format) const
{
Q_ASSERT(month >= 1 && month <= maximumMonthsInYear());
- return rawStandaloneMonthName(localeMonthIndexData()[locale.d->m_data_offset],
- localeMonthData(), month, format);
+ const QCalendarLocale &monthly = localeMonthIndexData()[locale.d->m_index];
+ Q_ASSERT(sameLocale(locale.d->m_data, monthly));
+ return rawStandaloneMonthName(monthly, localeMonthData(), month, format);
}
-QString QGregorianCalendar::standaloneMonthName(const QLocale &locale, int month, int year,
- QLocale::FormatType format) const
+QString QRomanCalendar::standaloneMonthName(const QLocale &locale, int month, int year,
+ QLocale::FormatType format) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (locale.d->m_data == systemData()) {
+ if (locale.d->m_data == &systemLocaleData) {
Q_ASSERT(month >= 1 && month <= 12);
- QVariant res = systemLocale()->query(format == QLocale::LongFormat
- ? QSystemLocale::StandaloneMonthNameLong
- : QSystemLocale::StandaloneMonthNameShort,
- month);
+ QSystemLocale::QueryType queryType = QSystemLocale::StandaloneMonthNameLong;
+ switch (format) {
+ case QLocale::LongFormat:
+ queryType = QSystemLocale::StandaloneMonthNameLong;
+ break;
+ case QLocale::ShortFormat:
+ queryType = QSystemLocale::StandaloneMonthNameShort;
+ break;
+ case QLocale::NarrowFormat:
+ queryType = QSystemLocale::StandaloneMonthNameNarrow;
+ break;
+ }
+ QVariant res = systemLocale()->query(queryType, month);
if (!res.isNull())
return res.toString();
}
@@ -2854,11 +3211,20 @@ QString QCalendarBackend::weekDayName(const QLocale &locale, int day,
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (locale.d->m_data == systemData()) {
- QVariant res = systemLocale()->query(format == QLocale::LongFormat
- ? QSystemLocale::DayNameLong
- : QSystemLocale::DayNameShort,
- day);
+ if (locale.d->m_data == &systemLocaleData) {
+ QSystemLocale::QueryType queryType = QSystemLocale::DayNameLong;
+ switch (format) {
+ case QLocale::LongFormat:
+ queryType = QSystemLocale::DayNameLong;
+ break;
+ case QLocale::ShortFormat:
+ queryType = QSystemLocale::DayNameShort;
+ break;
+ case QLocale::NarrowFormat:
+ queryType = QSystemLocale::DayNameNarrow;
+ break;
+ }
+ QVariant res = systemLocale()->query(queryType, day);
if (!res.isNull())
return res.toString();
}
@@ -2874,11 +3240,20 @@ QString QCalendarBackend::standaloneWeekDayName(const QLocale &locale, int day,
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (locale.d->m_data == systemData()) {
- QVariant res = systemLocale()->query(format == QLocale::LongFormat
- ? QSystemLocale::DayNameLong
- : QSystemLocale::DayNameShort,
- day);
+ if (locale.d->m_data == &systemLocaleData) {
+ QSystemLocale::QueryType queryType = QSystemLocale::StandaloneDayNameLong;
+ switch (format) {
+ case QLocale::LongFormat:
+ queryType = QSystemLocale::StandaloneDayNameLong;
+ break;
+ case QLocale::ShortFormat:
+ queryType = QSystemLocale::StandaloneDayNameShort;
+ break;
+ case QLocale::NarrowFormat:
+ queryType = QSystemLocale::StandaloneDayNameNarrow;
+ break;
+ }
+ QVariant res = systemLocale()->query(queryType, day);
if (!res.isNull())
return res.toString();
}
@@ -2897,8 +3272,8 @@ QString QCalendarBackend::standaloneWeekDayName(const QLocale &locale, int day,
Qt::DayOfWeek QLocale::firstDayOfWeek() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::FirstDayOfWeek, QVariant());
+ if (d->m_data == &systemLocaleData) {
+ const auto res = systemLocale()->query(QSystemLocale::FirstDayOfWeek);
if (!res.isNull())
return static_cast<Qt::DayOfWeek>(res.toUInt());
}
@@ -2908,10 +3283,10 @@ Qt::DayOfWeek QLocale::firstDayOfWeek() const
QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const
{
- for (int i = 0; i < ImperialMeasurementSystemsCount; ++i) {
- if (ImperialMeasurementSystems[i].languageId == m_data->m_language_id
- && ImperialMeasurementSystems[i].countryId == m_data->m_country_id) {
- return ImperialMeasurementSystems[i].system;
+ for (const auto &system : ImperialMeasurementSystems) {
+ if (system.languageId == m_data->m_language_id
+ && system.territoryId == m_data->m_territory_id) {
+ return system.system;
}
}
return QLocale::MetricSystem;
@@ -2925,10 +3300,11 @@ QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const
QList<Qt::DayOfWeek> QLocale::weekdays() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::Weekdays, QVariant());
- if (!res.isNull())
- return static_cast<QList<Qt::DayOfWeek> >(qvariant_cast<QList<Qt::DayOfWeek> >(res));
+ if (d->m_data == &systemLocaleData) {
+ auto res
+ = qvariant_cast<QList<Qt::DayOfWeek> >(systemLocale()->query(QSystemLocale::Weekdays));
+ if (!res.isEmpty())
+ return res;
}
#endif
QList<Qt::DayOfWeek> weekdays;
@@ -2950,8 +3326,8 @@ QList<Qt::DayOfWeek> QLocale::weekdays() const
QLocale::MeasurementSystem QLocale::measurementSystem() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::MeasurementSystem, QVariant());
+ if (d->m_data == &systemLocaleData) {
+ const auto res = systemLocale()->query(QSystemLocale::MeasurementSystem);
if (!res.isNull())
return MeasurementSystem(res.toInt());
}
@@ -2968,34 +3344,34 @@ QLocale::MeasurementSystem QLocale::measurementSystem() const
Qt::LayoutDirection QLocale::textDirection() const
{
switch (script()) {
- case QLocale::AdlamScript:
- case QLocale::ArabicScript:
- case QLocale::AvestanScript:
- case QLocale::CypriotScript:
- case QLocale::HatranScript:
- case QLocale::HebrewScript:
- case QLocale::ImperialAramaicScript:
- case QLocale::InscriptionalPahlaviScript:
- case QLocale::InscriptionalParthianScript:
- case QLocale::KharoshthiScript:
- case QLocale::LydianScript:
- case QLocale::MandaeanScript:
- case QLocale::ManichaeanScript:
- case QLocale::MendeKikakuiScript:
- case QLocale::MeroiticCursiveScript:
- case QLocale::MeroiticScript:
- case QLocale::NabataeanScript:
- case QLocale::NkoScript:
- case QLocale::OldHungarianScript:
- case QLocale::OldNorthArabianScript:
- case QLocale::OldSouthArabianScript:
- case QLocale::OrkhonScript:
- case QLocale::PalmyreneScript:
- case QLocale::PhoenicianScript:
- case QLocale::PsalterPahlaviScript:
- case QLocale::SamaritanScript:
- case QLocale::SyriacScript:
- case QLocale::ThaanaScript:
+ case AdlamScript:
+ case ArabicScript:
+ case AvestanScript:
+ case CypriotScript:
+ case HatranScript:
+ case HebrewScript:
+ case ImperialAramaicScript:
+ case InscriptionalPahlaviScript:
+ case InscriptionalParthianScript:
+ case KharoshthiScript:
+ case LydianScript:
+ case MandaeanScript:
+ case ManichaeanScript:
+ case MendeKikakuiScript:
+ case MeroiticCursiveScript:
+ case MeroiticScript:
+ case NabataeanScript:
+ case NkoScript:
+ case OldHungarianScript:
+ case OldNorthArabianScript:
+ case OldSouthArabianScript:
+ case OrkhonScript:
+ case PalmyreneScript:
+ case PhoenicianScript:
+ case PsalterPahlaviScript:
+ case SamaritanScript:
+ case SyriacScript:
+ case ThaanaScript:
return Qt::RightToLeft;
default:
break;
@@ -3063,10 +3439,10 @@ QString QLocale::toLower(const QString &str) const
QString QLocale::amText() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::AMText, QVariant());
- if (!res.isNull())
- return res.toString();
+ if (d->m_data == &systemLocaleData) {
+ auto res = systemLocale()->query(QSystemLocale::AMText).toString();
+ if (!res.isEmpty())
+ return res;
}
#endif
return d->m_data->anteMeridiem().getData(am_data);
@@ -3083,10 +3459,10 @@ QString QLocale::amText() const
QString QLocale::pmText() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::PMText, QVariant());
- if (!res.isNull())
- return res.toString();
+ if (d->m_data == &systemLocaleData) {
+ auto res = systemLocale()->query(QSystemLocale::PMText).toString();
+ if (!res.isEmpty())
+ return res;
}
#endif
return d->m_data->postMeridiem().getData(pm_data);
@@ -3128,7 +3504,19 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
day = parts.day;
}
- int i = 0;
+ auto appendToResult = [&](int t, int repeat) {
+ auto data = locale.d->m_data;
+ if (repeat > 1)
+ result.append(data->longLongToString(t, -1, 10, repeat, QLocaleData::ZeroPadded));
+ else
+ result.append(data->longLongToString(t));
+ };
+
+ auto formatType = [](int repeat) {
+ return repeat == 3 ? QLocale::ShortFormat : QLocale::LongFormat;
+ };
+
+ qsizetype i = 0;
while (i < format.size()) {
if (format.at(i).unicode() == '\'') {
result.append(qt_readEscapedFormatString(format, &i));
@@ -3136,7 +3524,9 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
}
const QChar c = format.at(i);
- int repeat = qt_repeatCount(format.mid(i));
+ qsizetype rep = qt_repeatCount(format.mid(i));
+ Q_ASSERT(rep < std::numeric_limits<int>::max());
+ int repeat = int(rep);
bool used = false;
if (formatDate) {
switch (c.unicode()) {
@@ -3148,15 +3538,11 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
repeat = 2;
switch (repeat) {
- case 4: {
- const int len = (year < 0) ? 5 : 4;
- result.append(locale.d->m_data->longLongToString(year, -1, 10, len,
- QLocaleData::ZeroPadded));
+ case 4:
+ appendToResult(year, (year < 0) ? 5 : 4);
break;
- }
case 2:
- result.append(locale.d->m_data->longLongToString(year % 100, -1, 10, 2,
- QLocaleData::ZeroPadded));
+ appendToResult(year % 100, 2);
break;
default:
repeat = 1;
@@ -3168,43 +3554,20 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
case 'M':
used = true;
repeat = qMin(repeat, 4);
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(month));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(month, -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- case 3:
- result.append(monthName(locale, month, year, QLocale::ShortFormat));
- break;
- case 4:
- result.append(monthName(locale, month, year, QLocale::LongFormat));
- break;
- }
+ if (repeat <= 2)
+ appendToResult(month, repeat);
+ else
+ result.append(monthName(locale, month, year, formatType(repeat)));
break;
case 'd':
used = true;
repeat = qMin(repeat, 4);
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(day));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(day, -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- case 3:
- result.append(locale.dayName(
- dayOfWeek(date.toJulianDay()), QLocale::ShortFormat));
- break;
- case 4:
- result.append(locale.dayName(
- dayOfWeek(date.toJulianDay()), QLocale::LongFormat));
- break;
- }
+ if (repeat <= 2)
+ appendToResult(day, repeat);
+ else
+ result.append(
+ locale.dayName(dayOfWeek(date.toJulianDay()), formatType(repeat)));
break;
default:
@@ -3223,83 +3586,51 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
else if (hour == 0)
hour = 12;
}
-
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(hour));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(hour, -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- }
+ appendToResult(hour, repeat);
break;
}
case 'H':
used = true;
repeat = qMin(repeat, 2);
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(time.hour()));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(time.hour(), -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- }
+ appendToResult(time.hour(), repeat);
break;
case 'm':
used = true;
repeat = qMin(repeat, 2);
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(time.minute()));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(time.minute(), -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- }
+ appendToResult(time.minute(), repeat);
break;
case 's':
used = true;
repeat = qMin(repeat, 2);
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(time.second()));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(time.second(), -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- }
- break;
-
- case 'a':
- used = true;
- repeat = format.mid(i + 1).startsWith(QLatin1Char('p')) ? 2 : 1;
- result.append(time.hour() < 12 ? locale.amText().toLower()
- : locale.pmText().toLower());
+ appendToResult(time.second(), repeat);
break;
case 'A':
+ case 'a': {
+ QString text = time.hour() < 12 ? locale.amText() : locale.pmText();
used = true;
- repeat = format.mid(i + 1).startsWith(QLatin1Char('P')) ? 2 : 1;
- result.append(time.hour() < 12 ? locale.amText().toUpper()
- : locale.pmText().toUpper());
+ repeat = 1;
+ if (format.mid(i + 1).startsWith(u'p', Qt::CaseInsensitive))
+ ++repeat;
+ if (c.unicode() == 'A' && (repeat == 1 || format.at(i + 1).unicode() == 'P'))
+ text = std::move(text).toUpper();
+ else if (c.unicode() == 'a' && (repeat == 1 || format.at(i + 1).unicode() == 'p'))
+ text = std::move(text).toLower();
+ // else 'Ap' or 'aP' => use CLDR text verbatim, preserving case
+ result.append(text);
break;
+ }
case 'z':
used = true;
- repeat = (repeat >= 3) ? 3 : 1;
+ repeat = qMin(repeat, 3);
// note: the millisecond component is treated like the decimal part of the seconds
// so ms == 2 is always printed as "002", but ms == 200 can be either "2" or "200"
- result.append(locale.d->m_data->longLongToString(time.msec(), -1, 10, 3,
- QLocaleData::ZeroPadded));
- if (repeat == 1) {
+ appendToResult(time.msec(), 3);
+ if (repeat != 3) {
if (result.endsWith(locale.zeroDigit()))
result.chop(1);
if (result.endsWith(locale.zeroDigit()))
@@ -3307,20 +3638,63 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
}
break;
- case 't':
+ case 't': {
+ enum AbbrType { Long, Offset, Short };
+ const auto tzAbbr = [locale](const QDateTime &when, AbbrType type) {
+#if QT_CONFIG(timezone)
+ if (type != Short || locale != QLocale::system()) {
+ QTimeZone::NameType mode =
+ type == Short ? QTimeZone::ShortName
+ : type == Long ? QTimeZone::LongName : QTimeZone::OffsetName;
+ return when.timeRepresentation().displayName(when, mode, locale);
+ } // else: prefer QDateTime's abbreviation, for backwards-compatibility.
+#endif // else, make do with non-localized abbreviation:
+ if (type != Offset)
+ return when.timeZoneAbbreviation();
+ // For Offset, we can coerce to a UTC-based zone's abbreviation:
+ return when.toOffsetFromUtc(when.offsetFromUtc()).timeZoneAbbreviation();
+ };
used = true;
- repeat = 1;
- // If we have a QDateTime use the time spec otherwise use the current system tzname
- result.append(formatDate ? datetime.timeZoneAbbreviation()
- : QDateTime::currentDateTime().timeZoneAbbreviation());
+ repeat = qMin(repeat, 4);
+ // If we don't have a date-time, use the current system time:
+ const QDateTime when = formatDate ? datetime : QDateTime::currentDateTime();
+ QString text;
+ switch (repeat) {
+ case 4:
+ text = tzAbbr(when, Long);
+ break;
+ case 3: // ±hh:mm
+ case 2: // ±hhmm (we'll remove the ':' at the end)
+ text = tzAbbr(when, Offset);
+ Q_ASSERT(text.startsWith("UTC"_L1)); // Need to strip this.
+ // The Qt::UTC case omits the zero offset:
+ text = (text.size() == 3
+ ? u"+00:00"_s
+ : (text.size() <= 6
+ // Whole-hour offsets may lack the zero minutes:
+ ? QStringView{text}.sliced(3) + ":00"_L1
+ : std::move(text).sliced(3)));
+ if (repeat == 2)
+ text = text.remove(u':');
+ break;
+ default:
+ text = tzAbbr(when, Short);
+ // UTC-offset zones only include minutes if non-zero.
+ if (text.startsWith("UTC"_L1) && text.size() == 6)
+ text += ":00"_L1;
+ break;
+ }
+ if (!text.isEmpty())
+ result.append(text);
break;
+ }
default:
break;
}
}
if (!used)
- result.append(QString(repeat, c));
+ result.resize(result.size() + repeat, c);
i += repeat;
}
@@ -3332,53 +3706,50 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
int width, unsigned flags) const
{
- return doubleToString(zeroDigit(), positiveSign(), negativeSign(),
- exponentSeparator(), groupSeparator(), decimalPoint(),
- d, precision, form, width, flags);
-}
-
-QString QLocaleData::doubleToString(const QString &zero, const QString &plus, const QString &minus,
- const QString &exponential,
- const QString &group, const QString &decimal,
- double d, int precision, DoubleForm form, int width,
- unsigned flags)
-{
+ // Although the special handling of F.P.Shortest below is limited to
+ // DFSignificantDigits, the double-conversion library does treat it
+ // specially for the other forms, shedding trailing zeros for DFDecimal and
+ // using the shortest mantissa that faithfully represents the value for
+ // DFExponent.
if (precision != QLocale::FloatingPointShortest && precision < 0)
precision = 6;
if (width < 0)
width = 0;
- bool negative = false;
- QString num_str;
-
int decpt;
- int bufSize = 1;
+ qsizetype bufSize = 1;
if (precision == QLocale::FloatingPointShortest)
- bufSize += DoubleMaxSignificant;
- else if (form == DFDecimal) // optimize for numbers between -512k and 512k
- bufSize += ((d > (1 << 19) || d < -(1 << 19)) ? DoubleMaxDigitsBeforeDecimal : 6) +
- precision;
- else // Add extra digit due to different interpretations of precision. Also, "nan" has to fit.
- bufSize += qMax(2, precision) + 1;
+ bufSize += std::numeric_limits<double>::max_digits10;
+ else if (form == DFDecimal && qt_is_finite(d))
+ bufSize += wholePartSpace(qAbs(d)) + precision;
+ else // Add extra digit due to different interpretations of precision.
+ bufSize += qMax(2, precision) + 1; // Must also be big enough for "nan" or "inf"
QVarLengthArray<char> buf(bufSize);
int length;
-
+ bool negative = false;
qt_doubleToAscii(d, form, precision, buf.data(), bufSize, negative, length, decpt);
- if (qstrncmp(buf.data(), "inf", 3) == 0 || qstrncmp(buf.data(), "nan", 3) == 0) {
- num_str = QString::fromLatin1(buf.data(), length);
- } else { // Handle normal numbers
+ const QString prefix = signPrefix(negative && !isZero(d), flags);
+ QString numStr;
+
+ if (length == 3
+ && (qstrncmp(buf.data(), "inf", 3) == 0 || qstrncmp(buf.data(), "nan", 3) == 0)) {
+ numStr = QString::fromLatin1(buf.data(), length);
+ } else { // Handle finite values
+ const QString zero = zeroDigit();
QString digits = QString::fromLatin1(buf.data(), length);
if (zero == u"0") {
// No need to convert digits.
+ Q_ASSERT(std::all_of(buf.cbegin(), buf.cbegin() + length, isAsciiDigit));
+ // That check is taken care of in unicodeForDigits, below.
} else if (zero.size() == 2 && zero.at(0).isHighSurrogate()) {
- const uint zeroUcs4 = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
+ const char32_t zeroUcs4 = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
QString converted;
converted.reserve(2 * digits.size());
- for (int i = 0; i < digits.length(); ++i) {
- const uint digit = zeroUcs4 - '0' + digits.at(i).unicode();
+ for (QChar ch : std::as_const(digits)) {
+ const char32_t digit = unicodeForDigit(ch.unicode() - '0', zeroUcs4);
Q_ASSERT(QChar::requiresSurrogates(digit));
converted.append(QChar::highSurrogate(digit));
converted.append(QChar::lowSurrogate(digit));
@@ -3387,329 +3758,527 @@ QString QLocaleData::doubleToString(const QString &zero, const QString &plus, co
} else {
Q_ASSERT(zero.size() == 1);
Q_ASSERT(!zero.at(0).isSurrogate());
- ushort z = zero.at(0).unicode() - '0';
- for (int i = 0; i < digits.length(); ++i)
- reinterpret_cast<ushort *>(digits.data())[i] += z;
+ char16_t z = zero.at(0).unicode();
+ char16_t *const value = reinterpret_cast<char16_t *>(digits.data());
+ for (qsizetype i = 0; i < digits.size(); ++i)
+ value[i] = unicodeForDigit(value[i] - '0', z);
}
- bool always_show_decpt = (flags & ForcePoint);
+ const bool mustMarkDecimal = flags & ForcePoint;
+ const bool groupDigits = flags & GroupDigits;
+ const int minExponentDigits = flags & ZeroPadExponent ? 2 : 1;
switch (form) {
- case DFExponent: {
- num_str = exponentForm(zero, decimal, exponential, group, plus, minus,
- digits, decpt, precision, PMDecimalDigits,
- always_show_decpt, flags & ZeroPadExponent);
- break;
- }
- case DFDecimal: {
- num_str = decimalForm(zero, decimal, group,
- digits, decpt, precision, PMDecimalDigits,
- always_show_decpt, flags & ThousandsGroup);
- break;
- }
- case DFSignificantDigits: {
- PrecisionMode mode = (flags & AddTrailingZeroes) ?
- PMSignificantDigits : PMChopTrailingZeros;
-
- const auto digitWidth = zero.size();
- int cutoff = precision < 0 ? 6 : precision;
- // Find out which representation is shorter
- if (precision == QLocale::FloatingPointShortest && decpt > 0) {
- cutoff = digits.length() / digitWidth + 4; // 'e', '+'/'-', one digit exponent
- if (decpt <= 10)
- ++cutoff;
- else
- cutoff += decpt > 100 ? 2 : 1;
- if (!always_show_decpt && digits.length() / digitWidth > decpt)
- ++cutoff; // decpt shown in exponent form, but not in decimal form
+ case DFExponent:
+ numStr = exponentForm(std::move(digits), decpt, precision, PMDecimalDigits,
+ mustMarkDecimal, minExponentDigits);
+ break;
+ case DFDecimal:
+ numStr = decimalForm(std::move(digits), decpt, precision, PMDecimalDigits,
+ mustMarkDecimal, groupDigits);
+ break;
+ case DFSignificantDigits: {
+ PrecisionMode mode
+ = (flags & AddTrailingZeroes) ? PMSignificantDigits : PMChopTrailingZeros;
+
+ /* POSIX specifies sprintf() to follow fprintf(), whose 'g/G' format
+ says; with P = 6 if precision unspecified else 1 if precision is
+ 0 else precision; when 'e/E' would have exponent X, use:
+ * 'f/F' if P > X >= -4, with precision P-1-X
+ * 'e/E' otherwise, with precision P-1
+ Helpfully, we already have mapped precision < 0 to 6 - except for
+ F.P.Shortest mode, which is its own story - and those of our
+ callers with unspecified precision either used 6 or -1 for it.
+ */
+ bool useDecimal;
+ if (precision == QLocale::FloatingPointShortest) {
+ // Find out which representation is shorter.
+ // Set bias to everything added to exponent form but not
+ // decimal, minus the converse.
+
+ // Exponent adds separator, sign and digits:
+ int bias = 2 + minExponentDigits;
+ // Decimal form may get grouping separators inserted:
+ if (groupDigits && decpt >= m_grouping_top + m_grouping_least)
+ bias -= (decpt - m_grouping_least) / m_grouping_higher + 1;
+ // X = decpt - 1 needs two digits if decpt > 10:
+ if (decpt > 10 && minExponentDigits == 1)
+ ++bias;
+ // Assume digitCount < 95, so we can ignore the 3-digit
+ // exponent case (we'll set useDecimal false anyway).
+
+ const qsizetype digitCount = digits.size() / zero.size();
+ if (!mustMarkDecimal) {
+ // Decimal separator is skipped if at end; adjust if
+ // that happens for only one form:
+ if (digitCount <= decpt && digitCount > 1)
+ ++bias; // decimal but not exponent
+ else if (digitCount == 1 && decpt <= 0)
+ --bias; // exponent but not decimal
}
-
- if (decpt != digits.length() / digitWidth && (decpt <= -4 || decpt > cutoff))
- num_str = exponentForm(zero, decimal, exponential, group, plus, minus,
- digits, decpt, precision, mode,
- always_show_decpt, flags & ZeroPadExponent);
- else
- num_str = decimalForm(zero, decimal, group,
- digits, decpt, precision, mode,
- always_show_decpt, flags & ThousandsGroup);
- break;
+ // When 0 < decpt <= digitCount, the forms have equal digit
+ // counts, plus things bias has taken into account; otherwise
+ // decimal form's digit count is right-padded with zeros to
+ // decpt, when decpt is positive, otherwise it's left-padded
+ // with 1 - decpt zeros.
+ useDecimal = (decpt <= 0 ? 1 - decpt <= bias
+ : decpt <= digitCount ? 0 <= bias : decpt <= digitCount + bias);
+ } else {
+ // X == decpt - 1, POSIX's P; -4 <= X < P iff -4 < decpt <= P
+ Q_ASSERT(precision >= 0);
+ useDecimal = decpt > -4 && decpt <= (precision ? precision : 1);
}
+
+ numStr = useDecimal
+ ? decimalForm(std::move(digits), decpt, precision, mode,
+ mustMarkDecimal, groupDigits)
+ : exponentForm(std::move(digits), decpt, precision, mode,
+ mustMarkDecimal, minExponentDigits);
+ break;
+ }
}
- if (isZero(d))
- negative = false;
-
- // pad with zeros. LeftAdjusted overrides this flag. Also, we don't
- // pad special numbers
- if (flags & QLocaleData::ZeroPadded && !(flags & QLocaleData::LeftAdjusted)) {
- int num_pad_chars = width - num_str.length() / zero.length();
- // leave space for the sign
- if (negative
- || flags & QLocaleData::AlwaysShowSign
- || flags & QLocaleData::BlankBeforePositive)
- --num_pad_chars;
-
- for (int i = 0; i < num_pad_chars; ++i)
- num_str.prepend(zero);
+ // Pad with zeros. LeftAdjusted overrides ZeroPadded.
+ if (flags & ZeroPadded && !(flags & LeftAdjusted)) {
+ for (qsizetype i = numStr.size() / zero.size() + prefix.size(); i < width; ++i)
+ numStr.prepend(zero);
}
}
- // add sign
- if (negative)
- num_str.prepend(minus);
- else if (flags & QLocaleData::AlwaysShowSign)
- num_str.prepend(plus);
- else if (flags & QLocaleData::BlankBeforePositive)
- num_str.prepend(QLatin1Char(' '));
-
- if (flags & QLocaleData::CapitalEorX)
- num_str = std::move(num_str).toUpper();
-
- return num_str;
+ return prefix + (flags & CapitalEorX ? std::move(numStr).toUpper() : numStr);
}
-QString QLocaleData::longLongToString(qlonglong l, int precision,
- int base, int width, unsigned flags) const
+QString QLocaleData::decimalForm(QString &&digits, int decpt, int precision,
+ PrecisionMode pm, bool mustMarkDecimal,
+ bool groupDigits) const
{
- return longLongToString(zeroDigit(), groupSeparator(), positiveSign(), negativeSign(),
- l, precision, base, width, flags);
-}
+ const QString zero = zeroDigit();
+ const auto digitWidth = zero.size();
+ Q_ASSERT(digitWidth == 1 || digitWidth == 2);
+ Q_ASSERT(digits.size() % digitWidth == 0);
-QString QLocaleData::longLongToString(const QString &zero, const QString &group,
- const QString &plus, const QString &minus,
- qlonglong l, int precision,
- int base, int width, unsigned flags)
-{
- bool precision_not_specified = false;
- if (precision == -1) {
- precision_not_specified = true;
- precision = 1;
+ // Separator needs to go at index decpt: so add zeros before or after the
+ // given digits, if they don't reach that position already:
+ if (decpt < 0) {
+ for (; decpt < 0; ++decpt)
+ digits.prepend(zero);
+ } else {
+ for (qsizetype i = digits.size() / digitWidth; i < decpt; ++i)
+ digits.append(zero);
}
- bool negative = l < 0;
- if (base != 10) {
- // these are not supported by sprintf for octal and hex
- flags &= ~AlwaysShowSign;
- flags &= ~BlankBeforePositive;
- negative = false; // neither are negative numbers
+ switch (pm) {
+ case PMDecimalDigits:
+ for (qsizetype i = digits.size() / digitWidth - decpt; i < precision; ++i)
+ digits.append(zero);
+ break;
+ case PMSignificantDigits:
+ for (qsizetype i = digits.size() / digitWidth; i < precision; ++i)
+ digits.append(zero);
+ break;
+ case PMChopTrailingZeros:
+ Q_ASSERT(digits.size() / digitWidth <= qMax(decpt, 1) || !digits.endsWith(zero));
+ break;
}
-QT_WARNING_PUSH
- /* "unary minus operator applied to unsigned type, result still unsigned" */
-QT_WARNING_DISABLE_MSVC(4146)
- /*
- Negating std::numeric_limits<qlonglong>::min() hits undefined behavior, so
- taking an absolute value has to cast to unsigned to change sign.
- */
- QString num_str = qulltoa(negative ? -qulonglong(l) : qulonglong(l), base, zero);
-QT_WARNING_POP
-
- const QString resultZero = base == 10 ? zero : QStringLiteral("0");
- const auto digitWidth = resultZero.size();
- uint cnt_thousand_sep = 0;
- if (base == 10) {
- if (flags & ThousandsGroup) {
- for (int i = num_str.length() / digitWidth - 3; i > 0; i -= 3) {
- num_str.insert(i * digitWidth, group);
- ++cnt_thousand_sep;
- }
- } else if (flags & IndianNumberGrouping) {
- const int size = num_str.length();
- if (size > 3 * digitWidth)
- num_str.insert(size - 3 * digitWidth , group);
- for (int i = size / digitWidth - 5; i > 0; i -= 2) {
- num_str.insert(i * digitWidth, group);
- ++cnt_thousand_sep;
- }
+ if (mustMarkDecimal || decpt < digits.size() / digitWidth)
+ digits.insert(decpt * digitWidth, decimalPoint());
+
+ if (groupDigits) {
+ const QString group = groupSeparator();
+ qsizetype i = decpt - m_grouping_least;
+ if (i >= m_grouping_top) {
+ digits.insert(i * digitWidth, group);
+ while ((i -= m_grouping_higher) > 0)
+ digits.insert(i * digitWidth, group);
}
}
- for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i)
- num_str.prepend(resultZero);
-
- if ((flags & ShowBase)
- && base == 8
- && (num_str.isEmpty() || num_str[0].unicode() != QLatin1Char('0')))
- num_str.prepend(QLatin1Char('0'));
-
- // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds
- // when precision is not specified in the format string
- bool zero_padded = flags & ZeroPadded
- && !(flags & LeftAdjusted)
- && precision_not_specified;
-
- if (zero_padded) {
- int num_pad_chars = width - num_str.length() / digitWidth;
-
- // leave space for the sign
- if (negative
- || flags & AlwaysShowSign
- || flags & BlankBeforePositive)
- --num_pad_chars;
-
- // leave space for optional '0x' in hex form
- if (base == 16 && (flags & ShowBase))
- num_pad_chars -= 2;
- // leave space for optional '0b' in binary form
- else if (base == 2 && (flags & ShowBase))
- num_pad_chars -= 2;
-
- while (num_pad_chars-- > 0)
- num_str.prepend(resultZero);
+ if (decpt == 0)
+ digits.prepend(zero);
+
+ return std::move(digits);
+}
+
+QString QLocaleData::exponentForm(QString &&digits, int decpt, int precision,
+ PrecisionMode pm, bool mustMarkDecimal,
+ int minExponentDigits) const
+{
+ const QString zero = zeroDigit();
+ const auto digitWidth = zero.size();
+ Q_ASSERT(digitWidth == 1 || digitWidth == 2);
+ Q_ASSERT(digits.size() % digitWidth == 0);
+
+ switch (pm) {
+ case PMDecimalDigits:
+ for (qsizetype i = digits.size() / digitWidth; i < precision + 1; ++i)
+ digits.append(zero);
+ break;
+ case PMSignificantDigits:
+ for (qsizetype i = digits.size() / digitWidth; i < precision; ++i)
+ digits.append(zero);
+ break;
+ case PMChopTrailingZeros:
+ Q_ASSERT(digits.size() / digitWidth <= 1 || !digits.endsWith(zero));
+ break;
}
- if (flags & CapitalEorX)
- num_str = std::move(num_str).toUpper();
+ if (mustMarkDecimal || digits.size() > digitWidth)
+ digits.insert(digitWidth, decimalPoint());
- if (base == 16 && (flags & ShowBase))
- num_str.prepend(QLatin1String(flags & UppercaseBase ? "0X" : "0x"));
- if (base == 2 && (flags & ShowBase))
- num_str.prepend(QLatin1String(flags & UppercaseBase ? "0B" : "0b"));
+ digits.append(exponentSeparator());
+ digits.append(longLongToString(decpt - 1, minExponentDigits, 10, -1, AlwaysShowSign));
+
+ return std::move(digits);
+}
- // add sign
+QString QLocaleData::signPrefix(bool negative, unsigned flags) const
+{
if (negative)
- num_str.prepend(minus);
- else if (flags & AlwaysShowSign)
- num_str.prepend(plus);
- else if (flags & BlankBeforePositive)
- num_str.prepend(QLatin1Char(' '));
+ return negativeSign();
+ if (flags & AlwaysShowSign)
+ return positiveSign();
+ if (flags & BlankBeforePositive)
+ return QStringView(u" ").toString();
+ return {};
+}
- return num_str;
+QString QLocaleData::longLongToString(qlonglong n, int precision,
+ int base, int width, unsigned flags) const
+{
+ bool negative = n < 0;
+
+ /*
+ Negating std::numeric_limits<qlonglong>::min() hits undefined behavior, so
+ taking an absolute value has to take a slight detour.
+ */
+ QString numStr = qulltoa(negative ? 1u + qulonglong(-(n + 1)) : qulonglong(n),
+ base, zeroDigit());
+
+ return applyIntegerFormatting(std::move(numStr), negative, precision, base, width, flags);
}
QString QLocaleData::unsLongLongToString(qulonglong l, int precision,
int base, int width, unsigned flags) const
{
- return unsLongLongToString(zeroDigit(), groupSeparator(), positiveSign(),
- l, precision, base, width, flags);
+ const QString zero = zeroDigit();
+ QString resultZero = base == 10 ? zero : QStringLiteral("0");
+ return applyIntegerFormatting(l ? qulltoa(l, base, zero) : resultZero,
+ false, precision, base, width, flags);
}
-QString QLocaleData::unsLongLongToString(const QString &zero, const QString &group,
- const QString &plus,
- qulonglong l, int precision,
- int base, int width, unsigned flags)
+QString QLocaleData::applyIntegerFormatting(QString &&numStr, bool negative, int precision,
+ int base, int width, unsigned flags) const
{
- const QString resultZero = base == 10 ? zero : QStringLiteral("0");
- QString num_str = l ? qulltoa(l, base, zero) : resultZero;
+ const QString zero = base == 10 ? zeroDigit() : QStringLiteral("0");
+ const auto digitWidth = zero.size();
+ const auto digitCount = numStr.size() / digitWidth;
- bool precision_not_specified = false;
- if (precision == -1) {
- if (flags == NoFlags)
- return num_str; // fast-path: nothing below applies, so we're done.
+ const auto basePrefix = [&] () -> QStringView {
+ if (flags & ShowBase) {
+ const bool upper = flags & UppercaseBase;
+ if (base == 16)
+ return upper ? u"0X" : u"0x";
+ if (base == 2)
+ return upper ? u"0B" : u"0b";
+ if (base == 8 && !numStr.startsWith(zero))
+ return zero;
+ }
+ return {};
+ }();
+
+ const QString prefix = signPrefix(negative, flags) + basePrefix;
+ // Count how much of width we've used up. Each digit counts as one
+ qsizetype usedWidth = digitCount + prefix.size();
+
+ if (base == 10 && flags & GroupDigits) {
+ const QString group = groupSeparator();
+ qsizetype i = digitCount - m_grouping_least;
+ if (i >= m_grouping_top) {
+ numStr.insert(i * digitWidth, group);
+ ++usedWidth;
+ while ((i -= m_grouping_higher) > 0) {
+ numStr.insert(i * digitWidth, group);
+ ++usedWidth;
+ }
+ }
+ // TODO: should we group any zero-padding we add later ?
+ }
- precision_not_specified = true;
+ const bool noPrecision = precision == -1;
+ if (noPrecision)
precision = 1;
+
+ for (qsizetype i = numStr.size(); i < precision; ++i) {
+ numStr.prepend(zero);
+ usedWidth++;
}
- const auto digitWidth = resultZero.size();
- uint cnt_thousand_sep = 0;
- if (base == 10) {
- if (flags & ThousandsGroup) {
- for (int i = num_str.length() / digitWidth - 3; i > 0; i -= 3) {
- num_str.insert(i * digitWidth, group);
- ++cnt_thousand_sep;
- }
- } else if (flags & IndianNumberGrouping) {
- const int size = num_str.length();
- if (size > 3 * digitWidth)
- num_str.insert(size - 3 * digitWidth , group);
- for (int i = size / digitWidth - 5; i > 0; i -= 2) {
- num_str.insert(i * digitWidth, group);
- ++cnt_thousand_sep;
+ // LeftAdjusted overrides ZeroPadded; and sprintf() only pads when
+ // precision is not specified in the format string.
+ if (noPrecision && flags & ZeroPadded && !(flags & LeftAdjusted)) {
+ for (qsizetype i = usedWidth; i < width; ++i)
+ numStr.prepend(zero);
+ }
+
+ QString result(flags & CapitalEorX ? std::move(numStr).toUpper() : std::move(numStr));
+ if (prefix.size())
+ result.prepend(prefix);
+ return result;
+}
+
+inline QLocaleData::NumericData QLocaleData::numericData(QLocaleData::NumberMode mode) const
+{
+ NumericData result;
+ if (this == c()) {
+ result.isC = true;
+ return result;
+ }
+ result.setZero(zero().viewData(single_character_data));
+ result.group = groupDelim().viewData(single_character_data);
+ // Note: minus, plus and exponent might not actually be single characters.
+ result.minus = minus().viewData(single_character_data);
+ result.plus = plus().viewData(single_character_data);
+ if (mode != IntegerMode)
+ result.decimal = decimalSeparator().viewData(single_character_data);
+ if (mode == DoubleScientificMode) {
+ result.exponent = exponential().viewData(single_character_data);
+ // exponentCyrillic means "apply the Cyrrilic-specific exponent hack"
+ result.exponentCyrillic = m_script_id == QLocale::CyrillicScript;
+ }
+#ifndef QT_NO_SYSTEMLOCALE
+ if (this == &systemLocaleData) {
+ const auto getString = [sys = systemLocale()](QSystemLocale::QueryType query) {
+ return sys->query(query).toString();
+ };
+ if (mode != IntegerMode) {
+ result.sysDecimal = getString(QSystemLocale::DecimalPoint);
+ if (result.sysDecimal.size())
+ result.decimal = QStringView{result.sysDecimal};
+ }
+ result.sysGroup = getString(QSystemLocale::GroupSeparator);
+ if (result.sysGroup.size())
+ result.group = QStringView{result.sysGroup};
+ result.sysMinus = getString(QSystemLocale::NegativeSign);
+ if (result.sysMinus.size())
+ result.minus = QStringView{result.sysMinus};
+ result.sysPlus = getString(QSystemLocale::PositiveSign);
+ if (result.sysPlus.size())
+ result.plus = QStringView{result.sysPlus};
+ result.setZero(getString(QSystemLocale::ZeroDigit));
+ }
+#endif
+
+ return result;
+}
+
+namespace {
+// A bit like QStringIterator but rather specialized ... and some of the tokens
+// it recognizes aren't single Unicode code-points (but it does map each to a
+// single character).
+class NumericTokenizer
+{
+ // TODO: use deterministic finite-state-automata.
+ // TODO QTBUG-95460: CLDR has Inf/NaN representations per locale.
+ static constexpr char lettersInfNaN[] = "afin"; // Letters of Inf, NaN
+ static constexpr auto matchInfNaN = QtPrivate::makeCharacterSetMatch<lettersInfNaN>();
+ const QStringView m_text;
+ const QLocaleData::NumericData m_guide;
+ qsizetype m_index = 0;
+ const QLocaleData::NumberMode m_mode;
+ static_assert('+' + 1 == ',' && ',' + 1 == '-' && '-' + 1 == '.');
+ char lastMark; // C locale accepts '+' through lastMark.
+public:
+ NumericTokenizer(QStringView text, QLocaleData::NumericData &&guide,
+ QLocaleData::NumberMode mode)
+ : m_text(text), m_guide(guide), m_mode(mode),
+ lastMark(mode == QLocaleData::IntegerMode ? '-' : '.')
+ {
+ Q_ASSERT(m_guide.isValid(mode));
+ }
+ bool done() const { return !(m_index < m_text.size()); }
+ qsizetype index() const { return m_index; }
+ inline int asBmpDigit(char16_t digit) const;
+ char nextToken();
+};
+
+int NumericTokenizer::asBmpDigit(char16_t digit) const
+{
+ // If digit *is* a digit, result will be in range 0 through 9; otherwise not.
+ // Must match qlocale_tools.h's unicodeForDigit()
+ if (m_guide.zeroUcs != u'\u3007' || digit == m_guide.zeroUcs)
+ return digit - m_guide.zeroUcs;
+
+ // QTBUG-85409: Suzhou's digits aren't contiguous !
+ if (digit == u'\u3020') // U+3020 POSTAL MARK FACE is not a digit.
+ return -1;
+ // ... but is followed by digits 1 through 9.
+ return digit - u'\u3020';
+}
+
+char NumericTokenizer::nextToken()
+{
+ // As long as caller stops iterating on a zero return, those don't need to
+ // keep m_index correctly updated.
+ Q_ASSERT(!done());
+ // Mauls non-letters above 'Z' but we don't care:
+ const auto asciiLower = [](unsigned char c) { return c >= 'A' ? c | 0x20 : c; };
+ const QStringView tail = m_text.sliced(m_index);
+ const QChar ch = tail.front();
+ if (ch == u'\u2212') {
+ // Special case: match the "proper" minus sign, for all locales.
+ ++m_index;
+ return '-';
+ }
+ if (m_guide.isC) {
+ // "Conversion" to C locale is just a filter:
+ ++m_index;
+ if (Q_LIKELY(ch.unicode() < 256)) {
+ unsigned char ascii = asciiLower(ch.toLatin1());
+ if (Q_LIKELY(isAsciiDigit(ascii) || ('+' <= ascii && ascii <= lastMark)
+ // No caller presently (6.5) passes DoubleStandardMode,
+ // so !IntegerMode implies scientific, for now.
+ || (m_mode != QLocaleData::IntegerMode
+ && matchInfNaN.matches(ascii))
+ || (m_mode == QLocaleData::DoubleScientificMode
+ && ascii == 'e'))) {
+ return ascii;
}
}
+ return 0;
+ }
+ if (ch.unicode() < 256) {
+ // Accept the C locale's digits and signs in all locales:
+ char ascii = asciiLower(ch.toLatin1());
+ if (isAsciiDigit(ascii) || ascii == '-' || ascii == '+'
+ // Also its Inf and NaN letters:
+ || (m_mode != QLocaleData::IntegerMode && matchInfNaN.matches(ascii))) {
+ ++m_index;
+ return ascii;
+ }
}
- int zeroPadding = precision - num_str.length() / digitWidth /* + cnt_thousand_sep*/;
- while (zeroPadding-- > 0)
- num_str.prepend(resultZero);
-
- if ((flags & ShowBase)
- && base == 8
- && (num_str.isEmpty() || num_str.at(0).unicode() != QLatin1Char('0')))
- num_str.prepend(QLatin1Char('0'));
-
- // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds
- // when precision is not specified in the format string
- bool zero_padded = flags & ZeroPadded
- && !(flags & LeftAdjusted)
- && precision_not_specified;
-
- if (zero_padded) {
- int num_pad_chars = width - num_str.length() / digitWidth;
-
- // leave space for optional '0x' in hex form
- if (base == 16 && flags & ShowBase)
- num_pad_chars -= 2;
- // leave space for optional '0b' in binary form
- else if (base == 2 && flags & ShowBase)
- num_pad_chars -= 2;
-
- while (num_pad_chars-- > 0)
- num_str.prepend(resultZero);
+ // Other locales may be trickier:
+ if (tail.startsWith(m_guide.minus)) {
+ m_index += m_guide.minus.size();
+ return '-';
+ }
+ if (tail.startsWith(m_guide.plus)) {
+ m_index += m_guide.plus.size();
+ return '+';
+ }
+ if (!m_guide.group.isEmpty() && tail.startsWith(m_guide.group)) {
+ m_index += m_guide.group.size();
+ return ',';
+ }
+ if (m_mode != QLocaleData::IntegerMode && tail.startsWith(m_guide.decimal)) {
+ m_index += m_guide.decimal.size();
+ return '.';
+ }
+ if (m_mode == QLocaleData::DoubleScientificMode
+ && tail.startsWith(m_guide.exponent, Qt::CaseInsensitive)) {
+ m_index += m_guide.exponent.size();
+ return 'e';
}
- if (flags & CapitalEorX)
- num_str = std::move(num_str).toUpper();
+ // Must match qlocale_tools.h's unicodeForDigit()
+ if (m_guide.zeroLen == 1) {
+ if (!ch.isSurrogate()) {
+ const uint gap = asBmpDigit(ch.unicode());
+ if (gap < 10u) {
+ ++m_index;
+ return '0' + gap;
+ }
+ } else if (ch.isHighSurrogate() && tail.size() > 1 && tail.at(1).isLowSurrogate()) {
+ return 0;
+ }
+ } else if (ch.isHighSurrogate()) {
+ // None of the corner cases below matches a surrogate, so (update
+ // already and) return early if we don't have a digit.
+ if (tail.size() > 1) {
+ QChar low = tail.at(1);
+ if (low.isLowSurrogate()) {
+ m_index += 2;
+ const uint gap = QChar::surrogateToUcs4(ch, low) - m_guide.zeroUcs;
+ return gap < 10u ? '0' + gap : 0;
+ }
+ }
+ return 0;
+ }
- if (base == 16 && flags & ShowBase)
- num_str.prepend(QLatin1String(flags & UppercaseBase ? "0X" : "0x"));
- else if (base == 2 && flags & ShowBase)
- num_str.prepend(QLatin1String(flags & UppercaseBase ? "0B" : "0b"));
+ // All cases where tail starts with properly-matched surrogate pair
+ // have been handled by this point.
+ Q_ASSERT(!(ch.isHighSurrogate() && tail.size() > 1 && tail.at(1).isLowSurrogate()));
- // add sign
- if (flags & AlwaysShowSign)
- num_str.prepend(plus);
- else if (flags & BlankBeforePositive)
- num_str.prepend(QLatin1Char(' '));
+ // Weird corner cases follow (code above assumes these match no surrogates).
+
+ // Some locales use a non-breaking space (U+00A0) or its thin version
+ // (U+202f) for grouping. These look like spaces, so people (and thus some
+ // of our tests) use a regular space instead and complain if it doesn't
+ // work.
+ // Should this be extended generally to any case where group is a space ?
+ if ((m_guide.group == u"\u00a0" || m_guide.group == u"\u202f") && tail.startsWith(u' ')) {
+ ++m_index;
+ return ',';
+ }
- return num_str;
+ // Cyrillic has its own E, used by Ukrainian as exponent; but others
+ // writing Cyrillic may well use that; and Ukrainians might well use E.
+ // All other Cyrillic locales (officially) use plain ASCII E.
+ if (m_guide.exponentCyrillic // Only true in scientific float mode.
+ && (tail.startsWith(u"\u0415", Qt::CaseInsensitive)
+ || tail.startsWith(u"E", Qt::CaseInsensitive))) {
+ ++m_index;
+ return 'e';
+ }
+
+ return 0;
}
+} // namespace with no name
/*
- Converts a number in locale to its representation in the C locale.
- Only has to guarantee that a string that is a correct representation of
- a number will be converted. If junk is passed in, junk will be passed
- out and the error will be detected during the actual conversion to a
- number. We can't detect junk here, since we don't even know the base
- of the number.
+ Converts a number in locale representation to the C locale equivalent.
+
+ Only has to guarantee that a string that is a correct representation of a
+ number will be converted. Checks signs, separators and digits appear in all
+ the places they should, and nowhere else.
+
+ Returns true precisely if the number appears to be well-formed, modulo
+ things a parser for C Locale strings (without digit-grouping separators;
+ they're stripped) will catch. When it returns true, it records (and
+ '\0'-terminates) the C locale representation in *result.
+
+ Note: only QString integer-parsing methods have a base parameter (hence need
+ to cope with letters as possible digits); but these are now all routed via
+ byteArrayToU?LongLong(), so no longer come via here. The QLocale
+ number-parsers only work in decimal, so don't have to cope with any digits
+ other than 0 through 9.
*/
bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
- CharBuff *result) const
+ NumberMode mode, CharBuff *result) const
{
s = s.trimmed();
if (s.size() < 1)
return false;
+ NumericTokenizer tokens(s, numericData(mode), mode);
+
+ // Digit-grouping details (all modes):
+ qsizetype digitsInGroup = 0;
+ qsizetype last_separator_idx = -1;
+ qsizetype start_of_digits_idx = -1;
+
+ // Floating-point details (non-integer modes):
+ qsizetype decpt_idx = -1;
+ qsizetype exponent_idx = -1;
+
+ char last = '\0';
+ while (!tokens.done()) {
+ qsizetype idx = tokens.index(); // before nextToken() advances
+ char out = tokens.nextToken();
+ if (out == 0)
+ return false;
+ Q_ASSERT(tokens.index() > idx); // it always *should* advance (except on zero return)
- const QChar *uc = s.data();
- auto length = s.size();
- decltype(length) idx = 0;
-
- const int leadingGroupWidth = (m_country_id == QLocale::India ? 2 : 3);
- int digitsInGroup = 0;
- int group_cnt = 0; // counts number of group chars
- int decpt_idx = -1;
- int last_separator_idx = -1;
- int start_of_digits_idx = -1;
- int exponent_idx = -1;
-
- while (idx < length) {
- const QStringView in = QStringView(uc + idx, uc[idx].isHighSurrogate() ? 2 : 1);
-
- char out = numericToCLocale(in);
- if (out == 0) {
- const QChar simple = in.size() == 1 ? in.front() : QChar::Null;
- if (in == listSeparator())
- out = ';';
- else if (in == percentSign())
- out = '%';
- // for handling base-x numbers
- else if (simple.toLatin1() >= 'A' && simple.toLatin1() <= 'Z')
- out = simple.toLower().toLatin1();
- else if (simple.toLatin1() >= 'a' && simple.toLatin1() <= 'z')
- out = simple.toLatin1();
- else
- break;
- } else if (out == '.') {
+ if (out == '.') {
// Fail if more than one decimal point or point after e
if (decpt_idx != -1 || exponent_idx != -1)
return false;
@@ -3718,309 +4287,246 @@ bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_o
exponent_idx = idx;
}
- if (number_options & QLocale::RejectLeadingZeroInExponent) {
- if (exponent_idx != -1 && out == '0' && idx < length - 1) {
- // After the exponent there can only be '+', '-' or digits.
- // If we find a '0' directly after some non-digit, then that is a leading zero.
- if (result->last() < '0' || result->last() > '9')
- return false;
- }
+ if (number_options.testFlag(QLocale::RejectLeadingZeroInExponent)
+ && exponent_idx != -1 && out == '0') {
+ // After the exponent there can only be '+', '-' or digits.
+ // If we find a '0' directly after some non-digit, then that is a
+ // leading zero, acceptable only if it is the whole exponent.
+ if (!tokens.done() && !isAsciiDigit(last))
+ return false;
}
- if (number_options & QLocale::RejectTrailingZeroesAfterDot) {
- // If we've seen a decimal point and the last character after the exponent is 0, then
- // that is a trailing zero.
- if (decpt_idx >= 0 && idx == exponent_idx && result->last() == '0')
- return false;
+ if (number_options.testFlag(QLocale::RejectTrailingZeroesAfterDot) && decpt_idx >= 0) {
+ // In a fractional part, a 0 just before the exponent is trailing:
+ if (idx == exponent_idx && last == '0')
+ return false;
}
- if (!(number_options & QLocale::RejectGroupSeparator)) {
- if (start_of_digits_idx == -1 && out >= '0' && out <= '9') {
- start_of_digits_idx = idx;
- digitsInGroup++;
+ if (!number_options.testFlag(QLocale::RejectGroupSeparator)) {
+ if (isAsciiDigit(out)) {
+ if (start_of_digits_idx == -1)
+ start_of_digits_idx = idx;
+ ++digitsInGroup;
} else if (out == ',') {
// Don't allow group chars after the decimal point or exponent
if (decpt_idx != -1 || exponent_idx != -1)
return false;
if (last_separator_idx == -1) {
- if (start_of_digits_idx == -1 || digitsInGroup > leadingGroupWidth)
+ // Check distance from the beginning of the digits:
+ if (start_of_digits_idx == -1 || m_grouping_top > digitsInGroup
+ || digitsInGroup >= m_grouping_least + m_grouping_top) {
return false;
+ }
} else {
- // check distance from the last separator or from the beginning of the digits
- // ### FIXME: Some locales allow other groupings!
- // See https://en.wikipedia.org/wiki/Thousands_separator
- if (digitsInGroup != leadingGroupWidth)
+ // Check distance from the last separator:
+ if (digitsInGroup != m_grouping_higher)
return false;
}
last_separator_idx = idx;
- ++group_cnt;
digitsInGroup = 0;
-
- // don't add the group separator
- idx += in.size();
- continue;
- } else if (out == '.' || idx == exponent_idx) {
- // check distance from the last separator
- // ### FIXME: Some locales allow other groupings!
- // See https://en.wikipedia.org/wiki/Thousands_separator
- if (last_separator_idx != -1 && digitsInGroup != 3)
+ } else if (mode != IntegerMode && (out == '.' || idx == exponent_idx)
+ && last_separator_idx != -1) {
+ // Were there enough digits since the last group separator?
+ if (digitsInGroup != m_grouping_least)
return false;
// stop processing separators
last_separator_idx = -1;
- } else if (out >= '0' && out <= '9') {
- digitsInGroup++;
}
+ } else if (out == ',') {
+ return false;
}
- result->append(out);
- idx += in.size();
+ last = out;
+ if (out != ',') // Leave group separators out of the result.
+ result->append(out);
}
- if (!(number_options & QLocale::RejectGroupSeparator)) {
- // group separator post-processing
- // did we end in a separator?
- if (last_separator_idx + 1 == idx)
- return false;
- // were there enough digits since the last separator?
- if (last_separator_idx != -1 && digitsInGroup != 3)
+ if (!number_options.testFlag(QLocale::RejectGroupSeparator) && last_separator_idx != -1) {
+ // Were there enough digits since the last group separator?
+ if (digitsInGroup != m_grouping_least)
return false;
}
- if (number_options & QLocale::RejectTrailingZeroesAfterDot) {
- // In decimal form, the last character can be a trailing zero if we've seen a decpt.
- if (decpt_idx != -1 && exponent_idx == -1 && result->last() == '0')
+ if (number_options.testFlag(QLocale::RejectTrailingZeroesAfterDot)
+ && decpt_idx != -1 && exponent_idx == -1) {
+ // In the fractional part, a final zero is trailing:
+ if (last == '0')
return false;
}
result->append('\0');
- return idx == length;
+ return true;
}
-bool QLocaleData::validateChars(QStringView str, NumberMode numMode, QByteArray *buff,
- int decDigits, QLocale::NumberOptions number_options) const
+ParsingResult
+QLocaleData::validateChars(QStringView str, NumberMode numMode, int decDigits,
+ QLocale::NumberOptions number_options) const
{
- buff->clear();
- buff->reserve(str.length());
+ ParsingResult result;
+ result.buff.reserve(str.size());
+ enum { Whole, Fractional, Exponent } state = Whole;
const bool scientific = numMode == DoubleScientificMode;
- bool lastWasE = false;
- bool lastWasDigit = false;
- int eCnt = 0;
- int decPointCnt = 0;
- bool dec = false;
- int decDigitCnt = 0;
-
- for (qsizetype i = 0; i < str.size();) {
- const QStringView in = str.mid(i, str.at(i).isHighSurrogate() ? 2 : 1);
- char c = numericToCLocale(in);
-
- if (c >= '0' && c <= '9') {
- if (numMode != IntegerMode) {
- // If a double has too many digits after decpt, it shall be Invalid.
- if (dec && decDigits != -1 && decDigits < ++decDigitCnt)
- return false;
- }
+ NumericTokenizer tokens(str, numericData(numMode), numMode);
+ char last = '\0';
- // The only non-digit character after the 'e' can be '+' or '-'.
- // If a zero is directly after that, then the exponent is zero-padded.
- if ((number_options & QLocale::RejectLeadingZeroInExponent)
- && c == '0' && eCnt > 0 && !lastWasDigit) {
- return false;
+ while (!tokens.done()) {
+ char c = tokens.nextToken();
+
+ if (isAsciiDigit(c)) {
+ switch (state) {
+ case Whole:
+ // Nothing special to do (unless we want to check grouping sizes).
+ break;
+ case Fractional:
+ // If a double has too many digits in its fractional part it is Invalid.
+ if (decDigits-- == 0)
+ return {};
+ break;
+ case Exponent:
+ if (!isAsciiDigit(last)) {
+ // This is the first digit in the exponent (there may have beena '+'
+ // or '-' in before). If it's a zero, the exponent is zero-padded.
+ if (c == '0' && (number_options & QLocale::RejectLeadingZeroInExponent))
+ return {};
+ }
+ break;
}
- lastWasDigit = true;
} else {
switch (c) {
- case '.':
- if (numMode == IntegerMode) {
- // If an integer has a decimal point, it shall be Invalid.
- return false;
- } else {
- // If a double has more than one decimal point, it shall be Invalid.
- if (++decPointCnt > 1)
- return false;
-#if 0
- // If a double with no decimal digits has a decimal point, it shall be
- // Invalid.
- if (decDigits == 0)
- return false;
-#endif // On second thoughts, it shall be Valid.
-
- dec = true;
- }
- break;
+ case '.':
+ // If an integer has a decimal point, it is Invalid.
+ // A double can only have one, at the end of its whole-number part.
+ if (numMode == IntegerMode || state != Whole)
+ return {};
+ // Even when decDigits is 0, we do allow the decimal point to be
+ // present - just as long as no digits follow it.
+
+ state = Fractional;
+ break;
- case '+':
- case '-':
- if (scientific) {
- // If a scientific has a sign that's not at the beginning or after
- // an 'e', it shall be Invalid.
- if (i != 0 && !lastWasE)
- return false;
- } else {
- // If a non-scientific has a sign that's not at the beginning,
- // it shall be Invalid.
- if (i != 0)
- return false;
- }
- break;
+ case '+':
+ case '-':
+ // A sign can only appear at the start or after the e of scientific:
+ if (last != '\0' && !(scientific && last == 'e'))
+ return {};
+ break;
- case ',':
- //it can only be placed after a digit which is before the decimal point
- if ((number_options & QLocale::RejectGroupSeparator) || !lastWasDigit ||
- decPointCnt > 0)
- return false;
- break;
+ case ',':
+ // Grouping is only allowed after a digit in the whole-number portion:
+ if ((number_options & QLocale::RejectGroupSeparator) || state != Whole
+ || !isAsciiDigit(last)) {
+ return {};
+ }
+ // We could check grouping sizes are correct, but fixup()s are
+ // probably better off correcting any misplacement instead.
+ break;
- case 'e':
- if (scientific) {
- // If a scientific has more than one 'e', it shall be Invalid.
- if (++eCnt > 1)
- return false;
- dec = false;
- } else {
- // If a non-scientific has an 'e', it shall be Invalid.
- return false;
- }
- break;
+ case 'e':
+ // Only one e is allowed and only in scientific:
+ if (!scientific || state == Exponent)
+ return {};
+ state = Exponent;
+ break;
- default:
- // If it's not a valid digit, it shall be Invalid.
- return false;
+ default:
+ // Nothing else can validly appear in a number.
+ // NumericTokenizer allows letters of "inf" and "nan", but
+ // validators don't accept those values.
+ // For anything else, tokens.nextToken() must have returned 0.
+ Q_ASSERT(!c || c == 'a' || c == 'f' || c == 'i' || c == 'n');
+ return {};
}
- lastWasDigit = false;
}
- lastWasE = c == 'e';
- if (c != ',')
- buff->append(c);
-
- i += in.size();
+ last = c;
+ if (c != ',') // Skip grouping
+ result.buff.append(c);
}
- return true;
+ result.state = ParsingResult::Acceptable;
+
+ // Intermediate if it ends with any character that requires a digit after
+ // it to be valid e.g. group separator, sign, or exponent
+ if (last == ',' || last == '-' || last == '+' || last == 'e')
+ result.state = ParsingResult::Intermediate;
+
+ return result;
}
double QLocaleData::stringToDouble(QStringView str, bool *ok,
QLocale::NumberOptions number_options) const
{
CharBuff buff;
- if (!numberToCLocale(str, number_options, &buff)) {
+ if (!numberToCLocale(str, number_options, DoubleScientificMode, &buff)) {
if (ok != nullptr)
*ok = false;
return 0.0;
}
- int processed = 0;
- bool nonNullOk = false;
- double d = qt_asciiToDouble(buff.constData(), buff.length() - 1, nonNullOk, processed);
+ auto r = qt_asciiToDouble(buff.constData(), buff.size() - 1);
if (ok != nullptr)
- *ok = nonNullOk;
- return d;
+ *ok = r.ok();
+ return r.result;
}
-qlonglong QLocaleData::stringToLongLong(QStringView str, int base, bool *ok,
- QLocale::NumberOptions number_options) const
+QSimpleParsedNumber<qint64>
+QLocaleData::stringToLongLong(QStringView str, int base,
+ QLocale::NumberOptions number_options) const
{
CharBuff buff;
- if (!numberToCLocale(str, number_options, &buff)) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
+ if (!numberToCLocale(str, number_options, IntegerMode, &buff))
+ return {};
- return bytearrayToLongLong(buff.constData(), base, ok);
+ return bytearrayToLongLong(QByteArrayView(buff), base);
}
-qulonglong QLocaleData::stringToUnsLongLong(QStringView str, int base, bool *ok,
- QLocale::NumberOptions number_options) const
+QSimpleParsedNumber<quint64>
+QLocaleData::stringToUnsLongLong(QStringView str, int base,
+ QLocale::NumberOptions number_options) const
{
CharBuff buff;
- if (!numberToCLocale(str, number_options, &buff)) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
+ if (!numberToCLocale(str, number_options, IntegerMode, &buff))
+ return {};
- return bytearrayToUnsLongLong(buff.constData(), base, ok);
+ return bytearrayToUnsLongLong(QByteArrayView(buff), base);
}
-double QLocaleData::bytearrayToDouble(const char *num, bool *ok)
+static bool checkParsed(QByteArrayView num, qsizetype used)
{
- bool nonNullOk = false;
- int len = static_cast<int>(strlen(num));
- Q_ASSERT(len >= 0);
- int processed = 0;
- double d = qt_asciiToDouble(num, len, nonNullOk, processed);
- if (ok != nullptr)
- *ok = nonNullOk;
- return d;
-}
-
-qlonglong QLocaleData::bytearrayToLongLong(const char *num, int base, bool *ok)
-{
- bool _ok;
- const char *endptr;
-
- if (*num == '\0') {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- qlonglong l = qstrtoll(num, &endptr, base, &_ok);
-
- if (!_ok) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
+ if (used <= 0)
+ return false;
- if (*endptr != '\0') {
- while (ascii_isspace(*endptr))
- ++endptr;
+ const qsizetype len = num.size();
+ if (used < len && num[used] != '\0') {
+ while (used < len && ascii_isspace(num[used]))
+ ++used;
}
- if (*endptr != '\0') {
+ if (used < len && num[used] != '\0')
// we stopped at a non-digit character after converting some digits
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
+ return false;
- if (ok != nullptr)
- *ok = true;
- return l;
+ return true;
}
-qulonglong QLocaleData::bytearrayToUnsLongLong(const char *num, int base, bool *ok)
+QSimpleParsedNumber<qint64> QLocaleData::bytearrayToLongLong(QByteArrayView num, int base)
{
- bool _ok;
- const char *endptr;
- qulonglong l = qstrtoull(num, &endptr, base, &_ok);
-
- if (!_ok) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- if (*endptr != '\0') {
- while (ascii_isspace(*endptr))
- ++endptr;
- }
-
- if (*endptr != '\0') {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
+ auto r = qstrntoll(num.data(), num.size(), base);
+ if (!checkParsed(num, r.used))
+ return {};
+ return r;
+}
- if (ok != nullptr)
- *ok = true;
- return l;
+QSimpleParsedNumber<quint64> QLocaleData::bytearrayToUnsLongLong(QByteArrayView num, int base)
+{
+ auto r = qstrntoull(num.data(), num.size(), base);
+ if (!checkParsed(num, r.used))
+ return {};
+ return r;
}
/*!
@@ -4039,24 +4545,24 @@ qulonglong QLocaleData::bytearrayToUnsLongLong(const char *num, int base, bool *
\since 4.8
Returns a currency symbol according to the \a format.
*/
-QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
+QString QLocale::currencySymbol(CurrencySymbolFormat format) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::CurrencySymbol, format);
- if (!res.isNull())
- return res.toString();
+ if (d->m_data == &systemLocaleData) {
+ auto res = systemLocale()->query(QSystemLocale::CurrencySymbol, format).toString();
+ if (!res.isEmpty())
+ return res;
}
#endif
switch (format) {
case CurrencySymbol:
return d->m_data->currencySymbol().getData(currency_symbol_data);
case CurrencyDisplayName:
- return d->m_data->currencyDisplayName().getListEntry(currency_display_name_data, 0);
+ return d->m_data->currencyDisplayName().getData(currency_display_name_data);
case CurrencyIsoCode: {
const char *code = d->m_data->m_currency_iso_code;
- if (int len = qstrnlen(code, 3))
- return QString::fromLatin1(code, len);
+ if (auto len = qstrnlen(code, 3))
+ return QString::fromLatin1(code, qsizetype(len));
break;
}
}
@@ -4074,12 +4580,12 @@ QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QSystemLocale::CurrencyToStringArgument arg(value, symbol);
- QVariant res =
- systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
- if (!res.isNull())
- return res.toString();
+ auto res = systemLocale()->query(QSystemLocale::CurrencyToString,
+ QVariant::fromValue(arg)).toString();
+ if (!res.isEmpty())
+ return res;
}
#endif
QLocaleData::DataRange range = d->m_data->currencyFormatNegative();
@@ -4090,8 +4596,8 @@ QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
QString str = toString(value);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
- sym = currencySymbol(QLocale::CurrencyIsoCode);
- return range.getData(currency_format_data).arg(str, sym);
+ sym = currencySymbol(CurrencyIsoCode);
+ return range.viewData(currency_format_data).arg(str, sym);
}
/*!
@@ -4101,32 +4607,21 @@ QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
QString QLocale::toCurrencyString(qulonglong value, const QString &symbol) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QSystemLocale::CurrencyToStringArgument arg(value, symbol);
- QVariant res =
- systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
- if (!res.isNull())
- return res.toString();
+ auto res = systemLocale()->query(QSystemLocale::CurrencyToString,
+ QVariant::fromValue(arg)).toString();
+ if (!res.isEmpty())
+ return res;
}
#endif
QString str = toString(value);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
- sym = currencySymbol(QLocale::CurrencyIsoCode);
+ sym = currencySymbol(CurrencyIsoCode);
return d->m_data->currencyFormat().getData(currency_format_data).arg(str, sym);
}
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
-/*!
- \since 4.8
- \overload
-*/
-QString QLocale::toCurrencyString(double value, const QString &symbol) const
-{
- return toCurrencyString(value, symbol, d->m_data->m_currency_digits);
-}
-#endif
-
/*!
\since 5.7
\overload toCurrencyString()
@@ -4140,12 +4635,12 @@ QString QLocale::toCurrencyString(double value, const QString &symbol) const
QString QLocale::toCurrencyString(double value, const QString &symbol, int precision) const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
+ if (d->m_data == &systemLocaleData) {
QSystemLocale::CurrencyToStringArgument arg(value, symbol);
- QVariant res =
- systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
- if (!res.isNull())
- return res.toString();
+ auto res = systemLocale()->query(QSystemLocale::CurrencyToString,
+ QVariant::fromValue(arg)).toString();
+ if (!res.isEmpty())
+ return res;
}
#endif
QLocaleData::DataRange range = d->m_data->currencyFormatNegative();
@@ -4156,12 +4651,11 @@ QString QLocale::toCurrencyString(double value, const QString &symbol, int preci
QString str = toString(value, 'f', precision == -1 ? d->m_data->m_currency_digits : precision);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
- sym = currencySymbol(QLocale::CurrencyIsoCode);
- return range.getData(currency_format_data).arg(str, sym);
+ sym = currencySymbol(CurrencyIsoCode);
+ return range.viewData(currency_format_data).arg(str, sym);
}
/*!
- \fn QString QLocale::toCurrencyString(float i, const QString &symbol) const
\fn QString QLocale::toCurrencyString(float i, const QString &symbol, int precision) const
\overload toCurrencyString()
*/
@@ -4182,19 +4676,6 @@ QString QLocale::toCurrencyString(double value, const QString &symbol, int preci
\sa formattedDataSize()
*/
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-/*!
- \obsolete
-
- Use the const version instead.
-*/
-QString QLocale::formattedDataSize(qint64 bytes, int precision, DataSizeFormats format)
-{
- const auto *that = this;
- return that->formattedDataSize(bytes, precision, format);
-}
-#endif
-
/*!
\since 5.10
@@ -4230,94 +4711,139 @@ QString QLocale::formattedDataSize(qint64 bytes, int precision, DataSizeFormats
// We don't support sizes in units larger than exbibytes because
// the number of bytes would not fit into qint64.
Q_ASSERT(power <= 6 && power >= 0);
- QString unit;
+ QStringView unit;
if (power > 0) {
QLocaleData::DataRange range = (format & DataSizeSIQuantifiers)
? d->m_data->byteAmountSI() : d->m_data->byteAmountIEC();
- unit = range.getListEntry(byte_unit_data, power - 1);
+ unit = range.viewListEntry(byte_unit_data, power - 1);
} else {
- unit = d->m_data->byteCount().getData(byte_unit_data);
+ unit = d->m_data->byteCount().viewData(byte_unit_data);
}
- return number + QLatin1Char(' ') + unit;
+ return number + u' ' + unit;
}
/*!
\since 4.8
-
- Returns an ordered list of locale names for translation purposes in
- preference order (like "en-Latn-US", "en-US", "en").
-
- The return value represents locale names that the user expects to see the
- UI translation in.
-
- Most like you do not need to use this function directly, but just pass the
+ \brief List of locale names for use in selecting translations
+
+ Each entry in the returned list is the name of a locale suitable to the
+ user's preferences for what to translate the UI into. Where a name in the
+ list is composed of several tags, they are joined as indicated by \a
+ separator. Prior to Qt 6.7 a dash was used as separator.
+
+ For example, using the default separator QLocale::TagSeparator::Dash, if the
+ user has configured their system to use English as used in the USA, the list
+ would be "en-Latn-US", "en-US", "en". The order of entries is the order in
+ which to check for translations; earlier items in the list are to be
+ preferred over later ones. If your translation files use underscores, rather
+ than dashes, to separate locale tags, pass QLocale::TagSeparator::Underscore
+ as \a separator.
+
+ Most likely you do not need to use this function directly, but just pass the
QLocale object to the QTranslator::load() function.
- The first item in the list is the most preferred one.
-
\sa QTranslator, bcp47Name()
*/
-QStringList QLocale::uiLanguages() const
+QStringList QLocale::uiLanguages(TagSeparator separator) const
{
+ const char sep = char(separator);
QStringList uiLanguages;
- QList<QLocale> locales;
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::UILanguages, QVariant());
- if (!res.isNull()) {
- uiLanguages = res.toStringList();
- // ... but we need to include likely-adjusted forms of each of those, too:
- for (const auto &entry : qAsConst(uiLanguages))
- locales.append(QLocale(entry));
+ if (uchar(sep) > 0x7f) {
+ badSeparatorWarning("uiLanguages", sep);
+ return uiLanguages;
+ }
+ QList<QLocaleId> localeIds;
+#ifdef QT_NO_SYSTEMLOCALE
+ constexpr bool isSystem = false;
+#else
+ const bool isSystem = d->m_data == &systemLocaleData;
+ if (isSystem) {
+ uiLanguages = systemLocale()->query(QSystemLocale::UILanguages).toStringList();
+ // ... but we need to include likely-adjusted forms of each of those, too.
+ // For now, collect up locale Ids representing the entries, for later processing:
+ for (const auto &entry : std::as_const(uiLanguages))
+ localeIds.append(QLocaleId::fromName(entry));
+ if (localeIds.isEmpty())
+ localeIds.append(systemLocale()->fallbackLocale().d->m_data->id());
+ // If the system locale (isn't C and) didn't include itself in the list,
+ // or as fallback, presume to know better than it and put its name
+ // first. (Known issue, QTBUG-104930, on some macOS versions when in
+ // locale en_DE.) Our translation system might have a translation for a
+ // locale the platform doesn't believe in.
+ const QString name = bcp47Name(separator);
+ if (!name.isEmpty() && language() != C && !uiLanguages.contains(name)) {
+ // That uses contains(name) as a cheap pre-test, but there may be an
+ // entry that matches this on purging likely subtags.
+ const QLocaleId mine = d->m_data->id().withLikelySubtagsRemoved();
+ const auto isMine = [mine](const QString &entry) {
+ return QLocaleId::fromName(entry).withLikelySubtagsRemoved() == mine;
+ };
+ if (std::none_of(uiLanguages.constBegin(), uiLanguages.constEnd(), isMine)) {
+ localeIds.prepend(d->m_data->id());
+ uiLanguages.prepend(name);
+ }
}
- if (locales.isEmpty())
- locales.append(systemLocale()->fallbackUiLocale());
} else
#endif
{
- locales.append(*this);
+ localeIds.append(d->m_data->id());
}
- for (int i = locales.size(); i-- > 0; ) {
- const QLocale &locale = locales.at(i);
- int j;
+ for (qsizetype i = localeIds.size(); i-- > 0; ) {
+ QLocaleId id = localeIds.at(i);
+ qsizetype j;
QByteArray prior;
- if (i < uiLanguages.size()) {
+ if (isSystem && i < uiLanguages.size()) {
// Adding likely-adjusted forms to system locale's list.
// Name the locale is derived from:
- const QString &name = uiLanguages.at(i);
- prior = name.toLatin1();
- // Don't try to likely-adjust if construction's likely-adjustments
- // were so drastic the result doesn't match the prior name:
- if (locale.name() != name && locale.d->rawName() != prior)
- continue;
- // Insert just after prior:
+ prior = uiLanguages.at(i).toLatin1();
+ // Insert just after the entry we're supplementing:
j = i + 1;
+ } else if (id.language_id == C) {
+ // Attempt no likely sub-tag amendments to C:
+ uiLanguages.append(QString::fromLatin1(id.name(sep)));
+ continue;
} else {
- // Plain locale, not system locale; just append.
+ // Plain locale or empty system uiLanguages; just append.
+ prior = id.name(sep);
+ uiLanguages.append(QString::fromLatin1(prior));
j = uiLanguages.size();
}
- const auto data = locale.d->m_data;
- QLocaleId id
- = QLocaleId::fromIds(data->m_language_id, data->m_script_id, data->m_country_id);
const QLocaleId max = id.withLikelySubtagsAdded();
const QLocaleId min = max.withLikelySubtagsRemoved();
- id.script_id = 0; // For re-use as script-less variant.
- // Include version with all likely sub-tags (last) if distinct from the rest:
- if (max != min && max != id && max.name() != prior)
- uiLanguages.insert(j, QString::fromLatin1(max.name()));
+ // Include minimal version (last) unless it's what our locale is derived from:
+ if (auto name = min.name(sep); name != prior)
+ uiLanguages.insert(j, QString::fromLatin1(name));
+ else if (!isSystem)
+ --j; // bcp47Name() matches min(): put more specific forms *before* it.
+
+ if (id.script_id) {
+ // Include scriptless version if likely-equivalent and distinct:
+ id.script_id = 0;
+ if (id != min && id.withLikelySubtagsAdded() == max) {
+ if (auto name = id.name(sep); name != prior)
+ uiLanguages.insert(j, QString::fromLatin1(name));
+ }
+ }
- // Include scriptless version if likely-equivalent and distinct:
- if (data->m_script_id && id != min && id.name() != prior
- && id.withLikelySubtagsAdded() == max) {
- uiLanguages.insert(j, QString::fromLatin1(id.name()));
+ if (!id.territory_id) {
+ Q_ASSERT(!min.territory_id);
+ Q_ASSERT(!id.script_id); // because we just cleared it.
+ // Include version with territory if it likely-equivalent and distinct:
+ id.territory_id = max.territory_id;
+ if (id != max && id.withLikelySubtagsAdded() == max) {
+ if (auto name = id.name(sep); name != prior)
+ uiLanguages.insert(j, QString::fromLatin1(name));
+ }
}
- // Include minimal version (first) unless it's what our locale is derived from:
- if (min.name() != prior)
- uiLanguages.insert(j, QString::fromLatin1(min.name()));
+ // Include version with all likely sub-tags (first) if distinct from the rest:
+ if (max != min && max != id) {
+ if (auto name = max.name(sep); name != prior)
+ uiLanguages.insert(j, QString::fromLatin1(name));
+ }
}
return uiLanguages;
}
@@ -4336,8 +4862,8 @@ QStringList QLocale::uiLanguages() const
QLocale QLocale::collation() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QString res = systemLocale()->query(QSystemLocale::Collation, QVariant()).toString();
+ if (d->m_data == &systemLocaleData) {
+ const auto res = systemLocale()->query(QSystemLocale::Collation).toString();
if (!res.isEmpty())
return QLocale(res);
}
@@ -4349,41 +4875,57 @@ QLocale QLocale::collation() const
\since 4.8
Returns a native name of the language for the locale. For example
- "Schwiizertüütsch" for Swiss-German locale.
+ "Schweizer Hochdeutsch" for the Swiss-German locale.
- \sa nativeCountryName(), languageToString()
+ \sa nativeTerritoryName(), languageToString()
*/
QString QLocale::nativeLanguageName() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::NativeLanguageName, QVariant());
- if (!res.isNull())
- return res.toString();
+ if (d->m_data == &systemLocaleData) {
+ auto res = systemLocale()->query(QSystemLocale::NativeLanguageName).toString();
+ if (!res.isEmpty())
+ return res;
}
#endif
return d->m_data->endonymLanguage().getData(endonyms_data);
}
/*!
- \since 4.8
+ \since 6.2
- Returns a native name of the country for the locale. For example
+ Returns a native name of the territory for the locale. For example
"España" for Spanish/Spain locale.
- \sa nativeLanguageName(), countryToString()
+ \sa nativeLanguageName(), territoryToString()
*/
-QString QLocale::nativeCountryName() const
+QString QLocale::nativeTerritoryName() const
{
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::NativeCountryName, QVariant());
- if (!res.isNull())
- return res.toString();
+ if (d->m_data == &systemLocaleData) {
+ auto res = systemLocale()->query(QSystemLocale::NativeTerritoryName).toString();
+ if (!res.isEmpty())
+ return res;
}
#endif
- return d->m_data->endonymCountry().getData(endonyms_data);
+ return d->m_data->endonymTerritory().getData(endonyms_data);
+}
+
+#if QT_DEPRECATED_SINCE(6, 6)
+/*!
+ \deprecated [6.6] Use \l nativeTerritoryName() instead.
+ \since 4.8
+
+ Returns a native name of the territory for the locale. For example
+ "España" for Spanish/Spain locale.
+
+ \sa nativeLanguageName(), territoryToString()
+*/
+QString QLocale::nativeCountryName() const
+{
+ return nativeTerritoryName();
}
+#endif
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QLocale &l)
@@ -4392,7 +4934,7 @@ QDebug operator<<(QDebug dbg, const QLocale &l)
dbg.nospace().noquote()
<< "QLocale(" << QLocale::languageToString(l.language())
<< ", " << QLocale::scriptToString(l.script())
- << ", " << QLocale::countryToString(l.country()) << ')';
+ << ", " << QLocale::territoryToString(l.territory()) << ')';
return dbg;
}
#endif
diff --git a/src/corelib/text/qlocale.h b/src/corelib/text/qlocale.h
index ee7e978e48..cb3eb64193 100644
--- a/src/corelib/text/qlocale.h
+++ b/src/corelib/text/qlocale.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOCALE_H
#define QLOCALE_H
@@ -65,7 +29,6 @@ class Q_CORE_EXPORT QLocale
{
Q_GADGET
friend class QString;
- friend class QStringRef;
friend class QByteArray;
friend class QIntValidator;
friend class QDoubleValidatorPrivate;
@@ -73,826 +36,830 @@ class Q_CORE_EXPORT QLocale
friend class QTextStreamPrivate;
public:
+ static constexpr int DefaultTwoDigitBaseYear = 1900;
+
// see qlocale_data_p.h for more info on generated data
// GENERATED PART STARTS HERE
- enum Language {
+ enum Language : ushort {
AnyLanguage = 0,
C = 1,
Abkhazian = 2,
- Oromo = 3,
- Afar = 4,
- Afrikaans = 5,
- Albanian = 6,
- Amharic = 7,
- Arabic = 8,
- Armenian = 9,
- Assamese = 10,
- Aymara = 11,
- Azerbaijani = 12,
- Bashkir = 13,
- Basque = 14,
- Bengali = 15,
- Dzongkha = 16,
- Bihari = 17,
- Bislama = 18,
- Breton = 19,
- Bulgarian = 20,
- Burmese = 21,
- Belarusian = 22,
- Khmer = 23,
- Catalan = 24,
- Chinese = 25,
- Corsican = 26,
- Croatian = 27,
- Czech = 28,
- Danish = 29,
- Dutch = 30,
- English = 31,
- Esperanto = 32,
- Estonian = 33,
- Faroese = 34,
- Fijian = 35,
- Finnish = 36,
- French = 37,
- WesternFrisian = 38,
- Gaelic = 39,
- Galician = 40,
- Georgian = 41,
- German = 42,
- Greek = 43,
- Greenlandic = 44,
- Guarani = 45,
- Gujarati = 46,
- Hausa = 47,
- Hebrew = 48,
- Hindi = 49,
- Hungarian = 50,
- Icelandic = 51,
- Indonesian = 52,
- Interlingua = 53,
- Interlingue = 54,
- Inuktitut = 55,
- Inupiak = 56,
- Irish = 57,
- Italian = 58,
- Japanese = 59,
- Javanese = 60,
- Kannada = 61,
- Kashmiri = 62,
- Kazakh = 63,
- Kinyarwanda = 64,
- Kirghiz = 65,
- Korean = 66,
- Kurdish = 67,
- Rundi = 68,
- Lao = 69,
- Latin = 70,
- Latvian = 71,
- Lingala = 72,
- Lithuanian = 73,
- Macedonian = 74,
- Malagasy = 75,
- Malay = 76,
- Malayalam = 77,
- Maltese = 78,
- Maori = 79,
- Marathi = 80,
- Marshallese = 81,
- Mongolian = 82,
- NauruLanguage = 83,
- Nepali = 84,
- NorwegianBokmal = 85,
- Occitan = 86,
- Oriya = 87,
- Pashto = 88,
- Persian = 89,
- Polish = 90,
- Portuguese = 91,
- Punjabi = 92,
- Quechua = 93,
- Romansh = 94,
- Romanian = 95,
- Russian = 96,
- Samoan = 97,
- Sango = 98,
- Sanskrit = 99,
- Serbian = 100,
- Ossetic = 101,
- SouthernSotho = 102,
- Tswana = 103,
- Shona = 104,
- Sindhi = 105,
- Sinhala = 106,
- Swati = 107,
- Slovak = 108,
- Slovenian = 109,
- Somali = 110,
- Spanish = 111,
- Sundanese = 112,
- Swahili = 113,
- Swedish = 114,
- Sardinian = 115,
- Tajik = 116,
- Tamil = 117,
- Tatar = 118,
- Telugu = 119,
- Thai = 120,
- Tibetan = 121,
- Tigrinya = 122,
- Tongan = 123,
- Tsonga = 124,
- Turkish = 125,
- Turkmen = 126,
- Tahitian = 127,
- Uighur = 128,
- Ukrainian = 129,
- Urdu = 130,
- Uzbek = 131,
- Vietnamese = 132,
- Volapuk = 133,
- Welsh = 134,
- Wolof = 135,
- Xhosa = 136,
- Yiddish = 137,
- Yoruba = 138,
- Zhuang = 139,
- Zulu = 140,
- NorwegianNynorsk = 141,
- Bosnian = 142,
- Divehi = 143,
- Manx = 144,
- Cornish = 145,
- Akan = 146,
- Konkani = 147,
- Ga = 148,
- Igbo = 149,
- Kamba = 150,
- Syriac = 151,
- Blin = 152,
- Geez = 153,
- Koro = 154,
- Sidamo = 155,
- Atsam = 156,
- Tigre = 157,
- Jju = 158,
- Friulian = 159,
- Venda = 160,
- Ewe = 161,
- Walamo = 162,
- Hawaiian = 163,
- Tyap = 164,
- Nyanja = 165,
- Filipino = 166,
- SwissGerman = 167,
- SichuanYi = 168,
- Kpelle = 169,
- LowGerman = 170,
- SouthNdebele = 171,
- NorthernSotho = 172,
- NorthernSami = 173,
- Taroko = 174,
- Gusii = 175,
- Taita = 176,
- Fulah = 177,
- Kikuyu = 178,
- Samburu = 179,
- Sena = 180,
- NorthNdebele = 181,
- Rombo = 182,
- Tachelhit = 183,
- Kabyle = 184,
- Nyankole = 185,
- Bena = 186,
- Vunjo = 187,
- Bambara = 188,
- Embu = 189,
- Cherokee = 190,
- Morisyen = 191,
- Makonde = 192,
- Langi = 193,
- Ganda = 194,
- Bemba = 195,
- Kabuverdianu = 196,
- Meru = 197,
- Kalenjin = 198,
- Nama = 199,
- Machame = 200,
- Colognian = 201,
- Masai = 202,
- Soga = 203,
- Luyia = 204,
- Asu = 205,
- Teso = 206,
- Saho = 207,
- KoyraChiini = 208,
- Rwa = 209,
- Luo = 210,
- Chiga = 211,
- CentralMoroccoTamazight = 212,
- KoyraboroSenni = 213,
- Shambala = 214,
- Bodo = 215,
- Avaric = 216,
- Chamorro = 217,
- Chechen = 218,
- Church = 219,
- Chuvash = 220,
- Cree = 221,
- Haitian = 222,
- Herero = 223,
- HiriMotu = 224,
- Kanuri = 225,
- Komi = 226,
- Kongo = 227,
- Kwanyama = 228,
- Limburgish = 229,
- LubaKatanga = 230,
- Luxembourgish = 231,
- Navaho = 232,
- Ndonga = 233,
- Ojibwa = 234,
- Pali = 235,
- Walloon = 236,
- Aghem = 237,
- Basaa = 238,
- Zarma = 239,
- Duala = 240,
- JolaFonyi = 241,
- Ewondo = 242,
- Bafia = 243,
- MakhuwaMeetto = 244,
- Mundang = 245,
- Kwasio = 246,
- Nuer = 247,
- Sakha = 248,
- Sangu = 249,
- CongoSwahili = 250,
- Tasawaq = 251,
- Vai = 252,
- Walser = 253,
- Yangben = 254,
- Avestan = 255,
- Asturian = 256,
- Ngomba = 257,
- Kako = 258,
- Meta = 259,
- Ngiemboon = 260,
- Aragonese = 261,
- Akkadian = 262,
- AncientEgyptian = 263,
- AncientGreek = 264,
- Aramaic = 265,
- Balinese = 266,
- Bamun = 267,
- BatakToba = 268,
- Buginese = 269,
- Buhid = 270,
- Carian = 271,
- Chakma = 272,
- ClassicalMandaic = 273,
- Coptic = 274,
- Dogri = 275,
- EasternCham = 276,
- EasternKayah = 277,
- Etruscan = 278,
- Gothic = 279,
- Hanunoo = 280,
- Ingush = 281,
- LargeFloweryMiao = 282,
- Lepcha = 283,
- Limbu = 284,
- Lisu = 285,
- Lu = 286,
- Lycian = 287,
- Lydian = 288,
- Mandingo = 289,
- Manipuri = 290,
- Meroitic = 291,
- NorthernThai = 292,
- OldIrish = 293,
- OldNorse = 294,
- OldPersian = 295,
- OldTurkish = 296,
- Pahlavi = 297,
- Parthian = 298,
- Phoenician = 299,
- PrakritLanguage = 300,
- Rejang = 301,
- Sabaean = 302,
- Samaritan = 303,
- Santali = 304,
- Saurashtra = 305,
- Sora = 306,
- Sylheti = 307,
- Tagbanwa = 308,
- TaiDam = 309,
- TaiNua = 310,
- Ugaritic = 311,
- Akoose = 312,
- Lakota = 313,
- StandardMoroccanTamazight = 314,
- Mapuche = 315,
- CentralKurdish = 316,
- LowerSorbian = 317,
- UpperSorbian = 318,
- Kenyang = 319,
- Mohawk = 320,
- Nko = 321,
- Prussian = 322,
- Kiche = 323,
- SouthernSami = 324,
- LuleSami = 325,
- InariSami = 326,
- SkoltSami = 327,
- Warlpiri = 328,
- ManichaeanMiddlePersian = 329,
- Mende = 330,
- AncientNorthArabian = 331,
- LinearA = 332,
- HmongNjua = 333,
- Ho = 334,
- Lezghian = 335,
- Bassa = 336,
- Mono = 337,
- TedimChin = 338,
- Maithili = 339,
- Ahom = 340,
- AmericanSignLanguage = 341,
- ArdhamagadhiPrakrit = 342,
- Bhojpuri = 343,
- HieroglyphicLuwian = 344,
- LiteraryChinese = 345,
- Mazanderani = 346,
- Mru = 347,
- Newari = 348,
- NorthernLuri = 349,
- Palauan = 350,
- Papiamento = 351,
- Saraiki = 352,
- TokelauLanguage = 353,
- TokPisin = 354,
- TuvaluLanguage = 355,
- UncodedLanguages = 356,
- Cantonese = 357,
- Osage = 358,
- Tangut = 359,
- Ido = 360,
- Lojban = 361,
- Sicilian = 362,
- SouthernKurdish = 363,
- WesternBalochi = 364,
- Cebuano = 365,
- Erzya = 366,
- Chickasaw = 367,
- Muscogee = 368,
- Silesian = 369,
+ Afar = 3,
+ Afrikaans = 4,
+ Aghem = 5,
+ Akan = 6,
+ Akkadian = 7,
+ Akoose = 8,
+ Albanian = 9,
+ AmericanSignLanguage = 10,
+ Amharic = 11,
+ AncientEgyptian = 12,
+ AncientGreek = 13,
+ Arabic = 14,
+ Aragonese = 15,
+ Aramaic = 16,
+ Armenian = 17,
+ Assamese = 18,
+ Asturian = 19,
+ Asu = 20,
+ Atsam = 21,
+ Avaric = 22,
+ Avestan = 23,
+ Aymara = 24,
+ Azerbaijani = 25,
+ Bafia = 26,
+ Balinese = 27,
+ Bambara = 28,
+ Bamun = 29,
+ Bangla = 30,
+ Basaa = 31,
+ Bashkir = 32,
+ Basque = 33,
+ BatakToba = 34,
+ Belarusian = 35,
+ Bemba = 36,
+ Bena = 37,
+ Bhojpuri = 38,
+ Bislama = 39,
+ Blin = 40,
+ Bodo = 41,
+ Bosnian = 42,
+ Breton = 43,
+ Buginese = 44,
+ Bulgarian = 45,
+ Burmese = 46,
+ Cantonese = 47,
+ Catalan = 48,
+ Cebuano = 49,
+ CentralAtlasTamazight = 50,
+ CentralKurdish = 51,
+ Chakma = 52,
+ Chamorro = 53,
+ Chechen = 54,
+ Cherokee = 55,
+ Chickasaw = 56,
+ Chiga = 57,
+ Chinese = 58,
+ Church = 59,
+ Chuvash = 60,
+ Colognian = 61,
+ Coptic = 62,
+ Cornish = 63,
+ Corsican = 64,
+ Cree = 65,
+ Croatian = 66,
+ Czech = 67,
+ Danish = 68,
+ Divehi = 69,
+ Dogri = 70,
+ Duala = 71,
+ Dutch = 72,
+ Dzongkha = 73,
+ Embu = 74,
+ English = 75,
+ Erzya = 76,
+ Esperanto = 77,
+ Estonian = 78,
+ Ewe = 79,
+ Ewondo = 80,
+ Faroese = 81,
+ Fijian = 82,
+ Filipino = 83,
+ Finnish = 84,
+ French = 85,
+ Friulian = 86,
+ Fulah = 87,
+ Gaelic = 88,
+ Ga = 89,
+ Galician = 90,
+ Ganda = 91,
+ Geez = 92,
+ Georgian = 93,
+ German = 94,
+ Gothic = 95,
+ Greek = 96,
+ Guarani = 97,
+ Gujarati = 98,
+ Gusii = 99,
+ Haitian = 100,
+ Hausa = 101,
+ Hawaiian = 102,
+ Hebrew = 103,
+ Herero = 104,
+ Hindi = 105,
+ HiriMotu = 106,
+ Hungarian = 107,
+ Icelandic = 108,
+ Ido = 109,
+ Igbo = 110,
+ InariSami = 111,
+ Indonesian = 112,
+ Ingush = 113,
+ Interlingua = 114,
+ Interlingue = 115,
+ Inuktitut = 116,
+ Inupiaq = 117,
+ Irish = 118,
+ Italian = 119,
+ Japanese = 120,
+ Javanese = 121,
+ Jju = 122,
+ JolaFonyi = 123,
+ Kabuverdianu = 124,
+ Kabyle = 125,
+ Kako = 126,
+ Kalaallisut = 127,
+ Kalenjin = 128,
+ Kamba = 129,
+ Kannada = 130,
+ Kanuri = 131,
+ Kashmiri = 132,
+ Kazakh = 133,
+ Kenyang = 134,
+ Khmer = 135,
+ Kiche = 136,
+ Kikuyu = 137,
+ Kinyarwanda = 138,
+ Komi = 139,
+ Kongo = 140,
+ Konkani = 141,
+ Korean = 142,
+ Koro = 143,
+ KoyraboroSenni = 144,
+ KoyraChiini = 145,
+ Kpelle = 146,
+ Kuanyama = 147,
+ Kurdish = 148,
+ Kwasio = 149,
+ Kyrgyz = 150,
+ Lakota = 151,
+ Langi = 152,
+ Lao = 153,
+ Latin = 154,
+ Latvian = 155,
+ Lezghian = 156,
+ Limburgish = 157,
+ Lingala = 158,
+ LiteraryChinese = 159,
+ Lithuanian = 160,
+ Lojban = 161,
+ LowerSorbian = 162,
+ LowGerman = 163,
+ LubaKatanga = 164,
+ LuleSami = 165,
+ Luo = 166,
+ Luxembourgish = 167,
+ Luyia = 168,
+ Macedonian = 169,
+ Machame = 170,
+ Maithili = 171,
+ MakhuwaMeetto = 172,
+ Makonde = 173,
+ Malagasy = 174,
+ Malayalam = 175,
+ Malay = 176,
+ Maltese = 177,
+ Mandingo = 178,
+ Manipuri = 179,
+ Manx = 180,
+ Maori = 181,
+ Mapuche = 182,
+ Marathi = 183,
+ Marshallese = 184,
+ Masai = 185,
+ Mazanderani = 186,
+ Mende = 187,
+ Meru = 188,
+ Meta = 189,
+ Mohawk = 190,
+ Mongolian = 191,
+ Morisyen = 192,
+ Mundang = 193,
+ Muscogee = 194,
+ Nama = 195,
+ NauruLanguage = 196,
+ Navajo = 197,
+ Ndonga = 198,
+ Nepali = 199,
+ Newari = 200,
+ Ngiemboon = 201,
+ Ngomba = 202,
+ NigerianPidgin = 203,
+ Nko = 204,
+ NorthernLuri = 205,
+ NorthernSami = 206,
+ NorthernSotho = 207,
+ NorthNdebele = 208,
+ NorwegianBokmal = 209,
+ NorwegianNynorsk = 210,
+ Nuer = 211,
+ Nyanja = 212,
+ Nyankole = 213,
+ Occitan = 214,
+ Odia = 215,
+ Ojibwa = 216,
+ OldIrish = 217,
+ OldNorse = 218,
+ OldPersian = 219,
+ Oromo = 220,
+ Osage = 221,
+ Ossetic = 222,
+ Pahlavi = 223,
+ Palauan = 224,
+ Pali = 225,
+ Papiamento = 226,
+ Pashto = 227,
+ Persian = 228,
+ Phoenician = 229,
+ Polish = 230,
+ Portuguese = 231,
+ Prussian = 232,
+ Punjabi = 233,
+ Quechua = 234,
+ Romanian = 235,
+ Romansh = 236,
+ Rombo = 237,
+ Rundi = 238,
+ Russian = 239,
+ Rwa = 240,
+ Saho = 241,
+ Sakha = 242,
+ Samburu = 243,
+ Samoan = 244,
+ Sango = 245,
+ Sangu = 246,
+ Sanskrit = 247,
+ Santali = 248,
+ Sardinian = 249,
+ Saurashtra = 250,
+ Sena = 251,
+ Serbian = 252,
+ Shambala = 253,
+ Shona = 254,
+ SichuanYi = 255,
+ Sicilian = 256,
+ Sidamo = 257,
+ Silesian = 258,
+ Sindhi = 259,
+ Sinhala = 260,
+ SkoltSami = 261,
+ Slovak = 262,
+ Slovenian = 263,
+ Soga = 264,
+ Somali = 265,
+ SouthernKurdish = 266,
+ SouthernSami = 267,
+ SouthernSotho = 268,
+ SouthNdebele = 269,
+ Spanish = 270,
+ StandardMoroccanTamazight = 271,
+ Sundanese = 272,
+ Swahili = 273,
+ Swati = 274,
+ Swedish = 275,
+ SwissGerman = 276,
+ Syriac = 277,
+ Tachelhit = 278,
+ Tahitian = 279,
+ TaiDam = 280,
+ Taita = 281,
+ Tajik = 282,
+ Tamil = 283,
+ Taroko = 284,
+ Tasawaq = 285,
+ Tatar = 286,
+ Telugu = 287,
+ Teso = 288,
+ Thai = 289,
+ Tibetan = 290,
+ Tigre = 291,
+ Tigrinya = 292,
+ TokelauLanguage = 293,
+ TokPisin = 294,
+ Tongan = 295,
+ Tsonga = 296,
+ Tswana = 297,
+ Turkish = 298,
+ Turkmen = 299,
+ TuvaluLanguage = 300,
+ Tyap = 301,
+ Ugaritic = 302,
+ Ukrainian = 303,
+ UpperSorbian = 304,
+ Urdu = 305,
+ Uyghur = 306,
+ Uzbek = 307,
+ Vai = 308,
+ Venda = 309,
+ Vietnamese = 310,
+ Volapuk = 311,
+ Vunjo = 312,
+ Walloon = 313,
+ Walser = 314,
+ Warlpiri = 315,
+ Welsh = 316,
+ WesternBalochi = 317,
+ WesternFrisian = 318,
+ Wolaytta = 319,
+ Wolof = 320,
+ Xhosa = 321,
+ Yangben = 322,
+ Yiddish = 323,
+ Yoruba = 324,
+ Zarma = 325,
+ Zhuang = 326,
+ Zulu = 327,
+ Kaingang = 328,
+ Nheengatu = 329,
+ Haryanvi = 330,
+ NorthernFrisian = 331,
+ Rajasthani = 332,
+ Moksha = 333,
+ TokiPona = 334,
+ Pijin = 335,
+ Obolo = 336,
+ Baluchi = 337,
+ Ligurian = 338,
+ Rohingya = 339,
+ Torwali = 340,
+ Anii = 341,
+ Kangri = 342,
+ Venetian = 343,
Afan = Oromo,
+ Bengali = Bangla,
Bhutani = Dzongkha,
Byelorussian = Belarusian,
Cambodian = Khmer,
+ CentralMoroccoTamazight = CentralAtlasTamazight,
Chewa = Nyanja,
Frisian = WesternFrisian,
+ Greenlandic = Kalaallisut,
+ Inupiak = Inupiaq,
+ Kirghiz = Kyrgyz,
Kurundi = Rundi,
- Moldavian = Romanian,
- Norwegian = NorwegianBokmal,
+ Kwanyama = Kuanyama,
+ Navaho = Navajo,
+ Oriya = Odia,
RhaetoRomance = Romansh,
- SerboCroatian = Serbian,
- Tagalog = Filipino,
- Twi = Akan,
- Uigur = Uighur,
+ Uighur = Uyghur,
+ Uigur = Uyghur,
+ Walamo = Wolaytta,
- LastLanguage = Silesian
+ LastLanguage = Venetian
};
- enum Script {
+ enum Script : ushort {
AnyScript = 0,
- ArabicScript = 1,
- CyrillicScript = 2,
- DeseretScript = 3,
- GurmukhiScript = 4,
- SimplifiedHanScript = 5,
- TraditionalHanScript = 6,
- LatinScript = 7,
- MongolianScript = 8,
- TifinaghScript = 9,
- ArmenianScript = 10,
- BengaliScript = 11,
- CherokeeScript = 12,
- DevanagariScript = 13,
- EthiopicScript = 14,
- GeorgianScript = 15,
- GreekScript = 16,
- GujaratiScript = 17,
- HebrewScript = 18,
- JapaneseScript = 19,
- KhmerScript = 20,
- KannadaScript = 21,
- KoreanScript = 22,
- LaoScript = 23,
- MalayalamScript = 24,
- MyanmarScript = 25,
- OriyaScript = 26,
- TamilScript = 27,
- TeluguScript = 28,
- ThaanaScript = 29,
- ThaiScript = 30,
- TibetanScript = 31,
- SinhalaScript = 32,
- SyriacScript = 33,
- YiScript = 34,
- VaiScript = 35,
- AvestanScript = 36,
- BalineseScript = 37,
- BamumScript = 38,
- BatakScript = 39,
- BopomofoScript = 40,
- BrahmiScript = 41,
- BugineseScript = 42,
- BuhidScript = 43,
- CanadianAboriginalScript = 44,
- CarianScript = 45,
- ChakmaScript = 46,
- ChamScript = 47,
- CopticScript = 48,
- CypriotScript = 49,
- EgyptianHieroglyphsScript = 50,
- FraserScript = 51,
- GlagoliticScript = 52,
- GothicScript = 53,
- HanScript = 54,
- HangulScript = 55,
- HanunooScript = 56,
- ImperialAramaicScript = 57,
- InscriptionalPahlaviScript = 58,
- InscriptionalParthianScript = 59,
- JavaneseScript = 60,
- KaithiScript = 61,
- KatakanaScript = 62,
- KayahLiScript = 63,
- KharoshthiScript = 64,
- LannaScript = 65,
- LepchaScript = 66,
- LimbuScript = 67,
- LinearBScript = 68,
- LycianScript = 69,
- LydianScript = 70,
- MandaeanScript = 71,
- MeiteiMayekScript = 72,
- MeroiticScript = 73,
- MeroiticCursiveScript = 74,
- NkoScript = 75,
- NewTaiLueScript = 76,
- OghamScript = 77,
- OlChikiScript = 78,
- OldItalicScript = 79,
- OldPersianScript = 80,
- OldSouthArabianScript = 81,
- OrkhonScript = 82,
- OsmanyaScript = 83,
- PhagsPaScript = 84,
- PhoenicianScript = 85,
- PollardPhoneticScript = 86,
- RejangScript = 87,
- RunicScript = 88,
- SamaritanScript = 89,
- SaurashtraScript = 90,
- SharadaScript = 91,
- ShavianScript = 92,
- SoraSompengScript = 93,
- CuneiformScript = 94,
- SundaneseScript = 95,
- SylotiNagriScript = 96,
- TagalogScript = 97,
- TagbanwaScript = 98,
- TaiLeScript = 99,
- TaiVietScript = 100,
- TakriScript = 101,
- UgariticScript = 102,
- BrailleScript = 103,
- HiraganaScript = 104,
- CaucasianAlbanianScript = 105,
- BassaVahScript = 106,
- DuployanScript = 107,
- ElbasanScript = 108,
- GranthaScript = 109,
- PahawhHmongScript = 110,
- KhojkiScript = 111,
- LinearAScript = 112,
- MahajaniScript = 113,
- ManichaeanScript = 114,
- MendeKikakuiScript = 115,
- ModiScript = 116,
- MroScript = 117,
- OldNorthArabianScript = 118,
- NabataeanScript = 119,
- PalmyreneScript = 120,
- PauCinHauScript = 121,
- OldPermicScript = 122,
- PsalterPahlaviScript = 123,
- SiddhamScript = 124,
- KhudawadiScript = 125,
- TirhutaScript = 126,
- VarangKshitiScript = 127,
- AhomScript = 128,
- AnatolianHieroglyphsScript = 129,
- HatranScript = 130,
- MultaniScript = 131,
- OldHungarianScript = 132,
- SignWritingScript = 133,
- AdlamScript = 134,
- BhaiksukiScript = 135,
- MarchenScript = 136,
- NewaScript = 137,
- OsageScript = 138,
- TangutScript = 139,
- HanWithBopomofoScript = 140,
- JamoScript = 141,
+ AdlamScript = 1,
+ AhomScript = 2,
+ AnatolianHieroglyphsScript = 3,
+ ArabicScript = 4,
+ ArmenianScript = 5,
+ AvestanScript = 6,
+ BalineseScript = 7,
+ BamumScript = 8,
+ BanglaScript = 9,
+ BassaVahScript = 10,
+ BatakScript = 11,
+ BhaiksukiScript = 12,
+ BopomofoScript = 13,
+ BrahmiScript = 14,
+ BrailleScript = 15,
+ BugineseScript = 16,
+ BuhidScript = 17,
+ CanadianAboriginalScript = 18,
+ CarianScript = 19,
+ CaucasianAlbanianScript = 20,
+ ChakmaScript = 21,
+ ChamScript = 22,
+ CherokeeScript = 23,
+ CopticScript = 24,
+ CuneiformScript = 25,
+ CypriotScript = 26,
+ CyrillicScript = 27,
+ DeseretScript = 28,
+ DevanagariScript = 29,
+ DuployanScript = 30,
+ EgyptianHieroglyphsScript = 31,
+ ElbasanScript = 32,
+ EthiopicScript = 33,
+ FraserScript = 34,
+ GeorgianScript = 35,
+ GlagoliticScript = 36,
+ GothicScript = 37,
+ GranthaScript = 38,
+ GreekScript = 39,
+ GujaratiScript = 40,
+ GurmukhiScript = 41,
+ HangulScript = 42,
+ HanScript = 43,
+ HanunooScript = 44,
+ HanWithBopomofoScript = 45,
+ HatranScript = 46,
+ HebrewScript = 47,
+ HiraganaScript = 48,
+ ImperialAramaicScript = 49,
+ InscriptionalPahlaviScript = 50,
+ InscriptionalParthianScript = 51,
+ JamoScript = 52,
+ JapaneseScript = 53,
+ JavaneseScript = 54,
+ KaithiScript = 55,
+ KannadaScript = 56,
+ KatakanaScript = 57,
+ KayahLiScript = 58,
+ KharoshthiScript = 59,
+ KhmerScript = 60,
+ KhojkiScript = 61,
+ KhudawadiScript = 62,
+ KoreanScript = 63,
+ LannaScript = 64,
+ LaoScript = 65,
+ LatinScript = 66,
+ LepchaScript = 67,
+ LimbuScript = 68,
+ LinearAScript = 69,
+ LinearBScript = 70,
+ LycianScript = 71,
+ LydianScript = 72,
+ MahajaniScript = 73,
+ MalayalamScript = 74,
+ MandaeanScript = 75,
+ ManichaeanScript = 76,
+ MarchenScript = 77,
+ MeiteiMayekScript = 78,
+ MendeScript = 79,
+ MeroiticCursiveScript = 80,
+ MeroiticScript = 81,
+ ModiScript = 82,
+ MongolianScript = 83,
+ MroScript = 84,
+ MultaniScript = 85,
+ MyanmarScript = 86,
+ NabataeanScript = 87,
+ NewaScript = 88,
+ NewTaiLueScript = 89,
+ NkoScript = 90,
+ OdiaScript = 91,
+ OghamScript = 92,
+ OlChikiScript = 93,
+ OldHungarianScript = 94,
+ OldItalicScript = 95,
+ OldNorthArabianScript = 96,
+ OldPermicScript = 97,
+ OldPersianScript = 98,
+ OldSouthArabianScript = 99,
+ OrkhonScript = 100,
+ OsageScript = 101,
+ OsmanyaScript = 102,
+ PahawhHmongScript = 103,
+ PalmyreneScript = 104,
+ PauCinHauScript = 105,
+ PhagsPaScript = 106,
+ PhoenicianScript = 107,
+ PollardPhoneticScript = 108,
+ PsalterPahlaviScript = 109,
+ RejangScript = 110,
+ RunicScript = 111,
+ SamaritanScript = 112,
+ SaurashtraScript = 113,
+ SharadaScript = 114,
+ ShavianScript = 115,
+ SiddhamScript = 116,
+ SignWritingScript = 117,
+ SimplifiedHanScript = 118,
+ SinhalaScript = 119,
+ SoraSompengScript = 120,
+ SundaneseScript = 121,
+ SylotiNagriScript = 122,
+ SyriacScript = 123,
+ TagalogScript = 124,
+ TagbanwaScript = 125,
+ TaiLeScript = 126,
+ TaiVietScript = 127,
+ TakriScript = 128,
+ TamilScript = 129,
+ TangutScript = 130,
+ TeluguScript = 131,
+ ThaanaScript = 132,
+ ThaiScript = 133,
+ TibetanScript = 134,
+ TifinaghScript = 135,
+ TirhutaScript = 136,
+ TraditionalHanScript = 137,
+ UgariticScript = 138,
+ VaiScript = 139,
+ VarangKshitiScript = 140,
+ YiScript = 141,
+ HanifiScript = 142,
+ BengaliScript = BanglaScript,
+ MendeKikakuiScript = MendeScript,
+ OriyaScript = OdiaScript,
SimplifiedChineseScript = SimplifiedHanScript,
TraditionalChineseScript = TraditionalHanScript,
- LastScript = JamoScript
+ LastScript = HanifiScript
};
- enum Country {
- AnyCountry = 0,
+ // ### Qt 7: Rename to Territory
+ enum Country : ushort {
+ AnyTerritory = 0,
Afghanistan = 1,
- Albania = 2,
- Algeria = 3,
- AmericanSamoa = 4,
- Andorra = 5,
- Angola = 6,
- Anguilla = 7,
- Antarctica = 8,
- AntiguaAndBarbuda = 9,
- Argentina = 10,
- Armenia = 11,
- Aruba = 12,
- Australia = 13,
- Austria = 14,
- Azerbaijan = 15,
- Bahamas = 16,
- Bahrain = 17,
- Bangladesh = 18,
- Barbados = 19,
- Belarus = 20,
- Belgium = 21,
- Belize = 22,
- Benin = 23,
- Bermuda = 24,
- Bhutan = 25,
- Bolivia = 26,
- BosniaAndHerzegowina = 27,
- Botswana = 28,
- BouvetIsland = 29,
- Brazil = 30,
- BritishIndianOceanTerritory = 31,
- Brunei = 32,
- Bulgaria = 33,
- BurkinaFaso = 34,
- Burundi = 35,
- Cambodia = 36,
- Cameroon = 37,
- Canada = 38,
- CapeVerde = 39,
- CaymanIslands = 40,
- CentralAfricanRepublic = 41,
- Chad = 42,
- Chile = 43,
- China = 44,
- ChristmasIsland = 45,
- CocosIslands = 46,
- Colombia = 47,
- Comoros = 48,
- CongoKinshasa = 49,
- CongoBrazzaville = 50,
- CookIslands = 51,
- CostaRica = 52,
- IvoryCoast = 53,
- Croatia = 54,
- Cuba = 55,
- Cyprus = 56,
- CzechRepublic = 57,
- Denmark = 58,
- Djibouti = 59,
- Dominica = 60,
- DominicanRepublic = 61,
- EastTimor = 62,
- Ecuador = 63,
- Egypt = 64,
- ElSalvador = 65,
- EquatorialGuinea = 66,
- Eritrea = 67,
- Estonia = 68,
- Ethiopia = 69,
- FalklandIslands = 70,
- FaroeIslands = 71,
- Fiji = 72,
- Finland = 73,
- France = 74,
- Guernsey = 75,
- FrenchGuiana = 76,
- FrenchPolynesia = 77,
- FrenchSouthernTerritories = 78,
- Gabon = 79,
- Gambia = 80,
- Georgia = 81,
- Germany = 82,
- Ghana = 83,
- Gibraltar = 84,
- Greece = 85,
- Greenland = 86,
- Grenada = 87,
- Guadeloupe = 88,
- Guam = 89,
- Guatemala = 90,
- Guinea = 91,
- GuineaBissau = 92,
- Guyana = 93,
- Haiti = 94,
- HeardAndMcDonaldIslands = 95,
- Honduras = 96,
- HongKong = 97,
- Hungary = 98,
- Iceland = 99,
- India = 100,
- Indonesia = 101,
- Iran = 102,
- Iraq = 103,
- Ireland = 104,
- Israel = 105,
- Italy = 106,
- Jamaica = 107,
- Japan = 108,
- Jordan = 109,
- Kazakhstan = 110,
- Kenya = 111,
- Kiribati = 112,
- NorthKorea = 113,
- SouthKorea = 114,
- Kuwait = 115,
- Kyrgyzstan = 116,
- Laos = 117,
- Latvia = 118,
- Lebanon = 119,
- Lesotho = 120,
- Liberia = 121,
- Libya = 122,
- Liechtenstein = 123,
- Lithuania = 124,
- Luxembourg = 125,
- Macau = 126,
- Macedonia = 127,
- Madagascar = 128,
- Malawi = 129,
- Malaysia = 130,
- Maldives = 131,
- Mali = 132,
- Malta = 133,
- MarshallIslands = 134,
- Martinique = 135,
- Mauritania = 136,
- Mauritius = 137,
- Mayotte = 138,
- Mexico = 139,
- Micronesia = 140,
- Moldova = 141,
- Monaco = 142,
- Mongolia = 143,
- Montserrat = 144,
- Morocco = 145,
- Mozambique = 146,
- Myanmar = 147,
- Namibia = 148,
- NauruCountry = 149,
- Nepal = 150,
- Netherlands = 151,
- CuraSao = 152,
- NewCaledonia = 153,
- NewZealand = 154,
- Nicaragua = 155,
- Niger = 156,
- Nigeria = 157,
- Niue = 158,
- NorfolkIsland = 159,
- NorthernMarianaIslands = 160,
- Norway = 161,
- Oman = 162,
- Pakistan = 163,
- Palau = 164,
- PalestinianTerritories = 165,
- Panama = 166,
- PapuaNewGuinea = 167,
- Paraguay = 168,
- Peru = 169,
- Philippines = 170,
- Pitcairn = 171,
- Poland = 172,
- Portugal = 173,
- PuertoRico = 174,
- Qatar = 175,
- Reunion = 176,
- Romania = 177,
- Russia = 178,
- Rwanda = 179,
- SaintKittsAndNevis = 180,
- SaintLucia = 181,
- SaintVincentAndTheGrenadines = 182,
- Samoa = 183,
- SanMarino = 184,
- SaoTomeAndPrincipe = 185,
- SaudiArabia = 186,
- Senegal = 187,
- Seychelles = 188,
- SierraLeone = 189,
- Singapore = 190,
- Slovakia = 191,
- Slovenia = 192,
- SolomonIslands = 193,
- Somalia = 194,
- SouthAfrica = 195,
- SouthGeorgiaAndTheSouthSandwichIslands = 196,
- Spain = 197,
- SriLanka = 198,
- SaintHelena = 199,
+ AlandIslands = 2,
+ Albania = 3,
+ Algeria = 4,
+ AmericanSamoa = 5,
+ Andorra = 6,
+ Angola = 7,
+ Anguilla = 8,
+ Antarctica = 9,
+ AntiguaAndBarbuda = 10,
+ Argentina = 11,
+ Armenia = 12,
+ Aruba = 13,
+ AscensionIsland = 14,
+ Australia = 15,
+ Austria = 16,
+ Azerbaijan = 17,
+ Bahamas = 18,
+ Bahrain = 19,
+ Bangladesh = 20,
+ Barbados = 21,
+ Belarus = 22,
+ Belgium = 23,
+ Belize = 24,
+ Benin = 25,
+ Bermuda = 26,
+ Bhutan = 27,
+ Bolivia = 28,
+ BosniaAndHerzegovina = 29,
+ Botswana = 30,
+ BouvetIsland = 31,
+ Brazil = 32,
+ BritishIndianOceanTerritory = 33,
+ BritishVirginIslands = 34,
+ Brunei = 35,
+ Bulgaria = 36,
+ BurkinaFaso = 37,
+ Burundi = 38,
+ Cambodia = 39,
+ Cameroon = 40,
+ Canada = 41,
+ CanaryIslands = 42,
+ CapeVerde = 43,
+ CaribbeanNetherlands = 44,
+ CaymanIslands = 45,
+ CentralAfricanRepublic = 46,
+ CeutaAndMelilla = 47,
+ Chad = 48,
+ Chile = 49,
+ China = 50,
+ ChristmasIsland = 51,
+ ClippertonIsland = 52,
+ CocosIslands = 53,
+ Colombia = 54,
+ Comoros = 55,
+ CongoBrazzaville = 56,
+ CongoKinshasa = 57,
+ CookIslands = 58,
+ CostaRica = 59,
+ Croatia = 60,
+ Cuba = 61,
+ Curacao = 62,
+ Cyprus = 63,
+ Czechia = 64,
+ Denmark = 65,
+ DiegoGarcia = 66,
+ Djibouti = 67,
+ Dominica = 68,
+ DominicanRepublic = 69,
+ Ecuador = 70,
+ Egypt = 71,
+ ElSalvador = 72,
+ EquatorialGuinea = 73,
+ Eritrea = 74,
+ Estonia = 75,
+ Eswatini = 76,
+ Ethiopia = 77,
+ Europe = 78,
+ EuropeanUnion = 79,
+ FalklandIslands = 80,
+ FaroeIslands = 81,
+ Fiji = 82,
+ Finland = 83,
+ France = 84,
+ FrenchGuiana = 85,
+ FrenchPolynesia = 86,
+ FrenchSouthernTerritories = 87,
+ Gabon = 88,
+ Gambia = 89,
+ Georgia = 90,
+ Germany = 91,
+ Ghana = 92,
+ Gibraltar = 93,
+ Greece = 94,
+ Greenland = 95,
+ Grenada = 96,
+ Guadeloupe = 97,
+ Guam = 98,
+ Guatemala = 99,
+ Guernsey = 100,
+ GuineaBissau = 101,
+ Guinea = 102,
+ Guyana = 103,
+ Haiti = 104,
+ HeardAndMcDonaldIslands = 105,
+ Honduras = 106,
+ HongKong = 107,
+ Hungary = 108,
+ Iceland = 109,
+ India = 110,
+ Indonesia = 111,
+ Iran = 112,
+ Iraq = 113,
+ Ireland = 114,
+ IsleOfMan = 115,
+ Israel = 116,
+ Italy = 117,
+ IvoryCoast = 118,
+ Jamaica = 119,
+ Japan = 120,
+ Jersey = 121,
+ Jordan = 122,
+ Kazakhstan = 123,
+ Kenya = 124,
+ Kiribati = 125,
+ Kosovo = 126,
+ Kuwait = 127,
+ Kyrgyzstan = 128,
+ Laos = 129,
+ LatinAmerica = 130,
+ Latvia = 131,
+ Lebanon = 132,
+ Lesotho = 133,
+ Liberia = 134,
+ Libya = 135,
+ Liechtenstein = 136,
+ Lithuania = 137,
+ Luxembourg = 138,
+ Macao = 139,
+ Macedonia = 140,
+ Madagascar = 141,
+ Malawi = 142,
+ Malaysia = 143,
+ Maldives = 144,
+ Mali = 145,
+ Malta = 146,
+ MarshallIslands = 147,
+ Martinique = 148,
+ Mauritania = 149,
+ Mauritius = 150,
+ Mayotte = 151,
+ Mexico = 152,
+ Micronesia = 153,
+ Moldova = 154,
+ Monaco = 155,
+ Mongolia = 156,
+ Montenegro = 157,
+ Montserrat = 158,
+ Morocco = 159,
+ Mozambique = 160,
+ Myanmar = 161,
+ Namibia = 162,
+ NauruTerritory = 163,
+ Nepal = 164,
+ Netherlands = 165,
+ NewCaledonia = 166,
+ NewZealand = 167,
+ Nicaragua = 168,
+ Nigeria = 169,
+ Niger = 170,
+ Niue = 171,
+ NorfolkIsland = 172,
+ NorthernMarianaIslands = 173,
+ NorthKorea = 174,
+ Norway = 175,
+ Oman = 176,
+ OutlyingOceania = 177,
+ Pakistan = 178,
+ Palau = 179,
+ PalestinianTerritories = 180,
+ Panama = 181,
+ PapuaNewGuinea = 182,
+ Paraguay = 183,
+ Peru = 184,
+ Philippines = 185,
+ Pitcairn = 186,
+ Poland = 187,
+ Portugal = 188,
+ PuertoRico = 189,
+ Qatar = 190,
+ Reunion = 191,
+ Romania = 192,
+ Russia = 193,
+ Rwanda = 194,
+ SaintBarthelemy = 195,
+ SaintHelena = 196,
+ SaintKittsAndNevis = 197,
+ SaintLucia = 198,
+ SaintMartin = 199,
SaintPierreAndMiquelon = 200,
- Sudan = 201,
- Suriname = 202,
- SvalbardAndJanMayenIslands = 203,
- Swaziland = 204,
- Sweden = 205,
- Switzerland = 206,
- Syria = 207,
- Taiwan = 208,
- Tajikistan = 209,
- Tanzania = 210,
- Thailand = 211,
- Togo = 212,
- TokelauCountry = 213,
- Tonga = 214,
- TrinidadAndTobago = 215,
- Tunisia = 216,
- Turkey = 217,
- Turkmenistan = 218,
- TurksAndCaicosIslands = 219,
- TuvaluCountry = 220,
- Uganda = 221,
- Ukraine = 222,
- UnitedArabEmirates = 223,
- UnitedKingdom = 224,
- UnitedStates = 225,
- UnitedStatesMinorOutlyingIslands = 226,
- Uruguay = 227,
- Uzbekistan = 228,
- Vanuatu = 229,
- VaticanCityState = 230,
- Venezuela = 231,
- Vietnam = 232,
- BritishVirginIslands = 233,
- UnitedStatesVirginIslands = 234,
- WallisAndFutunaIslands = 235,
- WesternSahara = 236,
- Yemen = 237,
- CanaryIslands = 238,
- Zambia = 239,
- Zimbabwe = 240,
- ClippertonIsland = 241,
- Montenegro = 242,
- Serbia = 243,
- SaintBarthelemy = 244,
- SaintMartin = 245,
- LatinAmerica = 246,
- AscensionIsland = 247,
- AlandIslands = 248,
- DiegoGarcia = 249,
- CeutaAndMelilla = 250,
- IsleOfMan = 251,
- Jersey = 252,
- TristanDaCunha = 253,
- SouthSudan = 254,
- Bonaire = 255,
- SintMaarten = 256,
- Kosovo = 257,
- EuropeanUnion = 258,
- OutlyingOceania = 259,
- World = 260,
- Europe = 261,
+ SaintVincentAndGrenadines = 201,
+ Samoa = 202,
+ SanMarino = 203,
+ SaoTomeAndPrincipe = 204,
+ SaudiArabia = 205,
+ Senegal = 206,
+ Serbia = 207,
+ Seychelles = 208,
+ SierraLeone = 209,
+ Singapore = 210,
+ SintMaarten = 211,
+ Slovakia = 212,
+ Slovenia = 213,
+ SolomonIslands = 214,
+ Somalia = 215,
+ SouthAfrica = 216,
+ SouthGeorgiaAndSouthSandwichIslands = 217,
+ SouthKorea = 218,
+ SouthSudan = 219,
+ Spain = 220,
+ SriLanka = 221,
+ Sudan = 222,
+ Suriname = 223,
+ SvalbardAndJanMayen = 224,
+ Sweden = 225,
+ Switzerland = 226,
+ Syria = 227,
+ Taiwan = 228,
+ Tajikistan = 229,
+ Tanzania = 230,
+ Thailand = 231,
+ TimorLeste = 232,
+ Togo = 233,
+ TokelauTerritory = 234,
+ Tonga = 235,
+ TrinidadAndTobago = 236,
+ TristanDaCunha = 237,
+ Tunisia = 238,
+ Turkey = 239,
+ Turkmenistan = 240,
+ TurksAndCaicosIslands = 241,
+ TuvaluTerritory = 242,
+ Uganda = 243,
+ Ukraine = 244,
+ UnitedArabEmirates = 245,
+ UnitedKingdom = 246,
+ UnitedStatesOutlyingIslands = 247,
+ UnitedStates = 248,
+ UnitedStatesVirginIslands = 249,
+ Uruguay = 250,
+ Uzbekistan = 251,
+ Vanuatu = 252,
+ VaticanCity = 253,
+ Venezuela = 254,
+ Vietnam = 255,
+ WallisAndFutuna = 256,
+ WesternSahara = 257,
+ World = 258,
+ Yemen = 259,
+ Zambia = 260,
+ Zimbabwe = 261,
+ AnyCountry = AnyTerritory,
+ Bonaire = CaribbeanNetherlands,
+ BosniaAndHerzegowina = BosniaAndHerzegovina,
+ CuraSao = Curacao,
+ CzechRepublic = Czechia,
DemocraticRepublicOfCongo = CongoKinshasa,
DemocraticRepublicOfKorea = NorthKorea,
+ EastTimor = TimorLeste,
LatinAmericaAndTheCaribbean = LatinAmerica,
+ Macau = Macao,
+ NauruCountry = NauruTerritory,
PeoplesRepublicOfCongo = CongoBrazzaville,
RepublicOfKorea = SouthKorea,
RussianFederation = Russia,
+ SaintVincentAndTheGrenadines = SaintVincentAndGrenadines,
+ SouthGeorgiaAndTheSouthSandwichIslands = SouthGeorgiaAndSouthSandwichIslands,
+ SvalbardAndJanMayenIslands = SvalbardAndJanMayen,
+ Swaziland = Eswatini,
SyrianArabRepublic = Syria,
- Tokelau = TokelauCountry,
- Tuvalu = TuvaluCountry,
+ TokelauCountry = TokelauTerritory,
+ TuvaluCountry = TuvaluTerritory,
+ UnitedStatesMinorOutlyingIslands = UnitedStatesOutlyingIslands,
+ VaticanCityState = VaticanCity,
+ WallisAndFutunaIslands = WallisAndFutuna,
- LastCountry = Europe
+ LastTerritory = Zimbabwe,
+ LastCountry = LastTerritory
};
// GENERATED PART ENDS HERE
+ using Territory = Country; // ### Qt 7: reverse
+
Q_ENUM(Language)
Q_ENUM(Country)
Q_ENUM(Script)
@@ -906,6 +873,7 @@ public:
Q_ENUM(MeasurementSystem)
enum FormatType { LongFormat, ShortFormat, NarrowFormat };
+ Q_ENUM(FormatType)
enum NumberOption {
DefaultNumberOptions = 0x0,
OmitGroupSeparator = 0x01,
@@ -916,16 +884,21 @@ public:
RejectTrailingZeroesAfterDot = 0x20
};
Q_DECLARE_FLAGS(NumberOptions, NumberOption)
+ Q_FLAG(NumberOptions)
enum FloatingPointPrecisionOption {
FloatingPointShortest = -128
};
+ enum class TagSeparator : char { Dash = '-', Underscore = '_' };
+ Q_ENUM(TagSeparator)
+
enum CurrencySymbolFormat {
CurrencyIsoCode,
CurrencySymbol,
CurrencyDisplayName
};
+ Q_ENUM(CurrencySymbolFormat)
enum DataSizeFormat {
// Single-bit values, for internal use.
@@ -941,38 +914,61 @@ public:
Q_FLAG(DataSizeFormats)
QLocale();
+ QT_CORE_INLINE_SINCE(6, 4)
explicit QLocale(const QString &name);
- QLocale(Language language, Country country = AnyCountry);
- QLocale(Language language, Script script, Country country);
- QLocale(const QLocale &other);
- QLocale &operator=(QLocale &&other) noexcept { swap(other); return *this; }
- QLocale &operator=(const QLocale &other);
+ explicit QLocale(QStringView name);
+ QLocale(Language language, Territory territory);
+ QLocale(Language language, Script script = AnyScript, Territory territory = AnyTerritory);
+ QLocale(const QLocale &other) noexcept;
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QLocale)
+ QLocale &operator=(const QLocale &other) noexcept;
~QLocale();
- void swap(QLocale &other) noexcept { qSwap(d, other.d); }
+ void swap(QLocale &other) noexcept { d.swap(other.d); }
Language language() const;
Script script() const;
+ Territory territory() const;
+#if QT_DEPRECATED_SINCE(6, 6)
+ QT_DEPRECATED_VERSION_X_6_6("Use territory() instead")
Country country() const;
- QString name() const;
+#endif
+#if QT_CORE_REMOVED_SINCE(6, 7)
+ QString name() const;
QString bcp47Name() const;
+#endif
+ QString name(TagSeparator separator = TagSeparator::Underscore) const;
+ QString bcp47Name(TagSeparator separator = TagSeparator::Dash) const;
+
QString nativeLanguageName() const;
+ QString nativeTerritoryName() const;
+#if QT_DEPRECATED_SINCE(6, 6)
+ QT_DEPRECATED_VERSION_X_6_6("Use nativeTerritoryName() instead")
QString nativeCountryName() const;
-
-#if QT_STRINGVIEW_LEVEL < 2
- short toShort(const QString &s, bool *ok = nullptr) const;
- ushort toUShort(const QString &s, bool *ok = nullptr) const;
- int toInt(const QString &s, bool *ok = nullptr) const;
- uint toUInt(const QString &s, bool *ok = nullptr) const;
- long toLong(const QString &s, bool *ok = nullptr) const;
- ulong toULong(const QString &s, bool *ok = nullptr) const;
- qlonglong toLongLong(const QString &s, bool *ok = nullptr) const;
- qulonglong toULongLong(const QString &s, bool *ok = nullptr) const;
- float toFloat(const QString &s, bool *ok = nullptr) const;
- double toDouble(const QString &s, bool *ok = nullptr) const;
#endif
+ short toShort(const QString &s, bool *ok = nullptr) const
+ { return toShort(qToStringViewIgnoringNull(s), ok); }
+ ushort toUShort(const QString &s, bool *ok = nullptr) const
+ { return toUShort(qToStringViewIgnoringNull(s), ok); }
+ int toInt(const QString &s, bool *ok = nullptr) const
+ { return toInt(qToStringViewIgnoringNull(s), ok); }
+ uint toUInt(const QString &s, bool *ok = nullptr) const
+ { return toUInt(qToStringViewIgnoringNull(s), ok); }
+ long toLong(const QString &s, bool *ok = nullptr) const
+ { return toLong(qToStringViewIgnoringNull(s), ok); }
+ ulong toULong(const QString &s, bool *ok = nullptr) const
+ { return toULong(qToStringViewIgnoringNull(s), ok); }
+ qlonglong toLongLong(const QString &s, bool *ok = nullptr) const
+ { return toLongLong(qToStringViewIgnoringNull(s), ok); }
+ qulonglong toULongLong(const QString &s, bool *ok = nullptr) const
+ { return toULongLong(qToStringViewIgnoringNull(s), ok); }
+ float toFloat(const QString &s, bool *ok = nullptr) const
+ { return toFloat(qToStringViewIgnoringNull(s), ok); }
+ double toDouble(const QString &s, bool *ok = nullptr) const
+ { return toDouble(qToStringViewIgnoringNull(s), ok); }
+
short toShort(QStringView s, bool *ok = nullptr) const;
ushort toUShort(QStringView s, bool *ok = nullptr) const;
int toInt(QStringView s, bool *ok = nullptr) const;
@@ -986,56 +982,73 @@ public:
QString toString(qlonglong i) const;
QString toString(qulonglong i) const;
- inline QString toString(long i) const;
- inline QString toString(ulong i) const;
- inline QString toString(short i) const;
- inline QString toString(ushort i) const;
- inline QString toString(int i) const;
- inline QString toString(uint i) const;
- QString toString(double i, char f = 'g', int prec = 6) const;
- inline QString toString(float i, char f = 'g', int prec = 6) const;
+ QString toString(long i) const { return toString(qlonglong(i)); }
+ QString toString(ulong i) const { return toString(qulonglong(i)); }
+ QString toString(short i) const { return toString(qlonglong(i)); }
+ QString toString(ushort i) const { return toString(qulonglong(i)); }
+ QString toString(int i) const { return toString(qlonglong(i)); }
+ QString toString(uint i) const { return toString(qulonglong(i)); }
+ QString toString(double f, char format = 'g', int precision = 6) const;
+ QString toString(float f, char format = 'g', int precision = 6) const
+ { return toString(double(f), format, precision); }
-#if QT_STRINGVIEW_LEVEL < 2
- QString toString(QDate date, const QString &formatStr) const;
- QString toString(QTime time, const QString &formatStr) const;
- QString toString(const QDateTime &dateTime, const QString &format) const;
-#endif
- QString toString(QDate date, QStringView formatStr) const;
- QString toString(QTime time, QStringView formatStr) const;
+ // (Can't inline first two: passing by value doesn't work when only forward-declared.)
+ QString toString(QDate date, const QString &format) const;
+ QString toString(QTime time, const QString &format) const;
+ QString toString(const QDateTime &dateTime, const QString &format) const
+ { return toString(dateTime, qToStringViewIgnoringNull(format)); }
+ QString toString(QDate date, QStringView format) const;
+ QString toString(QTime time, QStringView format) const;
QString toString(const QDateTime &dateTime, QStringView format) const;
QString toString(QDate date, FormatType format = LongFormat) const;
QString toString(QTime time, FormatType format = LongFormat) const;
QString toString(const QDateTime &dateTime, FormatType format = LongFormat) const;
- /* Removing default value for `format' is done intentionally,
- * after all tests we will remove non-calendar-aware version of these functions,
- * and add a default value for both calendar instance, and format
+ /* We can't pass a default for QCalendar (its declaration mentions
+ * QLocale::FormatType, so it has to #include this header, which thus can't
+ * #include its, so we can't instantiate QCalendar() as default). This
+ * precludes any default for format, too.
*/
- QString toString(QDate date, QStringView formatStr, QCalendar cal) const;
+ QString toString(QDate date, QStringView format, QCalendar cal) const;
QString toString(QDate date, FormatType format, QCalendar cal) const;
QString toString(const QDateTime &dateTime, FormatType format, QCalendar cal) const;
- QString toString(const QDateTime &dateTime, QStringView formatStr, QCalendar cal) const;
+ QString toString(const QDateTime &dateTime, QStringView format, QCalendar cal) const;
QString dateFormat(FormatType format = LongFormat) const;
QString timeFormat(FormatType format = LongFormat) const;
QString dateTimeFormat(FormatType format = LongFormat) const;
+ // QCalendar's header has to #include QLocale's, preventing the reverse, so
+ // QCalendar parameters can't have defaults here.
#if QT_CONFIG(datestring)
- QDate toDate(const QString &string, FormatType = LongFormat) const;
QTime toTime(const QString &string, FormatType = LongFormat) const;
- QDateTime toDateTime(const QString &string, FormatType format = LongFormat) const;
- QDate toDate(const QString &string, const QString &format) const;
QTime toTime(const QString &string, const QString &format) const;
+# if QT_CORE_REMOVED_SINCE(6, 7)
+ QDate toDate(const QString &string, FormatType = LongFormat) const;
+ QDate toDate(const QString &string, const QString &format) const;
+ QDateTime toDateTime(const QString &string, FormatType format = LongFormat) const;
QDateTime toDateTime(const QString &string, const QString &format) const;
// Calendar-aware API
QDate toDate(const QString &string, FormatType format, QCalendar cal) const;
- QDateTime toDateTime(const QString &string, FormatType format, QCalendar cal) const;
QDate toDate(const QString &string, const QString &format, QCalendar cal) const;
+ QDateTime toDateTime(const QString &string, FormatType format, QCalendar cal) const;
QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal) const;
-# if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_X("Calendar is ignored when parsing times")
- QTime toTime(const QString &string, FormatType format, QCalendar cal) const;
- QT_DEPRECATED_X("Calendar is ignored when parsing times")
- QTime toTime(const QString &string, const QString &format, QCalendar cal) const;
-# endif // 5.15
+# endif
+ QDate toDate(const QString &string, FormatType = LongFormat,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDate toDate(const QString &string, const QString &format,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDateTime toDateTime(const QString &string, FormatType format = LongFormat,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDateTime toDateTime(const QString &string, const QString &format,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ // Calendar-aware API
+ QDate toDate(const QString &string, FormatType format, QCalendar cal,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDate toDate(const QString &string, const QString &format, QCalendar cal,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDateTime toDateTime(const QString &string, FormatType format, QCalendar cal,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal,
+ int baseYear = DefaultTwoDigitBaseYear) const;
#endif
QString decimalPoint() const;
@@ -1067,48 +1080,84 @@ public:
QString currencySymbol(CurrencySymbolFormat = CurrencySymbol) const;
QString toCurrencyString(qlonglong, const QString &symbol = QString()) const;
QString toCurrencyString(qulonglong, const QString &symbol = QString()) const;
- inline QString toCurrencyString(short, const QString &symbol = QString()) const;
- inline QString toCurrencyString(ushort, const QString &symbol = QString()) const;
- inline QString toCurrencyString(int, const QString &symbol = QString()) const;
- inline QString toCurrencyString(uint, const QString &symbol = QString()) const;
-#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
+ QString toCurrencyString(short i, const QString &symbol = QString()) const
+ { return toCurrencyString(qlonglong(i), symbol); }
+ QString toCurrencyString(ushort i, const QString &symbol = QString()) const
+ { return toCurrencyString(qulonglong(i), symbol); }
+ QString toCurrencyString(int i, const QString &symbol = QString()) const
+ { return toCurrencyString(qlonglong(i), symbol); }
+ QString toCurrencyString(uint i, const QString &symbol = QString()) const
+ { return toCurrencyString(qulonglong(i), symbol); }
QString toCurrencyString(double, const QString &symbol = QString(), int precision = -1) const;
- inline QString toCurrencyString(float i, const QString &symbol = QString(), int precision = -1) const
+ QString toCurrencyString(float i, const QString &symbol = QString(), int precision = -1) const
{ return toCurrencyString(double(i), symbol, precision); }
-#else
- QString toCurrencyString(double, const QString &symbol = QString()) const;
- QString toCurrencyString(double, const QString &symbol, int precision) const;
- inline QString toCurrencyString(float i, const QString &symbol = QString()) const
- { return toCurrencyString(double(i), symbol); }
- inline QString toCurrencyString(float i, const QString &symbol, int precision) const
- { return toCurrencyString(double(i), symbol, precision); }
-#endif
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- QString formattedDataSize(qint64 bytes, int precision = 2, DataSizeFormats format = DataSizeIecFormat);
-#endif
QString formattedDataSize(qint64 bytes, int precision = 2, DataSizeFormats format = DataSizeIecFormat) const;
+#if QT_CORE_REMOVED_SINCE(6, 7)
QStringList uiLanguages() const;
+#endif
+ QStringList uiLanguages(TagSeparator separator = TagSeparator::Dash) const;
+
+ enum LanguageCodeType {
+ ISO639Part1 = 1 << 0,
+ ISO639Part2B = 1 << 1,
+ ISO639Part2T = 1 << 2,
+ ISO639Part3 = 1 << 3,
+ LegacyLanguageCode = 1 << 15,
+
+ ISO639Part2 = ISO639Part2B | ISO639Part2T,
+ ISO639Alpha2 = ISO639Part1,
+ ISO639Alpha3 = ISO639Part2 | ISO639Part3,
+ ISO639 = ISO639Alpha2 | ISO639Alpha3,
+
+ AnyLanguageCode = -1
+ };
+ Q_DECLARE_FLAGS(LanguageCodeTypes, LanguageCodeType)
+ Q_FLAG(LanguageCodeTypes)
- bool operator==(const QLocale &other) const;
- bool operator!=(const QLocale &other) const;
+#if QT_CORE_REMOVED_SINCE(6, 3)
+ static QString languageToCode(Language language);
+ static Language codeToLanguage(QStringView languageCode) noexcept;
+#endif
+ static QString languageToCode(Language language, LanguageCodeTypes codeTypes = AnyLanguageCode);
+ static Language codeToLanguage(QStringView languageCode,
+ LanguageCodeTypes codeTypes = AnyLanguageCode) noexcept;
+ static QString territoryToCode(Territory territory);
+ static Territory codeToTerritory(QStringView territoryCode) noexcept;
+#if QT_DEPRECATED_SINCE(6, 6)
+ QT_DEPRECATED_VERSION_X_6_6("Use territoryToCode(Territory) instead")
+ static QString countryToCode(Country country);
+ QT_DEPRECATED_VERSION_X_6_6("Use codeToTerritory(QStringView) instead")
+ static Country codeToCountry(QStringView countryCode) noexcept;
+#endif
+ static QString scriptToCode(Script script);
+ static Script codeToScript(QStringView scriptCode) noexcept;
static QString languageToString(Language language);
+ static QString territoryToString(Territory territory);
+#if QT_DEPRECATED_SINCE(6, 6)
+ QT_DEPRECATED_VERSION_X_6_6("Use territoryToString(Territory) instead")
static QString countryToString(Country country);
+#endif
static QString scriptToString(Script script);
static void setDefault(const QLocale &locale);
static QLocale c() { return QLocale(C); }
static QLocale system();
- static QList<QLocale> matchingLocales(QLocale::Language language, QLocale::Script script, QLocale::Country country);
+ static QList<QLocale> matchingLocales(QLocale::Language language, QLocale::Script script,
+ QLocale::Territory territory);
+#if QT_DEPRECATED_SINCE(6, 6)
+ QT_DEPRECATED_VERSION_X_6_6("Query territory() on each entry from matchingLocales() instead")
static QList<Country> countriesForLanguage(Language lang);
+#endif
void setNumberOptions(NumberOptions options);
NumberOptions numberOptions() const;
enum QuotationStyle { StandardQuotation, AlternateQuotation };
+ Q_ENUM(QuotationStyle)
QString quoteString(const QString &str, QuotationStyle style = StandardQuotation) const
{ return quoteString(QStringView(str), style); }
QString quoteString(QStringView str, QuotationStyle style = StandardQuotation) const;
@@ -1117,40 +1166,26 @@ public:
private:
QLocale(QLocalePrivate &dd);
+ bool equals(const QLocale &other) const;
friend class QLocalePrivate;
friend class QSystemLocale;
friend class QCalendarBackend;
- friend class QGregorianCalendar;
+ friend class QRomanCalendar;
friend Q_CORE_EXPORT size_t qHash(const QLocale &key, size_t seed) noexcept;
+ friend bool operator==(const QLocale &lhs, const QLocale &rhs) { return lhs.equals(rhs); }
+ friend bool operator!=(const QLocale &lhs, const QLocale &rhs) { return !lhs.equals(rhs); }
+
QSharedDataPointer<QLocalePrivate> d;
};
Q_DECLARE_SHARED(QLocale)
Q_DECLARE_OPERATORS_FOR_FLAGS(QLocale::NumberOptions)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QLocale::LanguageCodeTypes)
-inline QString QLocale::toString(long i) const
- { return toString(qlonglong(i)); }
-inline QString QLocale::toString(ulong i) const
- { return toString(qulonglong(i)); }
-inline QString QLocale::toString(short i) const
- { return toString(qlonglong(i)); }
-inline QString QLocale::toString(ushort i) const
- { return toString(qulonglong(i)); }
-inline QString QLocale::toString(int i) const
- { return toString(qlonglong(i)); }
-inline QString QLocale::toString(uint i) const
- { return toString(qulonglong(i)); }
-inline QString QLocale::toString(float i, char f, int prec) const
- { return toString(double(i), f, prec); }
-
-inline QString QLocale::toCurrencyString(short i, const QString &symbol) const
- { return toCurrencyString(qlonglong(i), symbol); }
-inline QString QLocale::toCurrencyString(ushort i, const QString &symbol) const
- { return toCurrencyString(qulonglong(i), symbol); }
-inline QString QLocale::toCurrencyString(int i, const QString &symbol) const
-{ return toCurrencyString(qlonglong(i), symbol); }
-inline QString QLocale::toCurrencyString(uint i, const QString &symbol) const
-{ return toCurrencyString(qulonglong(i), symbol); }
+#if QT_CORE_INLINE_IMPL_SINCE(6, 4)
+QLocale::QLocale(const QString &name)
+ : QLocale(qToStringViewIgnoringNull(name)) {}
+#endif
#ifndef QT_NO_DATASTREAM
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QLocale &);
diff --git a/src/corelib/text/qlocale.qdoc b/src/corelib/text/qlocale.qdoc
index eb497d9386..f3f0a5cc2d 100644
--- a/src/corelib/text/qlocale.qdoc
+++ b/src/corelib/text/qlocale.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QLocale
@@ -36,10 +12,9 @@
\ingroup string-processing
\ingroup shared
-
- QLocale is initialized with a language/country pair in its
- constructor and offers number-to-string and string-to-number
- conversion functions similar to those in QString.
+ QLocale is constructed for a specified language, optional script and
+ territory. It offers various facilities for formatting data as text,
+ localized appropriately, and for reading data out of localized text.
Example:
@@ -54,9 +29,6 @@
\list
\li If a QLocale object is constructed with the default constructor,
it will use the default locale's settings.
- \li QString::toInt(), QString::toDouble(), etc., interpret the
- string according to the default locale. If this fails, it
- falls back on the "C" locale.
\li QString::arg() uses the default locale to format a number when
its position specifier in the format string contains an 'L',
e.g. "%L1".
@@ -66,36 +38,47 @@
\snippet code/src_corelib_text_qlocale.cpp 1
- When a language/country pair is specified in the constructor, one
- of three things can happen:
-
- \list
- \li If the language/country pair is found in the database, it is used.
- \li If the language is found but the country is not, or if the country
- is \c AnyCountry, the language is used with the most
- appropriate available country (for example, Germany for German),
- \li If neither the language nor the country are found, QLocale
- defaults to the default locale (see setDefault()).
- \endlist
-
- Use language() and country() to determine the actual language and
- country values used.
-
An alternative method for constructing a QLocale object is by
specifying the locale name.
\snippet code/src_corelib_text_qlocale.cpp 2
- This constructor converts the locale name to a language/country
- pair; it does not use the system locale database.
+ This constructor reads the language, script and/or territory from the given
+ name, accepting either uderscore or dash as separator (and ignoring any
+ trailing \c{.codeset} or \c{@variant} suffix).
\note For the current keyboard input locale take a look at
QInputMethod::locale().
- QLocale's data is based on Common Locale Data Repository v36.
+ QLocale's data is based on Common Locale Data Repository v44.1.
+
+ \section1 Matching combinations of language, script and territory
+
+ QLocale has data, derived from CLDR, for many combinations of language,
+ script and territory, but not all. If it is constructed with all three of
+ these key values specified (treating \c AnyLanguage, \c AnyScript or \c
+ AnyTerritory as unspecified) and QLocale has data for the given combination,
+ this data is used. Otherwise, QLocale does its best to find a sensible
+ combination of language, script and territory, for which it does have data,
+ that matches those that were specified.
+
+ The CLDR provides tables of likely combinations, which are used to fill in
+ any unspecified key or keys; if QLocale has data for the result of such a
+ likely combination, that is used. If no language is specified, and none can
+ be determined from script and territory, or if QLocale has no data for the
+ language, the "C" locale (when reading the keys from a string) or default
+ locale (otherwise) is used.
+
+ When QLocale has no data for the keys specified, with likely keys filled in
+ where unspecified, but does have data for the resulting language, a
+ fall-back is sought, based on ignoring either territory, script or both (in
+ that order). This results in a QLocale which may not match what was asked
+ for, but provides localization that's as suitable as the available data
+ permits, for the keys specified.
+
+ Use language(), script() and territory() to determine the actual keys used.
- \sa QString::arg(), QString::toInt(), QString::toDouble(),
- QInputMethod::locale()
+ \sa QString::arg(), QInputMethod::locale()
*/
/*!
@@ -111,20 +94,18 @@
\value Afar
\value Afrikaans
\value Aghem
- \value Ahom Since Qt 5.7
\value Akan
- \value Akkadian Since Qt 5.1
- \value Akoose Since Qt 5.3
+ \value [since 5.1] Akkadian
+ \value [since 5.3] Akoose
\value Albanian
- \value AmericanSignLanguage Since Qt 5.7
+ \value [since 5.7] AmericanSignLanguage
\value Amharic
- \value AncientEgyptian Since Qt 5.1
- \value AncientGreek Since Qt 5.1
- \value AncientNorthArabian Since Qt 5.5
+ \value [since 5.1] AncientEgyptian
+ \value [since 5.1] AncientGreek
+ \value [since 6.7] Anii
\value Arabic
- \value Aragonese Since Qt 5.1
- \value Aramaic Since Qt 5.1
- \value ArdhamagadhiPrakrit Since Qt 5.7
+ \value [since 5.1] Aragonese
+ \value [since 5.1] Aramaic
\value Armenian
\value Assamese
\value Asturian
@@ -135,52 +116,49 @@
\value Aymara
\value Azerbaijani
\value Bafia
- \value Balinese Since Qt 5.1
+ \value [since 5.1] Balinese
+ \value [since 6.6] Baluchi
\value Bambara
- \value Bamun Since Qt 5.1
+ \value [since 5.1] Bamun
+ \value [since 6.0] Bangla
\value Basaa
\value Bashkir
\value Basque
- \value Bassa Since Qt 5.5
- \value BatakToba Since Qt 5.1
+ \value [since 5.1] BatakToba
\value Belarusian
\value Bemba
\value Bena
- \value Bengali
- \value Bhojpuri Since Qt 5.7
+ \value Bengali Obsolete, please use Bangla
+ \value [since 5.7] Bhojpuri
\value Bhutani Obsolete, please use Dzongkha
- \value Bihari
\value Bislama
\value Blin
\value Bodo
\value Bosnian
\value Breton
- \value Buginese Since Qt 5.1
- \value Buhid Since Qt 5.1
+ \value [since 5.1] Buginese
\value Bulgarian
\value Burmese
\value Byelorussian Obsolete, please use Belarusian
\value Cambodian Obsolete, please use Khmer
- \value Cantonese Since Qt 5.7
- \value Carian Since Qt 5.1
+ \value [since 5.7] Cantonese
\value Catalan
- \value Cebuano Since Qt 5.14
- \value CentralKurdish Since Qt 5.5
- \value CentralMoroccoTamazight
- \value Chakma Since Qt 5.1
+ \value [since 5.14] Cebuano
+ \value [since 6.0] CentralAtlasTamazight
+ \value [since 5.5] CentralKurdish
+ \value CentralMoroccoTamazight Obsolete, please use CentralAtlasTamazight
+ \value [since 5.1] Chakma
\value Chamorro
\value Chechen
\value Cherokee
\value Chewa Obsolete, please use Nyanja
- \value Chickasaw Since Qt 5.14
+ \value [since 5.14] Chickasaw
\value Chiga
\value Chinese (Mandarin)
\value Church
\value Chuvash
- \value ClassicalMandaic Since Qt 5.1
\value Colognian
- \value CongoSwahili
- \value Coptic Since Qt 5.1
+ \value [since 5.1] Coptic
\value Cornish
\value Corsican
\value Cree
@@ -188,18 +166,15 @@
\value Czech
\value Danish
\value Divehi
- \value Dogri Since Qt 5.1
+ \value [since 5.1] Dogri
\value Duala
\value Dutch
\value Dzongkha
- \value EasternCham Since Qt 5.1
- \value EasternKayah Since Qt 5.1
\value Embu
\value English
- \value Erzya Since Qt 5.14
+ \value [since 5.14] Erzya
\value Esperanto
\value Estonian
- \value Etruscan Since Qt 5.1
\value Ewe
\value Ewondo
\value Faroese
@@ -217,34 +192,32 @@
\value Geez
\value Georgian
\value German
- \value Gothic Since Qt 5.1
+ \value [since 5.1] Gothic
\value Greek
- \value Greenlandic
+ \value Greenlandic Obsolete, please use Kalaallisut
\value Guarani
\value Gujarati
\value Gusii
\value Haitian
- \value Hanunoo Since Qt 5.1
+ \value [since 6.5] Haryanvi
\value Hausa
\value Hawaiian
\value Hebrew
\value Herero
- \value HieroglyphicLuwian Since Qt 5.7
\value Hindi
\value HiriMotu
- \value HmongNjua Since Qt 5.5
- \value Ho Since Qt 5.5
\value Hungarian
\value Icelandic
- \value Ido Since Qt 5.12
+ \value [since 5.12] Ido
\value Igbo
- \value InariSami Since Qt 5.5
+ \value [since 5.5] InariSami
\value Indonesian
- \value Ingush Since Qt 5.1
+ \value [since 5.1] Ingush
\value Interlingua
\value Interlingue
\value Inuktitut
- \value Inupiak
+ \value Inupiak Obsolete, please use Inupiaq
+ \value [since 6.0] Inupiaq
\value Irish
\value Italian
\value Japanese
@@ -253,19 +226,22 @@
\value JolaFonyi
\value Kabuverdianu
\value Kabyle
+ \value [since 6.3] Kaingang
\value Kako
+ \value [since 6.0] Kalaallisut
\value Kalenjin
\value Kamba
+ \value [since 6.7] Kangri
\value Kannada
\value Kanuri
\value Kashmiri
\value Kazakh
- \value Kenyang Since Qt 5.5
+ \value [since 5.5] Kenyang
\value Khmer
- \value Kiche Since Qt 5.5
+ \value [since 5.5] Kiche
\value Kikuyu
\value Kinyarwanda
- \value Kirghiz
+ \value Kirghiz Obsolete, please use Kyrgyz
\value Komi
\value Kongo
\value Konkani
@@ -274,212 +250,198 @@
\value KoyraboroSenni
\value KoyraChiini
\value Kpelle
+ \value [since 6.0] Kuanyama
\value Kurdish
\value Kurundi Obsolete, please use Rundi
- \value Kwanyama
+ \value Kwanyama Obsolete, please use Kuanyama
\value Kwasio
- \value Lakota Since Qt 5.3
+ \value [since 6.0] Kyrgyz
+ \value [since 5.3] Lakota
\value Langi
\value Lao
- \value LargeFloweryMiao Since Qt 5.1
\value Latin
\value Latvian
- \value Lepcha Since Qt 5.1
- \value Lezghian Since Qt 5.5
+ \value [since 5.5] Lezghian
\value Limburgish
- \value Limbu Since Qt 5.1
- \value LinearA Since Qt 5.5
\value Lingala
- \value Lisu Since Qt 5.1
- \value LiteraryChinese Since Qt 5.7
+ \value [since 6.6] Ligurian
+ \value [since 5.7] LiteraryChinese
\value Lithuanian
- \value Lojban Since Qt 5.12
- \value LowerSorbian Since Qt 5.5
+ \value [since 5.12] Lojban
+ \value [since 5.5] LowerSorbian
\value LowGerman
\value LubaKatanga
- \value LuleSami Since Qt 5.5
+ \value [since 5.5] LuleSami
\value Luo
- \value Lu Since Qt 5.1
\value Luxembourgish
\value Luyia
- \value Lycian Since Qt 5.1
- \value Lydian Since Qt 5.1
\value Macedonian
\value Machame
- \value Maithili Since Qt 5.5
+ \value [since 5.5] Maithili
\value MakhuwaMeetto
\value Makonde
\value Malagasy
\value Malay
\value Malayalam
\value Maltese
- \value Mandingo Since Qt 5.1
- \value ManichaeanMiddlePersian Since Qt 5.5
- \value Manipuri Since Qt 5.1
+ \value [since 5.1] Mandingo
+ \value [since 5.1] Manipuri
\value Manx
\value Maori
- \value Mapuche Since Qt 5.5
+ \value [since 5.5] Mapuche
\value Marathi
\value Marshallese
\value Masai
- \value Mazanderani Since Qt 5.7
- \value Mende Since Qt 5.5
- \value Meroitic Since Qt 5.1
+ \value [since 5.7] Mazanderani
+ \value [since 5.5] Mende
\value Meru
\value Meta
- \value Mohawk Since Qt 5.5
- \value Moldavian Obsolete, please use Romanian
+ \value [since 5.5] Mohawk
+ \value [since 6.5] Moksha
\value Mongolian
- \value Mono Since Qt 5.5
\value Morisyen
- \value Mru Since Qt 5.7
\value Mundang
- \value Muscogee Since Qt 5.14
+ \value [since 5.14] Muscogee
\value Nama
\value NauruLanguage
- \value Navaho
+ \value Navaho Obsolete, please use Navajo
+ \value [since 6.0] Navajo
\value Ndonga
\value Nepali
- \value Newari Since Qt 5.7
+ \value [since 5.7] Newari
\value Ngiemboon
+ \value [since 6.3] Nheengatu
+ \value [since 6.0] NigerianPidgin
\value Ngomba
- \value Nko Since Qt 5.5
- \value NorthernLuri Since Qt 5.7
+ \value [since 5.5] Nko
+ \value [since 6.5] NorthernFrisian
+ \value [since 5.7] NorthernLuri
\value NorthernSami
\value NorthernSotho
- \value NorthernThai Since Qt 5.1
\value NorthNdebele
- \value NorwegianBokmal same as Norwegian
+ \value NorwegianBokmal
\value NorwegianNynorsk
- \value Norwegian same as NorwegianBokmal
\value Nuer
\value Nyanja
\value Nyankole
+ \value [since 6.5] Obolo
\value Occitan
+ \value [since 6.0] Odia
\value Ojibwa
- \value OldIrish Since Qt 5.1
- \value OldNorse Since Qt 5.1
- \value OldPersian Since Qt 5.1
- \value OldTurkish Since Qt 5.1
- \value Oriya
+ \value [since 5.1] OldIrish
+ \value [since 5.1] OldNorse
+ \value [since 5.1] OldPersian
+ \value Oriya Obsolete, please use Odia
\value Oromo
- \value Osage Since Qt 5.7
+ \value [since 5.7] Osage
\value Ossetic
- \value Pahlavi Since Qt 5.1
- \value Palauan Since Qt 5.7
+ \value [since 5.1] Pahlavi
+ \value [since 5.7] Palauan
\value Pali
- \value Papiamento Since Qt 5.7
- \value Parthian Since Qt 5.1
+ \value [since 5.7] Papiamento
\value Pashto
\value Persian
- \value Phoenician Since Qt 5.1
+ \value [since 5.1] Phoenician
+ \value [since 6.5] Pijin
\value Polish
\value Portuguese
- \value PrakritLanguage Since Qt 5.1
- \value Prussian Since Qt 5.5
+ \value [since 5.5] Prussian
\value Punjabi
\value Quechua
- \value Rejang Since Qt 5.1
+ \value [since 6.5] Rajasthani
\value RhaetoRomance Obsolete, please use Romansh
+ \value [since 6.6] Rohingya
\value Romanian
\value Romansh
\value Rombo
\value Rundi
\value Russian
\value Rwa
- \value Sabaean Since Qt 5.1
\value Saho
\value Sakha
- \value Samaritan Since Qt 5.1
\value Samburu
\value Samoan
\value Sango
\value Sangu
\value Sanskrit
- \value Santali Since Qt 5.1
- \value Saraiki Since Qt 5.7
+ \value [since 5.1] Santali
\value Sardinian
- \value Saurashtra Since Qt 5.1
+ \value [since 5.1] Saurashtra
\value Sena
\value Serbian
- \value SerboCroatian Obsolete, please use Serbian
\value Shambala
\value Shona
\value SichuanYi
- \value Sicilian Since Qt 5.12
+ \value [since 5.12] Sicilian
\value Sidamo
- \value Silesian Since Qt 5.14
+ \value [since 5.14] Silesian
\value Sindhi
\value Sinhala
- \value SkoltSami Since Qt 5.5
+ \value [since 5.5] SkoltSami
\value Slovak
\value Slovenian
\value Soga
\value Somali
- \value Sora Since Qt 5.1
- \value SouthernKurdish Since Qt 5.12
- \value SouthernSami Since Qt 5.5
+ \value [since 5.12] SouthernKurdish
+ \value [since 5.5] SouthernSami
\value SouthernSotho
\value SouthNdebele
\value Spanish
- \value StandardMoroccanTamazight Since Qt 5.3
+ \value [since 5.3] StandardMoroccanTamazight
\value Sundanese
\value Swahili
\value Swati
\value Swedish
\value SwissGerman
- \value Sylheti Since Qt 5.1
\value Syriac
\value Tachelhit
- \value Tagalog Obsolete, please use Filipino
- \value Tagbanwa Since Qt 5.1
\value Tahitian
- \value TaiDam Since Qt 5.1
- \value TaiNua Since Qt 5.1
+ \value [since 5.1] TaiDam
\value Taita
\value Tajik
\value Tamil
- \value Tangut Since Qt 5.7
\value Taroko
\value Tasawaq
\value Tatar
- \value TedimChin Since Qt 5.5
\value Telugu
\value Teso
\value Thai
\value Tibetan
\value Tigre
\value Tigrinya
- \value TokelauLanguage Since Qt 5.7
- \value TokPisin Since Qt 5.7
+ \value [since 5.7] TokelauLanguage
+ \value [since 6.5] TokiPona
+ \value [since 5.7] TokPisin
\value Tongan
+ \value [since 6.6] Torwali
\value Tsonga
\value Tswana
\value Turkish
\value Turkmen
- \value TuvaluLanguage Since Qt 5.7
- \value Twi Obsolete, please use Akan
+ \value [since 5.7] TuvaluLanguage
\value Tyap
- \value Ugaritic Since Qt 5.1
- \value Uighur
- \value Uigur Obsolete, please use Uighur
+ \value [since 5.1] Ugaritic
+ \value Uighur Obsolete, please use Uyghur
+ \value Uigur Obsolete, please use Uyghur
\value Ukrainian
- \value UncodedLanguages Since Qt 5.7
- \value UpperSorbian Since Qt 5.5
+ \value [since 5.5] UpperSorbian
\value Urdu
+ \value [since 6.0] Uyghur
\value Uzbek
\value Vai
\value Venda
+ \value [since 6.7] Venetian
\value Vietnamese
\value Volapuk
\value Vunjo
- \value Walamo
+ \value Walamo Obsolete, please use Wolaytta
\value Walloon
\value Walser
- \value Warlpiri Since Qt 5.5
+ \value [since 5.5] Warlpiri
\value Welsh
- \value WesternBalochi Since Qt 5.12
+ \value [since 5.12] WesternBalochi
\value WesternFrisian same as Frisian
+ \value [since 6.0] Wolaytta
\value Wolof
\value Xhosa
\value Yangben
@@ -495,11 +457,25 @@
*/
/*!
+ \typealias QLocale::Territory
+
+ This enumeration type is an alias for \l Country,
+ which shall be renamed to Territory at a future release.
+
+ \sa territory(), territoryToString()
+*/
+
+/*!
\enum QLocale::Country
- This enumerated type is used to specify a country.
+ This enumerated type is used to identify a territory.
+
+ An individual territory may be a province of a country, a country (by far the
+ most common case) or a larger geographic entity, to which some localization
+ details are specific.
- \value AnyCountry
+ \value AnyCountry Osbolete alias for \c AnyTerritory
+ \value [since 6.2] AnyTerritory
\value Afghanistan
\value AlandIslands
@@ -530,7 +506,8 @@
\value Bhutan
\value Bolivia
\value Bonaire
- \value BosniaAndHerzegowina
+ \value BosniaAndHerzegowina Obsolete, use \c BosniaAndHerzegovina instead
+ \value [since 6.0] BosniaAndHerzegovina
\value Botswana
\value BouvetIsland
\value Brazil
@@ -544,6 +521,7 @@
\value Cameroon
\value Canada
\value CanaryIslands
+ \value CaribbeanNetherlands
\value CapeVerde
\value CaymanIslands
\value CentralAfricanRepublic
@@ -562,11 +540,13 @@
\value CostaRica
\value Croatia
\value Cuba
- \value CuraSao
+ \value [since 6.0] Curacao
+ \value CuraSao Obsolete, use \c Curacao instead
\value Cyprus
- \value CzechRepublic
- \value DemocraticRepublicOfCongo Obsolete, please use CongoKinshasa
- \value DemocraticRepublicOfKorea Obsolete, please use NorthKorea
+ \value [since 6.0] Czechia
+ \value CzechRepublic Obsolete, use \c Czechia instead
+ \value DemocraticRepublicOfCongo Obsolete, use \c CongoKinshasa instead
+ \value DemocraticRepublicOfKorea Obsolete, use \c NorthKorea instead
\value Denmark
\value DiegoGarcia
\value Djibouti
@@ -579,9 +559,10 @@
\value EquatorialGuinea
\value Eritrea
\value Estonia
+ \value Eswatini
\value Ethiopia
- \value EuropeanUnion Since Qt 5.7
- \value Europe Since Qt 5.12
+ \value [since 5.7] EuropeanUnion
+ \value [since 5.12] Europe
\value FalklandIslands
\value FaroeIslands
\value Fiji
@@ -628,12 +609,12 @@
\value Kazakhstan
\value Kenya
\value Kiribati
- \value Kosovo Since Qt 5.2
+ \value [since 5.2] Kosovo
\value Kuwait
\value Kyrgyzstan
\value Laos
\value LatinAmerica
- \value LatinAmericaAndTheCaribbean Obsolete, please use LatinAmerica
+ \value LatinAmericaAndTheCaribbean Obsolete, use \c LatinAmerica instead
\value Latvia
\value Lebanon
\value Lesotho
@@ -642,6 +623,7 @@
\value Liechtenstein
\value Lithuania
\value Luxembourg
+ \value Macao
\value Macau
\value Macedonia
\value Madagascar
@@ -666,7 +648,8 @@
\value Mozambique
\value Myanmar
\value Namibia
- \value NauruCountry
+ \value NauruCountry Osbolete alias for \c NauruTerritory
+ \value [since 6.2] NauruTerritory
\value Nepal
\value Netherlands
\value NewCaledonia
@@ -680,14 +663,14 @@
\value NorthKorea
\value Norway
\value Oman
- \value OutlyingOceania Since Qt 5.7
+ \value [since 5.7] OutlyingOceania
\value Pakistan
\value Palau
\value PalestinianTerritories
\value Panama
\value PapuaNewGuinea
\value Paraguay
- \value PeoplesRepublicOfCongo Obsolete, please use CongoBrazzaville
+ \value PeoplesRepublicOfCongo Obsolete, use \c CongoBrazzaville instead
\value Peru
\value Philippines
\value Pitcairn
@@ -695,11 +678,11 @@
\value Portugal
\value PuertoRico
\value Qatar
- \value RepublicOfKorea Obsolete, please use SouthKorea
+ \value RepublicOfKorea Obsolete, use \c SouthKorea instead
\value Reunion
\value Romania
- \value RussianFederation same as Russia
- \value Russia same as RussianFederation
+ \value RussianFederation
+ \value Russia
\value Rwanda
\value SaintBarthelemy
\value SaintHelena
@@ -707,6 +690,7 @@
\value SaintLucia
\value SaintMartin
\value SaintPierreAndMiquelon
+ \value SaintVincentAndGrenadines
\value SaintVincentAndTheGrenadines
\value Samoa
\value SanMarino
@@ -723,6 +707,7 @@
\value SolomonIslands
\value Somalia
\value SouthAfrica
+ \value SouthGeorgiaAndSouthSandwichIslands
\value SouthGeorgiaAndTheSouthSandwichIslands
\value SouthKorea
\value SouthSudan
@@ -730,19 +715,21 @@
\value SriLanka
\value Sudan
\value Suriname
+ \value SvalbardAndJanMayen
\value SvalbardAndJanMayenIslands
\value Swaziland
\value Sweden
\value Switzerland
\value Syria
- \value SyrianArabRepublic Obsolete, please use Syria
+ \value SyrianArabRepublic Obsolete, use \c Syria instead
\value Taiwan
\value Tajikistan
\value Tanzania
\value Thailand
+ \value TimorLeste
\value Togo
- \value TokelauCountry
- \value Tokelau Obsolete, please use TokelauCountry
+ \value TokelauCountry Osbolete alias for \c TokelauTerritory
+ \value [since 6.2] TokelauTerritory
\value Tonga
\value TrinidadAndTobago
\value TristanDaCunha
@@ -750,31 +737,38 @@
\value Turkey
\value Turkmenistan
\value TurksAndCaicosIslands
- \value TuvaluCountry
- \value Tuvalu Obsolete, please use TuvaluCountry
+ \value TuvaluCountry Osbolete alias for \c TuvaluTerritory
+ \value [since 6.2] TuvaluTerritory
\value Uganda
\value Ukraine
\value UnitedArabEmirates
\value UnitedKingdom
\value UnitedStates
+ \value UnitedStatesOutlyingIslands
\value UnitedStatesMinorOutlyingIslands
\value UnitedStatesVirginIslands
\value Uruguay
\value Uzbekistan
\value Vanuatu
+ \value VaticanCity
\value VaticanCityState
\value Venezuela
\value Vietnam
+ \value WallisAndFutuna
\value WallisAndFutunaIslands
\value WesternSahara
- \value World Since Qt 5.12
+ \value [since 5.12] World
\value Yemen
\value Zambia
\value Zimbabwe
- \omitvalue LastCountry
+ \omitvalue LastCountry Osbolete alias for \c LastTerritory
+ \omitvalue LastTerritory
- \sa country(), countryToString()
+ \note Use the Territory alias for this enumeration where possible.
+ The Country enum shall be renamed to Territory at a later release.
+
+ \sa territory(), territoryToString(), codeToTerritory(), territoryToCode()
*/
/*!
@@ -784,148 +778,152 @@
\value AnyScript
- \value AdlamScript Since Qt 5.7
- \value AhomScript Since Qt 5.7
- \value AnatolianHieroglyphsScript Since Qt 5.7
+ \value [since 5.7] AdlamScript
+ \value [since 5.7] AhomScript
+ \value [since 5.7] AnatolianHieroglyphsScript
\value ArabicScript
\value ArmenianScript
- \value AvestanScript Since Qt 5.1
- \value BalineseScript Since Qt 5.1
- \value BamumScript Since Qt 5.1
- \value BassaVahScript Since Qt 5.5
- \value BatakScript Since Qt 5.1
- \value BengaliScript
- \value BhaiksukiScript Since Qt 5.7
- \value BopomofoScript Since Qt 5.1
- \value BrahmiScript Since Qt 5.1
- \value BrailleScript Since Qt 5.1
- \value BugineseScript Since Qt 5.1
- \value BuhidScript Since Qt 5.1
- \value CanadianAboriginalScript Since Qt 5.1
- \value CarianScript Since Qt 5.1
- \value CaucasianAlbanianScript Since Qt 5.5
- \value ChakmaScript Since Qt 5.1
- \value ChamScript Since Qt 5.1
+ \value [since 5.1] AvestanScript
+ \value [since 5.1] BalineseScript
+ \value [since 5.1] BamumScript
+ \value [since 6.0] BanglaScript
+ \value [since 5.5] BassaVahScript
+ \value [since 5.1] BatakScript
+ \value BengaliScript Obsolete, please use BanglaScript
+ \value [since 5.7] BhaiksukiScript
+ \value [since 5.1] BopomofoScript
+ \value [since 5.1] BrahmiScript
+ \value [since 5.1] BrailleScript
+ \value [since 5.1] BugineseScript
+ \value [since 5.1] BuhidScript
+ \value [since 5.1] CanadianAboriginalScript
+ \value [since 5.1] CarianScript
+ \value [since 5.5] CaucasianAlbanianScript
+ \value [since 5.1] ChakmaScript
+ \value [since 5.1] ChamScript
\value CherokeeScript
- \value CopticScript Since Qt 5.1
- \value CuneiformScript Since Qt 5.1
- \value CypriotScript Since Qt 5.1
+ \value [since 5.1] CopticScript
+ \value [since 5.1] CuneiformScript
+ \value [since 5.1] CypriotScript
\value CyrillicScript
- \value DeseretScript Since Qt 5.1
+ \value [since 5.1] DeseretScript
\value DevanagariScript
- \value DuployanScript Since Qt 5.5
- \value EgyptianHieroglyphsScript Since Qt 5.1
- \value ElbasanScript Since Qt 5.5
+ \value [since 5.5] DuployanScript
+ \value [since 5.1] EgyptianHieroglyphsScript
+ \value [since 5.5] ElbasanScript
\value EthiopicScript
- \value FraserScript Since Qt 5.1
+ \value [since 5.1] FraserScript
\value GeorgianScript
- \value GlagoliticScript Since Qt 5.1
- \value GothicScript Since Qt 5.1
- \value GranthaScript Since Qt 5.5
+ \value [since 5.1] GlagoliticScript
+ \value [since 5.1] GothicScript
+ \value [since 5.5] GranthaScript
\value GreekScript
\value GujaratiScript
\value GurmukhiScript
- \value HangulScript Since Qt 5.1
- \value HanScript Since Qt 5.1
- \value HanunooScript Since Qt 5.1
- \value HanWithBopomofoScript Since Qt 5.7
- \value HatranScript Since Qt 5.7
+ \value [since 5.1] HangulScript
+ \value [since 6.6] HanifiScript
+ \value [since 5.1] HanScript
+ \value [since 5.1] HanunooScript
+ \value [since 5.7] HanWithBopomofoScript
+ \value [since 5.7] HatranScript
\value HebrewScript
- \value HiraganaScript Since Qt 5.1
- \value ImperialAramaicScript Since Qt 5.1
- \value InscriptionalPahlaviScript Since Qt 5.1
- \value InscriptionalParthianScript Since Qt 5.1
- \value JamoScript Since Qt 5.7
+ \value [since 5.1] HiraganaScript
+ \value [since 5.1] ImperialAramaicScript
+ \value [since 5.1] InscriptionalPahlaviScript
+ \value [since 5.1] InscriptionalParthianScript
+ \value [since 5.7] JamoScript
\value JapaneseScript
- \value JavaneseScript Since Qt 5.1
- \value KaithiScript Since Qt 5.1
+ \value [since 5.1] JavaneseScript
+ \value [since 5.1] KaithiScript
\value KannadaScript
- \value KatakanaScript Since Qt 5.1
- \value KayahLiScript Since Qt 5.1
- \value KharoshthiScript Since Qt 5.1
- \value KhmerScript Since Qt 5.1
- \value KhojkiScript Since Qt 5.5
- \value KhudawadiScript Since Qt 5.5
+ \value [since 5.1] KatakanaScript
+ \value [since 5.1] KayahLiScript
+ \value [since 5.1] KharoshthiScript
+ \value [since 5.1] KhmerScript
+ \value [since 5.5] KhojkiScript
+ \value [since 5.5] KhudawadiScript
\value KoreanScript
- \value LannaScript Since Qt 5.1
+ \value [since 5.1] LannaScript
\value LaoScript
\value LatinScript
- \value LepchaScript Since Qt 5.1
- \value LimbuScript Since Qt 5.1
- \value LinearAScript Since Qt 5.5
- \value LinearBScript Since Qt 5.1
- \value LycianScript Since Qt 5.1
- \value LydianScript Since Qt 5.1
- \value MahajaniScript Since Qt 5.5
+ \value [since 5.1] LepchaScript
+ \value [since 5.1] LimbuScript
+ \value [since 5.5] LinearAScript
+ \value [since 5.1] LinearBScript
+ \value [since 5.1] LycianScript
+ \value [since 5.1] LydianScript
+ \value [since 5.5] MahajaniScript
\value MalayalamScript
- \value MandaeanScript Since Qt 5.1
- \value ManichaeanScript Since Qt 5.5
- \value MarchenScript Since Qt 5.7
- \value MeiteiMayekScript Since Qt 5.1
- \value MendeKikakuiScript Since Qt 5.5
- \value MeroiticCursiveScript Since Qt 5.1
- \value MeroiticScript Since Qt 5.1
- \value ModiScript Since Qt 5.5
+ \value [since 5.1] MandaeanScript
+ \value [since 5.5] ManichaeanScript
+ \value [since 5.7] MarchenScript
+ \value [since 5.1] MeiteiMayekScript
+ \value [since 6.0] MendeScript
+ \value MendeKikakuiScript Obsolete, please use MendeScript
+ \value [since 5.1] MeroiticCursiveScript
+ \value [since 5.1] MeroiticScript
+ \value [since 5.5] ModiScript
\value MongolianScript
- \value MroScript Since Qt 5.5
- \value MultaniScript Since Qt 5.7
+ \value [since 5.5] MroScript
+ \value [since 5.7] MultaniScript
\value MyanmarScript
- \value NabataeanScript Since Qt 5.5
- \value NewaScript Since Qt 5.7
- \value NewTaiLueScript Since Qt 5.1
- \value NkoScript Since Qt 5.1
- \value OghamScript Since Qt 5.1
- \value OlChikiScript Since Qt 5.1
- \value OldHungarianScript Since Qt 5.7
- \value OldItalicScript Since Qt 5.1
- \value OldNorthArabianScript Since Qt 5.5
- \value OldPermicScript Since Qt 5.5
- \value OldPersianScript Since Qt 5.1
- \value OldSouthArabianScript Since Qt 5.1
- \value OriyaScript
- \value OrkhonScript Since Qt 5.1
- \value OsageScript Since Qt 5.7
- \value OsmanyaScript Since Qt 5.1
- \value PahawhHmongScript Since Qt 5.5
- \value PalmyreneScript Since Qt 5.5
- \value PauCinHauScript Since Qt 5.5
- \value PhagsPaScript Since Qt 5.1
- \value PhoenicianScript Since Qt 5.1
- \value PollardPhoneticScript Since Qt 5.1
- \value PsalterPahlaviScript Since Qt 5.5
- \value RejangScript Since Qt 5.1
- \value RunicScript Since Qt 5.1
- \value SamaritanScript Since Qt 5.1
- \value SaurashtraScript Since Qt 5.1
- \value SharadaScript Since Qt 5.1
- \value ShavianScript Since Qt 5.1
- \value SiddhamScript Since Qt 5.5
- \value SignWritingScript Since Qt 5.7
+ \value [since 5.5] NabataeanScript
+ \value [since 5.7] NewaScript
+ \value [since 5.1] NewTaiLueScript
+ \value [since 5.1] NkoScript
+ \value [since 5.1] OghamScript
+ \value [since 5.1] OlChikiScript
+ \value [since 5.7] OldHungarianScript
+ \value [since 5.1] OldItalicScript
+ \value [since 5.5] OldNorthArabianScript
+ \value [since 5.5] OldPermicScript
+ \value [since 5.1] OldPersianScript
+ \value [since 5.1] OldSouthArabianScript
+ \value [since 6.0] OdiaScript
+ \value OriyaScript Obsolete, please use OdiaScript
+ \value [since 5.1] OrkhonScript
+ \value [since 5.7] OsageScript
+ \value [since 5.1] OsmanyaScript
+ \value [since 5.5] PahawhHmongScript
+ \value [since 5.5] PalmyreneScript
+ \value [since 5.5] PauCinHauScript
+ \value [since 5.1] PhagsPaScript
+ \value [since 5.1] PhoenicianScript
+ \value [since 5.1] PollardPhoneticScript
+ \value [since 5.5] PsalterPahlaviScript
+ \value [since 5.1] RejangScript
+ \value [since 5.1] RunicScript
+ \value [since 5.1] SamaritanScript
+ \value [since 5.1] SaurashtraScript
+ \value [since 5.1] SharadaScript
+ \value [since 5.1] ShavianScript
+ \value [since 5.5] SiddhamScript
+ \value [since 5.7] SignWritingScript
\value SimplifiedChineseScript same as SimplifiedHanScript
\value SimplifiedHanScript same as SimplifiedChineseScript
\value SinhalaScript
- \value SoraSompengScript Since Qt 5.1
- \value SundaneseScript Since Qt 5.1
- \value SylotiNagriScript Since Qt 5.1
+ \value [since 5.1] SoraSompengScript
+ \value [since 5.1] SundaneseScript
+ \value [since 5.1] SylotiNagriScript
\value SyriacScript
- \value TagalogScript Since Qt 5.1
- \value TagbanwaScript Since Qt 5.1
- \value TaiLeScript Since Qt 5.1
- \value TaiVietScript Since Qt 5.1
- \value TakriScript Since Qt 5.1
+ \value [since 5.1] TagalogScript
+ \value [since 5.1] TagbanwaScript
+ \value [since 5.1] TaiLeScript
+ \value [since 5.1] TaiVietScript
+ \value [since 5.1] TakriScript
\value TamilScript
- \value TangutScript Since Qt 5.7
+ \value [since 5.7] TangutScript
\value TeluguScript
\value ThaanaScript
\value ThaiScript
\value TibetanScript
\value TifinaghScript
- \value TirhutaScript Since Qt 5.5
+ \value [since 5.5] TirhutaScript
\value TraditionalChineseScript same as TraditionalHanScript
\value TraditionalHanScript same as TraditionalChineseScript
- \value UgariticScript Since Qt 5.1
+ \value [since 5.1] UgariticScript
\value VaiScript
- \value VarangKshitiScript Since Qt 5.5
+ \value [since 5.5] VarangKshitiScript
\value YiScript
\omitvalue LastScript
@@ -990,23 +988,23 @@
dot when parsing a number in scientific or decimal representation. The
default is to accept trailing zeroes.
- \sa setNumberOptions(), numberOptions()
+ \sa setNumberOptions(), numberOptions(), FloatingPointPrecisionOption
*/
/*!
\enum QLocale::FloatingPointPrecisionOption
- This enum defines constants that can be given as precision to QString::number(),
+ This enum defines a constant that can be given as precision to QString::number(),
QByteArray::number(), and QLocale::toString() when converting floats or doubles,
in order to express a variable number of digits as precision.
\value FloatingPointShortest The conversion algorithm will try to find the
- shortest accurate representation for the given number. "Accurate" means
- that you get the exact same number back from an inverse conversion on
- the generated string representation.
-
- \sa toString(), QString, QByteArray
+ shortest accurate representation for the given number. "Accurate" means
+ that you get the exact same number back from an inverse conversion on
+ the generated string representation. In particular, trailing zeros are
+ omitted (from the mantissa, in exponent formats).
+ \sa toString(), QString::number(), QByteArray::number()
\since 5.7
*/
@@ -1026,19 +1024,50 @@
\since 4.4
*/
+/*!
+ \enum QLocale::LanguageCodeType
+
+ This enum defines language code types that can be used to restrict set
+ of language codes considered by \c codeToLanguage and \c languageToCode.
+
+ \value ISO639Part1 ISO 639 Part 1 Alpha 2 code.
+ \value ISO639Part2B ISO 639 Part 2 bibliographic Alpha 3 code.
+ \value ISO639Part2T ISO 639 Part 2 terminological Alpha 3 code.
+ \value ISO639Part3 ISO 639 Part 3 Alpha 3 code.
+ \value LegacyLanguageCode Codes that are not part of the above set, but that
+ were supported by Qt in the past. This value can only be used by
+ codeToLanguage(). It is ignored when passed to languageToCode().
+ \value ISO639Part2 Any ISO 639 Part 2 code.
+ \value ISO639Alpha2 Any ISO-639 2-letter code.
+ \value ISO639Alpha3 Any ISO-639 3-letter code.
+ \value ISO639 Any ISO 639 code.
+ \value AnyLanguageCode Specifies that any code can be used.
+*/
/*!
- \fn bool QLocale::operator==(const QLocale &other) const
+ \fn bool QLocale::operator==(const QLocale &lhs, const QLocale &rhs)
+
+ Returns \c true if the two QLocale objects, \a lhs and \a rhs, are the same;
+ otherwise returns \c false.
- Returns \c true if the QLocale object is the same as the \a other
- locale specified; otherwise returns \c false.
+ \note The system locale is not equal to the QLocale object constructed from
+ its language(), script() and territory(), even if the two agree in all data
+ fields. Nor are two locales with different number options equal.
+
+ \sa operator!=(), setNumberOptions()
*/
/*!
- \fn bool QLocale::operator!=(const QLocale &other) const
+ \fn bool QLocale::operator!=(const QLocale &lhs, const QLocale &rhs)
+
+ Returns \c true if the two QLocale objects, \a lhs and \a rhs, differ;
+ otherwise returns \c false.
+
+ \note The system locale is not equal to the QLocale object constructed from
+ its language(), script() and territory(), even if the two agree in all data
+ fields. Nor are two locales with different number options equal.
- Returns \c true if the QLocale object is not the same as the \a other
- locale specified; otherwise returns \c false.
+ \sa operator==(), setNumberOptions()
*/
/*!
@@ -1083,7 +1112,7 @@
\value LanguageId a uint specifying the language.
\value ScriptId a uint specifying the script.
- \value CountryId a uint specifying the country.
+ \value TerritoryId a uint specifying the territory.
\value DecimalPoint a QString specifying the decimal point.
\value GroupSeparator a QString specifying the group separator.
\value ZeroDigit a QString specifying the zero digit.
@@ -1108,7 +1137,7 @@
\value MeasurementSystem a QLocale::MeasurementSystem enum specifying the measurement system
\value AMText a string that represents the system AM designator associated with a 12-hour clock.
\value PMText a string that represents the system PM designator associated with a 12-hour clock.
- \value FirstDayOfWeek a Qt::DayOfWeek enum specifiying the first day of the week
+ \value FirstDayOfWeek a Qt::DayOfWeek enum specifying the first day of the week
\value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
\value CurrencyToString a localized string representation of a number with a currency symbol. Converts a QSystemLocale::CurrencyToStringArgument stored in the in variant to a QString.
\value UILanguages a list of strings representing locale names that could be used for UI translation.
@@ -1118,20 +1147,13 @@
\value LocaleChanged this type is queried whenever the system locale is changed.
\value ListToSeparatedString a string that represents a join of a given QStringList with a locale-defined separator.
\value NativeLanguageName a string that represents the name of the native language.
- \value NativeCountryName a string that represents the name of the native country.
+ \value NativeTerritoryName a string that represents the name of the native territory.
\sa FormatType
*/
/*!
- \fn QLocale QSystemLocale::fallbackUiLocale() const
-
- \since 4.6
- Returns the fallback locale obtained from the system.
-*/
-
-/*!
- \fn QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
+ \fn QVariant QSystemLocale::query(QueryType type, QVariant &&in = QVariant()) const
Generic query method for locale data. Provides indirection.
Denotes the \a type of the query
@@ -1141,6 +1163,17 @@
*/
/*!
+ \fn QLocale QSystemLocale::fallbackLocale() const
+
+ \since 4.6
+
+ Returns the locale used if the system locale is not able to answer a query.
+
+ Must be a QLocale instance based on the built-in CLDR data, and should
+ match what the system locale is using as closely as that data supports.
+*/
+
+/*!
\class QSystemLocale::CurrencyToStringArgument
\inmodule QtCore
@@ -1159,7 +1192,7 @@
\variable QSystemLocale::CurrencyToStringArgument::value
An input value that should be converted to its string representation.
- Contains one of QVariant::LongLong, QVariant::ULongLong or QVariant::Double
+ Contains one of QMetaType::LongLong, QMetaType::ULongLong or QMetaType::Double
types.
*/
/*!
@@ -1235,13 +1268,17 @@
*/
/*!
-\fn QString QLocale::toString(float i, char f = 'g', int prec = 6) const
-
+\fn QString QLocale::toString(float f, char format = 'g', int precision = 6) const
\overload
-\a f and \a prec have the same meaning as in QString::number(double, char, int).
+Returns a string representing the floating-point number \a f.
-\sa toDouble()
+The \a format and \a precision have the same meanings as described in \l
+{toString(double, char, int)}.
+
+\sa toFloat(), toDouble(), numberOptions(), exponential(), decimalPoint(), zeroDigit(),
+ positiveSign(), percent(), toCurrencyString(), formattedDataSize(),
+ QLocale::FloatingPointPrecisionOption
*/
/*!
@@ -1267,8 +1304,3 @@
\since 4.8
\overload
*/
-/*!
- \fn QString QLocale::toCurrencyString(float value, const QString &symbol) const
- \since 4.8
- \overload
-*/
diff --git a/src/corelib/text/qlocale_data_p.h b/src/corelib/text/qlocale_data_p.h
index 0501c59e1a..6175398dd9 100644
--- a/src/corelib/text/qlocale_data_p.h
+++ b/src/corelib/text/qlocale_data_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: Unicode-3.0
#ifndef QLOCALE_DATA_P_H
#define QLOCALE_DATA_P_H
@@ -51,34 +15,71 @@
// We mean it.
//
-#include <QtCore/private/qglobal_p.h>
+#include <QtCore/qendian.h>
+#include <QtCore/private/qlocale_p.h>
+
+#include <array>
+#include <cstring> // std::memcmp
QT_BEGIN_NAMESPACE
-/* This part of the file isn't generated, but written by hand since
- * Unicode CLDR doesn't contain measurement system information.
- */
-struct CountryLanguage
+/* This part of the file isn't generated, but written by hand. Unicode CLDR's
+ information about measurement systems doesn't say which to use by default in
+ each locale. Even if it did, adding another entry in every locale's row of
+ locale_data[] would take up much more memory than the small table below.
+*/
+struct TerritoryLanguage
{
quint16 languageId;
- quint16 countryId;
+ quint16 territoryId;
QLocale::MeasurementSystem system;
};
-static const CountryLanguage ImperialMeasurementSystems[] = {
+static constexpr TerritoryLanguage ImperialMeasurementSystems[] = {
{ QLocale::English, QLocale::UnitedStates, QLocale::ImperialUSSystem },
{ QLocale::English, QLocale::UnitedStatesMinorOutlyingIslands, QLocale::ImperialUSSystem },
{ QLocale::Spanish, QLocale::UnitedStates, QLocale::ImperialUSSystem },
{ QLocale::Hawaiian, QLocale::UnitedStates, QLocale::ImperialUSSystem },
{ QLocale::English, QLocale::UnitedKingdom, QLocale::ImperialUKSystem }
};
-static const int ImperialMeasurementSystemsCount =
- sizeof(ImperialMeasurementSystems)/sizeof(ImperialMeasurementSystems[0]);
+
+/*
+ Storage for alpha codes with length of up to 4 allowing efficient comparison.
+*/
+struct AlphaCode {
+ constexpr AlphaCode(char c1 = 0, char c2 = 0, char c3 = 0)
+ : c1(c2m(c1)), c2(c2m(c2)), c3(c2m(c3)), reserved(0) { }
+
+ uint16_t c1: 5, c2:5, c3: 5, reserved:1;
+
+ bool isValid() const noexcept { return c1 != 0; }
+
+ std::array<char, 4> decode() const { return {m2c(c1), m2c(c2), m2c(c3), 0}; }
+
+private:
+ static constexpr uint16_t c2m(char c) { return c ? c - 'a' + 1 : 0; }
+ static constexpr char m2c (uint16_t c) { return c ? c + 'a' - 1 : 0; }
+
+ friend bool operator==(AlphaCode lhs, AlphaCode rhs) noexcept
+ {
+ static_assert(std::has_unique_object_representations_v<AlphaCode>,
+ "memcmp() cannot be used to implement equality on "
+ "types that don't have unique object representations");
+ return std::memcmp(&lhs, &rhs, sizeof(lhs)) == 0;
+ }
+};
+
+struct LanguageCodeEntry {
+ AlphaCode part1;
+ AlphaCode part2B;
+ AlphaCode part2T;
+ AlphaCode part3;
+};
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2020-04-07 from the
- Common Locale Data Repository v36
+ This part of the file was generated on 2024-04-04 from the
+ Common Locale Data Repository v44.1
http://www.unicode.org/cldr/
@@ -87,5412 +88,7101 @@ static const int ImperialMeasurementSystemsCount =
edited) CLDR data; see qtbase/util/locale_database/.
*/
-static const QLocaleId likely_subtags[] = {
- { 4, 0, 0 }, { 4, 7, 69 }, // aa -> aa_Latn_ET
- { 2, 0, 0 }, { 2, 2, 81 }, // ab -> ab_Cyrl_GE
- { 255, 0, 0 }, { 255, 36, 102 }, // ae -> ae_Avst_IR
- { 5, 0, 0 }, { 5, 7, 195 }, // af -> af_Latn_ZA
- { 237, 0, 0 }, { 237, 7, 37 }, // agq -> agq_Latn_CM
- { 340, 0, 0 }, { 340, 128, 100 }, // aho -> aho_Ahom_IN
- { 146, 0, 0 }, { 146, 7, 83 }, // ak -> ak_Latn_GH
- { 262, 0, 0 }, { 262, 94, 103 }, // akk -> akk_Xsux_IQ
- { 7, 0, 0 }, { 7, 14, 69 }, // am -> am_Ethi_ET
- { 261, 0, 0 }, { 261, 7, 197 }, // an -> an_Latn_ES
- { 8, 0, 0 }, { 8, 1, 64 }, // ar -> ar_Arab_EG
- { 265, 0, 0 }, { 265, 57, 102 }, // arc -> arc_Armi_IR
- { 265, 119, 0 }, { 265, 119, 109 }, // arc_Nbat -> arc_Nbat_JO
- { 265, 120, 0 }, { 265, 120, 207 }, // arc_Palm -> arc_Palm_SY
- { 315, 0, 0 }, { 315, 7, 43 }, // arn -> arn_Latn_CL
- { 10, 0, 0 }, { 10, 11, 100 }, // as -> as_Beng_IN
- { 205, 0, 0 }, { 205, 7, 210 }, // asa -> asa_Latn_TZ
- { 341, 0, 0 }, { 341, 133, 225 }, // ase -> ase_Sgnw_US
- { 256, 0, 0 }, { 256, 7, 197 }, // ast -> ast_Latn_ES
- { 216, 0, 0 }, { 216, 2, 178 }, // av -> av_Cyrl_RU
- { 11, 0, 0 }, { 11, 7, 26 }, // ay -> ay_Latn_BO
- { 12, 0, 0 }, { 12, 7, 15 }, // az -> az_Latn_AZ
- { 12, 0, 103 }, { 12, 1, 103 }, // az_IQ -> az_Arab_IQ
- { 12, 0, 102 }, { 12, 1, 102 }, // az_IR -> az_Arab_IR
- { 12, 0, 178 }, { 12, 2, 178 }, // az_RU -> az_Cyrl_RU
- { 12, 1, 0 }, { 12, 1, 102 }, // az_Arab -> az_Arab_IR
- { 13, 0, 0 }, { 13, 2, 178 }, // ba -> ba_Cyrl_RU
- { 266, 0, 0 }, { 266, 7, 101 }, // ban -> ban_Latn_ID
- { 238, 0, 0 }, { 238, 7, 37 }, // bas -> bas_Latn_CM
- { 267, 0, 0 }, { 267, 38, 37 }, // bax -> bax_Bamu_CM
- { 268, 0, 0 }, { 268, 7, 101 }, // bbc -> bbc_Latn_ID
- { 22, 0, 0 }, { 22, 2, 20 }, // be -> be_Cyrl_BY
- { 195, 0, 0 }, { 195, 7, 239 }, // bem -> bem_Latn_ZM
- { 186, 0, 0 }, { 186, 7, 210 }, // bez -> bez_Latn_TZ
- { 20, 0, 0 }, { 20, 2, 33 }, // bg -> bg_Cyrl_BG
- { 364, 0, 0 }, { 364, 1, 163 }, // bgn -> bgn_Arab_PK
- { 343, 0, 0 }, { 343, 13, 100 }, // bho -> bho_Deva_IN
- { 18, 0, 0 }, { 18, 7, 229 }, // bi -> bi_Latn_VU
- { 270, 0, 0 }, { 270, 7, 170 }, // bku -> bku_Latn_PH
- { 309, 0, 0 }, { 309, 100, 232 }, // blt -> blt_Tavt_VN
- { 188, 0, 0 }, { 188, 7, 132 }, // bm -> bm_Latn_ML
- { 15, 0, 0 }, { 15, 11, 18 }, // bn -> bn_Beng_BD
- { 121, 0, 0 }, { 121, 31, 44 }, // bo -> bo_Tibt_CN
- { 19, 0, 0 }, { 19, 7, 74 }, // br -> br_Latn_FR
- { 215, 0, 0 }, { 215, 13, 100 }, // brx -> brx_Deva_IN
- { 142, 0, 0 }, { 142, 7, 27 }, // bs -> bs_Latn_BA
- { 336, 0, 0 }, { 336, 106, 121 }, // bsq -> bsq_Bass_LR
- { 312, 0, 0 }, { 312, 7, 37 }, // bss -> bss_Latn_CM
- { 269, 0, 0 }, { 269, 7, 101 }, // bug -> bug_Latn_ID
- { 152, 0, 0 }, { 152, 14, 67 }, // byn -> byn_Ethi_ER
- { 24, 0, 0 }, { 24, 7, 197 }, // ca -> ca_Latn_ES
- { 156, 0, 0 }, { 156, 7, 157 }, // cch -> cch_Latn_NG
- { 272, 0, 0 }, { 272, 46, 18 }, // ccp -> ccp_Cakm_BD
- { 218, 0, 0 }, { 218, 2, 178 }, // ce -> ce_Cyrl_RU
- { 365, 0, 0 }, { 365, 7, 170 }, // ceb -> ceb_Latn_PH
- { 211, 0, 0 }, { 211, 7, 221 }, // cgg -> cgg_Latn_UG
- { 217, 0, 0 }, { 217, 7, 89 }, // ch -> ch_Latn_GU
- { 190, 0, 0 }, { 190, 12, 225 }, // chr -> chr_Cher_US
- { 367, 0, 0 }, { 367, 7, 225 }, // cic -> cic_Latn_US
- { 276, 0, 0 }, { 276, 47, 232 }, // cjm -> cjm_Cham_VN
- { 316, 0, 0 }, { 316, 1, 103 }, // ckb -> ckb_Arab_IQ
- { 26, 0, 0 }, { 26, 7, 74 }, // co -> co_Latn_FR
- { 274, 0, 0 }, { 274, 48, 64 }, // cop -> cop_Copt_EG
- { 221, 0, 0 }, { 221, 44, 38 }, // cr -> cr_Cans_CA
- { 28, 0, 0 }, { 28, 7, 57 }, // cs -> cs_Latn_CZ
- { 338, 0, 0 }, { 338, 121, 147 }, // ctd -> ctd_Pauc_MM
- { 219, 0, 0 }, { 219, 2, 178 }, // cu -> cu_Cyrl_RU
- { 219, 52, 0 }, { 219, 52, 33 }, // cu_Glag -> cu_Glag_BG
- { 220, 0, 0 }, { 220, 2, 178 }, // cv -> cv_Cyrl_RU
- { 134, 0, 0 }, { 134, 7, 224 }, // cy -> cy_Latn_GB
- { 29, 0, 0 }, { 29, 7, 58 }, // da -> da_Latn_DK
- { 176, 0, 0 }, { 176, 7, 111 }, // dav -> dav_Latn_KE
- { 42, 0, 0 }, { 42, 7, 82 }, // de -> de_Latn_DE
- { 239, 0, 0 }, { 239, 7, 156 }, // dje -> dje_Latn_NE
- { 275, 0, 0 }, { 275, 1, 100 }, // doi -> doi_Arab_IN
- { 317, 0, 0 }, { 317, 7, 82 }, // dsb -> dsb_Latn_DE
- { 240, 0, 0 }, { 240, 7, 37 }, // dua -> dua_Latn_CM
- { 143, 0, 0 }, { 143, 29, 131 }, // dv -> dv_Thaa_MV
- { 241, 0, 0 }, { 241, 7, 187 }, // dyo -> dyo_Latn_SN
- { 16, 0, 0 }, { 16, 31, 25 }, // dz -> dz_Tibt_BT
- { 189, 0, 0 }, { 189, 7, 111 }, // ebu -> ebu_Latn_KE
- { 161, 0, 0 }, { 161, 7, 83 }, // ee -> ee_Latn_GH
- { 263, 0, 0 }, { 263, 50, 64 }, // egy -> egy_Egyp_EG
- { 277, 0, 0 }, { 277, 63, 147 }, // eky -> eky_Kali_MM
- { 43, 0, 0 }, { 43, 16, 85 }, // el -> el_Grek_GR
- { 31, 0, 0 }, { 31, 7, 225 }, // en -> en_Latn_US
- { 31, 92, 0 }, { 31, 92, 224 }, // en_Shaw -> en_Shaw_GB
- { 32, 0, 0 }, { 32, 7, 260 }, // eo -> eo_Latn_001
- { 111, 0, 0 }, { 111, 7, 197 }, // es -> es_Latn_ES
- { 33, 0, 0 }, { 33, 7, 68 }, // et -> et_Latn_EE
- { 278, 0, 0 }, { 278, 79, 106 }, // ett -> ett_Ital_IT
- { 14, 0, 0 }, { 14, 7, 197 }, // eu -> eu_Latn_ES
- { 242, 0, 0 }, { 242, 7, 37 }, // ewo -> ewo_Latn_CM
- { 89, 0, 0 }, { 89, 1, 102 }, // fa -> fa_Arab_IR
- { 177, 0, 0 }, { 177, 7, 187 }, // ff -> ff_Latn_SN
- { 177, 134, 0 }, { 177, 134, 91 }, // ff_Adlm -> ff_Adlm_GN
- { 36, 0, 0 }, { 36, 7, 73 }, // fi -> fi_Latn_FI
- { 166, 0, 0 }, { 166, 7, 170 }, // fil -> fil_Latn_PH
- { 35, 0, 0 }, { 35, 7, 72 }, // fj -> fj_Latn_FJ
- { 34, 0, 0 }, { 34, 7, 71 }, // fo -> fo_Latn_FO
- { 37, 0, 0 }, { 37, 7, 74 }, // fr -> fr_Latn_FR
- { 159, 0, 0 }, { 159, 7, 106 }, // fur -> fur_Latn_IT
- { 38, 0, 0 }, { 38, 7, 151 }, // fy -> fy_Latn_NL
- { 57, 0, 0 }, { 57, 7, 104 }, // ga -> ga_Latn_IE
- { 148, 0, 0 }, { 148, 7, 83 }, // gaa -> gaa_Latn_GH
- { 39, 0, 0 }, { 39, 7, 224 }, // gd -> gd_Latn_GB
- { 153, 0, 0 }, { 153, 14, 69 }, // gez -> gez_Ethi_ET
- { 40, 0, 0 }, { 40, 7, 197 }, // gl -> gl_Latn_ES
- { 45, 0, 0 }, { 45, 7, 168 }, // gn -> gn_Latn_PY
- { 279, 0, 0 }, { 279, 53, 222 }, // got -> got_Goth_UA
- { 264, 0, 0 }, { 264, 49, 56 }, // grc -> grc_Cprt_CY
- { 264, 68, 0 }, { 264, 68, 85 }, // grc_Linb -> grc_Linb_GR
- { 167, 0, 0 }, { 167, 7, 206 }, // gsw -> gsw_Latn_CH
- { 46, 0, 0 }, { 46, 17, 100 }, // gu -> gu_Gujr_IN
- { 175, 0, 0 }, { 175, 7, 111 }, // guz -> guz_Latn_KE
- { 144, 0, 0 }, { 144, 7, 251 }, // gv -> gv_Latn_IM
- { 47, 0, 0 }, { 47, 7, 157 }, // ha -> ha_Latn_NG
- { 47, 0, 37 }, { 47, 1, 37 }, // ha_CM -> ha_Arab_CM
- { 47, 0, 201 }, { 47, 1, 201 }, // ha_SD -> ha_Arab_SD
- { 163, 0, 0 }, { 163, 7, 225 }, // haw -> haw_Latn_US
- { 48, 0, 0 }, { 48, 18, 105 }, // he -> he_Hebr_IL
- { 49, 0, 0 }, { 49, 13, 100 }, // hi -> hi_Deva_IN
- { 344, 0, 0 }, { 344, 129, 217 }, // hlu -> hlu_Hluw_TR
- { 282, 0, 0 }, { 282, 86, 44 }, // hmd -> hmd_Plrd_CN
- { 333, 0, 0 }, { 333, 110, 117 }, // hnj -> hnj_Hmng_LA
- { 280, 0, 0 }, { 280, 7, 170 }, // hnn -> hnn_Latn_PH
- { 224, 0, 0 }, { 224, 7, 167 }, // ho -> ho_Latn_PG
- { 334, 0, 0 }, { 334, 13, 100 }, // hoc -> hoc_Deva_IN
- { 27, 0, 0 }, { 27, 7, 54 }, // hr -> hr_Latn_HR
- { 318, 0, 0 }, { 318, 7, 82 }, // hsb -> hsb_Latn_DE
- { 222, 0, 0 }, { 222, 7, 94 }, // ht -> ht_Latn_HT
- { 50, 0, 0 }, { 50, 7, 98 }, // hu -> hu_Latn_HU
- { 9, 0, 0 }, { 9, 10, 11 }, // hy -> hy_Armn_AM
- { 223, 0, 0 }, { 223, 7, 148 }, // hz -> hz_Latn_NA
- { 53, 0, 0 }, { 53, 7, 260 }, // ia -> ia_Latn_001
- { 52, 0, 0 }, { 52, 7, 101 }, // id -> id_Latn_ID
- { 149, 0, 0 }, { 149, 7, 157 }, // ig -> ig_Latn_NG
- { 168, 0, 0 }, { 168, 34, 44 }, // ii -> ii_Yiii_CN
- { 56, 0, 0 }, { 56, 7, 225 }, // ik -> ik_Latn_US
- { 281, 0, 0 }, { 281, 2, 178 }, // inh -> inh_Cyrl_RU
- { 360, 0, 0 }, { 360, 7, 260 }, // io -> io_Latn_001
- { 51, 0, 0 }, { 51, 7, 99 }, // is -> is_Latn_IS
- { 58, 0, 0 }, { 58, 7, 106 }, // it -> it_Latn_IT
- { 55, 0, 0 }, { 55, 44, 38 }, // iu -> iu_Cans_CA
- { 59, 0, 0 }, { 59, 19, 108 }, // ja -> ja_Jpan_JP
- { 361, 0, 0 }, { 361, 7, 260 }, // jbo -> jbo_Latn_001
- { 257, 0, 0 }, { 257, 7, 37 }, // jgo -> jgo_Latn_CM
- { 200, 0, 0 }, { 200, 7, 210 }, // jmc -> jmc_Latn_TZ
- { 60, 0, 0 }, { 60, 7, 101 }, // jv -> jv_Latn_ID
- { 41, 0, 0 }, { 41, 15, 81 }, // ka -> ka_Geor_GE
- { 184, 0, 0 }, { 184, 7, 3 }, // kab -> kab_Latn_DZ
- { 158, 0, 0 }, { 158, 7, 157 }, // kaj -> kaj_Latn_NG
- { 150, 0, 0 }, { 150, 7, 111 }, // kam -> kam_Latn_KE
- { 164, 0, 0 }, { 164, 7, 157 }, // kcg -> kcg_Latn_NG
- { 192, 0, 0 }, { 192, 7, 210 }, // kde -> kde_Latn_TZ
- { 196, 0, 0 }, { 196, 7, 39 }, // kea -> kea_Latn_CV
- { 319, 0, 0 }, { 319, 7, 37 }, // ken -> ken_Latn_CM
- { 154, 0, 0 }, { 154, 7, 53 }, // kfo -> kfo_Latn_CI
- { 227, 0, 0 }, { 227, 7, 49 }, // kg -> kg_Latn_CD
- { 286, 0, 0 }, { 286, 76, 44 }, // khb -> khb_Talu_CN
- { 208, 0, 0 }, { 208, 7, 132 }, // khq -> khq_Latn_ML
- { 178, 0, 0 }, { 178, 7, 111 }, // ki -> ki_Latn_KE
- { 228, 0, 0 }, { 228, 7, 148 }, // kj -> kj_Latn_NA
- { 63, 0, 0 }, { 63, 2, 110 }, // kk -> kk_Cyrl_KZ
- { 63, 0, 1 }, { 63, 1, 1 }, // kk_AF -> kk_Arab_AF
- { 63, 0, 44 }, { 63, 1, 44 }, // kk_CN -> kk_Arab_CN
- { 63, 0, 102 }, { 63, 1, 102 }, // kk_IR -> kk_Arab_IR
- { 63, 0, 143 }, { 63, 1, 143 }, // kk_MN -> kk_Arab_MN
- { 63, 1, 0 }, { 63, 1, 44 }, // kk_Arab -> kk_Arab_CN
- { 258, 0, 0 }, { 258, 7, 37 }, // kkj -> kkj_Latn_CM
- { 44, 0, 0 }, { 44, 7, 86 }, // kl -> kl_Latn_GL
- { 198, 0, 0 }, { 198, 7, 111 }, // kln -> kln_Latn_KE
- { 23, 0, 0 }, { 23, 20, 36 }, // km -> km_Khmr_KH
- { 61, 0, 0 }, { 61, 21, 100 }, // kn -> kn_Knda_IN
- { 66, 0, 0 }, { 66, 22, 114 }, // ko -> ko_Kore_KR
- { 147, 0, 0 }, { 147, 13, 100 }, // kok -> kok_Deva_IN
- { 169, 0, 0 }, { 169, 7, 121 }, // kpe -> kpe_Latn_LR
- { 225, 0, 0 }, { 225, 7, 0 }, // kr -> kr_Latn
- { 62, 0, 0 }, { 62, 1, 100 }, // ks -> ks_Arab_IN
- { 214, 0, 0 }, { 214, 7, 210 }, // ksb -> ksb_Latn_TZ
- { 243, 0, 0 }, { 243, 7, 37 }, // ksf -> ksf_Latn_CM
- { 201, 0, 0 }, { 201, 7, 82 }, // ksh -> ksh_Latn_DE
- { 67, 0, 0 }, { 67, 7, 217 }, // ku -> ku_Latn_TR
- { 67, 0, 119 }, { 67, 1, 119 }, // ku_LB -> ku_Arab_LB
- { 67, 1, 0 }, { 67, 1, 103 }, // ku_Arab -> ku_Arab_IQ
- { 226, 0, 0 }, { 226, 2, 178 }, // kv -> kv_Cyrl_RU
- { 145, 0, 0 }, { 145, 7, 224 }, // kw -> kw_Latn_GB
- { 65, 0, 0 }, { 65, 2, 116 }, // ky -> ky_Cyrl_KG
- { 65, 0, 44 }, { 65, 1, 44 }, // ky_CN -> ky_Arab_CN
- { 65, 0, 217 }, { 65, 7, 217 }, // ky_TR -> ky_Latn_TR
- { 65, 1, 0 }, { 65, 1, 44 }, // ky_Arab -> ky_Arab_CN
- { 65, 7, 0 }, { 65, 7, 217 }, // ky_Latn -> ky_Latn_TR
- { 70, 0, 0 }, { 70, 7, 230 }, // la -> la_Latn_VA
- { 332, 0, 0 }, { 332, 112, 85 }, // lab -> lab_Lina_GR
- { 193, 0, 0 }, { 193, 7, 210 }, // lag -> lag_Latn_TZ
- { 231, 0, 0 }, { 231, 7, 125 }, // lb -> lb_Latn_LU
- { 283, 0, 0 }, { 283, 66, 100 }, // lep -> lep_Lepc_IN
- { 335, 0, 0 }, { 335, 2, 178 }, // lez -> lez_Cyrl_RU
- { 194, 0, 0 }, { 194, 7, 221 }, // lg -> lg_Latn_UG
- { 229, 0, 0 }, { 229, 7, 151 }, // li -> li_Latn_NL
- { 284, 0, 0 }, { 284, 13, 150 }, // lif -> lif_Deva_NP
- { 284, 67, 0 }, { 284, 67, 100 }, // lif_Limb -> lif_Limb_IN
- { 285, 0, 0 }, { 285, 51, 44 }, // lis -> lis_Lisu_CN
- { 313, 0, 0 }, { 313, 7, 225 }, // lkt -> lkt_Latn_US
- { 72, 0, 0 }, { 72, 7, 49 }, // ln -> ln_Latn_CD
- { 69, 0, 0 }, { 69, 23, 117 }, // lo -> lo_Laoo_LA
- { 349, 0, 0 }, { 349, 1, 102 }, // lrc -> lrc_Arab_IR
- { 73, 0, 0 }, { 73, 7, 124 }, // lt -> lt_Latn_LT
- { 230, 0, 0 }, { 230, 7, 49 }, // lu -> lu_Latn_CD
- { 210, 0, 0 }, { 210, 7, 111 }, // luo -> luo_Latn_KE
- { 204, 0, 0 }, { 204, 7, 111 }, // luy -> luy_Latn_KE
- { 71, 0, 0 }, { 71, 7, 118 }, // lv -> lv_Latn_LV
- { 345, 0, 0 }, { 345, 5, 44 }, // lzh -> lzh_Hans_CN
- { 339, 0, 0 }, { 339, 13, 100 }, // mai -> mai_Deva_IN
- { 289, 0, 0 }, { 289, 7, 80 }, // man -> man_Latn_GM
- { 289, 0, 91 }, { 289, 75, 91 }, // man_GN -> man_Nkoo_GN
- { 289, 75, 0 }, { 289, 75, 91 }, // man_Nkoo -> man_Nkoo_GN
- { 202, 0, 0 }, { 202, 7, 111 }, // mas -> mas_Latn_KE
- { 330, 0, 0 }, { 330, 7, 189 }, // men -> men_Latn_SL
- { 197, 0, 0 }, { 197, 7, 111 }, // mer -> mer_Latn_KE
- { 191, 0, 0 }, { 191, 7, 137 }, // mfe -> mfe_Latn_MU
- { 75, 0, 0 }, { 75, 7, 128 }, // mg -> mg_Latn_MG
- { 244, 0, 0 }, { 244, 7, 146 }, // mgh -> mgh_Latn_MZ
- { 259, 0, 0 }, { 259, 7, 37 }, // mgo -> mgo_Latn_CM
- { 81, 0, 0 }, { 81, 7, 134 }, // mh -> mh_Latn_MH
- { 79, 0, 0 }, { 79, 7, 154 }, // mi -> mi_Latn_NZ
- { 356, 0, 0 }, { 356, 130, 103 }, // mis -> mis_Hatr_IQ
- { 74, 0, 0 }, { 74, 2, 127 }, // mk -> mk_Cyrl_MK
- { 77, 0, 0 }, { 77, 24, 100 }, // ml -> ml_Mlym_IN
- { 82, 0, 0 }, { 82, 2, 143 }, // mn -> mn_Cyrl_MN
- { 82, 0, 44 }, { 82, 8, 44 }, // mn_CN -> mn_Mong_CN
- { 82, 8, 0 }, { 82, 8, 44 }, // mn_Mong -> mn_Mong_CN
- { 290, 0, 0 }, { 290, 11, 100 }, // mni -> mni_Beng_IN
- { 320, 0, 0 }, { 320, 7, 38 }, // moh -> moh_Latn_CA
- { 80, 0, 0 }, { 80, 13, 100 }, // mr -> mr_Deva_IN
- { 347, 0, 0 }, { 347, 117, 18 }, // mro -> mro_Mroo_BD
- { 76, 0, 0 }, { 76, 7, 130 }, // ms -> ms_Latn_MY
- { 76, 0, 46 }, { 76, 1, 46 }, // ms_CC -> ms_Arab_CC
- { 76, 0, 101 }, { 76, 1, 101 }, // ms_ID -> ms_Arab_ID
- { 78, 0, 0 }, { 78, 7, 133 }, // mt -> mt_Latn_MT
- { 245, 0, 0 }, { 245, 7, 37 }, // mua -> mua_Latn_CM
- { 368, 0, 0 }, { 368, 7, 225 }, // mus -> mus_Latn_US
- { 21, 0, 0 }, { 21, 25, 147 }, // my -> my_Mymr_MM
- { 366, 0, 0 }, { 366, 2, 178 }, // myv -> myv_Cyrl_RU
- { 273, 0, 0 }, { 273, 71, 102 }, // myz -> myz_Mand_IR
- { 346, 0, 0 }, { 346, 1, 102 }, // mzn -> mzn_Arab_IR
- { 83, 0, 0 }, { 83, 7, 149 }, // na -> na_Latn_NR
- { 199, 0, 0 }, { 199, 7, 148 }, // naq -> naq_Latn_NA
- { 85, 0, 0 }, { 85, 7, 161 }, // nb -> nb_Latn_NO
- { 181, 0, 0 }, { 181, 7, 240 }, // nd -> nd_Latn_ZW
- { 170, 0, 0 }, { 170, 7, 82 }, // nds -> nds_Latn_DE
- { 84, 0, 0 }, { 84, 13, 150 }, // ne -> ne_Deva_NP
- { 348, 0, 0 }, { 348, 13, 150 }, // new -> new_Deva_NP
- { 233, 0, 0 }, { 233, 7, 148 }, // ng -> ng_Latn_NA
- { 30, 0, 0 }, { 30, 7, 151 }, // nl -> nl_Latn_NL
- { 246, 0, 0 }, { 246, 7, 37 }, // nmg -> nmg_Latn_CM
- { 141, 0, 0 }, { 141, 7, 161 }, // nn -> nn_Latn_NO
- { 260, 0, 0 }, { 260, 7, 37 }, // nnh -> nnh_Latn_CM
- { 292, 0, 0 }, { 292, 65, 211 }, // nod -> nod_Lana_TH
- { 294, 0, 0 }, { 294, 88, 205 }, // non -> non_Runr_SE
- { 321, 0, 0 }, { 321, 75, 91 }, // nqo -> nqo_Nkoo_GN
- { 171, 0, 0 }, { 171, 7, 195 }, // nr -> nr_Latn_ZA
- { 172, 0, 0 }, { 172, 7, 195 }, // nso -> nso_Latn_ZA
- { 247, 0, 0 }, { 247, 7, 254 }, // nus -> nus_Latn_SS
- { 232, 0, 0 }, { 232, 7, 225 }, // nv -> nv_Latn_US
- { 165, 0, 0 }, { 165, 7, 129 }, // ny -> ny_Latn_MW
- { 185, 0, 0 }, { 185, 7, 221 }, // nyn -> nyn_Latn_UG
- { 86, 0, 0 }, { 86, 7, 74 }, // oc -> oc_Latn_FR
- { 3, 0, 0 }, { 3, 7, 69 }, // om -> om_Latn_ET
- { 87, 0, 0 }, { 87, 26, 100 }, // or -> or_Orya_IN
- { 101, 0, 0 }, { 101, 2, 81 }, // os -> os_Cyrl_GE
- { 358, 0, 0 }, { 358, 138, 225 }, // osa -> osa_Osge_US
- { 296, 0, 0 }, { 296, 82, 143 }, // otk -> otk_Orkh_MN
- { 92, 0, 0 }, { 92, 4, 100 }, // pa -> pa_Guru_IN
- { 92, 0, 163 }, { 92, 1, 163 }, // pa_PK -> pa_Arab_PK
- { 92, 1, 0 }, { 92, 1, 163 }, // pa_Arab -> pa_Arab_PK
- { 297, 0, 0 }, { 297, 58, 102 }, // pal -> pal_Phli_IR
- { 297, 123, 0 }, { 297, 123, 44 }, // pal_Phlp -> pal_Phlp_CN
- { 351, 0, 0 }, { 351, 7, 12 }, // pap -> pap_Latn_AW
- { 350, 0, 0 }, { 350, 7, 164 }, // pau -> pau_Latn_PW
- { 295, 0, 0 }, { 295, 80, 102 }, // peo -> peo_Xpeo_IR
- { 299, 0, 0 }, { 299, 85, 119 }, // phn -> phn_Phnx_LB
- { 342, 0, 0 }, { 342, 41, 100 }, // pka -> pka_Brah_IN
- { 90, 0, 0 }, { 90, 7, 172 }, // pl -> pl_Latn_PL
- { 300, 0, 0 }, { 300, 64, 163 }, // pra -> pra_Khar_PK
- { 322, 0, 0 }, { 322, 7, 260 }, // prg -> prg_Latn_001
- { 88, 0, 0 }, { 88, 1, 1 }, // ps -> ps_Arab_AF
- { 91, 0, 0 }, { 91, 7, 30 }, // pt -> pt_Latn_BR
- { 93, 0, 0 }, { 93, 7, 169 }, // qu -> qu_Latn_PE
- { 323, 0, 0 }, { 323, 7, 90 }, // quc -> quc_Latn_GT
- { 301, 0, 0 }, { 301, 7, 101 }, // rej -> rej_Latn_ID
- { 94, 0, 0 }, { 94, 7, 206 }, // rm -> rm_Latn_CH
- { 68, 0, 0 }, { 68, 7, 35 }, // rn -> rn_Latn_BI
- { 95, 0, 0 }, { 95, 7, 177 }, // ro -> ro_Latn_RO
- { 182, 0, 0 }, { 182, 7, 210 }, // rof -> rof_Latn_TZ
- { 96, 0, 0 }, { 96, 2, 178 }, // ru -> ru_Cyrl_RU
- { 64, 0, 0 }, { 64, 7, 179 }, // rw -> rw_Latn_RW
- { 209, 0, 0 }, { 209, 7, 210 }, // rwk -> rwk_Latn_TZ
- { 99, 0, 0 }, { 99, 13, 100 }, // sa -> sa_Deva_IN
- { 248, 0, 0 }, { 248, 2, 178 }, // sah -> sah_Cyrl_RU
- { 179, 0, 0 }, { 179, 7, 111 }, // saq -> saq_Latn_KE
- { 304, 0, 0 }, { 304, 7, 100 }, // sat -> sat_Latn_IN
- { 305, 0, 0 }, { 305, 90, 100 }, // saz -> saz_Saur_IN
- { 249, 0, 0 }, { 249, 7, 210 }, // sbp -> sbp_Latn_TZ
- { 115, 0, 0 }, { 115, 7, 106 }, // sc -> sc_Latn_IT
- { 362, 0, 0 }, { 362, 7, 106 }, // scn -> scn_Latn_IT
- { 105, 0, 0 }, { 105, 1, 163 }, // sd -> sd_Arab_PK
- { 105, 13, 0 }, { 105, 13, 100 }, // sd_Deva -> sd_Deva_IN
- { 105, 111, 0 }, { 105, 111, 100 }, // sd_Khoj -> sd_Khoj_IN
- { 105, 125, 0 }, { 105, 125, 100 }, // sd_Sind -> sd_Sind_IN
- { 363, 0, 0 }, { 363, 1, 102 }, // sdh -> sdh_Arab_IR
- { 173, 0, 0 }, { 173, 7, 161 }, // se -> se_Latn_NO
- { 180, 0, 0 }, { 180, 7, 146 }, // seh -> seh_Latn_MZ
- { 213, 0, 0 }, { 213, 7, 132 }, // ses -> ses_Latn_ML
- { 98, 0, 0 }, { 98, 7, 41 }, // sg -> sg_Latn_CF
- { 293, 0, 0 }, { 293, 77, 104 }, // sga -> sga_Ogam_IE
- { 183, 0, 0 }, { 183, 9, 145 }, // shi -> shi_Tfng_MA
- { 106, 0, 0 }, { 106, 32, 198 }, // si -> si_Sinh_LK
- { 155, 0, 0 }, { 155, 7, 69 }, // sid -> sid_Latn_ET
- { 108, 0, 0 }, { 108, 7, 191 }, // sk -> sk_Latn_SK
- { 352, 0, 0 }, { 352, 1, 163 }, // skr -> skr_Arab_PK
- { 109, 0, 0 }, { 109, 7, 192 }, // sl -> sl_Latn_SI
- { 97, 0, 0 }, { 97, 7, 183 }, // sm -> sm_Latn_WS
- { 324, 0, 0 }, { 324, 7, 205 }, // sma -> sma_Latn_SE
- { 325, 0, 0 }, { 325, 7, 205 }, // smj -> smj_Latn_SE
- { 326, 0, 0 }, { 326, 7, 73 }, // smn -> smn_Latn_FI
- { 303, 0, 0 }, { 303, 89, 105 }, // smp -> smp_Samr_IL
- { 327, 0, 0 }, { 327, 7, 73 }, // sms -> sms_Latn_FI
- { 104, 0, 0 }, { 104, 7, 240 }, // sn -> sn_Latn_ZW
- { 110, 0, 0 }, { 110, 7, 194 }, // so -> so_Latn_SO
- { 6, 0, 0 }, { 6, 7, 2 }, // sq -> sq_Latn_AL
- { 100, 0, 0 }, { 100, 2, 243 }, // sr -> sr_Cyrl_RS
- { 100, 0, 242 }, { 100, 7, 242 }, // sr_ME -> sr_Latn_ME
- { 100, 0, 177 }, { 100, 7, 177 }, // sr_RO -> sr_Latn_RO
- { 100, 0, 178 }, { 100, 7, 178 }, // sr_RU -> sr_Latn_RU
- { 100, 0, 217 }, { 100, 7, 217 }, // sr_TR -> sr_Latn_TR
- { 306, 0, 0 }, { 306, 93, 100 }, // srb -> srb_Sora_IN
- { 107, 0, 0 }, { 107, 7, 195 }, // ss -> ss_Latn_ZA
- { 207, 0, 0 }, { 207, 7, 67 }, // ssy -> ssy_Latn_ER
- { 102, 0, 0 }, { 102, 7, 195 }, // st -> st_Latn_ZA
- { 112, 0, 0 }, { 112, 7, 101 }, // su -> su_Latn_ID
- { 114, 0, 0 }, { 114, 7, 205 }, // sv -> sv_Latn_SE
- { 113, 0, 0 }, { 113, 7, 210 }, // sw -> sw_Latn_TZ
- { 250, 0, 0 }, { 250, 7, 49 }, // swc -> swc_Latn_CD
- { 307, 0, 0 }, { 307, 11, 18 }, // syl -> syl_Beng_BD
- { 151, 0, 0 }, { 151, 33, 103 }, // syr -> syr_Syrc_IQ
- { 369, 0, 0 }, { 369, 7, 172 }, // szl -> szl_Latn_PL
- { 117, 0, 0 }, { 117, 27, 100 }, // ta -> ta_Taml_IN
- { 308, 0, 0 }, { 308, 7, 170 }, // tbw -> tbw_Latn_PH
- { 310, 0, 0 }, { 310, 99, 44 }, // tdd -> tdd_Tale_CN
- { 119, 0, 0 }, { 119, 28, 100 }, // te -> te_Telu_IN
- { 206, 0, 0 }, { 206, 7, 221 }, // teo -> teo_Latn_UG
- { 116, 0, 0 }, { 116, 2, 209 }, // tg -> tg_Cyrl_TJ
- { 116, 0, 163 }, { 116, 1, 163 }, // tg_PK -> tg_Arab_PK
- { 116, 1, 0 }, { 116, 1, 163 }, // tg_Arab -> tg_Arab_PK
- { 120, 0, 0 }, { 120, 30, 211 }, // th -> th_Thai_TH
- { 122, 0, 0 }, { 122, 14, 69 }, // ti -> ti_Ethi_ET
- { 157, 0, 0 }, { 157, 14, 67 }, // tig -> tig_Ethi_ER
- { 126, 0, 0 }, { 126, 7, 218 }, // tk -> tk_Latn_TM
- { 353, 0, 0 }, { 353, 7, 213 }, // tkl -> tkl_Latn_TK
- { 103, 0, 0 }, { 103, 7, 195 }, // tn -> tn_Latn_ZA
- { 123, 0, 0 }, { 123, 7, 214 }, // to -> to_Latn_TO
- { 354, 0, 0 }, { 354, 7, 167 }, // tpi -> tpi_Latn_PG
- { 125, 0, 0 }, { 125, 7, 217 }, // tr -> tr_Latn_TR
- { 174, 0, 0 }, { 174, 7, 208 }, // trv -> trv_Latn_TW
- { 124, 0, 0 }, { 124, 7, 195 }, // ts -> ts_Latn_ZA
- { 118, 0, 0 }, { 118, 2, 178 }, // tt -> tt_Cyrl_RU
- { 355, 0, 0 }, { 355, 7, 220 }, // tvl -> tvl_Latn_TV
- { 251, 0, 0 }, { 251, 7, 156 }, // twq -> twq_Latn_NE
- { 359, 0, 0 }, { 359, 139, 44 }, // txg -> txg_Tang_CN
- { 127, 0, 0 }, { 127, 7, 77 }, // ty -> ty_Latn_PF
- { 212, 0, 0 }, { 212, 7, 145 }, // tzm -> tzm_Latn_MA
- { 128, 0, 0 }, { 128, 1, 44 }, // ug -> ug_Arab_CN
- { 128, 0, 110 }, { 128, 2, 110 }, // ug_KZ -> ug_Cyrl_KZ
- { 128, 0, 143 }, { 128, 2, 143 }, // ug_MN -> ug_Cyrl_MN
- { 128, 2, 0 }, { 128, 2, 110 }, // ug_Cyrl -> ug_Cyrl_KZ
- { 311, 0, 0 }, { 311, 102, 207 }, // uga -> uga_Ugar_SY
- { 129, 0, 0 }, { 129, 2, 222 }, // uk -> uk_Cyrl_UA
- { 130, 0, 0 }, { 130, 1, 163 }, // ur -> ur_Arab_PK
- { 131, 0, 0 }, { 131, 7, 228 }, // uz -> uz_Latn_UZ
- { 131, 0, 1 }, { 131, 1, 1 }, // uz_AF -> uz_Arab_AF
- { 131, 0, 44 }, { 131, 2, 44 }, // uz_CN -> uz_Cyrl_CN
- { 131, 1, 0 }, { 131, 1, 1 }, // uz_Arab -> uz_Arab_AF
- { 252, 0, 0 }, { 252, 35, 121 }, // vai -> vai_Vaii_LR
- { 160, 0, 0 }, { 160, 7, 195 }, // ve -> ve_Latn_ZA
- { 132, 0, 0 }, { 132, 7, 232 }, // vi -> vi_Latn_VN
- { 133, 0, 0 }, { 133, 7, 260 }, // vo -> vo_Latn_001
- { 187, 0, 0 }, { 187, 7, 210 }, // vun -> vun_Latn_TZ
- { 236, 0, 0 }, { 236, 7, 21 }, // wa -> wa_Latn_BE
- { 253, 0, 0 }, { 253, 7, 206 }, // wae -> wae_Latn_CH
- { 162, 0, 0 }, { 162, 14, 69 }, // wal -> wal_Ethi_ET
- { 328, 0, 0 }, { 328, 7, 13 }, // wbp -> wbp_Latn_AU
- { 135, 0, 0 }, { 135, 7, 187 }, // wo -> wo_Latn_SN
- { 271, 0, 0 }, { 271, 45, 217 }, // xcr -> xcr_Cari_TR
- { 136, 0, 0 }, { 136, 7, 195 }, // xh -> xh_Latn_ZA
- { 287, 0, 0 }, { 287, 69, 217 }, // xlc -> xlc_Lyci_TR
- { 288, 0, 0 }, { 288, 70, 217 }, // xld -> xld_Lydi_TR
- { 329, 0, 0 }, { 329, 114, 44 }, // xmn -> xmn_Mani_CN
- { 291, 0, 0 }, { 291, 74, 201 }, // xmr -> xmr_Merc_SD
- { 331, 0, 0 }, { 331, 118, 186 }, // xna -> xna_Narb_SA
- { 203, 0, 0 }, { 203, 7, 221 }, // xog -> xog_Latn_UG
- { 298, 0, 0 }, { 298, 59, 102 }, // xpr -> xpr_Prti_IR
- { 302, 0, 0 }, { 302, 81, 237 }, // xsa -> xsa_Sarb_YE
- { 254, 0, 0 }, { 254, 7, 37 }, // yav -> yav_Latn_CM
- { 137, 0, 0 }, { 137, 18, 260 }, // yi -> yi_Hebr_001
- { 138, 0, 0 }, { 138, 7, 157 }, // yo -> yo_Latn_NG
- { 357, 0, 0 }, { 357, 6, 97 }, // yue -> yue_Hant_HK
- { 357, 0, 44 }, { 357, 5, 44 }, // yue_CN -> yue_Hans_CN
- { 357, 5, 0 }, { 357, 5, 44 }, // yue_Hans -> yue_Hans_CN
- { 139, 0, 0 }, { 139, 7, 44 }, // za -> za_Latn_CN
- { 314, 0, 0 }, { 314, 9, 145 }, // zgh -> zgh_Tfng_MA
- { 25, 0, 0 }, { 25, 5, 44 }, // zh -> zh_Hans_CN
- { 25, 0, 13 }, { 25, 6, 13 }, // zh_AU -> zh_Hant_AU
- { 25, 0, 32 }, { 25, 6, 32 }, // zh_BN -> zh_Hant_BN
- { 25, 0, 224 }, { 25, 6, 224 }, // zh_GB -> zh_Hant_GB
- { 25, 0, 76 }, { 25, 6, 76 }, // zh_GF -> zh_Hant_GF
- { 25, 0, 97 }, { 25, 6, 97 }, // zh_HK -> zh_Hant_HK
- { 25, 0, 101 }, { 25, 6, 101 }, // zh_ID -> zh_Hant_ID
- { 25, 0, 126 }, { 25, 6, 126 }, // zh_MO -> zh_Hant_MO
- { 25, 0, 130 }, { 25, 6, 130 }, // zh_MY -> zh_Hant_MY
- { 25, 0, 166 }, { 25, 6, 166 }, // zh_PA -> zh_Hant_PA
- { 25, 0, 77 }, { 25, 6, 77 }, // zh_PF -> zh_Hant_PF
- { 25, 0, 170 }, { 25, 6, 170 }, // zh_PH -> zh_Hant_PH
- { 25, 0, 202 }, { 25, 6, 202 }, // zh_SR -> zh_Hant_SR
- { 25, 0, 211 }, { 25, 6, 211 }, // zh_TH -> zh_Hant_TH
- { 25, 0, 208 }, { 25, 6, 208 }, // zh_TW -> zh_Hant_TW
- { 25, 0, 225 }, { 25, 6, 225 }, // zh_US -> zh_Hant_US
- { 25, 0, 232 }, { 25, 6, 232 }, // zh_VN -> zh_Hant_VN
- { 25, 40, 0 }, { 25, 40, 208 }, // zh_Bopo -> zh_Bopo_TW
- { 25, 140, 0 }, { 25, 140, 208 }, // zh_Hanb -> zh_Hanb_TW
- { 25, 6, 0 }, { 25, 6, 208 }, // zh_Hant -> zh_Hant_TW
- { 140, 0, 0 }, { 140, 7, 195 }, // zu -> zu_Latn_ZA
- { 0, 0, 261 }, { 96, 2, 178 }, // und_150 -> ru_Cyrl_RU
- { 0, 0, 246 }, { 111, 7, 246 }, // und_419 -> es_Latn_419
- { 0, 0, 5 }, { 24, 7, 5 }, // und_AD -> ca_Latn_AD
- { 0, 0, 223 }, { 8, 1, 223 }, // und_AE -> ar_Arab_AE
- { 0, 0, 1 }, { 89, 1, 1 }, // und_AF -> fa_Arab_AF
- { 0, 0, 2 }, { 6, 7, 2 }, // und_AL -> sq_Latn_AL
- { 0, 0, 11 }, { 9, 10, 11 }, // und_AM -> hy_Armn_AM
- { 0, 0, 6 }, { 91, 7, 6 }, // und_AO -> pt_Latn_AO
- { 0, 0, 8 }, { 0, 7, 8 }, // und_AQ -> und_Latn_AQ
- { 0, 0, 10 }, { 111, 7, 10 }, // und_AR -> es_Latn_AR
- { 0, 0, 4 }, { 97, 7, 4 }, // und_AS -> sm_Latn_AS
- { 0, 0, 14 }, { 42, 7, 14 }, // und_AT -> de_Latn_AT
- { 0, 0, 12 }, { 30, 7, 12 }, // und_AW -> nl_Latn_AW
- { 0, 0, 248 }, { 114, 7, 248 }, // und_AX -> sv_Latn_AX
- { 0, 0, 15 }, { 12, 7, 15 }, // und_AZ -> az_Latn_AZ
- { 0, 0, 27 }, { 142, 7, 27 }, // und_BA -> bs_Latn_BA
- { 0, 0, 18 }, { 15, 11, 18 }, // und_BD -> bn_Beng_BD
- { 0, 0, 21 }, { 30, 7, 21 }, // und_BE -> nl_Latn_BE
- { 0, 0, 34 }, { 37, 7, 34 }, // und_BF -> fr_Latn_BF
- { 0, 0, 33 }, { 20, 2, 33 }, // und_BG -> bg_Cyrl_BG
- { 0, 0, 17 }, { 8, 1, 17 }, // und_BH -> ar_Arab_BH
- { 0, 0, 35 }, { 68, 7, 35 }, // und_BI -> rn_Latn_BI
- { 0, 0, 23 }, { 37, 7, 23 }, // und_BJ -> fr_Latn_BJ
- { 0, 0, 244 }, { 37, 7, 244 }, // und_BL -> fr_Latn_BL
- { 0, 0, 32 }, { 76, 7, 32 }, // und_BN -> ms_Latn_BN
- { 0, 0, 26 }, { 111, 7, 26 }, // und_BO -> es_Latn_BO
- { 0, 0, 255 }, { 351, 7, 255 }, // und_BQ -> pap_Latn_BQ
- { 0, 0, 30 }, { 91, 7, 30 }, // und_BR -> pt_Latn_BR
- { 0, 0, 25 }, { 16, 31, 25 }, // und_BT -> dz_Tibt_BT
- { 0, 0, 29 }, { 0, 7, 29 }, // und_BV -> und_Latn_BV
- { 0, 0, 20 }, { 22, 2, 20 }, // und_BY -> be_Cyrl_BY
- { 0, 0, 49 }, { 113, 7, 49 }, // und_CD -> sw_Latn_CD
- { 0, 0, 41 }, { 37, 7, 41 }, // und_CF -> fr_Latn_CF
- { 0, 0, 50 }, { 37, 7, 50 }, // und_CG -> fr_Latn_CG
- { 0, 0, 206 }, { 42, 7, 206 }, // und_CH -> de_Latn_CH
- { 0, 0, 53 }, { 37, 7, 53 }, // und_CI -> fr_Latn_CI
- { 0, 0, 43 }, { 111, 7, 43 }, // und_CL -> es_Latn_CL
- { 0, 0, 37 }, { 37, 7, 37 }, // und_CM -> fr_Latn_CM
- { 0, 0, 44 }, { 25, 5, 44 }, // und_CN -> zh_Hans_CN
- { 0, 0, 47 }, { 111, 7, 47 }, // und_CO -> es_Latn_CO
- { 0, 0, 241 }, { 0, 7, 241 }, // und_CP -> und_Latn_CP
- { 0, 0, 52 }, { 111, 7, 52 }, // und_CR -> es_Latn_CR
- { 0, 0, 55 }, { 111, 7, 55 }, // und_CU -> es_Latn_CU
- { 0, 0, 39 }, { 91, 7, 39 }, // und_CV -> pt_Latn_CV
- { 0, 0, 152 }, { 351, 7, 152 }, // und_CW -> pap_Latn_CW
- { 0, 0, 56 }, { 43, 16, 56 }, // und_CY -> el_Grek_CY
- { 0, 0, 57 }, { 28, 7, 57 }, // und_CZ -> cs_Latn_CZ
- { 0, 0, 82 }, { 42, 7, 82 }, // und_DE -> de_Latn_DE
- { 0, 0, 59 }, { 4, 7, 59 }, // und_DJ -> aa_Latn_DJ
- { 0, 0, 58 }, { 29, 7, 58 }, // und_DK -> da_Latn_DK
- { 0, 0, 61 }, { 111, 7, 61 }, // und_DO -> es_Latn_DO
- { 0, 0, 3 }, { 8, 1, 3 }, // und_DZ -> ar_Arab_DZ
- { 0, 0, 250 }, { 111, 7, 250 }, // und_EA -> es_Latn_EA
- { 0, 0, 63 }, { 111, 7, 63 }, // und_EC -> es_Latn_EC
- { 0, 0, 68 }, { 33, 7, 68 }, // und_EE -> et_Latn_EE
- { 0, 0, 64 }, { 8, 1, 64 }, // und_EG -> ar_Arab_EG
- { 0, 0, 236 }, { 8, 1, 236 }, // und_EH -> ar_Arab_EH
- { 0, 0, 67 }, { 122, 14, 67 }, // und_ER -> ti_Ethi_ER
- { 0, 0, 197 }, { 111, 7, 197 }, // und_ES -> es_Latn_ES
- { 0, 0, 69 }, { 7, 14, 69 }, // und_ET -> am_Ethi_ET
- { 0, 0, 258 }, { 31, 7, 224 }, // und_EU -> en_Latn_GB
- { 0, 0, 73 }, { 36, 7, 73 }, // und_FI -> fi_Latn_FI
- { 0, 0, 71 }, { 34, 7, 71 }, // und_FO -> fo_Latn_FO
- { 0, 0, 74 }, { 37, 7, 74 }, // und_FR -> fr_Latn_FR
- { 0, 0, 79 }, { 37, 7, 79 }, // und_GA -> fr_Latn_GA
- { 0, 0, 81 }, { 41, 15, 81 }, // und_GE -> ka_Geor_GE
- { 0, 0, 76 }, { 37, 7, 76 }, // und_GF -> fr_Latn_GF
- { 0, 0, 83 }, { 146, 7, 83 }, // und_GH -> ak_Latn_GH
- { 0, 0, 86 }, { 44, 7, 86 }, // und_GL -> kl_Latn_GL
- { 0, 0, 91 }, { 37, 7, 91 }, // und_GN -> fr_Latn_GN
- { 0, 0, 88 }, { 37, 7, 88 }, // und_GP -> fr_Latn_GP
- { 0, 0, 66 }, { 111, 7, 66 }, // und_GQ -> es_Latn_GQ
- { 0, 0, 85 }, { 43, 16, 85 }, // und_GR -> el_Grek_GR
- { 0, 0, 196 }, { 0, 7, 196 }, // und_GS -> und_Latn_GS
- { 0, 0, 90 }, { 111, 7, 90 }, // und_GT -> es_Latn_GT
- { 0, 0, 92 }, { 91, 7, 92 }, // und_GW -> pt_Latn_GW
- { 0, 0, 97 }, { 25, 6, 97 }, // und_HK -> zh_Hant_HK
- { 0, 0, 95 }, { 0, 7, 95 }, // und_HM -> und_Latn_HM
- { 0, 0, 96 }, { 111, 7, 96 }, // und_HN -> es_Latn_HN
- { 0, 0, 54 }, { 27, 7, 54 }, // und_HR -> hr_Latn_HR
- { 0, 0, 94 }, { 222, 7, 94 }, // und_HT -> ht_Latn_HT
- { 0, 0, 98 }, { 50, 7, 98 }, // und_HU -> hu_Latn_HU
- { 0, 0, 238 }, { 111, 7, 238 }, // und_IC -> es_Latn_IC
- { 0, 0, 101 }, { 52, 7, 101 }, // und_ID -> id_Latn_ID
- { 0, 0, 105 }, { 48, 18, 105 }, // und_IL -> he_Hebr_IL
- { 0, 0, 100 }, { 49, 13, 100 }, // und_IN -> hi_Deva_IN
- { 0, 0, 103 }, { 8, 1, 103 }, // und_IQ -> ar_Arab_IQ
- { 0, 0, 102 }, { 89, 1, 102 }, // und_IR -> fa_Arab_IR
- { 0, 0, 99 }, { 51, 7, 99 }, // und_IS -> is_Latn_IS
- { 0, 0, 106 }, { 58, 7, 106 }, // und_IT -> it_Latn_IT
- { 0, 0, 109 }, { 8, 1, 109 }, // und_JO -> ar_Arab_JO
- { 0, 0, 108 }, { 59, 19, 108 }, // und_JP -> ja_Jpan_JP
- { 0, 0, 111 }, { 113, 7, 111 }, // und_KE -> sw_Latn_KE
- { 0, 0, 116 }, { 65, 2, 116 }, // und_KG -> ky_Cyrl_KG
- { 0, 0, 36 }, { 23, 20, 36 }, // und_KH -> km_Khmr_KH
- { 0, 0, 48 }, { 8, 1, 48 }, // und_KM -> ar_Arab_KM
- { 0, 0, 113 }, { 66, 22, 113 }, // und_KP -> ko_Kore_KP
- { 0, 0, 114 }, { 66, 22, 114 }, // und_KR -> ko_Kore_KR
- { 0, 0, 115 }, { 8, 1, 115 }, // und_KW -> ar_Arab_KW
- { 0, 0, 110 }, { 96, 2, 110 }, // und_KZ -> ru_Cyrl_KZ
- { 0, 0, 117 }, { 69, 23, 117 }, // und_LA -> lo_Laoo_LA
- { 0, 0, 119 }, { 8, 1, 119 }, // und_LB -> ar_Arab_LB
- { 0, 0, 123 }, { 42, 7, 123 }, // und_LI -> de_Latn_LI
- { 0, 0, 198 }, { 106, 32, 198 }, // und_LK -> si_Sinh_LK
- { 0, 0, 120 }, { 102, 7, 120 }, // und_LS -> st_Latn_LS
- { 0, 0, 124 }, { 73, 7, 124 }, // und_LT -> lt_Latn_LT
- { 0, 0, 125 }, { 37, 7, 125 }, // und_LU -> fr_Latn_LU
- { 0, 0, 118 }, { 71, 7, 118 }, // und_LV -> lv_Latn_LV
- { 0, 0, 122 }, { 8, 1, 122 }, // und_LY -> ar_Arab_LY
- { 0, 0, 145 }, { 8, 1, 145 }, // und_MA -> ar_Arab_MA
- { 0, 0, 142 }, { 37, 7, 142 }, // und_MC -> fr_Latn_MC
- { 0, 0, 141 }, { 95, 7, 141 }, // und_MD -> ro_Latn_MD
- { 0, 0, 242 }, { 100, 7, 242 }, // und_ME -> sr_Latn_ME
- { 0, 0, 245 }, { 37, 7, 245 }, // und_MF -> fr_Latn_MF
- { 0, 0, 128 }, { 75, 7, 128 }, // und_MG -> mg_Latn_MG
- { 0, 0, 127 }, { 74, 2, 127 }, // und_MK -> mk_Cyrl_MK
- { 0, 0, 132 }, { 188, 7, 132 }, // und_ML -> bm_Latn_ML
- { 0, 0, 147 }, { 21, 25, 147 }, // und_MM -> my_Mymr_MM
- { 0, 0, 143 }, { 82, 2, 143 }, // und_MN -> mn_Cyrl_MN
- { 0, 0, 126 }, { 25, 6, 126 }, // und_MO -> zh_Hant_MO
- { 0, 0, 135 }, { 37, 7, 135 }, // und_MQ -> fr_Latn_MQ
- { 0, 0, 136 }, { 8, 1, 136 }, // und_MR -> ar_Arab_MR
- { 0, 0, 133 }, { 78, 7, 133 }, // und_MT -> mt_Latn_MT
- { 0, 0, 137 }, { 191, 7, 137 }, // und_MU -> mfe_Latn_MU
- { 0, 0, 131 }, { 143, 29, 131 }, // und_MV -> dv_Thaa_MV
- { 0, 0, 139 }, { 111, 7, 139 }, // und_MX -> es_Latn_MX
- { 0, 0, 130 }, { 76, 7, 130 }, // und_MY -> ms_Latn_MY
- { 0, 0, 146 }, { 91, 7, 146 }, // und_MZ -> pt_Latn_MZ
- { 0, 0, 148 }, { 5, 7, 148 }, // und_NA -> af_Latn_NA
- { 0, 0, 153 }, { 37, 7, 153 }, // und_NC -> fr_Latn_NC
- { 0, 0, 156 }, { 47, 7, 156 }, // und_NE -> ha_Latn_NE
- { 0, 0, 155 }, { 111, 7, 155 }, // und_NI -> es_Latn_NI
- { 0, 0, 151 }, { 30, 7, 151 }, // und_NL -> nl_Latn_NL
- { 0, 0, 161 }, { 85, 7, 161 }, // und_NO -> nb_Latn_NO
- { 0, 0, 150 }, { 84, 13, 150 }, // und_NP -> ne_Deva_NP
- { 0, 0, 162 }, { 8, 1, 162 }, // und_OM -> ar_Arab_OM
- { 0, 0, 166 }, { 111, 7, 166 }, // und_PA -> es_Latn_PA
- { 0, 0, 169 }, { 111, 7, 169 }, // und_PE -> es_Latn_PE
- { 0, 0, 77 }, { 37, 7, 77 }, // und_PF -> fr_Latn_PF
- { 0, 0, 167 }, { 354, 7, 167 }, // und_PG -> tpi_Latn_PG
- { 0, 0, 170 }, { 166, 7, 170 }, // und_PH -> fil_Latn_PH
- { 0, 0, 163 }, { 130, 1, 163 }, // und_PK -> ur_Arab_PK
- { 0, 0, 172 }, { 90, 7, 172 }, // und_PL -> pl_Latn_PL
- { 0, 0, 200 }, { 37, 7, 200 }, // und_PM -> fr_Latn_PM
- { 0, 0, 174 }, { 111, 7, 174 }, // und_PR -> es_Latn_PR
- { 0, 0, 165 }, { 8, 1, 165 }, // und_PS -> ar_Arab_PS
- { 0, 0, 173 }, { 91, 7, 173 }, // und_PT -> pt_Latn_PT
- { 0, 0, 164 }, { 350, 7, 164 }, // und_PW -> pau_Latn_PW
- { 0, 0, 168 }, { 45, 7, 168 }, // und_PY -> gn_Latn_PY
- { 0, 0, 175 }, { 8, 1, 175 }, // und_QA -> ar_Arab_QA
- { 0, 0, 259 }, { 31, 7, 249 }, // und_QO -> en_Latn_DG
- { 0, 0, 176 }, { 37, 7, 176 }, // und_RE -> fr_Latn_RE
- { 0, 0, 177 }, { 95, 7, 177 }, // und_RO -> ro_Latn_RO
- { 0, 0, 243 }, { 100, 2, 243 }, // und_RS -> sr_Cyrl_RS
- { 0, 0, 178 }, { 96, 2, 178 }, // und_RU -> ru_Cyrl_RU
- { 0, 0, 179 }, { 64, 7, 179 }, // und_RW -> rw_Latn_RW
- { 0, 0, 186 }, { 8, 1, 186 }, // und_SA -> ar_Arab_SA
- { 0, 0, 188 }, { 37, 7, 188 }, // und_SC -> fr_Latn_SC
- { 0, 0, 201 }, { 8, 1, 201 }, // und_SD -> ar_Arab_SD
- { 0, 0, 205 }, { 114, 7, 205 }, // und_SE -> sv_Latn_SE
- { 0, 0, 192 }, { 109, 7, 192 }, // und_SI -> sl_Latn_SI
- { 0, 0, 203 }, { 85, 7, 203 }, // und_SJ -> nb_Latn_SJ
- { 0, 0, 191 }, { 108, 7, 191 }, // und_SK -> sk_Latn_SK
- { 0, 0, 184 }, { 58, 7, 184 }, // und_SM -> it_Latn_SM
- { 0, 0, 187 }, { 37, 7, 187 }, // und_SN -> fr_Latn_SN
- { 0, 0, 194 }, { 110, 7, 194 }, // und_SO -> so_Latn_SO
- { 0, 0, 202 }, { 30, 7, 202 }, // und_SR -> nl_Latn_SR
- { 0, 0, 185 }, { 91, 7, 185 }, // und_ST -> pt_Latn_ST
- { 0, 0, 65 }, { 111, 7, 65 }, // und_SV -> es_Latn_SV
- { 0, 0, 207 }, { 8, 1, 207 }, // und_SY -> ar_Arab_SY
- { 0, 0, 42 }, { 37, 7, 42 }, // und_TD -> fr_Latn_TD
- { 0, 0, 78 }, { 37, 7, 78 }, // und_TF -> fr_Latn_TF
- { 0, 0, 212 }, { 37, 7, 212 }, // und_TG -> fr_Latn_TG
- { 0, 0, 211 }, { 120, 30, 211 }, // und_TH -> th_Thai_TH
- { 0, 0, 209 }, { 116, 2, 209 }, // und_TJ -> tg_Cyrl_TJ
- { 0, 0, 213 }, { 353, 7, 213 }, // und_TK -> tkl_Latn_TK
- { 0, 0, 62 }, { 91, 7, 62 }, // und_TL -> pt_Latn_TL
- { 0, 0, 218 }, { 126, 7, 218 }, // und_TM -> tk_Latn_TM
- { 0, 0, 216 }, { 8, 1, 216 }, // und_TN -> ar_Arab_TN
- { 0, 0, 214 }, { 123, 7, 214 }, // und_TO -> to_Latn_TO
- { 0, 0, 217 }, { 125, 7, 217 }, // und_TR -> tr_Latn_TR
- { 0, 0, 220 }, { 355, 7, 220 }, // und_TV -> tvl_Latn_TV
- { 0, 0, 208 }, { 25, 6, 208 }, // und_TW -> zh_Hant_TW
- { 0, 0, 210 }, { 113, 7, 210 }, // und_TZ -> sw_Latn_TZ
- { 0, 0, 222 }, { 129, 2, 222 }, // und_UA -> uk_Cyrl_UA
- { 0, 0, 221 }, { 113, 7, 221 }, // und_UG -> sw_Latn_UG
- { 0, 0, 227 }, { 111, 7, 227 }, // und_UY -> es_Latn_UY
- { 0, 0, 228 }, { 131, 7, 228 }, // und_UZ -> uz_Latn_UZ
- { 0, 0, 230 }, { 58, 7, 230 }, // und_VA -> it_Latn_VA
- { 0, 0, 231 }, { 111, 7, 231 }, // und_VE -> es_Latn_VE
- { 0, 0, 232 }, { 132, 7, 232 }, // und_VN -> vi_Latn_VN
- { 0, 0, 229 }, { 18, 7, 229 }, // und_VU -> bi_Latn_VU
- { 0, 0, 235 }, { 37, 7, 235 }, // und_WF -> fr_Latn_WF
- { 0, 0, 183 }, { 97, 7, 183 }, // und_WS -> sm_Latn_WS
- { 0, 0, 257 }, { 6, 7, 257 }, // und_XK -> sq_Latn_XK
- { 0, 0, 237 }, { 8, 1, 237 }, // und_YE -> ar_Arab_YE
- { 0, 0, 138 }, { 37, 7, 138 }, // und_YT -> fr_Latn_YT
- { 0, 0, 240 }, { 104, 7, 240 }, // und_ZW -> sn_Latn_ZW
- { 0, 134, 0 }, { 177, 134, 91 }, // und_Adlm -> ff_Adlm_GN
- { 0, 105, 0 }, { 335, 105, 178 }, // und_Aghb -> lez_Aghb_RU
- { 0, 128, 0 }, { 340, 128, 100 }, // und_Ahom -> aho_Ahom_IN
- { 0, 1, 0 }, { 8, 1, 64 }, // und_Arab -> ar_Arab_EG
- { 0, 1, 46 }, { 76, 1, 46 }, // und_Arab_CC -> ms_Arab_CC
- { 0, 1, 44 }, { 128, 1, 44 }, // und_Arab_CN -> ug_Arab_CN
- { 0, 1, 224 }, { 62, 1, 224 }, // und_Arab_GB -> ks_Arab_GB
- { 0, 1, 101 }, { 76, 1, 101 }, // und_Arab_ID -> ms_Arab_ID
- { 0, 1, 100 }, { 130, 1, 100 }, // und_Arab_IN -> ur_Arab_IN
- { 0, 1, 143 }, { 63, 1, 143 }, // und_Arab_MN -> kk_Arab_MN
- { 0, 1, 137 }, { 130, 1, 137 }, // und_Arab_MU -> ur_Arab_MU
- { 0, 1, 157 }, { 47, 1, 157 }, // und_Arab_NG -> ha_Arab_NG
- { 0, 1, 163 }, { 130, 1, 163 }, // und_Arab_PK -> ur_Arab_PK
- { 0, 1, 209 }, { 89, 1, 209 }, // und_Arab_TJ -> fa_Arab_TJ
- { 0, 1, 217 }, { 12, 1, 217 }, // und_Arab_TR -> az_Arab_TR
- { 0, 57, 0 }, { 265, 57, 102 }, // und_Armi -> arc_Armi_IR
- { 0, 10, 0 }, { 9, 10, 11 }, // und_Armn -> hy_Armn_AM
- { 0, 36, 0 }, { 255, 36, 102 }, // und_Avst -> ae_Avst_IR
- { 0, 37, 0 }, { 266, 37, 101 }, // und_Bali -> ban_Bali_ID
- { 0, 38, 0 }, { 267, 38, 37 }, // und_Bamu -> bax_Bamu_CM
- { 0, 106, 0 }, { 336, 106, 121 }, // und_Bass -> bsq_Bass_LR
- { 0, 39, 0 }, { 268, 39, 101 }, // und_Batk -> bbc_Batk_ID
- { 0, 11, 0 }, { 15, 11, 18 }, // und_Beng -> bn_Beng_BD
- { 0, 135, 0 }, { 99, 135, 100 }, // und_Bhks -> sa_Bhks_IN
- { 0, 40, 0 }, { 25, 40, 208 }, // und_Bopo -> zh_Bopo_TW
- { 0, 41, 0 }, { 342, 41, 100 }, // und_Brah -> pka_Brah_IN
- { 0, 103, 0 }, { 37, 103, 74 }, // und_Brai -> fr_Brai_FR
- { 0, 42, 0 }, { 269, 42, 101 }, // und_Bugi -> bug_Bugi_ID
- { 0, 43, 0 }, { 270, 43, 170 }, // und_Buhd -> bku_Buhd_PH
- { 0, 46, 0 }, { 272, 46, 18 }, // und_Cakm -> ccp_Cakm_BD
- { 0, 44, 0 }, { 221, 44, 38 }, // und_Cans -> cr_Cans_CA
- { 0, 45, 0 }, { 271, 45, 217 }, // und_Cari -> xcr_Cari_TR
- { 0, 47, 0 }, { 276, 47, 232 }, // und_Cham -> cjm_Cham_VN
- { 0, 12, 0 }, { 190, 12, 225 }, // und_Cher -> chr_Cher_US
- { 0, 48, 0 }, { 274, 48, 64 }, // und_Copt -> cop_Copt_EG
- { 0, 49, 0 }, { 264, 49, 56 }, // und_Cprt -> grc_Cprt_CY
- { 0, 2, 0 }, { 96, 2, 178 }, // und_Cyrl -> ru_Cyrl_RU
- { 0, 2, 2 }, { 74, 2, 2 }, // und_Cyrl_AL -> mk_Cyrl_AL
- { 0, 2, 27 }, { 100, 2, 27 }, // und_Cyrl_BA -> sr_Cyrl_BA
- { 0, 2, 81 }, { 2, 2, 81 }, // und_Cyrl_GE -> ab_Cyrl_GE
- { 0, 2, 85 }, { 74, 2, 85 }, // und_Cyrl_GR -> mk_Cyrl_GR
- { 0, 2, 141 }, { 129, 2, 141 }, // und_Cyrl_MD -> uk_Cyrl_MD
- { 0, 2, 177 }, { 20, 2, 177 }, // und_Cyrl_RO -> bg_Cyrl_RO
- { 0, 2, 191 }, { 129, 2, 191 }, // und_Cyrl_SK -> uk_Cyrl_SK
- { 0, 2, 257 }, { 100, 2, 257 }, // und_Cyrl_XK -> sr_Cyrl_XK
- { 0, 13, 0 }, { 49, 13, 100 }, // und_Deva -> hi_Deva_IN
- { 0, 13, 25 }, { 84, 13, 25 }, // und_Deva_BT -> ne_Deva_BT
- { 0, 13, 137 }, { 343, 13, 137 }, // und_Deva_MU -> bho_Deva_MU
- { 0, 107, 0 }, { 37, 107, 74 }, // und_Dupl -> fr_Dupl_FR
- { 0, 50, 0 }, { 263, 50, 64 }, // und_Egyp -> egy_Egyp_EG
- { 0, 108, 0 }, { 6, 108, 2 }, // und_Elba -> sq_Elba_AL
- { 0, 14, 0 }, { 7, 14, 69 }, // und_Ethi -> am_Ethi_ET
- { 0, 15, 0 }, { 41, 15, 81 }, // und_Geor -> ka_Geor_GE
- { 0, 52, 0 }, { 219, 52, 33 }, // und_Glag -> cu_Glag_BG
- { 0, 53, 0 }, { 279, 53, 222 }, // und_Goth -> got_Goth_UA
- { 0, 109, 0 }, { 99, 109, 100 }, // und_Gran -> sa_Gran_IN
- { 0, 16, 0 }, { 43, 16, 85 }, // und_Grek -> el_Grek_GR
- { 0, 17, 0 }, { 46, 17, 100 }, // und_Gujr -> gu_Gujr_IN
- { 0, 4, 0 }, { 92, 4, 100 }, // und_Guru -> pa_Guru_IN
- { 0, 140, 0 }, { 25, 140, 208 }, // und_Hanb -> zh_Hanb_TW
- { 0, 55, 0 }, { 66, 55, 114 }, // und_Hang -> ko_Hang_KR
- { 0, 54, 0 }, { 25, 54, 44 }, // und_Hani -> zh_Hani_CN
- { 0, 56, 0 }, { 280, 56, 170 }, // und_Hano -> hnn_Hano_PH
- { 0, 5, 0 }, { 25, 5, 44 }, // und_Hans -> zh_Hans_CN
- { 0, 6, 0 }, { 25, 6, 208 }, // und_Hant -> zh_Hant_TW
- { 0, 130, 0 }, { 356, 130, 103 }, // und_Hatr -> mis_Hatr_IQ
- { 0, 18, 0 }, { 48, 18, 105 }, // und_Hebr -> he_Hebr_IL
- { 0, 18, 38 }, { 137, 18, 38 }, // und_Hebr_CA -> yi_Hebr_CA
- { 0, 18, 224 }, { 137, 18, 224 }, // und_Hebr_GB -> yi_Hebr_GB
- { 0, 18, 205 }, { 137, 18, 205 }, // und_Hebr_SE -> yi_Hebr_SE
- { 0, 18, 222 }, { 137, 18, 222 }, // und_Hebr_UA -> yi_Hebr_UA
- { 0, 18, 225 }, { 137, 18, 225 }, // und_Hebr_US -> yi_Hebr_US
- { 0, 104, 0 }, { 59, 104, 108 }, // und_Hira -> ja_Hira_JP
- { 0, 129, 0 }, { 344, 129, 217 }, // und_Hluw -> hlu_Hluw_TR
- { 0, 110, 0 }, { 333, 110, 117 }, // und_Hmng -> hnj_Hmng_LA
- { 0, 132, 0 }, { 50, 132, 98 }, // und_Hung -> hu_Hung_HU
- { 0, 79, 0 }, { 278, 79, 106 }, // und_Ital -> ett_Ital_IT
- { 0, 141, 0 }, { 66, 141, 114 }, // und_Jamo -> ko_Jamo_KR
- { 0, 60, 0 }, { 60, 60, 101 }, // und_Java -> jv_Java_ID
- { 0, 19, 0 }, { 59, 19, 108 }, // und_Jpan -> ja_Jpan_JP
- { 0, 63, 0 }, { 277, 63, 147 }, // und_Kali -> eky_Kali_MM
- { 0, 62, 0 }, { 59, 62, 108 }, // und_Kana -> ja_Kana_JP
- { 0, 64, 0 }, { 300, 64, 163 }, // und_Khar -> pra_Khar_PK
- { 0, 20, 0 }, { 23, 20, 36 }, // und_Khmr -> km_Khmr_KH
- { 0, 111, 0 }, { 105, 111, 100 }, // und_Khoj -> sd_Khoj_IN
- { 0, 21, 0 }, { 61, 21, 100 }, // und_Knda -> kn_Knda_IN
- { 0, 22, 0 }, { 66, 22, 114 }, // und_Kore -> ko_Kore_KR
- { 0, 61, 0 }, { 343, 61, 100 }, // und_Kthi -> bho_Kthi_IN
- { 0, 65, 0 }, { 292, 65, 211 }, // und_Lana -> nod_Lana_TH
- { 0, 23, 0 }, { 69, 23, 117 }, // und_Laoo -> lo_Laoo_LA
- { 0, 7, 1 }, { 126, 7, 1 }, // und_Latn_AF -> tk_Latn_AF
- { 0, 7, 11 }, { 67, 7, 11 }, // und_Latn_AM -> ku_Latn_AM
- { 0, 7, 44 }, { 139, 7, 44 }, // und_Latn_CN -> za_Latn_CN
- { 0, 7, 56 }, { 125, 7, 56 }, // und_Latn_CY -> tr_Latn_CY
- { 0, 7, 3 }, { 37, 7, 3 }, // und_Latn_DZ -> fr_Latn_DZ
- { 0, 7, 69 }, { 31, 7, 69 }, // und_Latn_ET -> en_Latn_ET
- { 0, 7, 81 }, { 67, 7, 81 }, // und_Latn_GE -> ku_Latn_GE
- { 0, 7, 102 }, { 126, 7, 102 }, // und_Latn_IR -> tk_Latn_IR
- { 0, 7, 48 }, { 37, 7, 48 }, // und_Latn_KM -> fr_Latn_KM
- { 0, 7, 145 }, { 37, 7, 145 }, // und_Latn_MA -> fr_Latn_MA
- { 0, 7, 127 }, { 6, 7, 127 }, // und_Latn_MK -> sq_Latn_MK
- { 0, 7, 126 }, { 91, 7, 126 }, // und_Latn_MO -> pt_Latn_MO
- { 0, 7, 136 }, { 37, 7, 136 }, // und_Latn_MR -> fr_Latn_MR
- { 0, 7, 207 }, { 37, 7, 207 }, // und_Latn_SY -> fr_Latn_SY
- { 0, 7, 216 }, { 37, 7, 216 }, // und_Latn_TN -> fr_Latn_TN
- { 0, 7, 208 }, { 174, 7, 208 }, // und_Latn_TW -> trv_Latn_TW
- { 0, 7, 222 }, { 90, 7, 222 }, // und_Latn_UA -> pl_Latn_UA
- { 0, 66, 0 }, { 283, 66, 100 }, // und_Lepc -> lep_Lepc_IN
- { 0, 67, 0 }, { 284, 67, 100 }, // und_Limb -> lif_Limb_IN
- { 0, 112, 0 }, { 332, 112, 85 }, // und_Lina -> lab_Lina_GR
- { 0, 68, 0 }, { 264, 68, 85 }, // und_Linb -> grc_Linb_GR
- { 0, 51, 0 }, { 285, 51, 44 }, // und_Lisu -> lis_Lisu_CN
- { 0, 69, 0 }, { 287, 69, 217 }, // und_Lyci -> xlc_Lyci_TR
- { 0, 70, 0 }, { 288, 70, 217 }, // und_Lydi -> xld_Lydi_TR
- { 0, 113, 0 }, { 49, 113, 100 }, // und_Mahj -> hi_Mahj_IN
- { 0, 71, 0 }, { 273, 71, 102 }, // und_Mand -> myz_Mand_IR
- { 0, 114, 0 }, { 329, 114, 44 }, // und_Mani -> xmn_Mani_CN
- { 0, 136, 0 }, { 121, 136, 44 }, // und_Marc -> bo_Marc_CN
- { 0, 115, 0 }, { 330, 115, 189 }, // und_Mend -> men_Mend_SL
- { 0, 74, 0 }, { 291, 74, 201 }, // und_Merc -> xmr_Merc_SD
- { 0, 73, 0 }, { 291, 73, 201 }, // und_Mero -> xmr_Mero_SD
- { 0, 24, 0 }, { 77, 24, 100 }, // und_Mlym -> ml_Mlym_IN
- { 0, 116, 0 }, { 80, 116, 100 }, // und_Modi -> mr_Modi_IN
- { 0, 8, 0 }, { 82, 8, 44 }, // und_Mong -> mn_Mong_CN
- { 0, 117, 0 }, { 347, 117, 18 }, // und_Mroo -> mro_Mroo_BD
- { 0, 72, 0 }, { 290, 72, 100 }, // und_Mtei -> mni_Mtei_IN
- { 0, 131, 0 }, { 352, 131, 163 }, // und_Mult -> skr_Mult_PK
- { 0, 25, 0 }, { 21, 25, 147 }, // und_Mymr -> my_Mymr_MM
- { 0, 118, 0 }, { 331, 118, 186 }, // und_Narb -> xna_Narb_SA
- { 0, 119, 0 }, { 265, 119, 109 }, // und_Nbat -> arc_Nbat_JO
- { 0, 137, 0 }, { 348, 137, 150 }, // und_Newa -> new_Newa_NP
- { 0, 75, 0 }, { 289, 75, 91 }, // und_Nkoo -> man_Nkoo_GN
- { 0, 77, 0 }, { 293, 77, 104 }, // und_Ogam -> sga_Ogam_IE
- { 0, 78, 0 }, { 304, 78, 100 }, // und_Olck -> sat_Olck_IN
- { 0, 82, 0 }, { 296, 82, 143 }, // und_Orkh -> otk_Orkh_MN
- { 0, 26, 0 }, { 87, 26, 100 }, // und_Orya -> or_Orya_IN
- { 0, 138, 0 }, { 358, 138, 225 }, // und_Osge -> osa_Osge_US
- { 0, 83, 0 }, { 110, 83, 194 }, // und_Osma -> so_Osma_SO
- { 0, 120, 0 }, { 265, 120, 207 }, // und_Palm -> arc_Palm_SY
- { 0, 121, 0 }, { 338, 121, 147 }, // und_Pauc -> ctd_Pauc_MM
- { 0, 122, 0 }, { 226, 122, 178 }, // und_Perm -> kv_Perm_RU
- { 0, 84, 0 }, { 345, 84, 44 }, // und_Phag -> lzh_Phag_CN
- { 0, 58, 0 }, { 297, 58, 102 }, // und_Phli -> pal_Phli_IR
- { 0, 123, 0 }, { 297, 123, 44 }, // und_Phlp -> pal_Phlp_CN
- { 0, 85, 0 }, { 299, 85, 119 }, // und_Phnx -> phn_Phnx_LB
- { 0, 86, 0 }, { 282, 86, 44 }, // und_Plrd -> hmd_Plrd_CN
- { 0, 59, 0 }, { 298, 59, 102 }, // und_Prti -> xpr_Prti_IR
- { 0, 87, 0 }, { 301, 87, 101 }, // und_Rjng -> rej_Rjng_ID
- { 0, 88, 0 }, { 294, 88, 205 }, // und_Runr -> non_Runr_SE
- { 0, 89, 0 }, { 303, 89, 105 }, // und_Samr -> smp_Samr_IL
- { 0, 81, 0 }, { 302, 81, 237 }, // und_Sarb -> xsa_Sarb_YE
- { 0, 90, 0 }, { 305, 90, 100 }, // und_Saur -> saz_Saur_IN
- { 0, 133, 0 }, { 341, 133, 225 }, // und_Sgnw -> ase_Sgnw_US
- { 0, 92, 0 }, { 31, 92, 224 }, // und_Shaw -> en_Shaw_GB
- { 0, 91, 0 }, { 99, 91, 100 }, // und_Shrd -> sa_Shrd_IN
- { 0, 124, 0 }, { 99, 124, 100 }, // und_Sidd -> sa_Sidd_IN
- { 0, 125, 0 }, { 105, 125, 100 }, // und_Sind -> sd_Sind_IN
- { 0, 32, 0 }, { 106, 32, 198 }, // und_Sinh -> si_Sinh_LK
- { 0, 93, 0 }, { 306, 93, 100 }, // und_Sora -> srb_Sora_IN
- { 0, 95, 0 }, { 112, 95, 101 }, // und_Sund -> su_Sund_ID
- { 0, 96, 0 }, { 307, 96, 18 }, // und_Sylo -> syl_Sylo_BD
- { 0, 33, 0 }, { 151, 33, 103 }, // und_Syrc -> syr_Syrc_IQ
- { 0, 98, 0 }, { 308, 98, 170 }, // und_Tagb -> tbw_Tagb_PH
- { 0, 101, 0 }, { 275, 101, 100 }, // und_Takr -> doi_Takr_IN
- { 0, 99, 0 }, { 310, 99, 44 }, // und_Tale -> tdd_Tale_CN
- { 0, 76, 0 }, { 286, 76, 44 }, // und_Talu -> khb_Talu_CN
- { 0, 27, 0 }, { 117, 27, 100 }, // und_Taml -> ta_Taml_IN
- { 0, 139, 0 }, { 359, 139, 44 }, // und_Tang -> txg_Tang_CN
- { 0, 100, 0 }, { 309, 100, 232 }, // und_Tavt -> blt_Tavt_VN
- { 0, 28, 0 }, { 119, 28, 100 }, // und_Telu -> te_Telu_IN
- { 0, 9, 0 }, { 314, 9, 145 }, // und_Tfng -> zgh_Tfng_MA
- { 0, 97, 0 }, { 166, 97, 170 }, // und_Tglg -> fil_Tglg_PH
- { 0, 29, 0 }, { 143, 29, 131 }, // und_Thaa -> dv_Thaa_MV
- { 0, 30, 0 }, { 120, 30, 211 }, // und_Thai -> th_Thai_TH
- { 0, 31, 0 }, { 121, 31, 44 }, // und_Tibt -> bo_Tibt_CN
- { 0, 126, 0 }, { 339, 126, 100 }, // und_Tirh -> mai_Tirh_IN
- { 0, 102, 0 }, { 311, 102, 207 }, // und_Ugar -> uga_Ugar_SY
- { 0, 35, 0 }, { 252, 35, 121 }, // und_Vaii -> vai_Vaii_LR
- { 0, 127, 0 }, { 334, 127, 100 }, // und_Wara -> hoc_Wara_IN
- { 0, 80, 0 }, { 295, 80, 102 }, // und_Xpeo -> peo_Xpeo_IR
- { 0, 94, 0 }, { 262, 94, 103 }, // und_Xsux -> akk_Xsux_IQ
- { 0, 34, 0 }, { 168, 34, 44 } // und_Yiii -> ii_Yiii_CN
+static constexpr QLocaleId likely_subtags[] = {
+ { 2, 0, 0 }, { 2, 27, 90 }, // ab -> ab_Cyrl_GE
+ { 3, 0, 0 }, { 3, 66, 77 }, // aa -> aa_Latn_ET
+ { 4, 0, 0 }, { 4, 66, 216 }, // af -> af_Latn_ZA
+ { 5, 0, 0 }, { 5, 66, 40 }, // agq -> agq_Latn_CM
+ { 6, 0, 0 }, { 6, 66, 92 }, // ak -> ak_Latn_GH
+ { 7, 0, 0 }, { 7, 25, 113 }, // akk -> akk_Xsux_IQ
+ { 8, 0, 0 }, { 8, 66, 40 }, // bss -> bss_Latn_CM
+ { 9, 0, 0 }, { 9, 66, 3 }, // sq -> sq_Latn_AL
+ { 10, 0, 0 }, { 10, 117, 248 }, // ase -> ase_Sgnw_US
+ { 11, 0, 0 }, { 11, 33, 77 }, // am -> am_Ethi_ET
+ { 12, 0, 0 }, { 12, 31, 71 }, // egy -> egy_Egyp_EG
+ { 13, 70, 0 }, { 13, 70, 94 }, // grc_Linb -> grc_Linb_GR
+ { 13, 0, 0 }, { 13, 26, 63 }, // grc -> grc_Cprt_CY
+ { 14, 0, 0 }, { 14, 4, 71 }, // ar -> ar_Arab_EG
+ { 15, 0, 0 }, { 15, 66, 220 }, // an -> an_Latn_ES
+ { 16, 87, 0 }, { 16, 87, 122 }, // arc_Nbat -> arc_Nbat_JO
+ { 16, 104, 0 }, { 16, 104, 227 }, // arc_Palm -> arc_Palm_SY
+ { 16, 0, 0 }, { 16, 49, 112 }, // arc -> arc_Armi_IR
+ { 17, 0, 0 }, { 17, 5, 12 }, // hy -> hy_Armn_AM
+ { 18, 0, 0 }, { 18, 9, 110 }, // as -> as_Beng_IN
+ { 19, 0, 0 }, { 19, 66, 220 }, // ast -> ast_Latn_ES
+ { 20, 0, 0 }, { 20, 66, 230 }, // asa -> asa_Latn_TZ
+ { 21, 0, 0 }, { 21, 66, 169 }, // cch -> cch_Latn_NG
+ { 22, 0, 0 }, { 22, 27, 193 }, // av -> av_Cyrl_RU
+ { 23, 0, 0 }, { 23, 6, 112 }, // ae -> ae_Avst_IR
+ { 24, 0, 0 }, { 24, 66, 28 }, // ay -> ay_Latn_BO
+ { 25, 0, 112 }, { 25, 4, 112 }, // az_IR -> az_Arab_IR
+ { 25, 0, 113 }, { 25, 4, 113 }, // az_IQ -> az_Arab_IQ
+ { 25, 0, 193 }, { 25, 27, 193 }, // az_RU -> az_Cyrl_RU
+ { 25, 4, 0 }, { 25, 4, 112 }, // az_Arab -> az_Arab_IR
+ { 25, 0, 0 }, { 25, 66, 17 }, // az -> az_Latn_AZ
+ { 26, 0, 0 }, { 26, 66, 40 }, // ksf -> ksf_Latn_CM
+ { 27, 0, 0 }, { 27, 66, 111 }, // ban -> ban_Latn_ID
+ { 28, 0, 0 }, { 28, 66, 145 }, // bm -> bm_Latn_ML
+ { 29, 0, 0 }, { 29, 8, 40 }, // bax -> bax_Bamu_CM
+ { 30, 0, 0 }, { 30, 9, 20 }, // bn -> bn_Beng_BD
+ { 31, 0, 0 }, { 31, 66, 40 }, // bas -> bas_Latn_CM
+ { 32, 0, 0 }, { 32, 27, 193 }, // ba -> ba_Cyrl_RU
+ { 33, 0, 0 }, { 33, 66, 220 }, // eu -> eu_Latn_ES
+ { 34, 0, 0 }, { 34, 66, 111 }, // bbc -> bbc_Latn_ID
+ { 35, 0, 0 }, { 35, 27, 22 }, // be -> be_Cyrl_BY
+ { 36, 0, 0 }, { 36, 66, 260 }, // bem -> bem_Latn_ZM
+ { 37, 0, 0 }, { 37, 66, 230 }, // bez -> bez_Latn_TZ
+ { 38, 0, 0 }, { 38, 29, 110 }, // bho -> bho_Deva_IN
+ { 39, 0, 0 }, { 39, 66, 252 }, // bi -> bi_Latn_VU
+ { 40, 0, 0 }, { 40, 33, 74 }, // byn -> byn_Ethi_ER
+ { 41, 0, 0 }, { 41, 29, 110 }, // brx -> brx_Deva_IN
+ { 42, 0, 0 }, { 42, 66, 29 }, // bs -> bs_Latn_BA
+ { 43, 0, 0 }, { 43, 66, 84 }, // br -> br_Latn_FR
+ { 44, 0, 0 }, { 44, 66, 111 }, // bug -> bug_Latn_ID
+ { 45, 0, 0 }, { 45, 27, 36 }, // bg -> bg_Cyrl_BG
+ { 46, 0, 0 }, { 46, 86, 161 }, // my -> my_Mymr_MM
+ { 47, 0, 50 }, { 47, 118, 50 }, // yue_CN -> yue_Hans_CN
+ { 47, 118, 0 }, { 47, 118, 50 }, // yue_Hans -> yue_Hans_CN
+ { 47, 0, 0 }, { 47, 137, 107 }, // yue -> yue_Hant_HK
+ { 48, 0, 0 }, { 48, 66, 220 }, // ca -> ca_Latn_ES
+ { 49, 0, 0 }, { 49, 66, 185 }, // ceb -> ceb_Latn_PH
+ { 50, 0, 0 }, { 50, 66, 159 }, // tzm -> tzm_Latn_MA
+ { 51, 0, 0 }, { 51, 4, 113 }, // ckb -> ckb_Arab_IQ
+ { 52, 0, 0 }, { 52, 21, 20 }, // ccp -> ccp_Cakm_BD
+ { 53, 0, 0 }, { 53, 66, 98 }, // ch -> ch_Latn_GU
+ { 54, 0, 0 }, { 54, 27, 193 }, // ce -> ce_Cyrl_RU
+ { 55, 0, 0 }, { 55, 23, 248 }, // chr -> chr_Cher_US
+ { 56, 0, 0 }, { 56, 66, 248 }, // cic -> cic_Latn_US
+ { 57, 0, 0 }, { 57, 66, 243 }, // cgg -> cgg_Latn_UG
+ { 58, 0, 15 }, { 58, 137, 15 }, // zh_AU -> zh_Hant_AU
+ { 58, 0, 35 }, { 58, 137, 35 }, // zh_BN -> zh_Hant_BN
+ { 58, 0, 85 }, { 58, 137, 85 }, // zh_GF -> zh_Hant_GF
+ { 58, 0, 86 }, { 58, 137, 86 }, // zh_PF -> zh_Hant_PF
+ { 58, 0, 107 }, { 58, 137, 107 }, // zh_HK -> zh_Hant_HK
+ { 58, 0, 111 }, { 58, 137, 111 }, // zh_ID -> zh_Hant_ID
+ { 58, 0, 139 }, { 58, 137, 139 }, // zh_MO -> zh_Hant_MO
+ { 58, 0, 181 }, { 58, 137, 181 }, // zh_PA -> zh_Hant_PA
+ { 58, 0, 185 }, { 58, 137, 185 }, // zh_PH -> zh_Hant_PH
+ { 58, 0, 223 }, { 58, 137, 223 }, // zh_SR -> zh_Hant_SR
+ { 58, 0, 228 }, { 58, 137, 228 }, // zh_TW -> zh_Hant_TW
+ { 58, 0, 231 }, { 58, 137, 231 }, // zh_TH -> zh_Hant_TH
+ { 58, 0, 246 }, { 58, 137, 246 }, // zh_GB -> zh_Hant_GB
+ { 58, 0, 248 }, { 58, 137, 248 }, // zh_US -> zh_Hant_US
+ { 58, 0, 255 }, { 58, 137, 255 }, // zh_VN -> zh_Hant_VN
+ { 58, 13, 0 }, { 58, 13, 228 }, // zh_Bopo -> zh_Bopo_TW
+ { 58, 45, 0 }, { 58, 45, 228 }, // zh_Hanb -> zh_Hanb_TW
+ { 58, 137, 0 }, { 58, 137, 228 }, // zh_Hant -> zh_Hant_TW
+ { 58, 0, 0 }, { 58, 118, 50 }, // zh -> zh_Hans_CN
+ { 59, 36, 0 }, { 59, 36, 36 }, // cu_Glag -> cu_Glag_BG
+ { 59, 0, 0 }, { 59, 27, 193 }, // cu -> cu_Cyrl_RU
+ { 60, 0, 0 }, { 60, 27, 193 }, // cv -> cv_Cyrl_RU
+ { 61, 0, 0 }, { 61, 66, 91 }, // ksh -> ksh_Latn_DE
+ { 62, 0, 0 }, { 62, 24, 71 }, // cop -> cop_Copt_EG
+ { 63, 0, 0 }, { 63, 66, 246 }, // kw -> kw_Latn_GB
+ { 64, 0, 0 }, { 64, 66, 84 }, // co -> co_Latn_FR
+ { 65, 0, 0 }, { 65, 18, 41 }, // cr -> cr_Cans_CA
+ { 66, 0, 0 }, { 66, 66, 60 }, // hr -> hr_Latn_HR
+ { 67, 0, 0 }, { 67, 66, 64 }, // cs -> cs_Latn_CZ
+ { 68, 0, 0 }, { 68, 66, 65 }, // da -> da_Latn_DK
+ { 69, 0, 0 }, { 69, 132, 144 }, // dv -> dv_Thaa_MV
+ { 70, 0, 0 }, { 70, 29, 110 }, // doi -> doi_Deva_IN
+ { 71, 0, 0 }, { 71, 66, 40 }, // dua -> dua_Latn_CM
+ { 72, 0, 0 }, { 72, 66, 165 }, // nl -> nl_Latn_NL
+ { 73, 0, 0 }, { 73, 134, 27 }, // dz -> dz_Tibt_BT
+ { 74, 0, 0 }, { 74, 66, 124 }, // ebu -> ebu_Latn_KE
+ { 75, 115, 0 }, { 75, 115, 246 }, // en_Shaw -> en_Shaw_GB
+ { 75, 0, 0 }, { 75, 66, 248 }, // en -> en_Latn_US
+ { 76, 0, 0 }, { 76, 27, 193 }, // myv -> myv_Cyrl_RU
+ { 77, 0, 0 }, { 77, 66, 258 }, // eo -> eo_Latn_001
+ { 78, 0, 0 }, { 78, 66, 75 }, // et -> et_Latn_EE
+ { 79, 0, 0 }, { 79, 66, 92 }, // ee -> ee_Latn_GH
+ { 80, 0, 0 }, { 80, 66, 40 }, // ewo -> ewo_Latn_CM
+ { 81, 0, 0 }, { 81, 66, 81 }, // fo -> fo_Latn_FO
+ { 82, 0, 0 }, { 82, 66, 82 }, // fj -> fj_Latn_FJ
+ { 83, 0, 0 }, { 83, 66, 185 }, // fil -> fil_Latn_PH
+ { 84, 0, 0 }, { 84, 66, 83 }, // fi -> fi_Latn_FI
+ { 85, 0, 0 }, { 85, 66, 84 }, // fr -> fr_Latn_FR
+ { 86, 0, 0 }, { 86, 66, 117 }, // fur -> fur_Latn_IT
+ { 87, 1, 0 }, { 87, 1, 102 }, // ff_Adlm -> ff_Adlm_GN
+ { 87, 0, 0 }, { 87, 66, 206 }, // ff -> ff_Latn_SN
+ { 88, 0, 0 }, { 88, 66, 246 }, // gd -> gd_Latn_GB
+ { 89, 0, 0 }, { 89, 66, 92 }, // gaa -> gaa_Latn_GH
+ { 90, 0, 0 }, { 90, 66, 220 }, // gl -> gl_Latn_ES
+ { 91, 0, 0 }, { 91, 66, 243 }, // lg -> lg_Latn_UG
+ { 92, 0, 0 }, { 92, 33, 77 }, // gez -> gez_Ethi_ET
+ { 93, 0, 0 }, { 93, 35, 90 }, // ka -> ka_Geor_GE
+ { 94, 0, 0 }, { 94, 66, 91 }, // de -> de_Latn_DE
+ { 95, 0, 0 }, { 95, 37, 244 }, // got -> got_Goth_UA
+ { 96, 0, 0 }, { 96, 39, 94 }, // el -> el_Grek_GR
+ { 97, 0, 0 }, { 97, 66, 183 }, // gn -> gn_Latn_PY
+ { 98, 0, 0 }, { 98, 40, 110 }, // gu -> gu_Gujr_IN
+ { 99, 0, 0 }, { 99, 66, 124 }, // guz -> guz_Latn_KE
+ { 100, 0, 0 }, { 100, 66, 104 }, // ht -> ht_Latn_HT
+ { 101, 0, 40 }, { 101, 4, 40 }, // ha_CM -> ha_Arab_CM
+ { 101, 0, 222 }, { 101, 4, 222 }, // ha_SD -> ha_Arab_SD
+ { 101, 0, 0 }, { 101, 66, 169 }, // ha -> ha_Latn_NG
+ { 102, 0, 0 }, { 102, 66, 248 }, // haw -> haw_Latn_US
+ { 103, 0, 0 }, { 103, 47, 116 }, // he -> he_Hebr_IL
+ { 104, 0, 0 }, { 104, 66, 162 }, // hz -> hz_Latn_NA
+ { 105, 0, 0 }, { 105, 29, 110 }, // hi -> hi_Deva_IN
+ { 106, 0, 0 }, { 106, 66, 182 }, // ho -> ho_Latn_PG
+ { 107, 0, 0 }, { 107, 66, 108 }, // hu -> hu_Latn_HU
+ { 108, 0, 0 }, { 108, 66, 109 }, // is -> is_Latn_IS
+ { 109, 0, 0 }, { 109, 66, 258 }, // io -> io_Latn_001
+ { 110, 0, 0 }, { 110, 66, 169 }, // ig -> ig_Latn_NG
+ { 111, 0, 0 }, { 111, 66, 83 }, // smn -> smn_Latn_FI
+ { 112, 0, 0 }, { 112, 66, 111 }, // id -> id_Latn_ID
+ { 113, 0, 0 }, { 113, 27, 193 }, // inh -> inh_Cyrl_RU
+ { 114, 0, 0 }, { 114, 66, 258 }, // ia -> ia_Latn_001
+ { 115, 0, 0 }, { 115, 66, 75 }, // ie -> ie_Latn_EE
+ { 116, 0, 0 }, { 116, 18, 41 }, // iu -> iu_Cans_CA
+ { 117, 0, 0 }, { 117, 66, 248 }, // ik -> ik_Latn_US
+ { 118, 0, 0 }, { 118, 66, 114 }, // ga -> ga_Latn_IE
+ { 119, 0, 0 }, { 119, 66, 117 }, // it -> it_Latn_IT
+ { 120, 0, 0 }, { 120, 53, 120 }, // ja -> ja_Jpan_JP
+ { 121, 0, 0 }, { 121, 66, 111 }, // jv -> jv_Latn_ID
+ { 122, 0, 0 }, { 122, 66, 169 }, // kaj -> kaj_Latn_NG
+ { 123, 0, 0 }, { 123, 66, 206 }, // dyo -> dyo_Latn_SN
+ { 124, 0, 0 }, { 124, 66, 43 }, // kea -> kea_Latn_CV
+ { 125, 0, 0 }, { 125, 66, 4 }, // kab -> kab_Latn_DZ
+ { 126, 0, 0 }, { 126, 66, 40 }, // kkj -> kkj_Latn_CM
+ { 127, 0, 0 }, { 127, 66, 95 }, // kl -> kl_Latn_GL
+ { 128, 0, 0 }, { 128, 66, 124 }, // kln -> kln_Latn_KE
+ { 129, 0, 0 }, { 129, 66, 124 }, // kam -> kam_Latn_KE
+ { 130, 0, 0 }, { 130, 56, 110 }, // kn -> kn_Knda_IN
+ { 131, 4, 0 }, { 131, 4, 169 }, // kr_Arab -> kr_Arab_NG
+ { 131, 0, 0 }, { 131, 66, 169 }, // kr -> kr_Latn_NG
+ { 132, 0, 0 }, { 132, 4, 110 }, // ks -> ks_Arab_IN
+ { 133, 0, 1 }, { 133, 4, 1 }, // kk_AF -> kk_Arab_AF
+ { 133, 0, 50 }, { 133, 4, 50 }, // kk_CN -> kk_Arab_CN
+ { 133, 0, 112 }, { 133, 4, 112 }, // kk_IR -> kk_Arab_IR
+ { 133, 0, 156 }, { 133, 4, 156 }, // kk_MN -> kk_Arab_MN
+ { 133, 4, 0 }, { 133, 4, 50 }, // kk_Arab -> kk_Arab_CN
+ { 133, 0, 0 }, { 133, 27, 123 }, // kk -> kk_Cyrl_KZ
+ { 134, 0, 0 }, { 134, 66, 40 }, // ken -> ken_Latn_CM
+ { 135, 0, 0 }, { 135, 60, 39 }, // km -> km_Khmr_KH
+ { 136, 0, 0 }, { 136, 66, 99 }, // quc -> quc_Latn_GT
+ { 137, 0, 0 }, { 137, 66, 124 }, // ki -> ki_Latn_KE
+ { 138, 0, 0 }, { 138, 66, 194 }, // rw -> rw_Latn_RW
+ { 139, 0, 0 }, { 139, 27, 193 }, // kv -> kv_Cyrl_RU
+ { 140, 0, 0 }, { 140, 66, 57 }, // kg -> kg_Latn_CD
+ { 141, 0, 0 }, { 141, 29, 110 }, // kok -> kok_Deva_IN
+ { 142, 0, 0 }, { 142, 63, 218 }, // ko -> ko_Kore_KR
+ { 143, 0, 0 }, { 143, 66, 118 }, // kfo -> kfo_Latn_CI
+ { 144, 0, 0 }, { 144, 66, 145 }, // ses -> ses_Latn_ML
+ { 145, 0, 0 }, { 145, 66, 145 }, // khq -> khq_Latn_ML
+ { 146, 0, 0 }, { 146, 66, 134 }, // kpe -> kpe_Latn_LR
+ { 147, 0, 0 }, { 147, 66, 162 }, // kj -> kj_Latn_NA
+ { 148, 0, 132 }, { 148, 4, 132 }, // ku_LB -> ku_Arab_LB
+ { 148, 4, 0 }, { 148, 4, 113 }, // ku_Arab -> ku_Arab_IQ
+ { 148, 0, 0 }, { 148, 66, 239 }, // ku -> ku_Latn_TR
+ { 149, 0, 0 }, { 149, 66, 40 }, // nmg -> nmg_Latn_CM
+ { 150, 0, 50 }, { 150, 4, 50 }, // ky_CN -> ky_Arab_CN
+ { 150, 0, 239 }, { 150, 66, 239 }, // ky_TR -> ky_Latn_TR
+ { 150, 4, 0 }, { 150, 4, 50 }, // ky_Arab -> ky_Arab_CN
+ { 150, 66, 0 }, { 150, 66, 239 }, // ky_Latn -> ky_Latn_TR
+ { 150, 0, 0 }, { 150, 27, 128 }, // ky -> ky_Cyrl_KG
+ { 151, 0, 0 }, { 151, 66, 248 }, // lkt -> lkt_Latn_US
+ { 152, 0, 0 }, { 152, 66, 230 }, // lag -> lag_Latn_TZ
+ { 153, 0, 0 }, { 153, 65, 129 }, // lo -> lo_Laoo_LA
+ { 154, 0, 0 }, { 154, 66, 253 }, // la -> la_Latn_VA
+ { 155, 0, 0 }, { 155, 66, 131 }, // lv -> lv_Latn_LV
+ { 156, 0, 0 }, { 156, 27, 193 }, // lez -> lez_Cyrl_RU
+ { 157, 0, 0 }, { 157, 66, 165 }, // li -> li_Latn_NL
+ { 158, 0, 0 }, { 158, 66, 57 }, // ln -> ln_Latn_CD
+ { 159, 0, 0 }, { 159, 118, 50 }, // lzh -> lzh_Hans_CN
+ { 160, 0, 0 }, { 160, 66, 137 }, // lt -> lt_Latn_LT
+ { 161, 0, 0 }, { 161, 66, 258 }, // jbo -> jbo_Latn_001
+ { 162, 0, 0 }, { 162, 66, 91 }, // dsb -> dsb_Latn_DE
+ { 163, 0, 0 }, { 163, 66, 91 }, // nds -> nds_Latn_DE
+ { 164, 0, 0 }, { 164, 66, 57 }, // lu -> lu_Latn_CD
+ { 165, 0, 0 }, { 165, 66, 225 }, // smj -> smj_Latn_SE
+ { 166, 0, 0 }, { 166, 66, 124 }, // luo -> luo_Latn_KE
+ { 167, 0, 0 }, { 167, 66, 138 }, // lb -> lb_Latn_LU
+ { 168, 0, 0 }, { 168, 66, 124 }, // luy -> luy_Latn_KE
+ { 169, 0, 0 }, { 169, 27, 140 }, // mk -> mk_Cyrl_MK
+ { 170, 0, 0 }, { 170, 66, 230 }, // jmc -> jmc_Latn_TZ
+ { 171, 0, 0 }, { 171, 29, 110 }, // mai -> mai_Deva_IN
+ { 172, 0, 0 }, { 172, 66, 160 }, // mgh -> mgh_Latn_MZ
+ { 173, 0, 0 }, { 173, 66, 230 }, // kde -> kde_Latn_TZ
+ { 174, 0, 0 }, { 174, 66, 141 }, // mg -> mg_Latn_MG
+ { 175, 0, 0 }, { 175, 74, 110 }, // ml -> ml_Mlym_IN
+ { 176, 0, 53 }, { 176, 4, 53 }, // ms_CC -> ms_Arab_CC
+ { 176, 0, 0 }, { 176, 66, 143 }, // ms -> ms_Latn_MY
+ { 177, 0, 0 }, { 177, 66, 146 }, // mt -> mt_Latn_MT
+ { 178, 0, 102 }, { 178, 90, 102 }, // man_GN -> man_Nkoo_GN
+ { 178, 90, 0 }, { 178, 90, 102 }, // man_Nkoo -> man_Nkoo_GN
+ { 178, 0, 0 }, { 178, 66, 89 }, // man -> man_Latn_GM
+ { 179, 0, 0 }, { 179, 9, 110 }, // mni -> mni_Beng_IN
+ { 180, 0, 0 }, { 180, 66, 115 }, // gv -> gv_Latn_IM
+ { 181, 0, 0 }, { 181, 66, 167 }, // mi -> mi_Latn_NZ
+ { 182, 0, 0 }, { 182, 66, 49 }, // arn -> arn_Latn_CL
+ { 183, 0, 0 }, { 183, 29, 110 }, // mr -> mr_Deva_IN
+ { 184, 0, 0 }, { 184, 66, 147 }, // mh -> mh_Latn_MH
+ { 185, 0, 0 }, { 185, 66, 124 }, // mas -> mas_Latn_KE
+ { 186, 0, 0 }, { 186, 4, 112 }, // mzn -> mzn_Arab_IR
+ { 187, 0, 0 }, { 187, 66, 209 }, // men -> men_Latn_SL
+ { 188, 0, 0 }, { 188, 66, 124 }, // mer -> mer_Latn_KE
+ { 189, 0, 0 }, { 189, 66, 40 }, // mgo -> mgo_Latn_CM
+ { 190, 0, 0 }, { 190, 66, 41 }, // moh -> moh_Latn_CA
+ { 191, 0, 50 }, { 191, 83, 50 }, // mn_CN -> mn_Mong_CN
+ { 191, 83, 0 }, { 191, 83, 50 }, // mn_Mong -> mn_Mong_CN
+ { 191, 0, 0 }, { 191, 27, 156 }, // mn -> mn_Cyrl_MN
+ { 192, 0, 0 }, { 192, 66, 150 }, // mfe -> mfe_Latn_MU
+ { 193, 0, 0 }, { 193, 66, 40 }, // mua -> mua_Latn_CM
+ { 194, 0, 0 }, { 194, 66, 248 }, // mus -> mus_Latn_US
+ { 195, 0, 0 }, { 195, 66, 162 }, // naq -> naq_Latn_NA
+ { 196, 0, 0 }, { 196, 66, 163 }, // na -> na_Latn_NR
+ { 197, 0, 0 }, { 197, 66, 248 }, // nv -> nv_Latn_US
+ { 198, 0, 0 }, { 198, 66, 162 }, // ng -> ng_Latn_NA
+ { 199, 0, 0 }, { 199, 29, 164 }, // ne -> ne_Deva_NP
+ { 200, 0, 0 }, { 200, 29, 164 }, // new -> new_Deva_NP
+ { 201, 0, 0 }, { 201, 66, 40 }, // nnh -> nnh_Latn_CM
+ { 202, 0, 0 }, { 202, 66, 40 }, // jgo -> jgo_Latn_CM
+ { 203, 0, 0 }, { 203, 66, 169 }, // pcm -> pcm_Latn_NG
+ { 204, 0, 0 }, { 204, 90, 102 }, // nqo -> nqo_Nkoo_GN
+ { 205, 0, 0 }, { 205, 4, 112 }, // lrc -> lrc_Arab_IR
+ { 206, 0, 0 }, { 206, 66, 175 }, // se -> se_Latn_NO
+ { 207, 0, 0 }, { 207, 66, 216 }, // nso -> nso_Latn_ZA
+ { 208, 0, 0 }, { 208, 66, 261 }, // nd -> nd_Latn_ZW
+ { 209, 0, 0 }, { 209, 66, 175 }, // nb -> nb_Latn_NO
+ { 210, 0, 0 }, { 210, 66, 175 }, // nn -> nn_Latn_NO
+ { 211, 0, 0 }, { 211, 66, 219 }, // nus -> nus_Latn_SS
+ { 212, 0, 0 }, { 212, 66, 142 }, // ny -> ny_Latn_MW
+ { 213, 0, 0 }, { 213, 66, 243 }, // nyn -> nyn_Latn_UG
+ { 214, 0, 0 }, { 214, 66, 84 }, // oc -> oc_Latn_FR
+ { 215, 0, 0 }, { 215, 91, 110 }, // or -> or_Orya_IN
+ { 216, 0, 0 }, { 216, 18, 41 }, // oj -> oj_Cans_CA
+ { 217, 0, 0 }, { 217, 92, 114 }, // sga -> sga_Ogam_IE
+ { 218, 0, 0 }, { 218, 111, 225 }, // non -> non_Runr_SE
+ { 219, 0, 0 }, { 219, 98, 112 }, // peo -> peo_Xpeo_IR
+ { 220, 0, 0 }, { 220, 66, 77 }, // om -> om_Latn_ET
+ { 221, 0, 0 }, { 221, 101, 248 }, // osa -> osa_Osge_US
+ { 222, 0, 0 }, { 222, 27, 90 }, // os -> os_Cyrl_GE
+ { 223, 109, 0 }, { 223, 109, 50 }, // pal_Phlp -> pal_Phlp_CN
+ { 223, 0, 0 }, { 223, 50, 112 }, // pal -> pal_Phli_IR
+ { 224, 0, 0 }, { 224, 66, 179 }, // pau -> pau_Latn_PW
+ { 225, 14, 0 }, { 225, 14, 110 }, // pi_Brah -> pi_Brah_IN
+ { 225, 29, 0 }, { 225, 29, 110 }, // pi_Deva -> pi_Deva_IN
+ { 225, 59, 0 }, { 225, 59, 110 }, // pi_Khar -> pi_Khar_IN
+ { 225, 60, 0 }, { 225, 60, 110 }, // pi_Khmr -> pi_Khmr_IN
+ { 225, 86, 0 }, { 225, 86, 110 }, // pi_Mymr -> pi_Mymr_IN
+ { 225, 133, 0 }, { 225, 133, 110 }, // pi_Thai -> pi_Thai_IN
+ { 225, 0, 0 }, { 225, 119, 110 }, // pi -> pi_Sinh_IN
+ { 226, 0, 0 }, { 226, 66, 62 }, // pap -> pap_Latn_CW
+ { 227, 0, 0 }, { 227, 4, 1 }, // ps -> ps_Arab_AF
+ { 228, 0, 0 }, { 228, 4, 112 }, // fa -> fa_Arab_IR
+ { 229, 0, 0 }, { 229, 107, 132 }, // phn -> phn_Phnx_LB
+ { 230, 0, 0 }, { 230, 66, 187 }, // pl -> pl_Latn_PL
+ { 231, 0, 0 }, { 231, 66, 32 }, // pt -> pt_Latn_BR
+ { 232, 0, 0 }, { 232, 66, 187 }, // prg -> prg_Latn_PL
+ { 233, 0, 178 }, { 233, 4, 178 }, // pa_PK -> pa_Arab_PK
+ { 233, 4, 0 }, { 233, 4, 178 }, // pa_Arab -> pa_Arab_PK
+ { 233, 0, 0 }, { 233, 41, 110 }, // pa -> pa_Guru_IN
+ { 234, 0, 0 }, { 234, 66, 184 }, // qu -> qu_Latn_PE
+ { 235, 0, 0 }, { 235, 66, 192 }, // ro -> ro_Latn_RO
+ { 236, 0, 0 }, { 236, 66, 226 }, // rm -> rm_Latn_CH
+ { 237, 0, 0 }, { 237, 66, 230 }, // rof -> rof_Latn_TZ
+ { 238, 0, 0 }, { 238, 66, 38 }, // rn -> rn_Latn_BI
+ { 239, 0, 0 }, { 239, 27, 193 }, // ru -> ru_Cyrl_RU
+ { 240, 0, 0 }, { 240, 66, 230 }, // rwk -> rwk_Latn_TZ
+ { 241, 0, 0 }, { 241, 66, 74 }, // ssy -> ssy_Latn_ER
+ { 242, 0, 0 }, { 242, 27, 193 }, // sah -> sah_Cyrl_RU
+ { 243, 0, 0 }, { 243, 66, 124 }, // saq -> saq_Latn_KE
+ { 244, 0, 0 }, { 244, 66, 202 }, // sm -> sm_Latn_WS
+ { 245, 0, 0 }, { 245, 66, 46 }, // sg -> sg_Latn_CF
+ { 246, 0, 0 }, { 246, 66, 230 }, // sbp -> sbp_Latn_TZ
+ { 247, 0, 0 }, { 247, 29, 110 }, // sa -> sa_Deva_IN
+ { 248, 0, 0 }, { 248, 93, 110 }, // sat -> sat_Olck_IN
+ { 249, 0, 0 }, { 249, 66, 117 }, // sc -> sc_Latn_IT
+ { 250, 0, 0 }, { 250, 113, 110 }, // saz -> saz_Saur_IN
+ { 251, 0, 0 }, { 251, 66, 160 }, // seh -> seh_Latn_MZ
+ { 252, 0, 157 }, { 252, 66, 157 }, // sr_ME -> sr_Latn_ME
+ { 252, 0, 192 }, { 252, 66, 192 }, // sr_RO -> sr_Latn_RO
+ { 252, 0, 193 }, { 252, 66, 193 }, // sr_RU -> sr_Latn_RU
+ { 252, 0, 239 }, { 252, 66, 239 }, // sr_TR -> sr_Latn_TR
+ { 252, 0, 0 }, { 252, 27, 207 }, // sr -> sr_Cyrl_RS
+ { 253, 0, 0 }, { 253, 66, 230 }, // ksb -> ksb_Latn_TZ
+ { 254, 0, 0 }, { 254, 66, 261 }, // sn -> sn_Latn_ZW
+ { 255, 0, 0 }, { 255, 141, 50 }, // ii -> ii_Yiii_CN
+ { 256, 0, 0 }, { 256, 66, 117 }, // scn -> scn_Latn_IT
+ { 257, 0, 0 }, { 257, 66, 77 }, // sid -> sid_Latn_ET
+ { 258, 0, 0 }, { 258, 66, 187 }, // szl -> szl_Latn_PL
+ { 259, 0, 110 }, { 259, 29, 110 }, // sd_IN -> sd_Deva_IN
+ { 259, 29, 0 }, { 259, 29, 110 }, // sd_Deva -> sd_Deva_IN
+ { 259, 61, 0 }, { 259, 61, 110 }, // sd_Khoj -> sd_Khoj_IN
+ { 259, 62, 0 }, { 259, 62, 110 }, // sd_Sind -> sd_Sind_IN
+ { 259, 0, 0 }, { 259, 4, 178 }, // sd -> sd_Arab_PK
+ { 260, 0, 0 }, { 260, 119, 221 }, // si -> si_Sinh_LK
+ { 261, 0, 0 }, { 261, 66, 83 }, // sms -> sms_Latn_FI
+ { 262, 0, 0 }, { 262, 66, 212 }, // sk -> sk_Latn_SK
+ { 263, 0, 0 }, { 263, 66, 213 }, // sl -> sl_Latn_SI
+ { 264, 0, 0 }, { 264, 66, 243 }, // xog -> xog_Latn_UG
+ { 265, 0, 0 }, { 265, 66, 215 }, // so -> so_Latn_SO
+ { 266, 0, 0 }, { 266, 4, 112 }, // sdh -> sdh_Arab_IR
+ { 267, 0, 0 }, { 267, 66, 225 }, // sma -> sma_Latn_SE
+ { 268, 0, 0 }, { 268, 66, 216 }, // st -> st_Latn_ZA
+ { 269, 0, 0 }, { 269, 66, 216 }, // nr -> nr_Latn_ZA
+ { 270, 0, 0 }, { 270, 66, 220 }, // es -> es_Latn_ES
+ { 271, 0, 0 }, { 271, 135, 159 }, // zgh -> zgh_Tfng_MA
+ { 272, 0, 0 }, { 272, 66, 111 }, // su -> su_Latn_ID
+ { 273, 0, 0 }, { 273, 66, 230 }, // sw -> sw_Latn_TZ
+ { 274, 0, 0 }, { 274, 66, 216 }, // ss -> ss_Latn_ZA
+ { 275, 0, 0 }, { 275, 66, 225 }, // sv -> sv_Latn_SE
+ { 276, 0, 0 }, { 276, 66, 226 }, // gsw -> gsw_Latn_CH
+ { 277, 0, 0 }, { 277, 123, 113 }, // syr -> syr_Syrc_IQ
+ { 278, 0, 0 }, { 278, 135, 159 }, // shi -> shi_Tfng_MA
+ { 279, 0, 0 }, { 279, 66, 86 }, // ty -> ty_Latn_PF
+ { 280, 0, 0 }, { 280, 127, 255 }, // blt -> blt_Tavt_VN
+ { 281, 0, 0 }, { 281, 66, 124 }, // dav -> dav_Latn_KE
+ { 282, 0, 178 }, { 282, 4, 178 }, // tg_PK -> tg_Arab_PK
+ { 282, 4, 0 }, { 282, 4, 178 }, // tg_Arab -> tg_Arab_PK
+ { 282, 0, 0 }, { 282, 27, 229 }, // tg -> tg_Cyrl_TJ
+ { 283, 0, 0 }, { 283, 129, 110 }, // ta -> ta_Taml_IN
+ { 284, 0, 0 }, { 284, 66, 228 }, // trv -> trv_Latn_TW
+ { 285, 0, 0 }, { 285, 66, 170 }, // twq -> twq_Latn_NE
+ { 286, 0, 0 }, { 286, 27, 193 }, // tt -> tt_Cyrl_RU
+ { 287, 0, 0 }, { 287, 131, 110 }, // te -> te_Telu_IN
+ { 288, 0, 0 }, { 288, 66, 243 }, // teo -> teo_Latn_UG
+ { 289, 0, 0 }, { 289, 133, 231 }, // th -> th_Thai_TH
+ { 290, 0, 0 }, { 290, 134, 50 }, // bo -> bo_Tibt_CN
+ { 291, 0, 0 }, { 291, 33, 74 }, // tig -> tig_Ethi_ER
+ { 292, 0, 0 }, { 292, 33, 77 }, // ti -> ti_Ethi_ET
+ { 293, 0, 0 }, { 293, 66, 234 }, // tkl -> tkl_Latn_TK
+ { 294, 0, 0 }, { 294, 66, 182 }, // tpi -> tpi_Latn_PG
+ { 295, 0, 0 }, { 295, 66, 235 }, // to -> to_Latn_TO
+ { 296, 0, 0 }, { 296, 66, 216 }, // ts -> ts_Latn_ZA
+ { 297, 0, 0 }, { 297, 66, 216 }, // tn -> tn_Latn_ZA
+ { 298, 0, 0 }, { 298, 66, 239 }, // tr -> tr_Latn_TR
+ { 299, 0, 0 }, { 299, 66, 240 }, // tk -> tk_Latn_TM
+ { 300, 0, 0 }, { 300, 66, 242 }, // tvl -> tvl_Latn_TV
+ { 301, 0, 0 }, { 301, 66, 169 }, // kcg -> kcg_Latn_NG
+ { 302, 0, 0 }, { 302, 138, 227 }, // uga -> uga_Ugar_SY
+ { 303, 0, 0 }, { 303, 27, 244 }, // uk -> uk_Cyrl_UA
+ { 304, 0, 0 }, { 304, 66, 91 }, // hsb -> hsb_Latn_DE
+ { 305, 0, 0 }, { 305, 4, 178 }, // ur -> ur_Arab_PK
+ { 306, 0, 123 }, { 306, 27, 123 }, // ug_KZ -> ug_Cyrl_KZ
+ { 306, 0, 156 }, { 306, 27, 156 }, // ug_MN -> ug_Cyrl_MN
+ { 306, 27, 0 }, { 306, 27, 123 }, // ug_Cyrl -> ug_Cyrl_KZ
+ { 306, 0, 0 }, { 306, 4, 50 }, // ug -> ug_Arab_CN
+ { 307, 0, 1 }, { 307, 4, 1 }, // uz_AF -> uz_Arab_AF
+ { 307, 0, 50 }, { 307, 27, 50 }, // uz_CN -> uz_Cyrl_CN
+ { 307, 4, 0 }, { 307, 4, 1 }, // uz_Arab -> uz_Arab_AF
+ { 307, 0, 0 }, { 307, 66, 251 }, // uz -> uz_Latn_UZ
+ { 308, 0, 0 }, { 308, 139, 134 }, // vai -> vai_Vaii_LR
+ { 309, 0, 0 }, { 309, 66, 216 }, // ve -> ve_Latn_ZA
+ { 310, 0, 0 }, { 310, 66, 255 }, // vi -> vi_Latn_VN
+ { 311, 0, 0 }, { 311, 66, 258 }, // vo -> vo_Latn_001
+ { 312, 0, 0 }, { 312, 66, 230 }, // vun -> vun_Latn_TZ
+ { 313, 0, 0 }, { 313, 66, 23 }, // wa -> wa_Latn_BE
+ { 314, 0, 0 }, { 314, 66, 226 }, // wae -> wae_Latn_CH
+ { 315, 0, 0 }, { 315, 66, 15 }, // wbp -> wbp_Latn_AU
+ { 316, 0, 0 }, { 316, 66, 246 }, // cy -> cy_Latn_GB
+ { 317, 0, 0 }, { 317, 4, 178 }, // bgn -> bgn_Arab_PK
+ { 318, 0, 0 }, { 318, 66, 165 }, // fy -> fy_Latn_NL
+ { 319, 0, 0 }, { 319, 33, 77 }, // wal -> wal_Ethi_ET
+ { 320, 0, 0 }, { 320, 66, 206 }, // wo -> wo_Latn_SN
+ { 321, 0, 0 }, { 321, 66, 216 }, // xh -> xh_Latn_ZA
+ { 322, 0, 0 }, { 322, 66, 40 }, // yav -> yav_Latn_CM
+ { 323, 0, 0 }, { 323, 47, 244 }, // yi -> yi_Hebr_UA
+ { 324, 0, 0 }, { 324, 66, 169 }, // yo -> yo_Latn_NG
+ { 325, 0, 0 }, { 325, 66, 170 }, // dje -> dje_Latn_NE
+ { 326, 0, 0 }, { 326, 66, 50 }, // za -> za_Latn_CN
+ { 327, 0, 0 }, { 327, 66, 216 }, // zu -> zu_Latn_ZA
+ { 328, 0, 0 }, { 328, 66, 32 }, // kgp -> kgp_Latn_BR
+ { 329, 0, 0 }, { 329, 66, 32 }, // yrl -> yrl_Latn_BR
+ { 330, 0, 0 }, { 330, 29, 110 }, // bgc -> bgc_Deva_IN
+ { 331, 0, 0 }, { 331, 66, 91 }, // frr -> frr_Latn_DE
+ { 332, 0, 0 }, { 332, 29, 110 }, // raj -> raj_Deva_IN
+ { 333, 0, 0 }, { 333, 27, 193 }, // mdf -> mdf_Cyrl_RU
+ { 334, 0, 0 }, { 334, 66, 258 }, // tok -> tok_Latn_001
+ { 335, 0, 0 }, { 335, 66, 214 }, // pis -> pis_Latn_SB
+ { 336, 0, 0 }, { 336, 66, 169 }, // ann -> ann_Latn_NG
+ { 337, 0, 0 }, { 337, 4, 178 }, // bal -> bal_Arab_PK
+ { 338, 0, 0 }, { 338, 66, 117 }, // lij -> lij_Latn_IT
+ { 339, 0, 0 }, { 339, 142, 161 }, // rhg -> rhg_Rohg_MM
+ { 340, 0, 0 }, { 340, 4, 178 }, // trw -> trw_Arab_PK
+ { 341, 0, 0 }, { 341, 66, 25 }, // blo -> blo_Latn_BJ
+ { 342, 0, 0 }, { 342, 29, 110 }, // xnr -> xnr_Deva_IN
+ { 343, 0, 0 }, { 343, 66, 117 }, // vec -> vec_Latn_IT
+ { 0, 4, 1 }, { 228, 4, 1 }, // und_Arab_AF -> fa_Arab_AF
+ { 0, 66, 1 }, { 299, 66, 1 }, // und_Latn_AF -> tk_Latn_AF
+ { 0, 0, 1 }, { 228, 4, 1 }, // und_AF -> fa_Arab_AF
+ { 0, 66, 2 }, { 275, 66, 2 }, // und_Latn_AX -> sv_Latn_AX
+ { 0, 0, 2 }, { 275, 66, 2 }, // und_AX -> sv_Latn_AX
+ { 0, 27, 3 }, { 169, 27, 3 }, // und_Cyrl_AL -> mk_Cyrl_AL
+ { 0, 66, 3 }, { 9, 66, 3 }, // und_Latn_AL -> sq_Latn_AL
+ { 0, 0, 3 }, { 9, 66, 3 }, // und_AL -> sq_Latn_AL
+ { 0, 66, 4 }, { 85, 66, 4 }, // und_Latn_DZ -> fr_Latn_DZ
+ { 0, 0, 4 }, { 14, 4, 4 }, // und_DZ -> ar_Arab_DZ
+ { 0, 66, 5 }, { 244, 66, 5 }, // und_Latn_AS -> sm_Latn_AS
+ { 0, 0, 5 }, { 244, 66, 5 }, // und_AS -> sm_Latn_AS
+ { 0, 66, 6 }, { 48, 66, 6 }, // und_Latn_AD -> ca_Latn_AD
+ { 0, 0, 6 }, { 48, 66, 6 }, // und_AD -> ca_Latn_AD
+ { 0, 66, 7 }, { 231, 66, 7 }, // und_Latn_AO -> pt_Latn_AO
+ { 0, 0, 7 }, { 231, 66, 7 }, // und_AO -> pt_Latn_AO
+ { 0, 0, 8 }, { 75, 66, 8 }, // und_AI -> en_Latn_AI
+ { 0, 0, 9 }, { 75, 66, 9 }, // und_AQ -> en_Latn_AQ
+ { 0, 0, 10 }, { 75, 66, 10 }, // und_AG -> en_Latn_AG
+ { 0, 66, 11 }, { 270, 66, 11 }, // und_Latn_AR -> es_Latn_AR
+ { 0, 0, 11 }, { 270, 66, 11 }, // und_AR -> es_Latn_AR
+ { 0, 66, 12 }, { 148, 66, 12 }, // und_Latn_AM -> ku_Latn_AM
+ { 0, 0, 12 }, { 17, 5, 12 }, // und_AM -> hy_Armn_AM
+ { 0, 66, 13 }, { 72, 66, 13 }, // und_Latn_AW -> nl_Latn_AW
+ { 0, 0, 13 }, { 72, 66, 13 }, // und_AW -> nl_Latn_AW
+ { 0, 0, 14 }, { 75, 66, 14 }, // und_AC -> en_Latn_AC
+ { 0, 0, 15 }, { 75, 66, 15 }, // und_AU -> en_Latn_AU
+ { 0, 66, 16 }, { 94, 66, 16 }, // und_Latn_AT -> de_Latn_AT
+ { 0, 0, 16 }, { 94, 66, 16 }, // und_AT -> de_Latn_AT
+ { 0, 66, 17 }, { 25, 66, 17 }, // und_Latn_AZ -> az_Latn_AZ
+ { 0, 0, 17 }, { 25, 66, 17 }, // und_AZ -> az_Latn_AZ
+ { 0, 0, 18 }, { 75, 66, 18 }, // und_BS -> en_Latn_BS
+ { 0, 0, 19 }, { 14, 4, 19 }, // und_BH -> ar_Arab_BH
+ { 0, 0, 20 }, { 30, 9, 20 }, // und_BD -> bn_Beng_BD
+ { 0, 0, 21 }, { 75, 66, 21 }, // und_BB -> en_Latn_BB
+ { 0, 27, 22 }, { 35, 27, 22 }, // und_Cyrl_BY -> be_Cyrl_BY
+ { 0, 0, 22 }, { 35, 27, 22 }, // und_BY -> be_Cyrl_BY
+ { 0, 66, 23 }, { 72, 66, 23 }, // und_Latn_BE -> nl_Latn_BE
+ { 0, 0, 23 }, { 72, 66, 23 }, // und_BE -> nl_Latn_BE
+ { 0, 0, 24 }, { 75, 66, 24 }, // und_BZ -> en_Latn_BZ
+ { 0, 66, 25 }, { 85, 66, 25 }, // und_Latn_BJ -> fr_Latn_BJ
+ { 0, 0, 25 }, { 85, 66, 25 }, // und_BJ -> fr_Latn_BJ
+ { 0, 0, 26 }, { 75, 66, 26 }, // und_BM -> en_Latn_BM
+ { 0, 29, 27 }, { 199, 29, 27 }, // und_Deva_BT -> ne_Deva_BT
+ { 0, 134, 27 }, { 73, 134, 27 }, // und_Tibt_BT -> dz_Tibt_BT
+ { 0, 0, 27 }, { 73, 134, 27 }, // und_BT -> dz_Tibt_BT
+ { 0, 66, 28 }, { 270, 66, 28 }, // und_Latn_BO -> es_Latn_BO
+ { 0, 0, 28 }, { 270, 66, 28 }, // und_BO -> es_Latn_BO
+ { 0, 27, 29 }, { 252, 27, 29 }, // und_Cyrl_BA -> sr_Cyrl_BA
+ { 0, 66, 29 }, { 42, 66, 29 }, // und_Latn_BA -> bs_Latn_BA
+ { 0, 0, 29 }, { 42, 66, 29 }, // und_BA -> bs_Latn_BA
+ { 0, 0, 30 }, { 75, 66, 30 }, // und_BW -> en_Latn_BW
+ { 0, 0, 31 }, { 75, 66, 31 }, // und_BV -> en_Latn_BV
+ { 0, 66, 32 }, { 231, 66, 32 }, // und_Latn_BR -> pt_Latn_BR
+ { 0, 0, 32 }, { 231, 66, 32 }, // und_BR -> pt_Latn_BR
+ { 0, 0, 33 }, { 75, 66, 33 }, // und_IO -> en_Latn_IO
+ { 0, 0, 34 }, { 75, 66, 34 }, // und_VG -> en_Latn_VG
+ { 0, 66, 35 }, { 176, 66, 35 }, // und_Latn_BN -> ms_Latn_BN
+ { 0, 0, 35 }, { 176, 66, 35 }, // und_BN -> ms_Latn_BN
+ { 0, 27, 36 }, { 45, 27, 36 }, // und_Cyrl_BG -> bg_Cyrl_BG
+ { 0, 0, 36 }, { 45, 27, 36 }, // und_BG -> bg_Cyrl_BG
+ { 0, 66, 37 }, { 85, 66, 37 }, // und_Latn_BF -> fr_Latn_BF
+ { 0, 0, 37 }, { 85, 66, 37 }, // und_BF -> fr_Latn_BF
+ { 0, 66, 38 }, { 238, 66, 38 }, // und_Latn_BI -> rn_Latn_BI
+ { 0, 0, 38 }, { 238, 66, 38 }, // und_BI -> rn_Latn_BI
+ { 0, 0, 39 }, { 135, 60, 39 }, // und_KH -> km_Khmr_KH
+ { 0, 66, 40 }, { 85, 66, 40 }, // und_Latn_CM -> fr_Latn_CM
+ { 0, 0, 40 }, { 85, 66, 40 }, // und_CM -> fr_Latn_CM
+ { 0, 137, 41 }, { 47, 137, 41 }, // und_Hant_CA -> yue_Hant_CA
+ { 0, 0, 41 }, { 75, 66, 41 }, // und_CA -> en_Latn_CA
+ { 0, 66, 42 }, { 270, 66, 42 }, // und_Latn_IC -> es_Latn_IC
+ { 0, 0, 42 }, { 270, 66, 42 }, // und_IC -> es_Latn_IC
+ { 0, 66, 43 }, { 231, 66, 43 }, // und_Latn_CV -> pt_Latn_CV
+ { 0, 0, 43 }, { 231, 66, 43 }, // und_CV -> pt_Latn_CV
+ { 0, 66, 44 }, { 226, 66, 44 }, // und_Latn_BQ -> pap_Latn_BQ
+ { 0, 0, 44 }, { 226, 66, 44 }, // und_BQ -> pap_Latn_BQ
+ { 0, 0, 45 }, { 75, 66, 45 }, // und_KY -> en_Latn_KY
+ { 0, 66, 46 }, { 85, 66, 46 }, // und_Latn_CF -> fr_Latn_CF
+ { 0, 0, 46 }, { 85, 66, 46 }, // und_CF -> fr_Latn_CF
+ { 0, 66, 47 }, { 270, 66, 47 }, // und_Latn_EA -> es_Latn_EA
+ { 0, 0, 47 }, { 270, 66, 47 }, // und_EA -> es_Latn_EA
+ { 0, 66, 48 }, { 85, 66, 48 }, // und_Latn_TD -> fr_Latn_TD
+ { 0, 0, 48 }, { 85, 66, 48 }, // und_TD -> fr_Latn_TD
+ { 0, 66, 49 }, { 270, 66, 49 }, // und_Latn_CL -> es_Latn_CL
+ { 0, 0, 49 }, { 270, 66, 49 }, // und_CL -> es_Latn_CL
+ { 0, 4, 50 }, { 306, 4, 50 }, // und_Arab_CN -> ug_Arab_CN
+ { 0, 66, 50 }, { 326, 66, 50 }, // und_Latn_CN -> za_Latn_CN
+ { 0, 0, 50 }, { 58, 118, 50 }, // und_CN -> zh_Hans_CN
+ { 0, 0, 51 }, { 75, 66, 51 }, // und_CX -> en_Latn_CX
+ { 0, 0, 52 }, { 75, 66, 52 }, // und_CP -> en_Latn_CP
+ { 0, 4, 53 }, { 176, 4, 53 }, // und_Arab_CC -> ms_Arab_CC
+ { 0, 0, 53 }, { 176, 4, 53 }, // und_CC -> ms_Arab_CC
+ { 0, 66, 54 }, { 270, 66, 54 }, // und_Latn_CO -> es_Latn_CO
+ { 0, 0, 54 }, { 270, 66, 54 }, // und_CO -> es_Latn_CO
+ { 0, 66, 55 }, { 85, 66, 55 }, // und_Latn_KM -> fr_Latn_KM
+ { 0, 0, 55 }, { 14, 4, 55 }, // und_KM -> ar_Arab_KM
+ { 0, 66, 56 }, { 85, 66, 56 }, // und_Latn_CG -> fr_Latn_CG
+ { 0, 0, 56 }, { 85, 66, 56 }, // und_CG -> fr_Latn_CG
+ { 0, 66, 57 }, { 273, 66, 57 }, // und_Latn_CD -> sw_Latn_CD
+ { 0, 0, 57 }, { 273, 66, 57 }, // und_CD -> sw_Latn_CD
+ { 0, 0, 58 }, { 75, 66, 58 }, // und_CK -> en_Latn_CK
+ { 0, 66, 59 }, { 270, 66, 59 }, // und_Latn_CR -> es_Latn_CR
+ { 0, 0, 59 }, { 270, 66, 59 }, // und_CR -> es_Latn_CR
+ { 0, 66, 60 }, { 66, 66, 60 }, // und_Latn_HR -> hr_Latn_HR
+ { 0, 0, 60 }, { 66, 66, 60 }, // und_HR -> hr_Latn_HR
+ { 0, 66, 61 }, { 270, 66, 61 }, // und_Latn_CU -> es_Latn_CU
+ { 0, 0, 61 }, { 270, 66, 61 }, // und_CU -> es_Latn_CU
+ { 0, 66, 62 }, { 226, 66, 62 }, // und_Latn_CW -> pap_Latn_CW
+ { 0, 0, 62 }, { 226, 66, 62 }, // und_CW -> pap_Latn_CW
+ { 0, 66, 63 }, { 298, 66, 63 }, // und_Latn_CY -> tr_Latn_CY
+ { 0, 0, 63 }, { 96, 39, 63 }, // und_CY -> el_Grek_CY
+ { 0, 66, 64 }, { 67, 66, 64 }, // und_Latn_CZ -> cs_Latn_CZ
+ { 0, 0, 64 }, { 67, 66, 64 }, // und_CZ -> cs_Latn_CZ
+ { 0, 66, 65 }, { 68, 66, 65 }, // und_Latn_DK -> da_Latn_DK
+ { 0, 0, 65 }, { 68, 66, 65 }, // und_DK -> da_Latn_DK
+ { 0, 0, 66 }, { 75, 66, 66 }, // und_DG -> en_Latn_DG
+ { 0, 66, 67 }, { 3, 66, 67 }, // und_Latn_DJ -> aa_Latn_DJ
+ { 0, 0, 67 }, { 3, 66, 67 }, // und_DJ -> aa_Latn_DJ
+ { 0, 0, 68 }, { 75, 66, 68 }, // und_DM -> en_Latn_DM
+ { 0, 66, 69 }, { 270, 66, 69 }, // und_Latn_DO -> es_Latn_DO
+ { 0, 0, 69 }, { 270, 66, 69 }, // und_DO -> es_Latn_DO
+ { 0, 66, 70 }, { 270, 66, 70 }, // und_Latn_EC -> es_Latn_EC
+ { 0, 0, 70 }, { 270, 66, 70 }, // und_EC -> es_Latn_EC
+ { 0, 0, 71 }, { 14, 4, 71 }, // und_EG -> ar_Arab_EG
+ { 0, 66, 72 }, { 270, 66, 72 }, // und_Latn_SV -> es_Latn_SV
+ { 0, 0, 72 }, { 270, 66, 72 }, // und_SV -> es_Latn_SV
+ { 0, 66, 73 }, { 270, 66, 73 }, // und_Latn_GQ -> es_Latn_GQ
+ { 0, 0, 73 }, { 270, 66, 73 }, // und_GQ -> es_Latn_GQ
+ { 0, 33, 74 }, { 292, 33, 74 }, // und_Ethi_ER -> ti_Ethi_ER
+ { 0, 0, 74 }, { 292, 33, 74 }, // und_ER -> ti_Ethi_ER
+ { 0, 66, 75 }, { 78, 66, 75 }, // und_Latn_EE -> et_Latn_EE
+ { 0, 0, 75 }, { 78, 66, 75 }, // und_EE -> et_Latn_EE
+ { 0, 0, 76 }, { 75, 66, 76 }, // und_SZ -> en_Latn_SZ
+ { 0, 66, 77 }, { 75, 66, 77 }, // und_Latn_ET -> en_Latn_ET
+ { 0, 0, 77 }, { 11, 33, 77 }, // und_ET -> am_Ethi_ET
+ { 0, 0, 80 }, { 75, 66, 80 }, // und_FK -> en_Latn_FK
+ { 0, 66, 81 }, { 81, 66, 81 }, // und_Latn_FO -> fo_Latn_FO
+ { 0, 0, 81 }, { 81, 66, 81 }, // und_FO -> fo_Latn_FO
+ { 0, 0, 82 }, { 75, 66, 82 }, // und_FJ -> en_Latn_FJ
+ { 0, 66, 83 }, { 84, 66, 83 }, // und_Latn_FI -> fi_Latn_FI
+ { 0, 0, 83 }, { 84, 66, 83 }, // und_FI -> fi_Latn_FI
+ { 0, 66, 84 }, { 85, 66, 84 }, // und_Latn_FR -> fr_Latn_FR
+ { 0, 0, 84 }, { 85, 66, 84 }, // und_FR -> fr_Latn_FR
+ { 0, 66, 85 }, { 85, 66, 85 }, // und_Latn_GF -> fr_Latn_GF
+ { 0, 0, 85 }, { 85, 66, 85 }, // und_GF -> fr_Latn_GF
+ { 0, 66, 86 }, { 85, 66, 86 }, // und_Latn_PF -> fr_Latn_PF
+ { 0, 0, 86 }, { 85, 66, 86 }, // und_PF -> fr_Latn_PF
+ { 0, 66, 87 }, { 85, 66, 87 }, // und_Latn_TF -> fr_Latn_TF
+ { 0, 0, 87 }, { 85, 66, 87 }, // und_TF -> fr_Latn_TF
+ { 0, 66, 88 }, { 85, 66, 88 }, // und_Latn_GA -> fr_Latn_GA
+ { 0, 0, 88 }, { 85, 66, 88 }, // und_GA -> fr_Latn_GA
+ { 0, 0, 89 }, { 75, 66, 89 }, // und_GM -> en_Latn_GM
+ { 0, 27, 90 }, { 2, 27, 90 }, // und_Cyrl_GE -> ab_Cyrl_GE
+ { 0, 66, 90 }, { 148, 66, 90 }, // und_Latn_GE -> ku_Latn_GE
+ { 0, 0, 90 }, { 93, 35, 90 }, // und_GE -> ka_Geor_GE
+ { 0, 66, 91 }, { 94, 66, 91 }, // und_Latn_DE -> de_Latn_DE
+ { 0, 0, 91 }, { 94, 66, 91 }, // und_DE -> de_Latn_DE
+ { 0, 66, 92 }, { 6, 66, 92 }, // und_Latn_GH -> ak_Latn_GH
+ { 0, 0, 92 }, { 6, 66, 92 }, // und_GH -> ak_Latn_GH
+ { 0, 0, 93 }, { 75, 66, 93 }, // und_GI -> en_Latn_GI
+ { 0, 27, 94 }, { 169, 27, 94 }, // und_Cyrl_GR -> mk_Cyrl_GR
+ { 0, 0, 94 }, { 96, 39, 94 }, // und_GR -> el_Grek_GR
+ { 0, 66, 95 }, { 127, 66, 95 }, // und_Latn_GL -> kl_Latn_GL
+ { 0, 0, 95 }, { 127, 66, 95 }, // und_GL -> kl_Latn_GL
+ { 0, 0, 96 }, { 75, 66, 96 }, // und_GD -> en_Latn_GD
+ { 0, 66, 97 }, { 85, 66, 97 }, // und_Latn_GP -> fr_Latn_GP
+ { 0, 0, 97 }, { 85, 66, 97 }, // und_GP -> fr_Latn_GP
+ { 0, 0, 98 }, { 75, 66, 98 }, // und_GU -> en_Latn_GU
+ { 0, 66, 99 }, { 270, 66, 99 }, // und_Latn_GT -> es_Latn_GT
+ { 0, 0, 99 }, { 270, 66, 99 }, // und_GT -> es_Latn_GT
+ { 0, 0, 100 }, { 75, 66, 100 }, // und_GG -> en_Latn_GG
+ { 0, 66, 101 }, { 231, 66, 101 }, // und_Latn_GW -> pt_Latn_GW
+ { 0, 0, 101 }, { 231, 66, 101 }, // und_GW -> pt_Latn_GW
+ { 0, 66, 102 }, { 85, 66, 102 }, // und_Latn_GN -> fr_Latn_GN
+ { 0, 0, 102 }, { 85, 66, 102 }, // und_GN -> fr_Latn_GN
+ { 0, 0, 103 }, { 75, 66, 103 }, // und_GY -> en_Latn_GY
+ { 0, 66, 104 }, { 100, 66, 104 }, // und_Latn_HT -> ht_Latn_HT
+ { 0, 0, 104 }, { 100, 66, 104 }, // und_HT -> ht_Latn_HT
+ { 0, 0, 105 }, { 75, 66, 105 }, // und_HM -> en_Latn_HM
+ { 0, 66, 106 }, { 270, 66, 106 }, // und_Latn_HN -> es_Latn_HN
+ { 0, 0, 106 }, { 270, 66, 106 }, // und_HN -> es_Latn_HN
+ { 0, 0, 107 }, { 58, 137, 107 }, // und_HK -> zh_Hant_HK
+ { 0, 66, 108 }, { 107, 66, 108 }, // und_Latn_HU -> hu_Latn_HU
+ { 0, 0, 108 }, { 107, 66, 108 }, // und_HU -> hu_Latn_HU
+ { 0, 66, 109 }, { 108, 66, 109 }, // und_Latn_IS -> is_Latn_IS
+ { 0, 0, 109 }, { 108, 66, 109 }, // und_IS -> is_Latn_IS
+ { 0, 4, 110 }, { 305, 4, 110 }, // und_Arab_IN -> ur_Arab_IN
+ { 0, 0, 110 }, { 105, 29, 110 }, // und_IN -> hi_Deva_IN
+ { 0, 4, 111 }, { 176, 4, 111 }, // und_Arab_ID -> ms_Arab_ID
+ { 0, 66, 111 }, { 112, 66, 111 }, // und_Latn_ID -> id_Latn_ID
+ { 0, 0, 111 }, { 112, 66, 111 }, // und_ID -> id_Latn_ID
+ { 0, 4, 112 }, { 228, 4, 112 }, // und_Arab_IR -> fa_Arab_IR
+ { 0, 66, 112 }, { 299, 66, 112 }, // und_Latn_IR -> tk_Latn_IR
+ { 0, 0, 112 }, { 228, 4, 112 }, // und_IR -> fa_Arab_IR
+ { 0, 0, 113 }, { 14, 4, 113 }, // und_IQ -> ar_Arab_IQ
+ { 0, 0, 114 }, { 75, 66, 114 }, // und_IE -> en_Latn_IE
+ { 0, 0, 115 }, { 75, 66, 115 }, // und_IM -> en_Latn_IM
+ { 0, 0, 116 }, { 103, 47, 116 }, // und_IL -> he_Hebr_IL
+ { 0, 66, 117 }, { 119, 66, 117 }, // und_Latn_IT -> it_Latn_IT
+ { 0, 0, 117 }, { 119, 66, 117 }, // und_IT -> it_Latn_IT
+ { 0, 66, 118 }, { 85, 66, 118 }, // und_Latn_CI -> fr_Latn_CI
+ { 0, 0, 118 }, { 85, 66, 118 }, // und_CI -> fr_Latn_CI
+ { 0, 0, 119 }, { 75, 66, 119 }, // und_JM -> en_Latn_JM
+ { 0, 0, 120 }, { 120, 53, 120 }, // und_JP -> ja_Jpan_JP
+ { 0, 0, 121 }, { 75, 66, 121 }, // und_JE -> en_Latn_JE
+ { 0, 0, 122 }, { 14, 4, 122 }, // und_JO -> ar_Arab_JO
+ { 0, 0, 123 }, { 239, 27, 123 }, // und_KZ -> ru_Cyrl_KZ
+ { 0, 66, 124 }, { 273, 66, 124 }, // und_Latn_KE -> sw_Latn_KE
+ { 0, 0, 124 }, { 273, 66, 124 }, // und_KE -> sw_Latn_KE
+ { 0, 0, 125 }, { 75, 66, 125 }, // und_KI -> en_Latn_KI
+ { 0, 27, 126 }, { 252, 27, 126 }, // und_Cyrl_XK -> sr_Cyrl_XK
+ { 0, 66, 126 }, { 9, 66, 126 }, // und_Latn_XK -> sq_Latn_XK
+ { 0, 0, 126 }, { 9, 66, 126 }, // und_XK -> sq_Latn_XK
+ { 0, 0, 127 }, { 14, 4, 127 }, // und_KW -> ar_Arab_KW
+ { 0, 27, 128 }, { 150, 27, 128 }, // und_Cyrl_KG -> ky_Cyrl_KG
+ { 0, 0, 128 }, { 150, 27, 128 }, // und_KG -> ky_Cyrl_KG
+ { 0, 0, 129 }, { 153, 65, 129 }, // und_LA -> lo_Laoo_LA
+ { 0, 66, 130 }, { 270, 66, 130 }, // und_Latn_419 -> es_Latn_419
+ { 0, 0, 130 }, { 270, 66, 130 }, // und_419 -> es_Latn_419
+ { 0, 66, 131 }, { 155, 66, 131 }, // und_Latn_LV -> lv_Latn_LV
+ { 0, 0, 131 }, { 155, 66, 131 }, // und_LV -> lv_Latn_LV
+ { 0, 0, 132 }, { 14, 4, 132 }, // und_LB -> ar_Arab_LB
+ { 0, 66, 133 }, { 268, 66, 133 }, // und_Latn_LS -> st_Latn_LS
+ { 0, 0, 133 }, { 268, 66, 133 }, // und_LS -> st_Latn_LS
+ { 0, 0, 134 }, { 75, 66, 134 }, // und_LR -> en_Latn_LR
+ { 0, 0, 135 }, { 14, 4, 135 }, // und_LY -> ar_Arab_LY
+ { 0, 66, 136 }, { 94, 66, 136 }, // und_Latn_LI -> de_Latn_LI
+ { 0, 0, 136 }, { 94, 66, 136 }, // und_LI -> de_Latn_LI
+ { 0, 66, 137 }, { 160, 66, 137 }, // und_Latn_LT -> lt_Latn_LT
+ { 0, 0, 137 }, { 160, 66, 137 }, // und_LT -> lt_Latn_LT
+ { 0, 66, 138 }, { 85, 66, 138 }, // und_Latn_LU -> fr_Latn_LU
+ { 0, 0, 138 }, { 85, 66, 138 }, // und_LU -> fr_Latn_LU
+ { 0, 66, 139 }, { 231, 66, 139 }, // und_Latn_MO -> pt_Latn_MO
+ { 0, 0, 139 }, { 58, 137, 139 }, // und_MO -> zh_Hant_MO
+ { 0, 27, 140 }, { 169, 27, 140 }, // und_Cyrl_MK -> mk_Cyrl_MK
+ { 0, 66, 140 }, { 9, 66, 140 }, // und_Latn_MK -> sq_Latn_MK
+ { 0, 0, 140 }, { 169, 27, 140 }, // und_MK -> mk_Cyrl_MK
+ { 0, 66, 141 }, { 174, 66, 141 }, // und_Latn_MG -> mg_Latn_MG
+ { 0, 0, 141 }, { 174, 66, 141 }, // und_MG -> mg_Latn_MG
+ { 0, 0, 142 }, { 75, 66, 142 }, // und_MW -> en_Latn_MW
+ { 0, 66, 143 }, { 176, 66, 143 }, // und_Latn_MY -> ms_Latn_MY
+ { 0, 0, 143 }, { 176, 66, 143 }, // und_MY -> ms_Latn_MY
+ { 0, 0, 144 }, { 69, 132, 144 }, // und_MV -> dv_Thaa_MV
+ { 0, 66, 145 }, { 28, 66, 145 }, // und_Latn_ML -> bm_Latn_ML
+ { 0, 0, 145 }, { 28, 66, 145 }, // und_ML -> bm_Latn_ML
+ { 0, 66, 146 }, { 177, 66, 146 }, // und_Latn_MT -> mt_Latn_MT
+ { 0, 0, 146 }, { 177, 66, 146 }, // und_MT -> mt_Latn_MT
+ { 0, 0, 147 }, { 75, 66, 147 }, // und_MH -> en_Latn_MH
+ { 0, 66, 148 }, { 85, 66, 148 }, // und_Latn_MQ -> fr_Latn_MQ
+ { 0, 0, 148 }, { 85, 66, 148 }, // und_MQ -> fr_Latn_MQ
+ { 0, 66, 149 }, { 85, 66, 149 }, // und_Latn_MR -> fr_Latn_MR
+ { 0, 0, 149 }, { 14, 4, 149 }, // und_MR -> ar_Arab_MR
+ { 0, 4, 150 }, { 305, 4, 150 }, // und_Arab_MU -> ur_Arab_MU
+ { 0, 29, 150 }, { 38, 29, 150 }, // und_Deva_MU -> bho_Deva_MU
+ { 0, 66, 150 }, { 192, 66, 150 }, // und_Latn_MU -> mfe_Latn_MU
+ { 0, 0, 150 }, { 192, 66, 150 }, // und_MU -> mfe_Latn_MU
+ { 0, 66, 151 }, { 85, 66, 151 }, // und_Latn_YT -> fr_Latn_YT
+ { 0, 0, 151 }, { 85, 66, 151 }, // und_YT -> fr_Latn_YT
+ { 0, 66, 152 }, { 270, 66, 152 }, // und_Latn_MX -> es_Latn_MX
+ { 0, 0, 152 }, { 270, 66, 152 }, // und_MX -> es_Latn_MX
+ { 0, 0, 153 }, { 75, 66, 153 }, // und_FM -> en_Latn_FM
+ { 0, 27, 154 }, { 303, 27, 154 }, // und_Cyrl_MD -> uk_Cyrl_MD
+ { 0, 66, 154 }, { 235, 66, 154 }, // und_Latn_MD -> ro_Latn_MD
+ { 0, 0, 154 }, { 235, 66, 154 }, // und_MD -> ro_Latn_MD
+ { 0, 66, 155 }, { 85, 66, 155 }, // und_Latn_MC -> fr_Latn_MC
+ { 0, 0, 155 }, { 85, 66, 155 }, // und_MC -> fr_Latn_MC
+ { 0, 4, 156 }, { 133, 4, 156 }, // und_Arab_MN -> kk_Arab_MN
+ { 0, 27, 156 }, { 191, 27, 156 }, // und_Cyrl_MN -> mn_Cyrl_MN
+ { 0, 0, 156 }, { 191, 27, 156 }, // und_MN -> mn_Cyrl_MN
+ { 0, 66, 157 }, { 252, 66, 157 }, // und_Latn_ME -> sr_Latn_ME
+ { 0, 0, 157 }, { 252, 66, 157 }, // und_ME -> sr_Latn_ME
+ { 0, 0, 158 }, { 75, 66, 158 }, // und_MS -> en_Latn_MS
+ { 0, 66, 159 }, { 85, 66, 159 }, // und_Latn_MA -> fr_Latn_MA
+ { 0, 0, 159 }, { 14, 4, 159 }, // und_MA -> ar_Arab_MA
+ { 0, 66, 160 }, { 231, 66, 160 }, // und_Latn_MZ -> pt_Latn_MZ
+ { 0, 0, 160 }, { 231, 66, 160 }, // und_MZ -> pt_Latn_MZ
+ { 0, 4, 161 }, { 339, 4, 161 }, // und_Arab_MM -> rhg_Arab_MM
+ { 0, 0, 161 }, { 46, 86, 161 }, // und_MM -> my_Mymr_MM
+ { 0, 66, 162 }, { 4, 66, 162 }, // und_Latn_NA -> af_Latn_NA
+ { 0, 0, 162 }, { 4, 66, 162 }, // und_NA -> af_Latn_NA
+ { 0, 0, 163 }, { 75, 66, 163 }, // und_NR -> en_Latn_NR
+ { 0, 29, 164 }, { 199, 29, 164 }, // und_Deva_NP -> ne_Deva_NP
+ { 0, 0, 164 }, { 199, 29, 164 }, // und_NP -> ne_Deva_NP
+ { 0, 66, 165 }, { 72, 66, 165 }, // und_Latn_NL -> nl_Latn_NL
+ { 0, 0, 165 }, { 72, 66, 165 }, // und_NL -> nl_Latn_NL
+ { 0, 66, 166 }, { 85, 66, 166 }, // und_Latn_NC -> fr_Latn_NC
+ { 0, 0, 166 }, { 85, 66, 166 }, // und_NC -> fr_Latn_NC
+ { 0, 0, 167 }, { 75, 66, 167 }, // und_NZ -> en_Latn_NZ
+ { 0, 66, 168 }, { 270, 66, 168 }, // und_Latn_NI -> es_Latn_NI
+ { 0, 0, 168 }, { 270, 66, 168 }, // und_NI -> es_Latn_NI
+ { 0, 4, 169 }, { 101, 4, 169 }, // und_Arab_NG -> ha_Arab_NG
+ { 0, 0, 169 }, { 75, 66, 169 }, // und_NG -> en_Latn_NG
+ { 0, 66, 170 }, { 101, 66, 170 }, // und_Latn_NE -> ha_Latn_NE
+ { 0, 0, 170 }, { 101, 66, 170 }, // und_NE -> ha_Latn_NE
+ { 0, 0, 171 }, { 75, 66, 171 }, // und_NU -> en_Latn_NU
+ { 0, 0, 172 }, { 75, 66, 172 }, // und_NF -> en_Latn_NF
+ { 0, 0, 173 }, { 75, 66, 173 }, // und_MP -> en_Latn_MP
+ { 0, 0, 174 }, { 142, 63, 174 }, // und_KP -> ko_Kore_KP
+ { 0, 66, 175 }, { 209, 66, 175 }, // und_Latn_NO -> nb_Latn_NO
+ { 0, 0, 175 }, { 209, 66, 175 }, // und_NO -> nb_Latn_NO
+ { 0, 0, 176 }, { 14, 4, 176 }, // und_OM -> ar_Arab_OM
+ { 0, 4, 178 }, { 305, 4, 178 }, // und_Arab_PK -> ur_Arab_PK
+ { 0, 0, 178 }, { 305, 4, 178 }, // und_PK -> ur_Arab_PK
+ { 0, 66, 179 }, { 224, 66, 179 }, // und_Latn_PW -> pau_Latn_PW
+ { 0, 0, 179 }, { 224, 66, 179 }, // und_PW -> pau_Latn_PW
+ { 0, 0, 180 }, { 14, 4, 180 }, // und_PS -> ar_Arab_PS
+ { 0, 66, 181 }, { 270, 66, 181 }, // und_Latn_PA -> es_Latn_PA
+ { 0, 0, 181 }, { 270, 66, 181 }, // und_PA -> es_Latn_PA
+ { 0, 66, 182 }, { 294, 66, 182 }, // und_Latn_PG -> tpi_Latn_PG
+ { 0, 0, 182 }, { 294, 66, 182 }, // und_PG -> tpi_Latn_PG
+ { 0, 66, 183 }, { 97, 66, 183 }, // und_Latn_PY -> gn_Latn_PY
+ { 0, 0, 183 }, { 97, 66, 183 }, // und_PY -> gn_Latn_PY
+ { 0, 66, 184 }, { 270, 66, 184 }, // und_Latn_PE -> es_Latn_PE
+ { 0, 0, 184 }, { 270, 66, 184 }, // und_PE -> es_Latn_PE
+ { 0, 66, 185 }, { 83, 66, 185 }, // und_Latn_PH -> fil_Latn_PH
+ { 0, 0, 185 }, { 83, 66, 185 }, // und_PH -> fil_Latn_PH
+ { 0, 0, 186 }, { 75, 66, 186 }, // und_PN -> en_Latn_PN
+ { 0, 66, 187 }, { 230, 66, 187 }, // und_Latn_PL -> pl_Latn_PL
+ { 0, 0, 187 }, { 230, 66, 187 }, // und_PL -> pl_Latn_PL
+ { 0, 66, 188 }, { 231, 66, 188 }, // und_Latn_PT -> pt_Latn_PT
+ { 0, 0, 188 }, { 231, 66, 188 }, // und_PT -> pt_Latn_PT
+ { 0, 66, 189 }, { 270, 66, 189 }, // und_Latn_PR -> es_Latn_PR
+ { 0, 0, 189 }, { 270, 66, 189 }, // und_PR -> es_Latn_PR
+ { 0, 0, 190 }, { 14, 4, 190 }, // und_QA -> ar_Arab_QA
+ { 0, 66, 191 }, { 85, 66, 191 }, // und_Latn_RE -> fr_Latn_RE
+ { 0, 0, 191 }, { 85, 66, 191 }, // und_RE -> fr_Latn_RE
+ { 0, 27, 192 }, { 45, 27, 192 }, // und_Cyrl_RO -> bg_Cyrl_RO
+ { 0, 66, 192 }, { 235, 66, 192 }, // und_Latn_RO -> ro_Latn_RO
+ { 0, 0, 192 }, { 235, 66, 192 }, // und_RO -> ro_Latn_RO
+ { 0, 0, 193 }, { 239, 27, 193 }, // und_RU -> ru_Cyrl_RU
+ { 0, 66, 194 }, { 138, 66, 194 }, // und_Latn_RW -> rw_Latn_RW
+ { 0, 0, 194 }, { 138, 66, 194 }, // und_RW -> rw_Latn_RW
+ { 0, 66, 195 }, { 85, 66, 195 }, // und_Latn_BL -> fr_Latn_BL
+ { 0, 0, 195 }, { 85, 66, 195 }, // und_BL -> fr_Latn_BL
+ { 0, 0, 196 }, { 75, 66, 196 }, // und_SH -> en_Latn_SH
+ { 0, 0, 197 }, { 75, 66, 197 }, // und_KN -> en_Latn_KN
+ { 0, 0, 198 }, { 75, 66, 198 }, // und_LC -> en_Latn_LC
+ { 0, 66, 199 }, { 85, 66, 199 }, // und_Latn_MF -> fr_Latn_MF
+ { 0, 0, 199 }, { 85, 66, 199 }, // und_MF -> fr_Latn_MF
+ { 0, 66, 200 }, { 85, 66, 200 }, // und_Latn_PM -> fr_Latn_PM
+ { 0, 0, 200 }, { 85, 66, 200 }, // und_PM -> fr_Latn_PM
+ { 0, 0, 201 }, { 75, 66, 201 }, // und_VC -> en_Latn_VC
+ { 0, 66, 202 }, { 244, 66, 202 }, // und_Latn_WS -> sm_Latn_WS
+ { 0, 0, 202 }, { 244, 66, 202 }, // und_WS -> sm_Latn_WS
+ { 0, 66, 203 }, { 119, 66, 203 }, // und_Latn_SM -> it_Latn_SM
+ { 0, 0, 203 }, { 119, 66, 203 }, // und_SM -> it_Latn_SM
+ { 0, 66, 204 }, { 231, 66, 204 }, // und_Latn_ST -> pt_Latn_ST
+ { 0, 0, 204 }, { 231, 66, 204 }, // und_ST -> pt_Latn_ST
+ { 0, 0, 205 }, { 14, 4, 205 }, // und_SA -> ar_Arab_SA
+ { 0, 66, 206 }, { 85, 66, 206 }, // und_Latn_SN -> fr_Latn_SN
+ { 0, 0, 206 }, { 85, 66, 206 }, // und_SN -> fr_Latn_SN
+ { 0, 27, 207 }, { 252, 27, 207 }, // und_Cyrl_RS -> sr_Cyrl_RS
+ { 0, 66, 207 }, { 252, 66, 207 }, // und_Latn_RS -> sr_Latn_RS
+ { 0, 0, 207 }, { 252, 27, 207 }, // und_RS -> sr_Cyrl_RS
+ { 0, 66, 208 }, { 85, 66, 208 }, // und_Latn_SC -> fr_Latn_SC
+ { 0, 0, 208 }, { 85, 66, 208 }, // und_SC -> fr_Latn_SC
+ { 0, 0, 210 }, { 75, 66, 210 }, // und_SG -> en_Latn_SG
+ { 0, 0, 211 }, { 75, 66, 211 }, // und_SX -> en_Latn_SX
+ { 0, 27, 212 }, { 303, 27, 212 }, // und_Cyrl_SK -> uk_Cyrl_SK
+ { 0, 66, 212 }, { 262, 66, 212 }, // und_Latn_SK -> sk_Latn_SK
+ { 0, 0, 212 }, { 262, 66, 212 }, // und_SK -> sk_Latn_SK
+ { 0, 66, 213 }, { 263, 66, 213 }, // und_Latn_SI -> sl_Latn_SI
+ { 0, 0, 213 }, { 263, 66, 213 }, // und_SI -> sl_Latn_SI
+ { 0, 0, 214 }, { 75, 66, 214 }, // und_SB -> en_Latn_SB
+ { 0, 66, 215 }, { 265, 66, 215 }, // und_Latn_SO -> so_Latn_SO
+ { 0, 0, 215 }, { 265, 66, 215 }, // und_SO -> so_Latn_SO
+ { 0, 0, 216 }, { 75, 66, 216 }, // und_ZA -> en_Latn_ZA
+ { 0, 0, 217 }, { 75, 66, 217 }, // und_GS -> en_Latn_GS
+ { 0, 0, 218 }, { 142, 63, 218 }, // und_KR -> ko_Kore_KR
+ { 0, 0, 219 }, { 14, 4, 219 }, // und_SS -> ar_Arab_SS
+ { 0, 66, 220 }, { 270, 66, 220 }, // und_Latn_ES -> es_Latn_ES
+ { 0, 0, 220 }, { 270, 66, 220 }, // und_ES -> es_Latn_ES
+ { 0, 0, 221 }, { 260, 119, 221 }, // und_LK -> si_Sinh_LK
+ { 0, 0, 222 }, { 14, 4, 222 }, // und_SD -> ar_Arab_SD
+ { 0, 66, 223 }, { 72, 66, 223 }, // und_Latn_SR -> nl_Latn_SR
+ { 0, 0, 223 }, { 72, 66, 223 }, // und_SR -> nl_Latn_SR
+ { 0, 66, 224 }, { 209, 66, 224 }, // und_Latn_SJ -> nb_Latn_SJ
+ { 0, 0, 224 }, { 209, 66, 224 }, // und_SJ -> nb_Latn_SJ
+ { 0, 47, 225 }, { 323, 47, 225 }, // und_Hebr_SE -> yi_Hebr_SE
+ { 0, 66, 225 }, { 275, 66, 225 }, // und_Latn_SE -> sv_Latn_SE
+ { 0, 0, 225 }, { 275, 66, 225 }, // und_SE -> sv_Latn_SE
+ { 0, 66, 226 }, { 94, 66, 226 }, // und_Latn_CH -> de_Latn_CH
+ { 0, 0, 226 }, { 94, 66, 226 }, // und_CH -> de_Latn_CH
+ { 0, 66, 227 }, { 85, 66, 227 }, // und_Latn_SY -> fr_Latn_SY
+ { 0, 0, 227 }, { 14, 4, 227 }, // und_SY -> ar_Arab_SY
+ { 0, 66, 228 }, { 284, 66, 228 }, // und_Latn_TW -> trv_Latn_TW
+ { 0, 0, 228 }, { 58, 137, 228 }, // und_TW -> zh_Hant_TW
+ { 0, 4, 229 }, { 228, 4, 229 }, // und_Arab_TJ -> fa_Arab_TJ
+ { 0, 27, 229 }, { 282, 27, 229 }, // und_Cyrl_TJ -> tg_Cyrl_TJ
+ { 0, 0, 229 }, { 282, 27, 229 }, // und_TJ -> tg_Cyrl_TJ
+ { 0, 66, 230 }, { 273, 66, 230 }, // und_Latn_TZ -> sw_Latn_TZ
+ { 0, 0, 230 }, { 273, 66, 230 }, // und_TZ -> sw_Latn_TZ
+ { 0, 0, 231 }, { 289, 133, 231 }, // und_TH -> th_Thai_TH
+ { 0, 66, 232 }, { 231, 66, 232 }, // und_Latn_TL -> pt_Latn_TL
+ { 0, 0, 232 }, { 231, 66, 232 }, // und_TL -> pt_Latn_TL
+ { 0, 66, 233 }, { 85, 66, 233 }, // und_Latn_TG -> fr_Latn_TG
+ { 0, 0, 233 }, { 85, 66, 233 }, // und_TG -> fr_Latn_TG
+ { 0, 66, 234 }, { 293, 66, 234 }, // und_Latn_TK -> tkl_Latn_TK
+ { 0, 0, 234 }, { 293, 66, 234 }, // und_TK -> tkl_Latn_TK
+ { 0, 66, 235 }, { 295, 66, 235 }, // und_Latn_TO -> to_Latn_TO
+ { 0, 0, 235 }, { 295, 66, 235 }, // und_TO -> to_Latn_TO
+ { 0, 0, 236 }, { 75, 66, 236 }, // und_TT -> en_Latn_TT
+ { 0, 0, 237 }, { 75, 66, 237 }, // und_TA -> en_Latn_TA
+ { 0, 66, 238 }, { 85, 66, 238 }, // und_Latn_TN -> fr_Latn_TN
+ { 0, 0, 238 }, { 14, 4, 238 }, // und_TN -> ar_Arab_TN
+ { 0, 66, 239 }, { 298, 66, 239 }, // und_Latn_TR -> tr_Latn_TR
+ { 0, 0, 239 }, { 298, 66, 239 }, // und_TR -> tr_Latn_TR
+ { 0, 66, 240 }, { 299, 66, 240 }, // und_Latn_TM -> tk_Latn_TM
+ { 0, 0, 240 }, { 299, 66, 240 }, // und_TM -> tk_Latn_TM
+ { 0, 0, 241 }, { 75, 66, 241 }, // und_TC -> en_Latn_TC
+ { 0, 66, 242 }, { 300, 66, 242 }, // und_Latn_TV -> tvl_Latn_TV
+ { 0, 0, 242 }, { 300, 66, 242 }, // und_TV -> tvl_Latn_TV
+ { 0, 66, 243 }, { 273, 66, 243 }, // und_Latn_UG -> sw_Latn_UG
+ { 0, 0, 243 }, { 273, 66, 243 }, // und_UG -> sw_Latn_UG
+ { 0, 27, 244 }, { 303, 27, 244 }, // und_Cyrl_UA -> uk_Cyrl_UA
+ { 0, 47, 244 }, { 323, 47, 244 }, // und_Hebr_UA -> yi_Hebr_UA
+ { 0, 66, 244 }, { 230, 66, 244 }, // und_Latn_UA -> pl_Latn_UA
+ { 0, 0, 244 }, { 303, 27, 244 }, // und_UA -> uk_Cyrl_UA
+ { 0, 0, 245 }, { 14, 4, 245 }, // und_AE -> ar_Arab_AE
+ { 0, 4, 246 }, { 305, 4, 246 }, // und_Arab_GB -> ur_Arab_GB
+ { 0, 0, 246 }, { 75, 66, 246 }, // und_GB -> en_Latn_GB
+ { 0, 0, 247 }, { 75, 66, 247 }, // und_UM -> en_Latn_UM
+ { 0, 47, 248 }, { 323, 47, 248 }, // und_Hebr_US -> yi_Hebr_US
+ { 0, 0, 248 }, { 75, 66, 248 }, // und_US -> en_Latn_US
+ { 0, 0, 249 }, { 75, 66, 249 }, // und_VI -> en_Latn_VI
+ { 0, 66, 250 }, { 270, 66, 250 }, // und_Latn_UY -> es_Latn_UY
+ { 0, 0, 250 }, { 270, 66, 250 }, // und_UY -> es_Latn_UY
+ { 0, 66, 251 }, { 307, 66, 251 }, // und_Latn_UZ -> uz_Latn_UZ
+ { 0, 0, 251 }, { 307, 66, 251 }, // und_UZ -> uz_Latn_UZ
+ { 0, 66, 252 }, { 39, 66, 252 }, // und_Latn_VU -> bi_Latn_VU
+ { 0, 0, 252 }, { 39, 66, 252 }, // und_VU -> bi_Latn_VU
+ { 0, 66, 253 }, { 119, 66, 253 }, // und_Latn_VA -> it_Latn_VA
+ { 0, 0, 253 }, { 119, 66, 253 }, // und_VA -> it_Latn_VA
+ { 0, 66, 254 }, { 270, 66, 254 }, // und_Latn_VE -> es_Latn_VE
+ { 0, 0, 254 }, { 270, 66, 254 }, // und_VE -> es_Latn_VE
+ { 0, 66, 255 }, { 310, 66, 255 }, // und_Latn_VN -> vi_Latn_VN
+ { 0, 0, 255 }, { 310, 66, 255 }, // und_VN -> vi_Latn_VN
+ { 0, 66, 256 }, { 85, 66, 256 }, // und_Latn_WF -> fr_Latn_WF
+ { 0, 0, 256 }, { 85, 66, 256 }, // und_WF -> fr_Latn_WF
+ { 0, 0, 257 }, { 14, 4, 257 }, // und_EH -> ar_Arab_EH
+ { 0, 0, 259 }, { 14, 4, 259 }, // und_YE -> ar_Arab_YE
+ { 0, 66, 260 }, { 36, 66, 260 }, // und_Latn_ZM -> bem_Latn_ZM
+ { 0, 0, 260 }, { 36, 66, 260 }, // und_ZM -> bem_Latn_ZM
+ { 0, 66, 261 }, { 254, 66, 261 }, // und_Latn_ZW -> sn_Latn_ZW
+ { 0, 0, 261 }, { 254, 66, 261 }, // und_ZW -> sn_Latn_ZW
+ { 0, 1, 0 }, { 87, 1, 102 }, // und_Adlm -> ff_Adlm_GN
+ { 0, 4, 0 }, { 14, 4, 71 }, // und_Arab -> ar_Arab_EG
+ { 0, 5, 0 }, { 17, 5, 12 }, // und_Armn -> hy_Armn_AM
+ { 0, 6, 0 }, { 23, 6, 112 }, // und_Avst -> ae_Avst_IR
+ { 0, 7, 0 }, { 27, 7, 111 }, // und_Bali -> ban_Bali_ID
+ { 0, 8, 0 }, { 29, 8, 40 }, // und_Bamu -> bax_Bamu_CM
+ { 0, 9, 0 }, { 30, 9, 20 }, // und_Beng -> bn_Beng_BD
+ { 0, 11, 0 }, { 34, 11, 111 }, // und_Batk -> bbc_Batk_ID
+ { 0, 12, 0 }, { 247, 12, 110 }, // und_Bhks -> sa_Bhks_IN
+ { 0, 13, 0 }, { 58, 13, 228 }, // und_Bopo -> zh_Bopo_TW
+ { 0, 15, 0 }, { 85, 15, 84 }, // und_Brai -> fr_Brai_FR
+ { 0, 16, 0 }, { 44, 16, 111 }, // und_Bugi -> bug_Bugi_ID
+ { 0, 18, 0 }, { 116, 18, 41 }, // und_Cans -> iu_Cans_CA
+ { 0, 21, 0 }, { 52, 21, 20 }, // und_Cakm -> ccp_Cakm_BD
+ { 0, 23, 0 }, { 55, 23, 248 }, // und_Cher -> chr_Cher_US
+ { 0, 24, 0 }, { 62, 24, 71 }, // und_Copt -> cop_Copt_EG
+ { 0, 25, 0 }, { 7, 25, 113 }, // und_Xsux -> akk_Xsux_IQ
+ { 0, 26, 0 }, { 13, 26, 63 }, // und_Cprt -> grc_Cprt_CY
+ { 0, 27, 0 }, { 239, 27, 193 }, // und_Cyrl -> ru_Cyrl_RU
+ { 0, 29, 0 }, { 105, 29, 110 }, // und_Deva -> hi_Deva_IN
+ { 0, 30, 0 }, { 85, 30, 84 }, // und_Dupl -> fr_Dupl_FR
+ { 0, 31, 0 }, { 12, 31, 71 }, // und_Egyp -> egy_Egyp_EG
+ { 0, 32, 0 }, { 9, 32, 3 }, // und_Elba -> sq_Elba_AL
+ { 0, 33, 0 }, { 11, 33, 77 }, // und_Ethi -> am_Ethi_ET
+ { 0, 35, 0 }, { 93, 35, 90 }, // und_Geor -> ka_Geor_GE
+ { 0, 36, 0 }, { 59, 36, 36 }, // und_Glag -> cu_Glag_BG
+ { 0, 37, 0 }, { 95, 37, 244 }, // und_Goth -> got_Goth_UA
+ { 0, 38, 0 }, { 247, 38, 110 }, // und_Gran -> sa_Gran_IN
+ { 0, 39, 0 }, { 96, 39, 94 }, // und_Grek -> el_Grek_GR
+ { 0, 40, 0 }, { 98, 40, 110 }, // und_Gujr -> gu_Gujr_IN
+ { 0, 41, 0 }, { 233, 41, 110 }, // und_Guru -> pa_Guru_IN
+ { 0, 42, 0 }, { 142, 42, 218 }, // und_Hang -> ko_Hang_KR
+ { 0, 43, 0 }, { 58, 43, 50 }, // und_Hani -> zh_Hani_CN
+ { 0, 45, 0 }, { 58, 45, 228 }, // und_Hanb -> zh_Hanb_TW
+ { 0, 47, 0 }, { 103, 47, 116 }, // und_Hebr -> he_Hebr_IL
+ { 0, 48, 0 }, { 120, 48, 120 }, // und_Hira -> ja_Hira_JP
+ { 0, 49, 0 }, { 16, 49, 112 }, // und_Armi -> arc_Armi_IR
+ { 0, 50, 0 }, { 223, 50, 112 }, // und_Phli -> pal_Phli_IR
+ { 0, 52, 0 }, { 142, 52, 218 }, // und_Jamo -> ko_Jamo_KR
+ { 0, 53, 0 }, { 120, 53, 120 }, // und_Jpan -> ja_Jpan_JP
+ { 0, 54, 0 }, { 121, 54, 111 }, // und_Java -> jv_Java_ID
+ { 0, 55, 0 }, { 38, 55, 110 }, // und_Kthi -> bho_Kthi_IN
+ { 0, 56, 0 }, { 130, 56, 110 }, // und_Knda -> kn_Knda_IN
+ { 0, 57, 0 }, { 120, 57, 120 }, // und_Kana -> ja_Kana_JP
+ { 0, 60, 0 }, { 135, 60, 39 }, // und_Khmr -> km_Khmr_KH
+ { 0, 61, 0 }, { 259, 61, 110 }, // und_Khoj -> sd_Khoj_IN
+ { 0, 62, 0 }, { 259, 62, 110 }, // und_Sind -> sd_Sind_IN
+ { 0, 63, 0 }, { 142, 63, 218 }, // und_Kore -> ko_Kore_KR
+ { 0, 65, 0 }, { 153, 65, 129 }, // und_Laoo -> lo_Laoo_LA
+ { 0, 66, 0 }, { 75, 66, 248 }, // und_Latn -> en_Latn_US
+ { 0, 70, 0 }, { 13, 70, 94 }, // und_Linb -> grc_Linb_GR
+ { 0, 73, 0 }, { 105, 73, 110 }, // und_Mahj -> hi_Mahj_IN
+ { 0, 74, 0 }, { 175, 74, 110 }, // und_Mlym -> ml_Mlym_IN
+ { 0, 77, 0 }, { 290, 77, 50 }, // und_Marc -> bo_Marc_CN
+ { 0, 78, 0 }, { 179, 78, 110 }, // und_Mtei -> mni_Mtei_IN
+ { 0, 79, 0 }, { 187, 79, 209 }, // und_Mend -> men_Mend_SL
+ { 0, 82, 0 }, { 183, 82, 110 }, // und_Modi -> mr_Modi_IN
+ { 0, 83, 0 }, { 191, 83, 50 }, // und_Mong -> mn_Mong_CN
+ { 0, 86, 0 }, { 46, 86, 161 }, // und_Mymr -> my_Mymr_MM
+ { 0, 87, 0 }, { 16, 87, 122 }, // und_Nbat -> arc_Nbat_JO
+ { 0, 88, 0 }, { 200, 88, 164 }, // und_Newa -> new_Newa_NP
+ { 0, 90, 0 }, { 178, 90, 102 }, // und_Nkoo -> man_Nkoo_GN
+ { 0, 91, 0 }, { 215, 91, 110 }, // und_Orya -> or_Orya_IN
+ { 0, 92, 0 }, { 217, 92, 114 }, // und_Ogam -> sga_Ogam_IE
+ { 0, 93, 0 }, { 248, 93, 110 }, // und_Olck -> sat_Olck_IN
+ { 0, 94, 0 }, { 107, 94, 108 }, // und_Hung -> hu_Hung_HU
+ { 0, 97, 0 }, { 139, 97, 193 }, // und_Perm -> kv_Perm_RU
+ { 0, 98, 0 }, { 219, 98, 112 }, // und_Xpeo -> peo_Xpeo_IR
+ { 0, 101, 0 }, { 221, 101, 248 }, // und_Osge -> osa_Osge_US
+ { 0, 102, 0 }, { 265, 102, 215 }, // und_Osma -> so_Osma_SO
+ { 0, 104, 0 }, { 16, 104, 227 }, // und_Palm -> arc_Palm_SY
+ { 0, 106, 0 }, { 159, 106, 50 }, // und_Phag -> lzh_Phag_CN
+ { 0, 107, 0 }, { 229, 107, 132 }, // und_Phnx -> phn_Phnx_LB
+ { 0, 109, 0 }, { 223, 109, 50 }, // und_Phlp -> pal_Phlp_CN
+ { 0, 111, 0 }, { 218, 111, 225 }, // und_Runr -> non_Runr_SE
+ { 0, 113, 0 }, { 250, 113, 110 }, // und_Saur -> saz_Saur_IN
+ { 0, 114, 0 }, { 247, 114, 110 }, // und_Shrd -> sa_Shrd_IN
+ { 0, 115, 0 }, { 75, 115, 246 }, // und_Shaw -> en_Shaw_GB
+ { 0, 116, 0 }, { 247, 116, 110 }, // und_Sidd -> sa_Sidd_IN
+ { 0, 117, 0 }, { 10, 117, 248 }, // und_Sgnw -> ase_Sgnw_US
+ { 0, 118, 0 }, { 58, 118, 50 }, // und_Hans -> zh_Hans_CN
+ { 0, 119, 0 }, { 260, 119, 221 }, // und_Sinh -> si_Sinh_LK
+ { 0, 121, 0 }, { 272, 121, 111 }, // und_Sund -> su_Sund_ID
+ { 0, 123, 0 }, { 277, 123, 113 }, // und_Syrc -> syr_Syrc_IQ
+ { 0, 124, 0 }, { 83, 124, 185 }, // und_Tglg -> fil_Tglg_PH
+ { 0, 127, 0 }, { 280, 127, 255 }, // und_Tavt -> blt_Tavt_VN
+ { 0, 128, 0 }, { 70, 128, 110 }, // und_Takr -> doi_Takr_IN
+ { 0, 129, 0 }, { 283, 129, 110 }, // und_Taml -> ta_Taml_IN
+ { 0, 131, 0 }, { 287, 131, 110 }, // und_Telu -> te_Telu_IN
+ { 0, 132, 0 }, { 69, 132, 144 }, // und_Thaa -> dv_Thaa_MV
+ { 0, 133, 0 }, { 289, 133, 231 }, // und_Thai -> th_Thai_TH
+ { 0, 134, 0 }, { 290, 134, 50 }, // und_Tibt -> bo_Tibt_CN
+ { 0, 135, 0 }, { 271, 135, 159 }, // und_Tfng -> zgh_Tfng_MA
+ { 0, 136, 0 }, { 171, 136, 110 }, // und_Tirh -> mai_Tirh_IN
+ { 0, 137, 0 }, { 58, 137, 228 }, // und_Hant -> zh_Hant_TW
+ { 0, 138, 0 }, { 302, 138, 227 }, // und_Ugar -> uga_Ugar_SY
+ { 0, 139, 0 }, { 308, 139, 134 }, // und_Vaii -> vai_Vaii_LR
+ { 0, 141, 0 }, { 255, 141, 50 }, // und_Yiii -> ii_Yiii_CN
+ { 0, 142, 0 }, { 339, 142, 161 } // und_Rohg -> rhg_Rohg_MM
};
-static const quint16 locale_index[] = {
+static constexpr quint16 locale_index[] = {
0, // AnyLanguage
0, // C
- 0, // Abkhazian
- 1, // Oromo
- 3, // Afar
- 4, // Afrikaans
- 6, // Albanian
- 9, // Amharic
- 10, // Arabic
- 38, // Armenian
- 39, // Assamese
+ 1, // Abkhazian
+ 2, // Afar
+ 5, // Afrikaans
+ 7, // Aghem
+ 8, // Akan
+ 0, // Akkadian
+ 9, // Akoose
+ 10, // Albanian
+ 0, // American Sign Language
+ 13, // Amharic
+ 0, // Ancient Egyptian
+ 0, // Ancient Greek
+ 14, // Arabic
+ 42, // Aragonese
+ 0, // Aramaic
+ 43, // Armenian
+ 44, // Assamese
+ 45, // Asturian
+ 46, // Asu
+ 47, // Atsam
+ 0, // Avaric
+ 0, // Avestan
0, // Aymara
- 40, // Azerbaijani
- 43, // Bashkir
- 44, // Basque
- 45, // Bengali
- 47, // Dzongkha
- 0, // Bihari
+ 48, // Azerbaijani
+ 53, // Bafia
+ 0, // Balinese
+ 54, // Bambara
+ 0, // Bamun
+ 56, // Bangla
+ 58, // Basaa
+ 59, // Bashkir
+ 60, // Basque
+ 0, // Batak Toba
+ 61, // Belarusian
+ 62, // Bemba
+ 63, // Bena
+ 64, // Bhojpuri
0, // Bislama
- 48, // Breton
- 49, // Bulgarian
- 50, // Burmese
- 51, // Belarusian
- 52, // Khmer
- 53, // Catalan
- 57, // Chinese
- 64, // Corsican
- 65, // Croatian
- 67, // Czech
- 68, // Danish
- 70, // Dutch
- 77, // English
- 183, // Esperanto
- 184, // Estonian
- 185, // Faroese
- 0, // Fijian
- 187, // Finnish
- 188, // French
- 234, // Western Frisian
- 235, // Gaelic
- 236, // Galician
- 237, // Georgian
- 238, // German
- 245, // Greek
- 247, // Greenlandic
- 248, // Guarani
- 249, // Gujarati
- 250, // Hausa
- 254, // Hebrew
- 255, // Hindi
- 256, // Hungarian
- 257, // Icelandic
- 258, // Indonesian
- 259, // Interlingua
- 0, // Interlingue
- 260, // Inuktitut
- 0, // Inupiak
- 262, // Irish
- 264, // Italian
- 268, // Japanese
- 269, // Javanese
- 270, // Kannada
- 271, // Kashmiri
- 272, // Kazakh
- 273, // Kinyarwanda
- 274, // Kirghiz
- 275, // Korean
- 277, // Kurdish
- 278, // Rundi
- 279, // Lao
- 0, // Latin
- 280, // Latvian
- 281, // Lingala
- 285, // Lithuanian
- 286, // Macedonian
- 287, // Malagasy
- 288, // Malay
- 292, // Malayalam
- 293, // Maltese
- 294, // Maori
- 295, // Marathi
- 0, // Marshallese
- 296, // Mongolian
- 0, // Nauru
- 298, // Nepali
- 300, // Norwegian Bokmal
- 302, // Occitan
- 303, // Oriya
- 304, // Pashto
- 306, // Persian
- 308, // Polish
- 309, // Portuguese
- 321, // Punjabi
- 323, // Quechua
- 326, // Romansh
- 327, // Romanian
- 329, // Russian
- 0, // Samoan
- 335, // Sango
- 336, // Sanskrit
- 337, // Serbian
- 345, // Ossetic
- 347, // Southern Sotho
- 348, // Tswana
- 349, // Shona
- 350, // Sindhi
- 351, // Sinhala
- 352, // Swati
- 353, // Slovak
- 354, // Slovenian
- 355, // Somali
- 359, // Spanish
- 387, // Sundanese
- 388, // Swahili
- 392, // Swedish
- 395, // Sardinian
- 396, // Tajik
- 397, // Tamil
- 401, // Tatar
- 402, // Telugu
- 403, // Thai
- 404, // Tibetan
- 406, // Tigrinya
- 408, // Tongan
- 409, // Tsonga
- 410, // Turkish
- 412, // Turkmen
- 0, // Tahitian
- 413, // Uighur
- 414, // Ukrainian
- 415, // Urdu
- 417, // Uzbek
- 420, // Vietnamese
- 421, // Volapuk
- 422, // Welsh
- 423, // Wolof
- 424, // Xhosa
- 425, // Yiddish
- 426, // Yoruba
- 0, // Zhuang
- 428, // Zulu
- 429, // Norwegian Nynorsk
- 430, // Bosnian
- 432, // Divehi
- 433, // Manx
- 434, // Cornish
- 435, // Akan
- 436, // Konkani
- 437, // Ga
- 438, // Igbo
- 439, // Kamba
- 440, // Syriac
- 441, // Blin
- 442, // Geez
- 0, // Koro
- 443, // Sidamo
- 444, // Atsam
- 445, // Tigre
- 446, // Jju
- 447, // Friulian
- 448, // Venda
- 449, // Ewe
- 451, // Walamo
- 452, // Hawaiian
- 453, // Tyap
- 454, // Nyanja
- 455, // Filipino
- 456, // Swiss German
- 459, // Sichuan Yi
- 460, // Kpelle
- 461, // Low German
- 463, // South Ndebele
- 464, // Northern Sotho
- 465, // Northern Sami
- 468, // Taroko
- 469, // Gusii
- 470, // Taita
- 471, // Fulah
- 484, // Kikuyu
- 485, // Samburu
- 486, // Sena
- 487, // North Ndebele
- 488, // Rombo
- 489, // Tachelhit
- 491, // Kabyle
- 492, // Nyankole
- 493, // Bena
- 494, // Vunjo
- 495, // Bambara
- 497, // Embu
- 498, // Cherokee
- 499, // Morisyen
- 500, // Makonde
- 501, // Langi
- 502, // Ganda
- 503, // Bemba
- 504, // Kabuverdianu
- 505, // Meru
- 506, // Kalenjin
- 507, // Nama
- 508, // Machame
- 509, // Colognian
- 510, // Masai
- 512, // Soga
- 513, // Luyia
- 514, // Asu
- 515, // Teso
- 517, // Saho
- 518, // Koyra Chiini
- 519, // Rwa
- 520, // Luo
- 521, // Chiga
- 522, // Central Morocco Tamazight
- 523, // Koyraboro Senni
- 524, // Shambala
- 525, // Bodo
- 0, // Avaric
+ 65, // Blin
+ 66, // Bodo
+ 67, // Bosnian
+ 69, // Breton
+ 0, // Buginese
+ 70, // Bulgarian
+ 71, // Burmese
+ 72, // Cantonese
+ 74, // Catalan
+ 78, // Cebuano
+ 79, // Central Atlas Tamazight
+ 80, // Central Kurdish
+ 82, // Chakma
0, // Chamorro
- 526, // Chechen
- 527, // Church
- 528, // Chuvash
+ 84, // Chechen
+ 85, // Cherokee
+ 86, // Chickasaw
+ 87, // Chiga
+ 88, // Chinese
+ 95, // Church
+ 96, // Chuvash
+ 97, // Colognian
+ 0, // Coptic
+ 98, // Cornish
+ 99, // Corsican
0, // Cree
+ 100, // Croatian
+ 102, // Czech
+ 103, // Danish
+ 105, // Divehi
+ 106, // Dogri
+ 107, // Duala
+ 108, // Dutch
+ 115, // Dzongkha
+ 116, // Embu
+ 117, // English
+ 226, // Erzya
+ 227, // Esperanto
+ 228, // Estonian
+ 229, // Ewe
+ 231, // Ewondo
+ 232, // Faroese
+ 0, // Fijian
+ 234, // Filipino
+ 235, // Finnish
+ 236, // French
+ 282, // Friulian
+ 283, // Fulah
+ 307, // Gaelic
+ 308, // Ga
+ 309, // Galician
+ 310, // Ganda
+ 311, // Geez
+ 313, // Georgian
+ 314, // German
+ 0, // Gothic
+ 321, // Greek
+ 323, // Guarani
+ 324, // Gujarati
+ 325, // Gusii
0, // Haitian
+ 326, // Hausa
+ 331, // Hawaiian
+ 332, // Hebrew
0, // Herero
+ 333, // Hindi
0, // Hiri Motu
+ 335, // Hungarian
+ 336, // Icelandic
+ 337, // Ido
+ 338, // Igbo
+ 339, // Inari Sami
+ 340, // Indonesian
+ 0, // Ingush
+ 341, // Interlingua
+ 342, // Interlingue
+ 343, // Inuktitut
+ 0, // Inupiaq
+ 345, // Irish
+ 347, // Italian
+ 351, // Japanese
+ 352, // Javanese
+ 353, // Jju
+ 354, // Jola-Fonyi
+ 355, // Kabuverdianu
+ 356, // Kabyle
+ 357, // Kako
+ 358, // Kalaallisut
+ 359, // Kalenjin
+ 360, // Kamba
+ 361, // Kannada
0, // Kanuri
+ 362, // Kashmiri
+ 364, // Kazakh
+ 365, // Kenyang
+ 366, // Khmer
+ 367, // Kiche
+ 368, // Kikuyu
+ 369, // Kinyarwanda
0, // Komi
0, // Kongo
- 0, // Kwanyama
+ 370, // Konkani
+ 371, // Korean
+ 0, // Koro
+ 374, // Koyraboro Senni
+ 375, // Koyra Chiini
+ 376, // Kpelle
+ 0, // Kuanyama
+ 378, // Kurdish
+ 379, // Kwasio
+ 380, // Kyrgyz
+ 381, // Lakota
+ 382, // Langi
+ 383, // Lao
+ 384, // Latin
+ 385, // Latvian
+ 0, // Lezghian
0, // Limburgish
- 529, // Luba Katanga
- 530, // Luxembourgish
- 0, // Navaho
+ 386, // Lingala
+ 0, // Literary Chinese
+ 390, // Lithuanian
+ 391, // Lojban
+ 392, // Lower Sorbian
+ 393, // Low German
+ 395, // Luba-Katanga
+ 396, // Lule Sami
+ 398, // Luo
+ 399, // Luxembourgish
+ 400, // Luyia
+ 401, // Macedonian
+ 402, // Machame
+ 403, // Maithili
+ 404, // Makhuwa-Meetto
+ 405, // Makonde
+ 406, // Malagasy
+ 407, // Malayalam
+ 408, // Malay
+ 414, // Maltese
+ 0, // Mandingo
+ 415, // Manipuri
+ 417, // Manx
+ 418, // Maori
+ 419, // Mapuche
+ 420, // Marathi
+ 0, // Marshallese
+ 421, // Masai
+ 423, // Mazanderani
+ 0, // Mende
+ 424, // Meru
+ 425, // Meta
+ 426, // Mohawk
+ 427, // Mongolian
+ 430, // Morisyen
+ 431, // Mundang
+ 432, // Muscogee
+ 433, // Nama
+ 0, // Nauru
+ 434, // Navajo
0, // Ndonga
+ 435, // Nepali
+ 0, // Newari
+ 437, // Ngiemboon
+ 438, // Ngomba
+ 439, // Nigerian Pidgin
+ 440, // Nko
+ 441, // Northern Luri
+ 443, // Northern Sami
+ 446, // Northern Sotho
+ 447, // North Ndebele
+ 448, // Norwegian Bokmal
+ 450, // Norwegian Nynorsk
+ 451, // Nuer
+ 452, // Nyanja
+ 453, // Nyankole
+ 454, // Occitan
+ 456, // Odia
0, // Ojibwa
- 0, // Pali
- 531, // Walloon
- 532, // Aghem
- 533, // Basaa
- 534, // Zarma
- 535, // Duala
- 536, // Jola Fonyi
- 537, // Ewondo
- 538, // Bafia
- 539, // Makhuwa Meetto
- 540, // Mundang
- 541, // Kwasio
- 542, // Nuer
- 543, // Sakha
- 544, // Sangu
- 0, // Congo Swahili
- 545, // Tasawaq
- 546, // Vai
- 548, // Walser
- 549, // Yangben
- 0, // Avestan
- 550, // Asturian
- 551, // Ngomba
- 552, // Kako
- 553, // Meta
- 554, // Ngiemboon
- 555, // Aragonese
- 0, // Akkadian
- 0, // Ancient Egyptian
- 0, // Ancient Greek
- 0, // Aramaic
- 0, // Balinese
- 0, // Bamun
- 0, // Batak Toba
- 0, // Buginese
- 0, // Buhid
- 0, // Carian
- 556, // Chakma
- 0, // Classical Mandaic
- 0, // Coptic
- 0, // Dogri
- 0, // Eastern Cham
- 0, // Eastern Kayah
- 0, // Etruscan
- 0, // Gothic
- 0, // Hanunoo
- 0, // Ingush
- 0, // Large Flowery Miao
- 0, // Lepcha
- 0, // Limbu
- 0, // Lisu
- 0, // Lu
- 0, // Lycian
- 0, // Lydian
- 0, // Mandingo
- 558, // Manipuri
- 0, // Meroitic
- 0, // Northern Thai
0, // Old Irish
0, // Old Norse
0, // Old Persian
- 0, // Old Turkish
+ 457, // Oromo
+ 459, // Osage
+ 460, // Ossetic
0, // Pahlavi
- 0, // Parthian
+ 0, // Palauan
+ 0, // Pali
+ 462, // Papiamento
+ 464, // Pashto
+ 466, // Persian
0, // Phoenician
- 0, // Prakrit Language
- 0, // Rejang
- 0, // Sabaean
- 0, // Samaritan
- 0, // Santali
+ 468, // Polish
+ 469, // Portuguese
+ 481, // Prussian
+ 482, // Punjabi
+ 484, // Quechua
+ 487, // Romanian
+ 489, // Romansh
+ 490, // Rombo
+ 491, // Rundi
+ 492, // Russian
+ 498, // Rwa
+ 499, // Saho
+ 500, // Sakha
+ 501, // Samburu
+ 0, // Samoan
+ 502, // Sango
+ 503, // Sangu
+ 504, // Sanskrit
+ 505, // Santali
+ 507, // Sardinian
0, // Saurashtra
- 0, // Sora
- 0, // Sylheti
- 0, // Tagbanwa
- 559, // Tai Dam
- 0, // Tai Nua
- 0, // Ugaritic
- 560, // Akoose
- 561, // Lakota
- 562, // Standard Moroccan Tamazight
- 563, // Mapuche
- 564, // Central Kurdish
- 566, // Lower Sorbian
- 567, // Upper Sorbian
- 568, // Kenyang
- 569, // Mohawk
- 570, // Nko
- 571, // Prussian
- 572, // Kiche
- 573, // Southern Sami
- 574, // Lule Sami
- 575, // Inari Sami
- 576, // Skolt Sami
- 577, // Warlpiri
- 0, // Manichaean Middle Persian
- 0, // Mende
- 0, // Ancient North Arabian
- 0, // Linear A
- 0, // Hmong Njua
- 0, // Ho
- 0, // Lezghian
- 0, // Bassa
- 0, // Mono
- 0, // Tedim Chin
- 0, // Maithili
- 0, // Ahom
- 0, // American Sign Language
- 0, // Ardhamagadhi Prakrit
- 0, // Bhojpuri
- 0, // Hieroglyphic Luwian
- 0, // Literary Chinese
- 578, // Mazanderani
- 0, // Mru
- 0, // Newari
- 579, // Northern Luri
- 0, // Palauan
- 0, // Papiamento
- 0, // Saraiki
+ 508, // Sena
+ 509, // Serbian
+ 517, // Shambala
+ 518, // Shona
+ 519, // Sichuan Yi
+ 520, // Sicilian
+ 521, // Sidamo
+ 522, // Silesian
+ 523, // Sindhi
+ 525, // Sinhala
+ 526, // Skolt Sami
+ 527, // Slovak
+ 528, // Slovenian
+ 529, // Soga
+ 530, // Somali
+ 534, // Southern Kurdish
+ 536, // Southern Sami
+ 538, // Southern Sotho
+ 540, // South Ndebele
+ 541, // Spanish
+ 569, // Standard Moroccan Tamazight
+ 570, // Sundanese
+ 571, // Swahili
+ 575, // Swati
+ 577, // Swedish
+ 580, // Swiss German
+ 583, // Syriac
+ 585, // Tachelhit
+ 0, // Tahitian
+ 587, // Tai Dam
+ 588, // Taita
+ 589, // Tajik
+ 590, // Tamil
+ 594, // Taroko
+ 595, // Tasawaq
+ 596, // Tatar
+ 597, // Telugu
+ 598, // Teso
+ 600, // Thai
+ 601, // Tibetan
+ 603, // Tigre
+ 604, // Tigrinya
0, // Tokelau
- 0, // Tok Pisin
+ 606, // Tok Pisin
+ 607, // Tongan
+ 608, // Tsonga
+ 609, // Tswana
+ 611, // Turkish
+ 613, // Turkmen
0, // Tuvalu
- 0, // Uncoded Languages
- 581, // Cantonese
- 583, // Osage
- 0, // Tangut
- 584, // Ido
- 585, // Lojban
- 586, // Sicilian
- 587, // Southern Kurdish
- 588, // Western Balochi
- 589, // Cebuano
- 590, // Erzya
- 591, // Chickasaw
- 592, // Muscogee
- 593, // Silesian
+ 614, // Tyap
+ 0, // Ugaritic
+ 615, // Ukrainian
+ 616, // Upper Sorbian
+ 617, // Urdu
+ 619, // Uyghur
+ 620, // Uzbek
+ 623, // Vai
+ 625, // Venda
+ 626, // Vietnamese
+ 627, // Volapuk
+ 628, // Vunjo
+ 629, // Walloon
+ 630, // Walser
+ 631, // Warlpiri
+ 632, // Welsh
+ 633, // Western Balochi
+ 638, // Western Frisian
+ 639, // Wolaytta
+ 640, // Wolof
+ 641, // Xhosa
+ 642, // Yangben
+ 643, // Yiddish
+ 644, // Yoruba
+ 646, // Zarma
+ 647, // Zhuang
+ 648, // Zulu
+ 649, // Kaingang
+ 650, // Nheengatu
+ 653, // Haryanvi
+ 654, // Northern Frisian
+ 655, // Rajasthani
+ 656, // Moksha
+ 657, // Toki Pona
+ 658, // Pijin
+ 659, // Obolo
+ 660, // Baluchi
+ 662, // Ligurian
+ 663, // Rohingya
+ 665, // Torwali
+ 666, // Anii
+ 667, // Kangri
+ 668, // Venetian
0 // trailing 0
};
-static const QLocaleData locale_data[] = {
- // lang script terr lStrt lpMid lpEnd lPair lDelm dec group prcnt zero minus plus exp qtOpn qtEnd altQO altQE lDFmt sDFmt lTFmt sTFmt slDay lDays ssDys sDays snDay nDays am pm byte siQnt iecQn crSym crDsp crFmt crFNg ntLng ntTer currISO curDgt curRnd dow1st wknd+ wknd-
- { 1, 0, 0, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 8, 0, 17, 0, 0, 0, 0, 56, 56, 83, 96, 0, 0, 0, 5, 22, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 8, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 4, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7 }, // C/AnyScript/AnyCountry
- { 3, 7, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 45, 10, 22, 109, 109, 163, 163, 83, 83, 2, 2, 0, 5, 22, 0, 0, 4, 0, 0, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 17, 4, 0, 6, 10, {69,84,66}, 2, 1, 7, 6, 7 }, // Oromo/Latin/Ethiopia
- { 3, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 45, 0, 0, 109, 109, 163, 163, 190, 190, 2, 2, 0, 5, 22, 2, 0, 4, 0, 0, 16, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 6, 8, {75,69,83}, 2, 1, 7, 6, 7 }, // Oromo/Latin/Kenya
- { 4, 7, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7 }, // Afar/Latin/Ethiopia
- { 5, 7, 195, 0, 0, 7, 7, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 80, 70, 0, 0, 203, 203, 260, 260, 287, 287, 4, 4, 45, 5, 22, 5, 17, 4, 13, 24, 33, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 27, 27, 13, 13, 3, 3, 5, 17, 23, 1, 66, 4, 6, 9, 11, {90,65,82}, 2, 1, 7, 6, 7 }, // Afrikaans/Latin/South Africa
- { 5, 7, 148, 0, 0, 7, 7, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 70, 10, 22, 203, 203, 260, 260, 287, 287, 4, 4, 45, 5, 22, 6, 83, 4, 13, 24, 44, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 57, 57, 27, 27, 13, 13, 3, 3, 5, 17, 23, 1, 54, 4, 6, 9, 7, {78,65,68}, 2, 1, 1, 6, 7 }, // Afrikaans/Latin/Namibia
- { 6, 7, 2, 0, 0, 15, 15, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 0, 113, 29, 22, 300, 300, 357, 384, 411, 411, 7, 7, 50, 5, 22, 7, 137, 19, 24, 51, 56, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 7, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 4, 44, 5, 7, 5, 8, {65,76,76}, 0, 0, 1, 6, 7 }, // Albanian/Latin/Albania
- { 6, 7, 127, 0, 0, 15, 15, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 0, 113, 0, 0, 300, 300, 357, 384, 411, 411, 7, 7, 50, 5, 22, 11, 181, 19, 24, 51, 64, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 3, 53, 5, 7, 5, 18, {77,75,68}, 2, 1, 1, 6, 7 }, // Albanian/Latin/Macedonia
- { 6, 7, 257, 0, 0, 15, 15, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 0, 113, 0, 0, 300, 300, 357, 384, 411, 411, 7, 7, 50, 5, 22, 14, 234, 19, 24, 51, 82, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 1, 20, 5, 7, 5, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Albanian/Latin/Kosovo
- { 7, 14, 69, 24, 24, 30, 39, 6, 0, 1, 2, 3, 4, 5, 9, 15, 16, 17, 18, 53, 45, 10, 22, 425, 425, 452, 452, 478, 478, 18, 17, 54, 57, 22, 15, 254, 4, 13, 88, 92, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 27, 27, 26, 26, 13, 13, 3, 4, 3, 23, 23, 2, 33, 4, 6, 4, 5, {69,84,66}, 2, 1, 7, 6, 7 }, // Amharic/Ethiopic/Ethiopia
- { 8, 1, 64, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 17, 287, 19, 0, 97, 104, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 80, 5, 0, 7, 3, {69,71,80}, 2, 1, 6, 5, 6 }, // Arabic/Arabic/Egypt
- { 8, 1, 3, 47, 47, 47, 47, 6, 1, 0, 30, 3, 33, 35, 9, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 22, 367, 4, 13, 97, 107, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5,101, 4, 6, 7, 7, {68,90,68}, 2, 1, 6, 5, 6 }, // Arabic/Arabic/Algeria
- { 8, 1, 17, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 27, 468, 19, 0, 97, 114, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 90, 5, 0, 7, 7, {66,72,68}, 3, 0, 6, 5, 6 }, // Arabic/Arabic/Bahrain
- { 8, 1, 42, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 32, 558, 19, 0, 97, 121, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 4,111, 5, 0, 7, 4, {88,65,70}, 0, 0, 1, 6, 7 }, // Arabic/Arabic/Chad
- { 8, 1, 48, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 0, 0, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 33, 669, 19, 0, 97, 125, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 10, 5, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 2,104, 5, 0, 7, 9, {75,77,70}, 0, 0, 1, 6, 7 }, // Arabic/Arabic/Comoros
- { 8, 1, 59, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 36, 773, 19, 0, 97, 134, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 3, 83, 5, 0, 7, 6, {68,74,70}, 0, 0, 6, 6, 7 }, // Arabic/Arabic/Djibouti
- { 8, 1, 67, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 39, 856, 19, 0, 97, 140, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 3, 90, 5, 0, 7, 7, {69,82,78}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/Eritrea
- { 8, 1, 103, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 42, 946, 19, 0, 97, 147, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 83, 5, 0, 7, 6, {73,81,68}, 0, 0, 6, 5, 6 }, // Arabic/Arabic/Iraq
- { 8, 1, 105, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 1, 1, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 47, 1029, 19, 0, 97, 153, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 9, 4, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 1,132, 5, 0, 7, 7, {73,76,83}, 2, 1, 7, 5, 6 }, // Arabic/Arabic/Israel
- { 8, 1, 109, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 48, 1161, 19, 0, 97, 160, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 83, 5, 0, 7, 6, {74,79,68}, 3, 0, 6, 5, 6 }, // Arabic/Arabic/Jordan
- { 8, 1, 115, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 53, 1244, 19, 0, 97, 166, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 83, 5, 0, 7, 6, {75,87,68}, 3, 0, 6, 5, 6 }, // Arabic/Arabic/Kuwait
- { 8, 1, 119, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 58, 1327, 19, 0, 97, 172, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 83, 5, 0, 7, 5, {76,66,80}, 0, 0, 1, 6, 7 }, // Arabic/Arabic/Lebanon
- { 8, 1, 122, 47, 47, 47, 47, 6, 1, 0, 30, 3, 33, 35, 9, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 63, 1410, 4, 13, 97, 177, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 87, 4, 6, 7, 5, {76,89,68}, 3, 0, 6, 5, 6 }, // Arabic/Arabic/Libya
- { 8, 1, 136, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 68, 1497, 19, 0, 97, 182, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 4,111, 5, 0, 7, 9, {77,82,85}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/Mauritania
- { 8, 1, 145, 47, 47, 47, 47, 6, 1, 0, 30, 3, 33, 35, 9, 11, 10, 13, 12, 119, 136, 0, 0, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 72, 1608, 4, 13, 97, 191, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 10, 5, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 86, 4, 6, 7, 6, {77,65,68}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/Morocco
- { 8, 1, 162, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 77, 1694, 19, 0, 97, 197, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 76, 5, 0, 7, 5, {79,77,82}, 3, 0, 6, 5, 6 }, // Arabic/Arabic/Oman
- { 8, 1, 165, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 47, 1029, 19, 0, 97, 202, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 1,132, 5, 0, 7, 18, {73,76,83}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/Palestinian Territories
- { 8, 1, 175, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 82, 1770, 19, 0, 97, 220, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 69, 5, 0, 7, 3, {81,65,82}, 2, 1, 6, 5, 6 }, // Arabic/Arabic/Qatar
- { 8, 1, 186, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 87, 1839, 19, 0, 97, 223, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 76, 5, 0, 7, 24, {83,65,82}, 2, 1, 7, 5, 6 }, // Arabic/Arabic/Saudi Arabia
- { 8, 1, 194, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 92, 1915, 19, 0, 97, 247, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 1, 76, 5, 0, 7, 7, {83,79,83}, 0, 0, 1, 6, 7 }, // Arabic/Arabic/Somalia
- { 8, 1, 201, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 93, 1991, 19, 0, 97, 254, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 4, 90, 5, 0, 7, 7, {83,68,71}, 2, 1, 6, 5, 6 }, // Arabic/Arabic/Sudan
- { 8, 1, 207, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 97, 2081, 19, 0, 97, 261, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 76, 5, 0, 7, 5, {83,89,80}, 0, 0, 6, 5, 6 }, // Arabic/Arabic/Syria
- { 8, 1, 216, 47, 47, 47, 47, 6, 1, 0, 30, 3, 33, 35, 9, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 102, 2157, 4, 13, 97, 266, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 94, 4, 6, 7, 4, {84,78,68}, 3, 0, 1, 6, 7 }, // Arabic/Arabic/Tunisia
- { 8, 1, 223, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 107, 2251, 19, 0, 97, 270, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 90, 5, 0, 7, 24, {65,69,68}, 2, 1, 6, 5, 6 }, // Arabic/Arabic/United Arab Emirates
- { 8, 1, 236, 47, 47, 47, 47, 6, 0, 1, 30, 3, 33, 35, 9, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 72, 1608, 4, 13, 97, 294, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 86, 4, 6, 7, 15, {77,65,68}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/Western Sahara
- { 8, 1, 237, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 112, 2341, 19, 0, 97, 309, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 69, 5, 0, 7, 5, {89,69,82}, 0, 0, 7, 5, 6 }, // Arabic/Arabic/Yemen
- { 8, 1, 254, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 117, 2410, 19, 0, 97, 314, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 1,131, 5, 0, 7, 12, {83,83,80}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/South Sudan
- { 8, 1, 260, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 0, 0, 19, 0, 326, 348, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 0, 0, 5, 0, 22, 6, {0,0,0}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/World
- { 9, 10, 11, 0, 0, 54, 54, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 15, 16, 146, 166, 0, 0, 555, 555, 616, 616, 643, 643, 0, 0, 131, 137, 22, 118, 2541, 19, 0, 354, 361, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 8, 10, 5, 61, 61, 27, 27, 13, 13, 2, 2, 6, 17, 23, 1, 45, 5, 0, 7, 8, {65,77,68}, 2, 0, 1, 6, 7 }, // Armenian/Armenian/Armenia
- { 10, 11, 100, 0, 0, 61, 61, 6, 0, 1, 2, 37, 4, 5, 9, 10, 11, 12, 13, 174, 192, 42, 42, 656, 656, 713, 713, 744, 744, 22, 22, 154, 158, 22, 119, 2586, 8, 0, 369, 376, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 57, 57, 31, 31, 13, 13, 9, 7, 4, 37, 23, 1, 42, 5, 0, 7, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Assamese/Bengali/India
- { 12, 7, 15, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 200, 166, 0, 0, 757, 757, 823, 849, 96, 96, 0, 0, 195, 5, 22, 120, 2628, 19, 0, 380, 390, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 66, 66, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 57, 5, 0, 10, 10, {65,90,78}, 2, 1, 1, 6, 7 }, // Azerbaijani/Latin/Azerbaijan
- { 12, 1, 102, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {73,82,82}, 0, 0, 6, 5, 5 }, // Azerbaijani/Arabic/Iran
- { 12, 2, 15, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 17, 18, 200, 166, 0, 0, 875, 875, 941, 941, 96, 96, 31, 29, 0, 5, 22, 120, 2685, 19, 0, 400, 410, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 66, 66, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 5, 5, 0, 10, 10, {65,90,78}, 2, 1, 1, 6, 7 }, // Azerbaijani/Cyrillic/Azerbaijan
- { 13, 2, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 121, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {82,85,66}, 2, 1, 1, 6, 7 }, // Bashkir/Cyrillic/Russia
- { 14, 7, 197, 0, 0, 78, 78, 6, 1, 0, 2, 3, 38, 5, 9, 10, 11, 10, 11, 217, 253, 54, 0, 967, 967, 1034, 1034, 1061, 1061, 0, 0, 199, 5, 22, 14, 2690, 19, 24, 420, 427, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 6, 12, 5, 67, 67, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 19, 5, 7, 7, 8, {69,85,82}, 2, 1, 1, 6, 7 }, // Basque/Latin/Spain
- { 15, 11, 18, 0, 0, 87, 87, 6, 0, 1, 2, 37, 4, 5, 9, 10, 11, 12, 13, 174, 259, 10, 22, 1074, 1074, 1131, 1131, 1167, 1167, 0, 0, 154, 5, 22, 122, 2709, 0, 31, 435, 440, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 57, 57, 36, 36, 17, 17, 2, 2, 4, 17, 23, 1, 48, 4, 6, 5, 8, {66,68,84}, 2, 1, 7, 6, 7 }, // Bengali/Bengali/Bangladesh
- { 15, 11, 100, 0, 0, 87, 87, 6, 0, 1, 2, 37, 4, 5, 9, 10, 11, 12, 13, 174, 259, 10, 22, 1074, 1074, 1131, 1131, 1167, 1167, 0, 0, 154, 5, 22, 119, 2757, 0, 31, 435, 448, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 57, 57, 36, 36, 17, 17, 2, 2, 4, 17, 23, 1, 42, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Bengali/Bengali/India
- { 16, 31, 25, 96, 96, 96, 96, 6, 0, 1, 2, 39, 4, 5, 9, 10, 11, 12, 13, 265, 70, 66, 93, 1184, 1184, 1262, 1262, 1295, 1295, 33, 31, 0, 5, 22, 123, 2799, 4, 0, 452, 458, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 10, 27, 22, 78, 78, 33, 33, 26, 26, 5, 6, 4, 17, 23, 3, 8, 4, 0, 6, 5, {66,84,78}, 2, 1, 7, 6, 7 }, // Dzongkha/Tibetan/Bhutan
- { 19, 7, 74, 0, 0, 105, 105, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 45, 0, 0, 1321, 1321, 1363, 1363, 1395, 1395, 38, 37, 206, 213, 230, 14, 2807, 19, 0, 463, 472, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 42, 42, 32, 32, 17, 17, 4, 4, 7, 17, 23, 1, 35, 5, 0, 9, 5, {69,85,82}, 2, 1, 1, 6, 7 }, // Breton/Latin/France
- { 20, 2, 33, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 40, 10, 40, 10, 295, 317, 1, 1, 1412, 1412, 1466, 1466, 1486, 1486, 42, 41, 253, 5, 22, 126, 2842, 19, 24, 477, 486, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 12, 9, 4, 54, 54, 20, 20, 13, 13, 6, 6, 7, 17, 23, 3, 46, 5, 7, 9, 8, {66,71,78}, 2, 1, 1, 6, 7 }, // Bulgarian/Cyrillic/Bulgaria
- { 21, 25, 147, 120, 120, 125, 125, 135, 0, 1, 2, 41, 4, 5, 9, 10, 11, 12, 13, 329, 347, 115, 125, 1499, 1499, 1499, 1499, 1552, 1552, 48, 47, 260, 5, 22, 2, 2888, 8, 0, 494, 494, 5, 5, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 6, 53, 53, 53, 53, 13, 13, 5, 3, 5, 17, 23, 1, 28, 5, 0, 6, 6, {77,77,75}, 0, 0, 7, 6, 7 }, // Burmese/Myanmar/Myanmar
- { 22, 2, 20, 0, 0, 136, 136, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 167, 131, 0, 1565, 1565, 1620, 1620, 1640, 1640, 0, 0, 265, 270, 22, 0, 2916, 19, 0, 500, 510, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 7, 11, 5, 55, 55, 20, 20, 13, 13, 2, 2, 5, 17, 23, 2, 88, 5, 0, 10, 8, {66,89,78}, 2, 0, 1, 6, 7 }, // Belarusian/Cyrillic/Belarus
- { 23, 20, 36, 0, 0, 143, 152, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 259, 10, 22, 1653, 1698, 1744, 1744, 1783, 1783, 0, 0, 287, 5, 22, 129, 3004, 0, 31, 518, 523, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 45, 46, 39, 39, 13, 13, 2, 2, 2, 17, 23, 1, 28, 4, 6, 5, 7, {75,72,82}, 2, 1, 7, 6, 7 }, // Khmer/Khmer/Cambodia
- { 24, 7, 197, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 355, 259, 1, 1, 1796, 1796, 1855, 1855, 1882, 1882, 53, 50, 0, 5, 22, 14, 3032, 19, 24, 530, 536, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 9, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 19, 5, 7, 6, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // Catalan/Latin/Spain
- { 24, 7, 5, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 355, 259, 1, 1, 1796, 1796, 1855, 1855, 1882, 1882, 53, 50, 0, 5, 22, 14, 3032, 19, 24, 530, 543, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 9, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 19, 5, 7, 6, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // Catalan/Latin/Andorra
- { 24, 7, 74, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 355, 259, 1, 1, 1796, 1796, 1855, 1855, 1882, 1882, 53, 50, 0, 5, 22, 14, 3032, 19, 24, 530, 550, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 9, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 19, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Catalan/Latin/France
- { 24, 7, 106, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 355, 259, 1, 1, 1796, 1796, 1855, 1855, 1882, 1882, 53, 50, 0, 5, 22, 14, 3032, 19, 24, 530, 556, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 9, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 19, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Catalan/Latin/Italy
- { 25, 5, 44, 168, 168, 173, 173, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 377, 390, 142, 27, 1902, 1902, 1929, 1929, 1949, 1949, 58, 55, 289, 291, 22, 130, 3051, 4, 13, 562, 566, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 21, 23, 1, 12, 4, 6, 4, 2, {67,78,89}, 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/China
- { 25, 5, 97, 168, 168, 173, 173, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 377, 259, 142, 27, 1902, 1902, 1929, 1929, 1949, 1949, 58, 55, 289, 291, 22, 131, 3063, 4, 13, 562, 568, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 21, 23, 3, 10, 4, 6, 4, 9, {72,75,68}, 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Hong Kong
- { 25, 5, 126, 168, 168, 173, 173, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 377, 259, 142, 27, 1902, 1902, 1929, 1929, 1949, 1949, 58, 55, 289, 291, 22, 134, 3073, 4, 13, 562, 577, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 21, 23, 4, 12, 4, 6, 4, 9, {77,79,80}, 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Macau
- { 25, 5, 190, 168, 168, 173, 173, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 377, 45, 142, 27, 1902, 1902, 1929, 1929, 1949, 1949, 58, 55, 289, 291, 22, 6, 3085, 4, 13, 562, 586, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 21, 23, 1, 14, 4, 6, 4, 3, {83,71,68}, 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Singapore
- { 25, 6, 97, 168, 168, 178, 178, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 377, 398, 153, 27, 1902, 1902, 1962, 1962, 1949, 1949, 58, 55, 312, 5, 22, 131, 3063, 4, 13, 589, 593, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 13, 6, 27, 27, 20, 20, 13, 13, 2, 2, 3, 17, 23, 3, 10, 4, 6, 4, 9, {72,75,68}, 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Hong Kong
- { 25, 6, 126, 168, 168, 178, 178, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 377, 398, 153, 27, 1902, 1902, 1962, 1962, 1949, 1949, 58, 55, 312, 5, 22, 134, 3099, 4, 13, 589, 602, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 13, 6, 27, 27, 20, 20, 13, 13, 2, 2, 3, 17, 23, 4, 12, 4, 6, 4, 9, {77,79,80}, 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Macau
- { 25, 6, 208, 168, 168, 173, 173, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 406, 390, 153, 27, 1902, 1902, 1962, 1962, 1949, 1949, 58, 55, 0, 5, 22, 6, 3111, 4, 13, 589, 611, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 13, 6, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 12, 4, 6, 4, 2, {84,87,68}, 2, 0, 7, 6, 7 }, // Chinese/Traditional Han/Taiwan
- { 26, 7, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Corsican/Latin/France
- { 27, 7, 54, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 439, 54, 0, 1982, 1982, 2039, 2039, 2066, 2079, 0, 0, 315, 5, 22, 138, 3123, 19, 0, 613, 621, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 13, 12, 5, 57, 57, 27, 27, 13, 13, 2, 2, 7, 17, 23, 3, 59, 5, 0, 8, 8, {72,82,75}, 2, 1, 1, 6, 7 }, // Croatian/Latin/Croatia
- { 27, 7, 27, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 452, 54, 0, 1982, 1982, 2039, 2039, 2079, 2079, 0, 0, 315, 5, 22, 141, 3182, 19, 0, 613, 629, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 9, 12, 5, 57, 57, 27, 27, 13, 13, 2, 2, 7, 17, 23, 2, 84, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7 }, // Croatian/Latin/Bosnia And Herzegowina
- { 28, 7, 57, 0, 0, 183, 183, 6, 1, 14, 2, 3, 4, 5, 9, 40, 10, 46, 12, 461, 166, 1, 1, 2092, 2092, 2140, 2140, 2160, 2160, 60, 57, 322, 5, 22, 143, 3266, 19, 0, 648, 655, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 9, 4, 48, 48, 20, 20, 13, 13, 4, 4, 5, 17, 23, 2, 67, 5, 0, 7, 5, {67,90,75}, 2, 0, 1, 6, 7 }, // Czech/Latin/Czech Republic
- { 29, 7, 58, 0, 0, 190, 190, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 478, 501, 166, 166, 2173, 2173, 2223, 2250, 2284, 2284, 0, 0, 0, 5, 22, 145, 3333, 19, 0, 660, 665, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 50, 50, 27, 34, 13, 13, 2, 2, 5, 17, 23, 3, 41, 5, 0, 5, 7, {68,75,75}, 2, 0, 1, 6, 7 }, // Danish/Latin/Denmark
- { 29, 7, 86, 0, 0, 190, 190, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 478, 501, 166, 166, 2173, 2173, 2223, 2250, 2284, 2284, 0, 0, 0, 5, 22, 145, 3333, 19, 0, 660, 672, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 50, 50, 27, 34, 13, 13, 2, 2, 5, 17, 23, 3, 41, 5, 0, 5, 8, {68,75,75}, 2, 0, 1, 6, 7 }, // Danish/Latin/Greenland
- { 30, 7, 151, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 14, 3374, 8, 37, 680, 680, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 7, 10, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Netherlands
- { 30, 7, 12, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 148, 3392, 8, 37, 680, 690, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 54, 5, 7, 10, 5, {65,87,71}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Aruba
- { 30, 7, 21, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 46, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 14, 3374, 8, 37, 680, 695, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 7, 10, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Belgium
- { 30, 7, 152, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 152, 3446, 8, 37, 680, 701, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 96, 5, 7, 10, 7, {65,78,71}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Cura Sao
- { 30, 7, 202, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 6, 3542, 8, 37, 680, 708, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 57, 5, 7, 10, 8, {83,82,68}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Suriname
- { 30, 7, 255, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 6, 3599, 8, 37, 680, 716, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 60, 5, 7, 10, 19, {85,83,68}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Bonaire
- { 30, 7, 256, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 152, 3446, 8, 37, 680, 735, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 96, 5, 7, 10, 12, {65,78,71}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Sint Maarten
- { 31, 7, 225, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 747, 763, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 16, 13, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/United States
- { 31, 3, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 156, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Deseret/United States
- { 31, 7, 4, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 776, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 14, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/American Samoa
- { 31, 7, 7, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 790, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 8, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Anguilla
- { 31, 7, 9, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 798, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 17, {88,67,68}, 2, 1, 7, 6, 7 }, // English/Latin/Antigua And Barbuda
- { 31, 7, 13, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 6, 10, 11, 12, 13, 0, 259, 10, 22, 0, 0, 56, 56, 2388, 2388, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 815, 815, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 27, 27, 24, 24, 2, 2, 5, 17, 23, 1, 58, 4, 6, 18, 9, {65,85,68}, 2, 1, 7, 6, 7 }, // English/Latin/Australia
- { 31, 7, 14, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 8, 0, 756, 833, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Austria
- { 31, 7, 16, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3840, 4, 13, 756, 840, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 7, {66,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/Bahamas
- { 31, 7, 19, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3892, 4, 13, 756, 847, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 55, 4, 6, 7, 8, {66,66,68}, 2, 1, 1, 6, 7 }, // English/Latin/Barbados
- { 31, 7, 21, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 19, 0, 756, 855, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Belgium
- { 31, 7, 22, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3947, 4, 13, 756, 862, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 46, 4, 6, 7, 6, {66,90,68}, 2, 1, 7, 6, 7 }, // English/Latin/Belize
- { 31, 7, 24, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3993, 4, 13, 756, 868, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 7, {66,77,68}, 2, 1, 1, 6, 7 }, // English/Latin/Bermuda
- { 31, 7, 28, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 136, 4045, 4, 13, 756, 875, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 49, 4, 6, 7, 8, {66,87,80}, 2, 1, 7, 6, 7 }, // English/Latin/Botswana
- { 31, 7, 31, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 883, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 30, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/British Indian Ocean Territory
- { 31, 7, 35, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 0, 0, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 159, 4094, 4, 13, 756, 913, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 52, 4, 6, 7, 7, {66,73,70}, 0, 0, 1, 6, 7 }, // English/Latin/Burundi
- { 31, 7, 37, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 32, 4146, 4, 13, 756, 920, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 82, 4, 6, 7, 8, {88,65,70}, 0, 0, 1, 6, 7 }, // English/Latin/Cameroon
- { 31, 7, 38, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 6, 10, 11, 12, 13, 27, 70, 10, 22, 0, 0, 2412, 2412, 83, 83, 64, 61, 0, 5, 22, 6, 4228, 4, 13, 928, 944, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 12, 7, 56, 56, 34, 34, 13, 13, 4, 4, 5, 17, 23, 1, 52, 4, 6, 16, 6, {67,65,68}, 2, 0, 7, 6, 7 }, // English/Latin/Canada
- { 31, 7, 40, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4280, 4, 13, 756, 950, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 14, {75,89,68}, 2, 1, 1, 6, 7 }, // English/Latin/Cayman Islands
- { 31, 7, 45, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 964, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 16, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Christmas Island
- { 31, 7, 46, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 980, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 23, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Cocos Islands
- { 31, 7, 51, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4350, 4, 13, 756, 1003, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 12, {78,90,68}, 2, 1, 1, 6, 7 }, // English/Latin/Cook Islands
- { 31, 7, 56, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 4, 13, 756, 1015, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 4, 6, 7, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Cyprus
- { 31, 7, 58, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 166, 166, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 145, 4411, 19, 0, 756, 1021, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 43, 5, 0, 7, 7, {68,75,75}, 2, 0, 1, 6, 7 }, // English/Latin/Denmark
- { 31, 7, 60, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1028, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 8, {88,67,68}, 2, 1, 7, 6, 7 }, // English/Latin/Dominica
- { 31, 7, 67, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 39, 4454, 4, 13, 756, 1036, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 49, 4, 6, 7, 7, {69,82,78}, 2, 1, 1, 6, 7 }, // English/Latin/Eritrea
- { 31, 7, 70, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 4503, 4, 13, 756, 1043, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 73, 4, 6, 7, 16, {70,75,80}, 2, 1, 1, 6, 7 }, // English/Latin/Falkland Islands
- { 31, 7, 72, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4576, 4, 13, 756, 1059, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 46, 4, 6, 7, 4, {70,74,68}, 2, 1, 1, 6, 7 }, // English/Latin/Fiji
- { 31, 7, 73, 0, 0, 208, 208, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 176, 167, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 19, 0, 756, 1063, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 9, 4, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Finland
- { 31, 7, 75, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 4622, 4, 13, 756, 1070, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 31, 4, 6, 7, 8, {71,66,80}, 2, 1, 1, 6, 7 }, // English/Latin/Guernsey
- { 31, 7, 80, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 162, 4653, 4, 13, 756, 1078, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 49, 4, 6, 7, 6, {71,77,68}, 2, 1, 1, 6, 7 }, // English/Latin/Gambia
- { 31, 7, 82, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 19, 0, 756, 1084, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Germany
- { 31, 7, 83, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 163, 4702, 4, 13, 756, 1091, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 46, 4, 6, 7, 5, {71,72,83}, 2, 1, 1, 6, 7 }, // English/Latin/Ghana
- { 31, 7, 84, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 4748, 4, 13, 756, 1096, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 9, {71,73,80}, 2, 1, 1, 6, 7 }, // English/Latin/Gibraltar
- { 31, 7, 87, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1105, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 7, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Grenada
- { 31, 7, 89, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1112, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 4, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/Guam
- { 31, 7, 93, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4800, 4, 13, 756, 1116, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 55, 4, 6, 7, 6, {71,89,68}, 2, 0, 1, 6, 7 }, // English/Latin/Guyana
- { 31, 7, 97, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 398, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 131, 4855, 4, 13, 756, 1122, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 55, 4, 6, 7, 19, {72,75,68}, 2, 1, 7, 6, 7 }, // English/Latin/Hong Kong
- { 31, 7, 100, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 119, 4910, 4, 13, 756, 891, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 43, 4, 6, 7, 5, {73,78,82}, 2, 1, 7, 7, 7 }, // English/Latin/India
- { 31, 7, 104, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 45, 0, 0, 0, 0, 56, 56, 83, 83, 64, 61, 0, 5, 22, 14, 3821, 4, 13, 756, 1141, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 56, 56, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 19, 4, 6, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Ireland
- { 31, 7, 105, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 1, 1, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 47, 4953, 4, 13, 756, 1148, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 9, 4, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 6, {73,76,83}, 2, 1, 7, 5, 6 }, // English/Latin/Israel
- { 31, 7, 107, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 5014, 4, 13, 756, 1154, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 7, {74,77,68}, 2, 1, 7, 6, 7 }, // English/Latin/Jamaica
- { 31, 7, 111, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 2, 5066, 4, 13, 756, 1161, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 52, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // English/Latin/Kenya
- { 31, 7, 112, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 1166, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 8, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Kiribati
- { 31, 7, 120, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 5, 5118, 4, 13, 756, 1174, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 60, 4, 6, 7, 7, {90,65,82}, 2, 1, 1, 6, 7 }, // English/Latin/Lesotho
- { 31, 7, 121, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 5178, 4, 13, 756, 1181, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 7, {76,82,68}, 2, 1, 1, 6, 7 }, // English/Latin/Liberia
- { 31, 7, 126, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 134, 5230, 4, 13, 756, 1188, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 52, 4, 6, 7, 15, {77,79,80}, 2, 1, 7, 6, 7 }, // English/Latin/Macau
- { 31, 7, 128, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 166, 5282, 4, 13, 756, 1203, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 53, 4, 6, 7, 10, {77,71,65}, 0, 0, 1, 6, 7 }, // English/Latin/Madagascar
- { 31, 7, 129, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 142, 5335, 4, 13, 756, 1213, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 52, 4, 6, 7, 6, {77,87,75}, 2, 1, 1, 6, 7 }, // English/Latin/Malawi
- { 31, 7, 130, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 168, 5387, 4, 13, 756, 1219, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 58, 4, 6, 7, 8, {77,89,82}, 2, 1, 1, 6, 7 }, // English/Latin/Malaysia
- { 31, 7, 133, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 4, 13, 756, 1227, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 4, 6, 7, 5, {69,85,82}, 2, 1, 7, 6, 7 }, // English/Latin/Malta
- { 31, 7, 134, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1232, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 16, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/Marshall Islands
- { 31, 7, 137, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 170, 5445, 4, 13, 756, 1248, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 52, 4, 6, 7, 9, {77,85,82}, 2, 0, 1, 6, 7 }, // English/Latin/Mauritius
- { 31, 7, 140, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1257, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 10, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/Micronesia
- { 31, 7, 144, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1267, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 10, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Montserrat
- { 31, 7, 148, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 5497, 4, 13, 756, 1277, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 7, {78,65,68}, 2, 1, 1, 6, 7 }, // English/Latin/Namibia
- { 31, 7, 149, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 1284, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 5, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Nauru
- { 31, 7, 151, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 8, 37, 756, 1289, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 7, 7, 11, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Netherlands
- { 31, 7, 154, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 46, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4350, 4, 13, 756, 1300, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 11, {78,90,68}, 2, 1, 1, 6, 7 }, // English/Latin/New Zealand
- { 31, 7, 157, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 172, 5549, 4, 13, 756, 1311, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 49, 4, 6, 7, 7, {78,71,78}, 2, 1, 1, 6, 7 }, // English/Latin/Nigeria
- { 31, 7, 158, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4350, 4, 13, 756, 1318, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 4, {78,90,68}, 2, 1, 1, 6, 7 }, // English/Latin/Niue
- { 31, 7, 159, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 1322, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 14, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Norfolk Island
- { 31, 7, 160, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1336, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 24, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/Northern Mariana Islands
- { 31, 7, 163, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 170, 5598, 4, 13, 756, 1360, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 52, 4, 6, 7, 8, {80,75,82}, 2, 0, 7, 6, 7 }, // English/Latin/Pakistan
- { 31, 7, 164, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1368, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 5, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/Palau
- { 31, 7, 167, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 2, 5650, 4, 13, 756, 1373, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 72, 4, 6, 7, 16, {80,71,75}, 2, 1, 1, 6, 7 }, // English/Latin/Papua New Guinea
- { 31, 7, 170, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 173, 5722, 4, 13, 756, 1389, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 11, {80,72,80}, 2, 1, 7, 6, 7 }, // English/Latin/Philippines
- { 31, 7, 171, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4350, 4, 13, 756, 1400, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 16, {78,90,68}, 2, 1, 1, 6, 7 }, // English/Latin/Pitcairn
- { 31, 7, 174, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1416, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 11, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/Puerto Rico
- { 31, 7, 179, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 174, 5774, 4, 13, 756, 1427, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 46, 4, 6, 7, 6, {82,87,70}, 0, 0, 1, 6, 7 }, // English/Latin/Rwanda
- { 31, 7, 180, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1433, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 16, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Saint Kitts And Nevis
- { 31, 7, 181, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1449, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 8, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Saint Lucia
- { 31, 7, 182, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1457, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 23, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Saint Vincent And The Grenadines
- { 31, 7, 183, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 176, 5820, 4, 13, 756, 785, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 39, 4, 6, 7, 5, {87,83,84}, 2, 1, 7, 6, 7 }, // English/Latin/Samoa
- { 31, 7, 188, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 179, 5859, 4, 13, 756, 1480, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 58, 4, 6, 7, 10, {83,67,82}, 2, 1, 1, 6, 7 }, // English/Latin/Seychelles
- { 31, 7, 189, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 7, 5917, 4, 13, 756, 1490, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 67, 4, 6, 7, 12, {83,76,76}, 0, 0, 1, 6, 7 }, // English/Latin/Sierra Leone
- { 31, 7, 190, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 5984, 4, 13, 756, 1502, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 55, 4, 6, 7, 9, {83,71,68}, 2, 1, 7, 6, 7 }, // English/Latin/Singapore
- { 31, 7, 192, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 6, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 19, 24, 756, 1511, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 7, 7, 8, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Slovenia
- { 31, 7, 193, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 6039, 4, 13, 756, 1519, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 73, 4, 6, 7, 15, {83,66,68}, 2, 1, 1, 6, 7 }, // English/Latin/Solomon Islands
- { 31, 7, 195, 0, 0, 208, 208, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 545, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 5, 5118, 4, 13, 756, 1534, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 60, 4, 6, 7, 12, {90,65,82}, 2, 1, 7, 6, 7 }, // English/Latin/South Africa
- { 31, 7, 199, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 6112, 4, 13, 756, 1546, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 9, {83,72,80}, 2, 1, 1, 6, 7 }, // English/Latin/Saint Helena
- { 31, 7, 201, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 0, 6164, 4, 13, 756, 1555, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 49, 4, 6, 7, 5, {83,68,71}, 2, 1, 6, 5, 6 }, // English/Latin/Sudan
- { 31, 7, 204, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 181, 6213, 4, 13, 756, 1560, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 8, {83,90,76}, 2, 1, 1, 6, 7 }, // English/Latin/Swaziland
- { 31, 7, 205, 0, 0, 208, 208, 6, 1, 14, 2, 3, 4, 5, 47, 10, 11, 12, 13, 0, 70, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 145, 6265, 19, 0, 756, 1568, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 46, 5, 0, 7, 6, {83,69,75}, 2, 0, 1, 6, 7 }, // English/Latin/Sweden
- { 31, 7, 206, 0, 0, 208, 208, 6, 0, 13, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 0, 6311, 8, 44, 756, 1574, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 40, 5, 5, 7, 11, {67,72,70}, 2, 0, 1, 6, 7 }, // English/Latin/Switzerland
- { 31, 7, 210, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 182, 6351, 4, 13, 756, 1585, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 61, 4, 6, 7, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // English/Latin/Tanzania
- { 31, 7, 213, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4350, 4, 13, 756, 1593, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 7, {78,90,68}, 2, 1, 1, 6, 7 }, // English/Latin/Tokelau
- { 31, 7, 214, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 185, 6412, 4, 13, 756, 1600, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 48, 4, 6, 7, 5, {84,79,80}, 2, 1, 1, 6, 7 }, // English/Latin/Tonga
- { 31, 7, 215, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 6460, 4, 13, 756, 1605, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 79, 4, 6, 7, 17, {84,84,68}, 2, 1, 7, 6, 7 }, // English/Latin/Trinidad And Tobago
- { 31, 7, 219, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1622, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 22, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/Turks And Caicos Islands
- { 31, 7, 220, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 1644, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 6, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Tuvalu
- { 31, 7, 221, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 187, 6539, 4, 13, 756, 1650, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 55, 4, 6, 7, 6, {85,71,88}, 0, 0, 1, 7, 7 }, // English/Latin/Uganda
- { 31, 7, 223, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 190, 6594, 4, 13, 756, 1656, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 54, 4, 6, 7, 20, {65,69,68}, 2, 1, 6, 5, 6 }, // English/Latin/United Arab Emirates
- { 31, 7, 224, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 6648, 4, 13, 1676, 1691, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 46, 4, 6, 15, 14, {71,66,80}, 2, 1, 1, 6, 7 }, // English/Latin/United Kingdom
- { 31, 7, 226, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1705, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 21, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/United States Minor Outlying Islands
- { 31, 7, 229, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 193, 6694, 4, 13, 756, 1726, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 43, 4, 6, 7, 7, {86,85,86}, 0, 0, 1, 6, 7 }, // English/Latin/Vanuatu
- { 31, 7, 233, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1733, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 22, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/British Virgin Islands
- { 31, 7, 234, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1755, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 19, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/United States Virgin Islands
- { 31, 7, 239, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 2, 6737, 4, 13, 756, 1774, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 49, 4, 6, 7, 6, {90,77,87}, 2, 1, 1, 6, 7 }, // English/Latin/Zambia
- { 31, 7, 240, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 398, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1780, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 8, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/Zimbabwe
- { 31, 7, 249, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1788, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 12, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/Diego Garcia
- { 31, 7, 251, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 4622, 4, 13, 756, 1800, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 31, 4, 6, 7, 11, {71,66,80}, 2, 1, 1, 6, 7 }, // English/Latin/Isle Of Man
- { 31, 7, 252, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 4622, 4, 13, 756, 1811, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 31, 4, 6, 7, 6, {71,66,80}, 2, 1, 1, 6, 7 }, // English/Latin/Jersey
- { 31, 7, 254, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 6786, 4, 13, 756, 1817, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 67, 4, 6, 7, 11, {83,83,80}, 2, 1, 1, 6, 7 }, // English/Latin/South Sudan
- { 31, 7, 256, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 152, 6853, 4, 13, 756, 1828, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 94, 4, 6, 7, 12, {65,78,71}, 2, 1, 1, 6, 7 }, // English/Latin/Sint Maarten
- { 31, 7, 260, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 0, 0, 4, 13, 756, 1840, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 4, 6, 7, 5, {0,0,0}, 2, 1, 1, 6, 7 }, // English/Latin/World
- { 31, 7, 261, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 0, 0, 19, 0, 756, 1845, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 5, 0, 7, 6, {0,0,0}, 2, 1, 1, 6, 7 }, // English/Latin/Europe
- { 32, 7, 260, 0, 0, 217, 217, 6, 1, 14, 2, 3, 38, 5, 9, 10, 11, 12, 13, 555, 72, 185, 0, 2446, 2446, 2496, 2496, 2516, 2516, 70, 67, 327, 5, 22, 0, 0, 8, 0, 1851, 1860, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 8, 25, 5, 50, 50, 20, 20, 13, 13, 3, 3, 6, 17, 23, 0, 0, 5, 0, 9, 5, {0,0,0}, 2, 1, 1, 6, 7 }, // Esperanto/Latin/World
- { 33, 7, 68, 0, 0, 226, 226, 6, 1, 14, 2, 3, 38, 5, 47, 40, 10, 46, 12, 420, 166, 0, 0, 2529, 2529, 2591, 2591, 2591, 2591, 0, 0, 333, 5, 22, 14, 6947, 19, 24, 1865, 1870, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 13, 13, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 5, 5, {69,85,82}, 2, 1, 1, 6, 7 }, // Estonian/Latin/Estonia
- { 34, 7, 71, 0, 0, 190, 190, 6, 1, 0, 2, 3, 38, 5, 9, 10, 11, 12, 13, 420, 166, 0, 0, 2604, 2604, 2677, 2704, 2738, 2738, 0, 0, 339, 5, 22, 145, 6966, 19, 24, 1875, 1883, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 73, 73, 27, 34, 13, 13, 2, 2, 3, 17, 23, 2, 42, 5, 7, 8, 7, {68,75,75}, 2, 0, 1, 6, 7 }, // Faroese/Latin/Faroe Islands
- { 34, 7, 58, 0, 0, 190, 190, 6, 1, 0, 2, 3, 38, 5, 9, 10, 11, 12, 13, 420, 166, 0, 0, 2604, 2604, 2677, 2704, 2738, 2738, 0, 0, 339, 5, 22, 145, 6966, 19, 24, 1875, 665, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 73, 73, 27, 34, 13, 13, 2, 2, 3, 17, 23, 3, 42, 5, 7, 8, 7, {68,75,75}, 2, 0, 1, 6, 7 }, // Faroese/Latin/Denmark
- { 36, 7, 73, 0, 0, 226, 226, 6, 1, 14, 2, 3, 38, 5, 9, 11, 11, 13, 13, 461, 581, 176, 167, 2751, 2817, 2897, 2897, 2917, 2917, 73, 70, 342, 347, 364, 14, 7008, 19, 0, 1890, 1895, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 9, 4, 66, 80, 20, 20, 13, 13, 3, 3, 5, 17, 23, 1, 19, 5, 0, 5, 5, {69,85,82}, 2, 1, 1, 6, 7 }, // Finnish/Latin/Finland
- { 37, 7, 74, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 1908, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/France
- { 37, 7, 3, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 195, 7027, 19, 24, 1900, 1914, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 50, 5, 7, 8, 7, {68,90,68}, 2, 1, 6, 5, 6 }, // French/Latin/Algeria
- { 37, 7, 21, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 46, 210, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 1921, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 7, 23, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 8, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Belgium
- { 37, 7, 23, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 1929, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Benin
- { 37, 7, 34, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 1934, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 12, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Burkina Faso
- { 37, 7, 35, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 159, 7135, 19, 24, 1900, 913, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 52, 5, 7, 8, 7, {66,73,70}, 0, 0, 1, 6, 7 }, // French/Latin/Burundi
- { 37, 7, 37, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 76, 73, 387, 213, 230, 32, 7187, 19, 24, 1900, 1946, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 5, 4, 6, 17, 23, 4, 55, 5, 7, 8, 8, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Cameroon
- { 37, 7, 38, 0, 0, 234, 234, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 11, 10, 97, 70, 233, 233, 2930, 2930, 2981, 2981, 3015, 3015, 64, 61, 387, 213, 230, 6, 7242, 19, 24, 1954, 944, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 24, 9, 51, 51, 34, 34, 13, 13, 4, 4, 6, 17, 23, 1, 53, 5, 7, 17, 6, {67,65,68}, 2, 0, 7, 6, 7 }, // French/Latin/Canada
- { 37, 7, 41, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7187, 19, 24, 1900, 1971, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 55, 5, 7, 8, 25, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Central African Republic
- { 37, 7, 42, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7187, 19, 24, 1900, 1996, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 55, 5, 7, 8, 5, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Chad
- { 37, 7, 48, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7295, 19, 24, 1900, 2001, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 50, 5, 7, 8, 7, {75,77,70}, 0, 0, 1, 6, 7 }, // French/Latin/Comoros
- { 37, 7, 49, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7345, 19, 24, 1900, 2008, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 52, 5, 7, 8, 14, {67,68,70}, 2, 1, 1, 6, 7 }, // French/Latin/Congo Kinshasa
- { 37, 7, 50, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7187, 19, 24, 1900, 2022, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 55, 5, 7, 8, 17, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Congo Brazzaville
- { 37, 7, 53, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 2039, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 13, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Ivory Coast
- { 37, 7, 59, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 36, 7397, 19, 24, 1900, 2052, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 56, 5, 7, 8, 8, {68,74,70}, 0, 0, 6, 6, 7 }, // French/Latin/Djibouti
- { 37, 7, 66, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7187, 19, 24, 1900, 2060, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 55, 5, 7, 8, 18, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Equatorial Guinea
- { 37, 7, 76, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2078, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 16, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/French Guiana
- { 37, 7, 77, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 197, 7453, 19, 24, 1900, 2094, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 34, 5, 7, 8, 19, {88,80,70}, 0, 0, 1, 6, 7 }, // French/Latin/French Polynesia
- { 37, 7, 79, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7187, 19, 24, 1900, 2113, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 55, 5, 7, 8, 5, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Gabon
- { 37, 7, 88, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2118, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Guadeloupe
- { 37, 7, 91, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 201, 7487, 19, 24, 1900, 2060, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 47, 5, 7, 8, 6, {71,78,70}, 0, 0, 1, 6, 7 }, // French/Latin/Guinea
- { 37, 7, 94, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 163, 7534, 19, 24, 1900, 2128, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 56, 5, 7, 8, 5, {72,84,71}, 2, 1, 1, 6, 7 }, // French/Latin/Haiti
- { 37, 7, 125, 0, 0, 234, 234, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2133, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Luxembourg
- { 37, 7, 128, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 166, 7590, 19, 24, 1900, 1203, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 53, 5, 7, 8, 10, {77,71,65}, 0, 0, 1, 6, 7 }, // French/Latin/Madagascar
- { 37, 7, 132, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 2143, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 4, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Mali
- { 37, 7, 135, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2147, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Martinique
- { 37, 7, 136, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 203, 7643, 19, 24, 1900, 2157, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 65, 5, 7, 8, 10, {77,82,85}, 2, 1, 1, 6, 7 }, // French/Latin/Mauritania
- { 37, 7, 137, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 170, 7708, 19, 24, 1900, 2167, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 62, 5, 7, 8, 7, {77,85,82}, 2, 0, 1, 6, 7 }, // French/Latin/Mauritius
- { 37, 7, 138, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2174, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Mayotte
- { 37, 7, 142, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2181, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Monaco
- { 37, 7, 145, 0, 0, 234, 234, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 64, 61, 387, 213, 230, 205, 7770, 19, 24, 1900, 2187, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 4, 4, 6, 17, 23, 3, 53, 5, 7, 8, 5, {77,65,68}, 2, 1, 1, 6, 7 }, // French/Latin/Morocco
- { 37, 7, 153, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 197, 7453, 19, 24, 1900, 2192, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 34, 5, 7, 8, 18, {88,80,70}, 0, 0, 1, 6, 7 }, // French/Latin/New Caledonia
- { 37, 7, 156, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 1311, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Niger
- { 37, 7, 176, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2210, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Reunion
- { 37, 7, 179, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 174, 7823, 19, 24, 1900, 1427, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 49, 5, 7, 8, 6, {82,87,70}, 0, 0, 1, 6, 7 }, // French/Latin/Rwanda
- { 37, 7, 187, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 2220, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 7, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Senegal
- { 37, 7, 188, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 179, 7872, 19, 24, 1900, 1480, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 70, 5, 7, 8, 10, {83,67,82}, 2, 1, 1, 6, 7 }, // French/Latin/Seychelles
- { 37, 7, 200, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2227, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 24, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Saint Pierre And Miquelon
- { 37, 7, 206, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 17, 18, 0, 166, 257, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 208, 7942, 19, 24, 2251, 2266, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 14, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 44, 5, 7, 15, 6, {67,72,70}, 2, 0, 1, 6, 7 }, // French/Latin/Switzerland
- { 37, 7, 207, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 211, 7986, 19, 24, 1900, 2272, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 50, 5, 7, 8, 5, {83,89,80}, 0, 0, 6, 5, 6 }, // French/Latin/Syria
- { 37, 7, 212, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 2277, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 4, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Togo
- { 37, 7, 216, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 213, 8036, 19, 24, 1900, 2281, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 50, 5, 7, 8, 7, {84,78,68}, 3, 0, 1, 6, 7 }, // French/Latin/Tunisia
- { 37, 7, 229, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 193, 8086, 19, 24, 1900, 1726, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 50, 5, 7, 8, 7, {86,85,86}, 0, 0, 1, 6, 7 }, // French/Latin/Vanuatu
- { 37, 7, 235, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 197, 7453, 19, 24, 1900, 2288, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 34, 5, 7, 8, 16, {88,80,70}, 0, 0, 1, 6, 7 }, // French/Latin/Wallis And Futuna Islands
- { 37, 7, 244, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2304, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 16, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Saint Barthelemy
- { 37, 7, 245, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2320, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 12, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Saint Martin
- { 38, 7, 151, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 347, 0, 0, 3028, 3028, 3081, 3081, 83, 83, 0, 0, 0, 5, 22, 14, 3374, 8, 37, 2332, 2337, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 53, 53, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 7, 5, 8, {69,85,82}, 2, 1, 1, 6, 7 }, // Western Frisian/Latin/Netherlands
- { 39, 7, 224, 0, 0, 242, 242, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 589, 45, 0, 0, 3101, 3101, 3169, 3169, 3196, 3196, 5, 77, 393, 5, 22, 117, 8136, 4, 13, 2345, 2353, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 10, 10, 5, 68, 68, 27, 27, 13, 13, 1, 1, 6, 17, 23, 1, 85, 4, 6, 8, 22, {71,66,80}, 2, 1, 1, 6, 7 }, // Gaelic/Latin/United Kingdom
- { 40, 7, 197, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 45, 0, 0, 3209, 3257, 3305, 3339, 3373, 3386, 64, 61, 0, 5, 22, 14, 3032, 19, 0, 2375, 2381, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 48, 48, 34, 34, 13, 20, 4, 4, 5, 17, 23, 1, 19, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Galician/Latin/Spain
- { 41, 15, 81, 0, 0, 259, 259, 6, 1, 14, 2, 3, 4, 5, 9, 40, 10, 15, 16, 637, 166, 0, 0, 3406, 3406, 3467, 3467, 3494, 3494, 0, 0, 399, 404, 22, 215, 8221, 19, 0, 2387, 2394, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 10, 5, 61, 61, 27, 27, 13, 13, 2, 2, 5, 37, 23, 1, 42, 5, 0, 7, 10, {71,69,76}, 2, 1, 1, 6, 7 }, // Georgian/Georgian/Georgia
- { 42, 7, 82, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 14, 8263, 19, 0, 2404, 2411, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 5, 0, 7, 11, {69,85,82}, 2, 1, 1, 6, 7 }, // German/Latin/Germany
- { 42, 7, 14, 0, 0, 267, 267, 6, 1, 14, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 14, 8263, 19, 0, 2422, 2422, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 5, 0, 24, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // German/Latin/Austria
- { 42, 7, 21, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 14, 8263, 19, 0, 2404, 2446, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // German/Latin/Belgium
- { 42, 7, 106, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 14, 8263, 19, 0, 2404, 2453, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // German/Latin/Italy
- { 42, 7, 123, 0, 0, 267, 267, 6, 0, 13, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 208, 8281, 19, 0, 2404, 2460, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 3, 57, 5, 0, 7, 13, {67,72,70}, 2, 0, 1, 6, 7 }, // German/Latin/Liechtenstein
- { 42, 7, 125, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 14, 8263, 19, 0, 2404, 2473, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 5, 0, 7, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // German/Latin/Luxembourg
- { 42, 7, 206, 0, 0, 267, 267, 6, 0, 13, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 208, 8281, 19, 0, 2482, 2482, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 3, 57, 5, 0, 21, 7, {67,72,70}, 2, 0, 1, 6, 7 }, // German/Latin/Switzerland
- { 43, 16, 85, 0, 0, 276, 276, 6, 1, 0, 2, 3, 4, 5, 6, 15, 16, 10, 11, 0, 259, 10, 22, 3626, 3626, 3680, 3680, 3707, 3707, 81, 78, 0, 5, 22, 14, 8338, 19, 0, 2503, 2511, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 54, 54, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Greek/Greek/Greece
- { 43, 16, 56, 0, 0, 276, 276, 6, 1, 0, 2, 3, 4, 5, 6, 15, 16, 10, 11, 0, 259, 10, 22, 3626, 3626, 3680, 3680, 3707, 3707, 81, 78, 0, 5, 22, 14, 8338, 19, 0, 2503, 2517, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 54, 54, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Greek/Greek/Cyprus
- { 44, 7, 86, 0, 0, 285, 285, 6, 1, 0, 2, 3, 38, 5, 47, 16, 15, 18, 17, 80, 70, 166, 166, 3720, 3720, 3817, 3817, 3844, 3844, 0, 0, 0, 5, 22, 145, 8356, 4, 49, 2523, 2534, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 97, 97, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 61, 4, 5, 11, 16, {68,75,75}, 2, 0, 1, 6, 7 }, // Greenlandic/Latin/Greenland
- { 45, 7, 168, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 216, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {80,89,71}, 0, 0, 7, 6, 7 }, // Guarani/Latin/Paraguay
- { 46, 17, 100, 0, 0, 296, 296, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 259, 271, 284, 3857, 3857, 3909, 3909, 3940, 3940, 0, 0, 446, 450, 22, 119, 8417, 4, 13, 2550, 2557, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 8, 52, 52, 31, 31, 18, 18, 2, 2, 4, 19, 23, 1, 45, 4, 6, 7, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Gujarati/Gujarati/India
- { 47, 7, 157, 0, 0, 305, 305, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 656, 259, 0, 0, 3958, 3958, 4009, 4009, 4036, 4036, 85, 82, 0, 5, 22, 172, 8462, 8, 0, 2561, 2566, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 51, 51, 27, 27, 13, 13, 6, 5, 4, 17, 23, 1, 53, 5, 0, 5, 8, {78,71,78}, 2, 1, 1, 6, 7 }, // Hausa/Latin/Nigeria
- { 47, 1, 157, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 172, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7 }, // Hausa/Arabic/Nigeria
- { 47, 7, 83, 0, 0, 305, 305, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 656, 259, 10, 22, 3958, 3958, 4009, 4009, 4036, 4036, 85, 82, 0, 5, 22, 163, 0, 8, 0, 2561, 2574, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 51, 51, 27, 27, 13, 13, 6, 5, 4, 17, 23, 3, 0, 5, 0, 5, 4, {71,72,83}, 2, 1, 1, 6, 7 }, // Hausa/Latin/Ghana
- { 47, 7, 156, 0, 0, 305, 305, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 656, 259, 0, 0, 3958, 3958, 4009, 4009, 4036, 4036, 85, 82, 0, 5, 22, 33, 8515, 8, 0, 2561, 2578, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 51, 51, 27, 27, 13, 13, 6, 5, 4, 17, 23, 3, 29, 5, 0, 5, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // Hausa/Latin/Niger
- { 48, 18, 105, 0, 0, 313, 313, 6, 0, 1, 2, 3, 33, 35, 9, 11, 11, 13, 13, 673, 581, 1, 1, 4049, 4049, 4113, 4113, 4158, 4158, 91, 87, 469, 5, 22, 47, 8544, 19, 0, 2583, 2588, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 18, 8, 9, 4, 64, 64, 45, 45, 20, 20, 6, 5, 4, 17, 23, 1, 53, 5, 0, 5, 5, {73,76,83}, 2, 1, 7, 5, 6 }, // Hebrew/Hebrew/Israel
- { 49, 13, 100, 0, 0, 319, 328, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 10, 22, 4178, 4178, 4230, 4230, 4261, 4261, 68, 65, 473, 5, 22, 119, 8597, 4, 0, 2593, 2599, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 41, 4, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Hindi/Devanagari/India
- { 50, 7, 98, 0, 0, 336, 336, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 16, 15, 691, 710, 1, 1, 4279, 4279, 4330, 4330, 4348, 4348, 97, 92, 477, 5, 22, 217, 8638, 19, 0, 2603, 2609, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 13, 9, 4, 51, 51, 18, 18, 16, 16, 3, 3, 4, 17, 23, 2, 45, 5, 0, 6, 12, {72,85,70}, 2, 0, 1, 6, 7 }, // Hungarian/Latin/Hungary
- { 51, 7, 99, 0, 0, 190, 190, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 581, 0, 0, 4364, 4364, 4444, 4444, 4478, 4478, 100, 95, 481, 5, 22, 219, 8683, 19, 0, 2621, 2629, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 80, 80, 34, 34, 13, 13, 4, 4, 4, 17, 23, 3, 48, 5, 0, 8, 6, {73,83,75}, 0, 0, 1, 6, 7 }, // Icelandic/Latin/Iceland
- { 52, 7, 101, 0, 0, 344, 354, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 45, 166, 166, 4491, 4491, 4533, 4533, 4560, 4560, 0, 0, 0, 5, 22, 222, 8731, 4, 0, 2635, 2635, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 42, 42, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 38, 4, 0, 9, 9, {73,68,82}, 2, 0, 7, 6, 7 }, // Indonesian/Latin/Indonesia
- { 53, 7, 260, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 723, 511, 0, 0, 4573, 4573, 4629, 4629, 4656, 4656, 0, 0, 0, 5, 22, 0, 0, 8, 37, 2644, 2655, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 5, 7, 11, 5, {0,0,0}, 2, 1, 1, 6, 7 }, // Interlingua/Latin/World
- { 55, 44, 38, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 224, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7 }, // Inuktitut/Canadian Aboriginal/Canada
- { 55, 7, 38, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 224, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7 }, // Inuktitut/Latin/Canada
- { 57, 7, 104, 0, 0, 363, 242, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 45, 0, 0, 4669, 4669, 4743, 4743, 4779, 4779, 104, 99, 485, 5, 22, 14, 8769, 4, 13, 2660, 2667, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 74, 74, 36, 36, 13, 13, 4, 4, 6, 17, 23, 1, 30, 4, 6, 7, 4, {69,85,82}, 2, 1, 1, 6, 7 }, // Irish/Latin/Ireland
- { 57, 7, 224, 0, 0, 363, 242, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 45, 0, 0, 4669, 4669, 4743, 4743, 4779, 4779, 104, 99, 485, 5, 22, 117, 8799, 4, 13, 2660, 2671, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 74, 74, 36, 36, 13, 13, 4, 4, 6, 17, 23, 1, 94, 4, 6, 7, 19, {71,66,80}, 2, 1, 1, 6, 7 }, // Irish/Latin/United Kingdom
- { 58, 7, 106, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 45, 0, 0, 4792, 4792, 4848, 4848, 4875, 4875, 0, 0, 0, 5, 22, 14, 3032, 19, 0, 2690, 2698, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Italian/Latin/Italy
- { 58, 7, 184, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 45, 0, 0, 4792, 4792, 4848, 4848, 4875, 4875, 0, 0, 0, 5, 22, 14, 3032, 19, 0, 2690, 2704, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 8, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // Italian/Latin/San Marino
- { 58, 7, 206, 0, 0, 252, 252, 6, 0, 13, 2, 3, 4, 5, 9, 15, 16, 17, 18, 0, 166, 0, 0, 4792, 4792, 4848, 4848, 4875, 4875, 0, 0, 0, 5, 22, 0, 8893, 19, 0, 2690, 2714, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 52, 5, 0, 8, 8, {67,72,70}, 2, 0, 1, 6, 7 }, // Italian/Latin/Switzerland
- { 58, 7, 230, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 45, 0, 0, 4792, 4792, 4848, 4848, 4875, 4875, 0, 0, 0, 5, 22, 14, 3032, 19, 0, 2690, 2722, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 8, 18, {69,85,82}, 2, 1, 1, 6, 7 }, // Italian/Latin/Vatican City State
- { 59, 19, 108, 168, 168, 168, 168, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 377, 545, 292, 1, 4888, 4888, 4915, 4915, 4915, 4915, 108, 103, 491, 494, 22, 227, 8945, 4, 13, 2740, 2740, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 10, 10, 4, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 10, 4, 6, 3, 2, {74,80,89}, 0, 0, 7, 6, 7 }, // Japanese/Japanese/Japan
- { 60, 7, 101, 0, 0, 374, 384, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 511, 0, 0, 4928, 4928, 4968, 4968, 4996, 4996, 110, 105, 511, 5, 22, 222, 8731, 8, 0, 2743, 2747, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 40, 40, 28, 28, 13, 13, 4, 5, 4, 17, 23, 2, 38, 5, 0, 4, 9, {73,68,82}, 2, 0, 7, 6, 7 }, // Javanese/Latin/Indonesia
- { 61, 21, 100, 0, 0, 393, 405, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 259, 271, 284, 5009, 5009, 5062, 5062, 5094, 5094, 114, 110, 515, 523, 22, 119, 8955, 4, 13, 2756, 2761, 6, 6, 12, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 8, 53, 53, 32, 32, 19, 19, 9, 7, 8, 35, 23, 1, 48, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Kannada/Kannada/India
- { 62, 1, 100, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 27, 521, 10, 22, 5113, 5113, 5164, 5164, 5213, 5213, 0, 0, 0, 5, 22, 119, 9003, 8, 0, 2765, 2770, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 6, 12, 7, 51, 51, 49, 49, 13, 13, 2, 2, 4, 17, 23, 1, 16, 5, 0, 5, 9, {73,78,82}, 2, 1, 7, 7, 7 }, // Kashmiri/Arabic/India
- { 63, 2, 110, 0, 0, 0, 416, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 749, 166, 0, 0, 5226, 5226, 5281, 5281, 5301, 5301, 0, 0, 253, 558, 575, 228, 9019, 19, 0, 2779, 2789, 6, 6, 6, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 10, 5, 55, 55, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 57, 5, 0, 10, 9, {75,90,84}, 2, 1, 1, 6, 7 }, // Kazakh/Cyrillic/Kazakhstan
- { 64, 7, 179, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 12, 13, 53, 70, 0, 0, 5314, 5314, 5397, 5397, 83, 83, 0, 0, 0, 5, 22, 174, 0, 8, 0, 2798, 2809, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 83, 83, 34, 34, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 11, 8, {82,87,70}, 0, 0, 1, 6, 7 }, // Kinyarwanda/Latin/Rwanda
- { 65, 2, 116, 0, 0, 426, 426, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 771, 259, 0, 0, 5431, 5431, 5487, 5487, 5524, 5524, 123, 117, 253, 598, 22, 229, 9076, 19, 0, 2817, 2825, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 10, 5, 56, 56, 37, 37, 13, 13, 5, 14, 4, 18, 23, 3, 51, 5, 0, 8, 10, {75,71,83}, 2, 1, 1, 6, 7 }, // Kirghiz/Cyrillic/Kyrgyzstan
- { 66, 22, 114, 0, 0, 436, 436, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 794, 810, 302, 315, 5537, 5537, 5564, 5564, 5564, 5564, 128, 131, 616, 5, 22, 232, 9127, 4, 13, 2835, 2838, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 13, 7, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 18, 4, 6, 3, 4, {75,82,87}, 0, 0, 7, 6, 7 }, // Korean/Korean/South Korea
- { 66, 22, 113, 0, 0, 436, 436, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 794, 810, 302, 315, 5537, 5537, 5564, 5564, 5564, 5564, 128, 131, 616, 5, 22, 233, 9145, 4, 13, 2835, 2842, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 13, 7, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 3, 38, 4, 6, 3, 11, {75,80,87}, 0, 0, 1, 6, 7 }, // Korean/Korean/North Korea
- { 67, 7, 217, 0, 0, 443, 443, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 5577, 5577, 5618, 5618, 5637, 5637, 130, 133, 0, 5, 22, 236, 0, 19, 24, 2853, 2858, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 41, 41, 19, 19, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 7, 5, 7, {84,82,89}, 2, 1, 1, 6, 7 }, // Kurdish/Latin/Turkey
- { 68, 7, 35, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 11, 11, 13, 13, 97, 398, 0, 0, 5650, 5650, 5738, 5738, 83, 83, 132, 135, 0, 5, 22, 159, 9183, 0, 0, 2865, 2873, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 88, 88, 33, 33, 13, 13, 5, 5, 4, 17, 23, 3, 20, 4, 0, 8, 8, {66,73,70}, 0, 0, 1, 6, 7 }, // Rundi/Latin/Burundi
- { 69, 23, 117, 0, 0, 0, 450, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 819, 398, 322, 1, 5771, 5771, 5827, 5827, 5862, 5862, 137, 140, 0, 5, 22, 237, 9203, 4, 44, 2881, 2881, 6, 6, 6, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 24, 4, 56, 56, 35, 35, 16, 16, 8, 8, 4, 17, 23, 1, 20, 4, 5, 3, 3, {76,65,75}, 0, 0, 7, 6, 7 }, // Lao/Lao/Laos
- { 71, 7, 118, 0, 0, 459, 459, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 838, 166, 0, 0, 5878, 5949, 6020, 6070, 6120, 6120, 145, 148, 619, 5, 22, 14, 9223, 19, 0, 2884, 2892, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 8, 10, 5, 71, 71, 50, 50, 13, 13, 14, 11, 5, 17, 23, 1, 22, 5, 0, 8, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // Latvian/Latin/Latvia
- { 72, 7, 49, 0, 0, 467, 467, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0, 6133, 6133, 6232, 6232, 6259, 6259, 159, 159, 0, 5, 22, 32, 9245, 19, 0, 2899, 2906, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 2, 16, 5, 0, 7, 30, {67,68,70}, 2, 1, 1, 6, 7 }, // Lingala/Latin/Congo Kinshasa
- { 72, 7, 6, 0, 0, 467, 467, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0, 6133, 6133, 6232, 6232, 6259, 6259, 159, 159, 0, 5, 22, 238, 9261, 19, 0, 2899, 2936, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 2, 16, 5, 0, 7, 6, {65,79,65}, 2, 1, 1, 6, 7 }, // Lingala/Latin/Angola
- { 72, 7, 41, 0, 0, 467, 467, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0, 6133, 6133, 6232, 6232, 6259, 6259, 159, 159, 0, 5, 22, 32, 9277, 19, 0, 2899, 2942, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 4, 16, 5, 0, 7, 26, {88,65,70}, 0, 0, 1, 6, 7 }, // Lingala/Latin/Central African Republic
- { 72, 7, 50, 0, 0, 467, 467, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0, 6133, 6133, 6232, 6232, 6259, 6259, 159, 159, 0, 5, 22, 32, 9277, 19, 0, 2899, 2968, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 4, 16, 5, 0, 7, 5, {88,65,70}, 0, 0, 1, 6, 7 }, // Lingala/Latin/Congo Brazzaville
- { 73, 7, 124, 0, 0, 476, 476, 6, 1, 14, 2, 3, 38, 5, 47, 40, 10, 40, 10, 864, 70, 0, 0, 6272, 6272, 6360, 6360, 6380, 6380, 167, 165, 624, 5, 22, 14, 9293, 19, 0, 2973, 2981, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 27, 10, 10, 5, 88, 88, 20, 20, 13, 13, 9, 6, 6, 17, 23, 1, 29, 5, 0, 8, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // Lithuanian/Latin/Lithuania
- { 74, 2, 127, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 0, 113, 0, 0, 6393, 6393, 6446, 6480, 1486, 1486, 176, 171, 630, 5, 22, 240, 9322, 19, 0, 2988, 2998, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 53, 53, 34, 33, 13, 13, 10, 8, 5, 17, 23, 4, 55, 5, 0, 10, 18, {77,75,68}, 2, 1, 1, 6, 7 }, // Macedonian/Cyrillic/Macedonia
- { 75, 7, 128, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 70, 0, 0, 6513, 6513, 6572, 6572, 6605, 6605, 0, 0, 0, 5, 22, 166, 5291, 4, 0, 3016, 3024, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 59, 59, 33, 33, 13, 13, 2, 2, 4, 17, 23, 2, 6, 4, 0, 8, 12, {77,71,65}, 0, 0, 1, 6, 7 }, // Malagasy/Latin/Madagascar
- { 76, 7, 130, 0, 0, 354, 354, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 46, 10, 22, 6618, 6618, 6660, 6660, 6687, 6687, 186, 179, 619, 5, 22, 168, 9377, 4, 13, 3036, 1219, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 12, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 2, 38, 4, 6, 6, 8, {77,89,82}, 2, 1, 1, 6, 7 }, // Malay/Latin/Malaysia
- { 76, 1, 130, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 168, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {77,89,82}, 2, 1, 1, 6, 7 }, // Malay/Arabic/Malaysia
- { 76, 7, 32, 0, 0, 354, 354, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 85, 46, 10, 22, 6618, 6618, 6660, 6660, 6687, 6687, 186, 179, 619, 5, 22, 6, 9415, 4, 13, 3036, 3042, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 7, 12, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 1, 30, 4, 6, 6, 6, {66,78,68}, 2, 1, 1, 6, 7 }, // Malay/Latin/Brunei
- { 76, 7, 190, 0, 0, 354, 354, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 46, 10, 22, 6618, 6618, 6660, 6660, 6687, 6687, 186, 179, 619, 5, 22, 6, 9445, 4, 13, 3036, 3048, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 12, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 1, 36, 4, 6, 6, 9, {83,71,68}, 2, 1, 7, 6, 7 }, // Malay/Latin/Singapore
- { 77, 24, 100, 0, 0, 484, 497, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 891, 259, 10, 22, 6700, 6776, 6851, 6851, 6891, 6912, 0, 0, 635, 641, 22, 119, 9481, 4, 13, 3057, 3063, 6, 6, 13, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 76, 75, 40, 40, 21, 20, 2, 2, 6, 27, 23, 1, 39, 4, 6, 6, 6, {73,78,82}, 2, 1, 7, 7, 7 }, // Malayalam/Malayalam/India
- { 78, 7, 133, 0, 0, 509, 517, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 909, 45, 0, 0, 6932, 6932, 6994, 6994, 7021, 7041, 0, 0, 0, 5, 22, 14, 9520, 4, 0, 3069, 1227, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 62, 62, 27, 27, 20, 19, 2, 2, 4, 17, 23, 1, 26, 4, 0, 5, 5, {69,85,82}, 2, 1, 7, 6, 7 }, // Maltese/Latin/Malta
- { 79, 7, 154, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 511, 10, 22, 7060, 7060, 7106, 7106, 7132, 7132, 0, 0, 0, 5, 22, 6, 9546, 8, 0, 3074, 3079, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 46, 46, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 36, 5, 0, 5, 8, {78,90,68}, 2, 1, 1, 6, 7 }, // Maori/Latin/New Zealand
- { 80, 13, 100, 0, 0, 524, 524, 6, 0, 1, 2, 60, 4, 5, 9, 10, 11, 12, 13, 174, 259, 10, 22, 7145, 7145, 7197, 7197, 4261, 4261, 188, 182, 473, 5, 22, 119, 9582, 4, 13, 3087, 2599, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 52, 52, 31, 31, 18, 18, 5, 4, 4, 17, 23, 1, 42, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Marathi/Devanagari/India
- { 82, 2, 143, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 932, 967, 54, 0, 7228, 7270, 7312, 7312, 7312, 7312, 193, 186, 253, 668, 22, 244, 9624, 8, 0, 3092, 3098, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 35, 10, 12, 5, 42, 42, 20, 20, 20, 20, 4, 4, 4, 17, 23, 1, 45, 5, 0, 6, 6, {77,78,84}, 2, 0, 1, 6, 7 }, // Mongolian/Cyrillic/Mongolia
- { 82, 8, 44, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 245, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,78,89}, 2, 1, 7, 6, 7 }, // Mongolian/Mongolian/China
- { 84, 13, 150, 533, 0, 538, 538, 6, 0, 1, 2, 60, 4, 5, 9, 10, 11, 12, 13, 53, 253, 0, 0, 7332, 7332, 7385, 7385, 7417, 7417, 197, 190, 473, 685, 22, 248, 9669, 8, 0, 3104, 3104, 5, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 53, 53, 32, 32, 17, 17, 9, 7, 4, 19, 23, 4, 48, 5, 0, 6, 5, {78,80,82}, 2, 1, 7, 6, 7 }, // Nepali/Devanagari/Nepal
- { 84, 13, 100, 533, 0, 538, 538, 6, 0, 1, 2, 60, 4, 5, 9, 10, 11, 12, 13, 53, 253, 10, 22, 7332, 7332, 7385, 7385, 7417, 7417, 197, 190, 473, 685, 22, 119, 9717, 8, 0, 3104, 2599, 5, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 53, 53, 32, 32, 17, 17, 9, 7, 4, 19, 23, 1, 48, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Nepali/Devanagari/India
- { 85, 7, 161, 0, 0, 190, 190, 6, 1, 14, 2, 3, 38, 5, 9, 15, 16, 12, 13, 461, 501, 0, 0, 2173, 2173, 2250, 2250, 2284, 2284, 64, 61, 0, 5, 22, 145, 9765, 8, 0, 3110, 3122, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 50, 50, 34, 34, 13, 13, 4, 4, 4, 17, 23, 2, 43, 5, 0, 12, 5, {78,79,75}, 2, 0, 1, 6, 7 }, // Norwegian Bokmal/Latin/Norway
- { 85, 7, 203, 0, 0, 190, 190, 6, 1, 14, 2, 3, 38, 5, 9, 15, 16, 12, 13, 461, 501, 0, 0, 2173, 2173, 2250, 2250, 2284, 2284, 64, 61, 0, 5, 22, 145, 9765, 8, 0, 3110, 3127, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 50, 50, 34, 34, 13, 13, 4, 4, 4, 17, 23, 2, 43, 5, 0, 12, 21, {78,79,75}, 2, 0, 1, 6, 7 }, // Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands
- { 86, 7, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Occitan/Latin/France
- { 87, 26, 100, 0, 0, 545, 553, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 7434, 7434, 7487, 7487, 7519, 7519, 0, 0, 704, 5, 22, 119, 9808, 4, 13, 3148, 3153, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 53, 53, 32, 32, 17, 17, 2, 2, 5, 17, 23, 1, 42, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Oriya/Oriya/India
- { 88, 1, 1, 560, 560, 566, 575, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 977, 390, 55, 1, 7536, 7536, 7536, 7536, 83, 83, 206, 197, 709, 5, 22, 252, 9850, 4, 13, 3157, 3161, 6, 6, 9, 8, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 20, 8, 11, 4, 38, 38, 38, 38, 13, 13, 4, 4, 5, 17, 23, 1, 24, 4, 6, 4, 9, {65,70,78}, 0, 0, 6, 4, 5 }, // Pashto/Arabic/Afghanistan
- { 88, 1, 163, 560, 560, 566, 575, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 977, 390, 10, 22, 7536, 7536, 7536, 7536, 83, 83, 206, 197, 709, 5, 22, 170, 9874, 4, 13, 3157, 3170, 6, 6, 9, 8, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 20, 8, 12, 7, 38, 38, 38, 38, 13, 13, 4, 4, 5, 17, 23, 2, 51, 4, 6, 4, 7, {80,75,82}, 2, 0, 7, 6, 7 }, // Pashto/Arabic/Pakistan
- { 89, 1, 102, 583, 583, 590, 598, 53, 19, 20, 21, 52, 61, 35, 56, 15, 16, 17, 18, 97, 390, 55, 1, 7574, 7574, 7574, 7574, 7622, 7622, 210, 201, 714, 718, 22, 253, 9925, 54, 60, 3177, 3182, 7, 7, 8, 7, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 16, 8, 11, 4, 48, 48, 48, 48, 13, 13, 9, 8, 4, 44, 23, 4, 36, 6, 8, 5, 5, {73,82,82}, 0, 0, 6, 5, 5 }, // Persian/Arabic/Iran
- { 89, 1, 1, 583, 583, 590, 598, 53, 19, 20, 21, 52, 61, 35, 56, 15, 16, 17, 18, 97, 390, 55, 1, 7574, 7574, 7574, 7574, 7622, 7622, 210, 201, 714, 718, 22, 252, 9961, 8, 60, 3187, 3161, 7, 7, 8, 7, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 16, 8, 11, 4, 48, 48, 48, 48, 13, 13, 9, 8, 4, 44, 23, 1, 54, 5, 8, 3, 9, {65,70,78}, 0, 0, 6, 4, 5 }, // Persian/Arabic/Afghanistan
- { 90, 7, 172, 0, 0, 161, 161, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 15, 16, 0, 501, 0, 0, 7635, 7635, 7693, 7693, 7726, 7739, 0, 0, 322, 5, 22, 257,10015, 19, 24, 3190, 3196, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 58, 58, 33, 33, 13, 13, 2, 2, 5, 17, 23, 2, 76, 5, 7, 6, 6, {80,76,78}, 2, 1, 1, 6, 7 }, // Polish/Latin/Poland
- { 91, 7, 30, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 45, 0, 0, 7752, 7752, 7830, 7830, 7864, 7864, 0, 0, 0, 5, 22, 5,10091, 8, 0, 3202, 3211, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 10, 5, 78, 78, 34, 34, 13, 13, 2, 2, 5, 17, 23, 2, 53, 5, 0, 9, 6, {66,82,76}, 2, 1, 7, 6, 7 }, // Portuguese/Latin/Brazil
- { 91, 7, 6, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 238,10144, 19, 24, 3202, 3217, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 2, 53, 5, 7, 9, 6, {65,79,65}, 2, 1, 1, 6, 7 }, // Portuguese/Latin/Angola
- { 91, 7, 39, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 259,10197, 19, 24, 3202, 3223, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 68, 5, 7, 9, 10, {67,86,69}, 2, 1, 1, 6, 7 }, // Portuguese/Latin/Cape Verde
- { 91, 7, 62, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 156,10265, 19, 24, 3202, 3233, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 80, 5, 7, 9, 11, {85,83,68}, 2, 1, 1, 6, 7 }, // Portuguese/Latin/East Timor
- { 91, 7, 66, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 32,10345, 19, 24, 3202, 3244, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 4, 58, 5, 7, 9, 16, {88,65,70}, 0, 0, 1, 6, 7 }, // Portuguese/Latin/Equatorial Guinea
- { 91, 7, 92, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 33,10403, 19, 24, 3202, 3260, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 61, 5, 7, 9, 12, {88,79,70}, 0, 0, 1, 6, 7 }, // Portuguese/Latin/Guinea Bissau
- { 91, 7, 125, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 14, 3032, 19, 24, 3202, 3272, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 19, 5, 7, 9, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // Portuguese/Latin/Luxembourg
- { 91, 7, 126, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 10, 22, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 134,10464, 19, 24, 3202, 3282, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 4, 53, 5, 7, 9, 19, {77,79,80}, 2, 1, 7, 6, 7 }, // Portuguese/Latin/Macau
- { 91, 7, 146, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 260,10517, 19, 24, 3202, 3301, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 65, 5, 7, 9, 10, {77,90,78}, 2, 1, 7, 6, 7 }, // Portuguese/Latin/Mozambique
- { 91, 7, 173, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 14, 3032, 19, 24, 3311, 3328, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 19, 5, 7, 17, 8, {69,85,82}, 2, 1, 7, 6, 7 }, // Portuguese/Latin/Portugal
- { 91, 7, 185, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 263,10582, 19, 24, 3202, 3336, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 2, 91, 5, 7, 9, 19, {83,84,78}, 2, 1, 1, 6, 7 }, // Portuguese/Latin/Sao Tome And Principe
- { 91, 7, 206, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 208,10673, 19, 24, 3202, 3355, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 44, 5, 7, 9, 5, {67,72,70}, 2, 0, 1, 6, 7 }, // Portuguese/Latin/Switzerland
- { 92, 4, 100, 0, 0, 605, 605, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 10, 22, 7925, 7925, 7981, 7981, 8016, 8016, 227, 217, 762, 5, 22, 119,10717, 8, 0, 3360, 3366, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 35, 35, 22, 22, 6, 6, 4, 17, 23, 1, 38, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Punjabi/Gurmukhi/India
- { 92, 1, 163, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 527, 45, 10, 22, 8038, 8038, 8038, 8038, 83, 83, 0, 0, 0, 5, 22, 77,10755, 8, 0, 3370, 3170, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 10, 12, 7, 36, 36, 36, 36, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 6, 7, {80,75,82}, 2, 0, 7, 6, 7 }, // Punjabi/Arabic/Pakistan
- { 93, 7, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 45, 0, 0, 8074, 8074, 8126, 8126, 8153, 8153, 64, 61, 0, 5, 22, 265,10761, 8, 0, 3376, 3384, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 28, 5, 0, 8, 4, {80,69,78}, 2, 1, 7, 6, 7 }, // Quechua/Latin/Peru
- { 93, 7, 26, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 45, 0, 0, 8074, 8074, 8126, 8126, 8153, 8153, 64, 61, 0, 5, 22, 267,10789, 8, 0, 3376, 3388, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 24, 5, 0, 8, 7, {66,79,66}, 2, 1, 1, 6, 7 }, // Quechua/Latin/Bolivia
- { 93, 7, 63, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 45, 0, 0, 8074, 8074, 8126, 8126, 8153, 8153, 64, 61, 0, 5, 22, 6,10813, 8, 0, 3376, 3395, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 36, 5, 0, 8, 7, {85,83,68}, 2, 1, 1, 6, 7 }, // Quechua/Latin/Ecuador
- { 94, 7, 206, 0, 0, 0, 0, 6, 0, 13, 2, 3, 38, 5, 9, 15, 16, 17, 18, 997, 347, 0, 0, 8166, 8166, 8221, 8221, 8243, 8243, 0, 0, 0, 5, 22, 208,10849, 19, 0, 3402, 3411, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 10, 5, 55, 55, 22, 22, 13, 13, 2, 2, 4, 17, 23, 3, 45, 5, 0, 9, 6, {67,72,70}, 2, 0, 1, 6, 7 }, // Romansh/Latin/Switzerland
- { 95, 7, 177, 0, 0, 614, 614, 6, 1, 0, 2, 3, 4, 5, 9, 40, 11, 15, 16, 0, 501, 0, 0, 8256, 8256, 8303, 8303, 3015, 3015, 64, 61, 766, 5, 22, 269,10894, 19, 24, 3417, 3423, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 47, 47, 33, 33, 13, 13, 4, 4, 4, 17, 23, 3, 56, 5, 7, 6, 7, {82,79,78}, 2, 1, 1, 6, 7 }, // Romanian/Latin/Romania
- { 95, 7, 141, 0, 0, 614, 614, 6, 1, 0, 2, 3, 4, 5, 9, 40, 11, 15, 16, 0, 501, 0, 0, 8256, 8256, 8336, 8336, 8363, 8363, 64, 61, 766, 5, 22, 7,10950, 19, 24, 3417, 3430, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 47, 47, 27, 27, 15, 15, 4, 4, 4, 17, 23, 1, 68, 5, 7, 6, 17, {77,68,76}, 2, 1, 1, 6, 7 }, // Romanian/Latin/Moldova
- { 96, 2, 178, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 121,11018, 19, 0, 3447, 3454, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 1, 88, 5, 0, 7, 6, {82,85,66}, 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Russia
- { 96, 2, 20, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 0,11106, 19, 0, 3447, 510, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 2, 93, 5, 0, 7, 8, {66,89,78}, 2, 0, 1, 6, 7 }, // Russian/Cyrillic/Belarus
- { 96, 2, 110, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 228,11199, 19, 0, 3447, 3460, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 1, 82, 5, 0, 7, 9, {75,90,84}, 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kazakhstan
- { 96, 2, 116, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 229,11281, 19, 0, 3447, 3469, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 3, 81, 5, 0, 7, 8, {75,71,83}, 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kyrgyzstan
- { 96, 2, 141, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 7,11362, 19, 0, 3447, 3477, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 1, 78, 5, 0, 7, 7, {77,68,76}, 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Moldova
- { 96, 2, 222, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 272,11440, 19, 0, 3447, 3484, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 1, 91, 5, 0, 7, 7, {85,65,72}, 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Ukraine
- { 98, 7, 41, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 398, 0, 0, 8472, 8472, 8537, 8537, 8564, 8564, 233, 223, 0, 5, 22, 32,11531, 4, 44, 3491, 3496, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 65, 65, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 18, 4, 5, 5, 22, {88,65,70}, 0, 0, 1, 6, 7 }, // Sango/Latin/Central African Republic
- { 99, 13, 100, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 119, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {73,78,82}, 2, 1, 7, 7, 7 }, // Sanskrit/Devanagari/India
- { 100, 2, 243, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8577, 8577, 8628, 8628, 8655, 8655, 235, 225, 770, 5, 22, 273,11549, 19, 24, 3518, 3524, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 51, 51, 27, 27, 13, 13, 9, 8, 7, 17, 23, 3, 57, 5, 7, 6, 6, {82,83,68}, 0, 0, 1, 6, 7 }, // Serbian/Cyrillic/Serbia
- { 100, 7, 27, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8668, 8668, 8724, 8724, 2066, 2066, 244, 233, 315, 5, 22, 141,11606, 19, 24, 3530, 629, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 56, 56, 25, 25, 13, 13, 11, 8, 7, 17, 23, 2,173, 5, 7, 6, 19, {66,65,77}, 2, 1, 1, 6, 7 }, // Serbian/Latin/Bosnia And Herzegowina
- { 100, 7, 242, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8668, 8668, 8749, 8749, 2066, 2066, 244, 233, 315, 5, 22, 14,11779, 19, 24, 3530, 3536, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 56, 56, 27, 27, 13, 13, 11, 8, 7, 17, 23, 1, 22, 5, 7, 6, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // Serbian/Latin/Montenegro
- { 100, 7, 243, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8776, 8776, 8749, 8749, 2066, 2066, 255, 233, 315, 5, 22, 273,11801, 19, 24, 3530, 3545, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 53, 53, 27, 27, 13, 13, 9, 8, 7, 17, 23, 3, 57, 5, 7, 6, 6, {82,83,68}, 0, 0, 1, 6, 7 }, // Serbian/Latin/Serbia
- { 100, 2, 27, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8829, 8829, 8883, 8883, 8655, 8655, 264, 225, 770, 5, 22, 276,11858, 19, 24, 3518, 3551, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 54, 54, 25, 25, 13, 13, 11, 8, 7, 17, 23, 2,173, 5, 7, 6, 19, {66,65,77}, 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Bosnia And Herzegowina
- { 100, 2, 242, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8829, 8829, 8628, 8628, 8655, 8655, 264, 225, 770, 5, 22, 14,12031, 19, 24, 3518, 3570, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 54, 54, 27, 27, 13, 13, 11, 8, 7, 17, 23, 1, 22, 5, 7, 6, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Montenegro
- { 100, 2, 257, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8577, 8577, 8628, 8628, 8655, 8655, 235, 225, 770, 5, 22, 14,12031, 19, 24, 3518, 3579, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 51, 51, 27, 27, 13, 13, 9, 8, 7, 17, 23, 1, 22, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Kosovo
- { 100, 7, 257, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8776, 8776, 8749, 8749, 2066, 2066, 255, 233, 315, 5, 22, 14,11779, 19, 24, 3530, 3585, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 53, 53, 27, 27, 13, 13, 9, 8, 7, 17, 23, 1, 22, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Serbian/Latin/Kosovo
- { 101, 2, 81, 0, 0, 622, 622, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 1047, 166, 0, 0, 8908, 8968, 9028, 9055, 9082, 9082, 275, 241, 0, 5, 22, 215,12053, 8, 0, 3591, 3595, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 10, 5, 60, 60, 27, 27, 13, 13, 15, 15, 4, 17, 23, 1, 16, 5, 0, 4, 11, {71,69,76}, 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Georgia
- { 101, 2, 178, 0, 0, 622, 622, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 1047, 166, 0, 0, 8908, 8968, 9028, 9055, 9082, 9082, 275, 241, 0, 5, 22, 121,12069, 8, 0, 3591, 3606, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 10, 5, 60, 60, 27, 27, 13, 13, 15, 15, 4, 17, 23, 1, 16, 5, 0, 4, 6, {82,85,66}, 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Russia
- { 102, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Southern Sotho/Latin/South Africa
- { 103, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Tswana/Latin/South Africa
- { 104, 7, 240, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 11, 11, 13, 13, 53, 70, 0, 0, 9095, 9095, 9149, 9149, 9176, 9176, 0, 0, 0, 5, 22, 156,12085, 4, 13, 3612, 1780, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 15, 4, 6, 8, 8, {85,83,68}, 2, 1, 7, 6, 7 }, // Shona/Latin/Zimbabwe
- { 105, 1, 163, 0, 0, 631, 639, 53, 19, 20, 21, 23, 24, 26, 28, 10, 11, 12, 13, 53, 70, 10, 22, 9189, 9189, 9189, 9189, 9223, 9223, 290, 256, 777, 783, 22, 170,12100, 19, 0, 3620, 3624, 6, 6, 8, 7, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 34, 34, 34, 34, 30, 30, 11, 11, 6, 61, 23, 2, 42, 5, 0, 4, 7, {80,75,82}, 2, 0, 7, 6, 7 }, // Sindhi/Arabic/Pakistan
- { 106, 32, 198, 0, 0, 646, 655, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 166, 166, 9253, 9253, 9314, 9314, 9352, 9352, 301, 267, 844, 849, 22, 278,12142, 4, 13, 3631, 3636, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 38, 38, 18, 18, 5, 4, 5, 42, 23, 3, 57, 4, 6, 5, 11, {76,75,82}, 2, 1, 1, 6, 7 }, // Sinhala/Sinhala/Sri Lanka
- { 107, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Swati/Latin/South Africa
- { 108, 7, 191, 0, 0, 183, 663, 6, 1, 14, 2, 3, 4, 5, 6, 40, 10, 46, 12, 461, 1070, 1, 1, 9370, 9370, 9421, 9421, 9441, 9441, 0, 0, 322, 5, 22, 14,12199, 19, 24, 3647, 3657, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 9, 4, 51, 51, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 25, 5, 7, 10, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // Slovak/Latin/Slovakia
- { 109, 7, 192, 0, 0, 670, 670, 6, 1, 0, 2, 3, 38, 5, 6, 40, 10, 46, 12, 1020, 440, 0, 0, 9454, 9454, 9505, 9505, 9539, 9539, 60, 271, 50, 5, 22, 14,12224, 19, 24, 3666, 3677, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 9, 10, 5, 51, 51, 34, 34, 13, 13, 4, 4, 4, 17, 23, 1, 27, 5, 7, 11, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // Slovenian/Latin/Slovenia
- { 110, 7, 194, 0, 0, 678, 678, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1080, 45, 10, 22, 9552, 9552, 9598, 9598, 9629, 9629, 306, 275, 891, 897, 22, 92,12251, 4, 13, 3686, 3694, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 12, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 1, 20, 4, 6, 8, 10, {83,79,83}, 0, 0, 1, 6, 7 }, // Somali/Latin/Somalia
- { 110, 7, 59, 0, 0, 678, 678, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1080, 45, 10, 22, 9552, 9552, 9598, 9598, 9629, 9629, 306, 275, 891, 897, 22, 36,12271, 4, 13, 3686, 3704, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 12, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 3, 49, 4, 6, 8, 7, {68,74,70}, 0, 0, 6, 6, 7 }, // Somali/Latin/Djibouti
- { 110, 7, 69, 0, 0, 678, 678, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1080, 45, 10, 22, 9552, 9552, 9598, 9598, 9629, 9629, 306, 275, 891, 897, 22, 0,12320, 4, 13, 3686, 3711, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 12, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 2, 51, 4, 6, 8, 8, {69,84,66}, 2, 1, 7, 6, 7 }, // Somali/Latin/Ethiopia
- { 110, 7, 111, 0, 0, 678, 678, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1080, 45, 0, 0, 9552, 9552, 9598, 9598, 9629, 9629, 306, 275, 891, 897, 22, 2,12371, 4, 13, 3686, 1161, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 10, 5, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 3, 51, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Somali/Latin/Kenya
- { 111, 7, 197, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 259, 55, 1, 9643, 9643, 9695, 9695, 8153, 8153, 53, 50, 0, 5, 22, 14, 3032, 19, 0, 3719, 2381, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 19, 5, 0, 17, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Spain
- { 111, 7, 10, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 3015, 53, 50, 0, 5, 22, 6,12422, 8, 37, 3719, 3736, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 50, 5, 7, 7, 9, {65,82,83}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Argentina
- { 111, 7, 22, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 64, 61, 0, 5, 22, 6,12472, 4, 0, 3719, 3745, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 4, 4, 5, 17, 23, 1, 51, 4, 0, 7, 6, {66,90,68}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Belize
- { 111, 7, 26, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 267,12523, 4, 0, 3719, 3388, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 2, 34, 4, 0, 7, 7, {66,79,66}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Bolivia
- { 111, 7, 30, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 64, 61, 0, 5, 22, 5,12557, 4, 0, 3719, 3211, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 4, 4, 5, 17, 23, 2, 51, 4, 0, 7, 6, {66,82,76}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Brazil
- { 111, 7, 43, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 347, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 6,12608, 4, 0, 3719, 3751, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 44, 4, 0, 7, 5, {67,76,80}, 0, 0, 1, 6, 7 }, // Spanish/Latin/Chile
- { 111, 7, 47, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 46, 10, 22, 9643, 9643, 9695, 9695, 4656, 3015, 53, 50, 0, 5, 22, 6,12652, 4, 0, 3719, 3756, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 53, 4, 0, 7, 8, {67,79,80}, 2, 0, 7, 6, 7 }, // Spanish/Latin/Colombia
- { 111, 7, 52, 0, 0, 687, 687, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 281,12705, 4, 0, 3719, 3764, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 66, 4, 0, 7, 10, {67,82,67}, 2, 0, 1, 6, 7 }, // Spanish/Latin/Costa Rica
- { 111, 7, 55, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 64, 61, 0, 5, 22, 6,12771, 4, 0, 3719, 3774, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 4, 4, 5, 17, 23, 1, 41, 4, 0, 7, 4, {67,85,80}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Cuba
- { 111, 7, 61, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 10, 22, 9643, 9643, 9695, 9695, 3015, 3015, 53, 50, 0, 5, 22, 282,12812, 4, 13, 3719, 3778, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 3, 53, 4, 6, 7, 20, {68,79,80}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Dominican Republic
- { 111, 7, 63, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 6,12865, 4, 0, 3719, 3395, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 69, 4, 0, 7, 7, {85,83,68}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Ecuador
- { 111, 7, 65, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 6,12865, 4, 0, 3719, 3798, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 69, 4, 0, 7, 11, {85,83,68}, 2, 1, 7, 6, 7 }, // Spanish/Latin/El Salvador
- { 111, 7, 66, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 259, 55, 1, 9643, 9643, 9695, 9695, 8153, 8153, 53, 50, 0, 5, 22, 32,12934, 19, 0, 3719, 3809, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 4, 91, 5, 0, 7, 17, {88,65,70}, 0, 0, 1, 6, 7 }, // Spanish/Latin/Equatorial Guinea
- { 111, 7, 90, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 46, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 285,13025, 4, 0, 3719, 3826, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 29, 4, 0, 7, 9, {71,84,81}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Guatemala
- { 111, 7, 96, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1099, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 7,13054, 4, 0, 3719, 3835, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 59, 4, 0, 7, 8, {72,78,76}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Honduras
- { 111, 7, 139, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 45, 1, 1, 9643, 9643, 9695, 9695, 3015, 3015, 53, 50, 0, 5, 22, 6,13113, 4, 0, 3843, 3860, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 9, 4, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 47, 4, 0, 17, 6, {77,88,78}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Mexico
- { 111, 7, 155, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 286,13160, 4, 0, 3719, 3866, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 2, 68, 4, 0, 7, 9, {78,73,79}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Nicaragua
- { 111, 7, 166, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 1126, 10, 22, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 288,13228, 4, 0, 3719, 3875, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 3, 53, 4, 0, 7, 6, {80,65,66}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Panama
- { 111, 7, 168, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 291,13281, 4, 0, 3719, 3881, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 3, 60, 4, 0, 7, 8, {80,89,71}, 0, 0, 7, 6, 7 }, // Spanish/Latin/Paraguay
- { 111, 7, 169, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 46, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 265,13341, 4, 0, 3719, 3384, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 2, 42, 4, 0, 7, 4, {80,69,78}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Peru
- { 111, 7, 170, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 259, 10, 22, 9643, 9643, 9695, 9695, 8153, 8153, 53, 50, 0, 5, 22, 173,13383, 19, 0, 3719, 3889, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 47, 5, 0, 7, 9, {80,72,80}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Philippines
- { 111, 7, 174, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 1126, 10, 22, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 6,12865, 4, 0, 3719, 1416, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 69, 4, 0, 7, 11, {85,83,68}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Puerto Rico
- { 111, 7, 225, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 398, 10, 22, 9643, 9643, 9695, 9695, 3015, 3015, 53, 50, 0, 5, 22, 6,12865, 4, 0, 3719, 3898, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 69, 4, 0, 7, 14, {85,83,68}, 2, 1, 7, 6, 7 }, // Spanish/Latin/United States
- { 111, 7, 227, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 6,13430, 8, 37, 3719, 3912, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 47, 5, 7, 7, 7, {85,89,85}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Uruguay
- { 111, 7, 231, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 10, 22, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 294,13477, 4, 0, 3719, 3919, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 4, 57, 4, 0, 7, 9, {86,69,83}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Venezuela
- { 111, 7, 238, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 259, 55, 1, 9643, 9643, 9695, 9695, 8153, 8153, 53, 50, 0, 5, 22, 14, 3032, 19, 0, 3719, 3928, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 19, 5, 0, 7, 8, {69,85,82}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Canary Islands
- { 111, 7, 246, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 64, 61, 0, 5, 22, 0, 0, 4, 0, 3936, 3959, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 4, 4, 5, 17, 23, 0, 0, 4, 0, 23, 13, {0,0,0}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Latin America
- { 111, 7, 250, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 259, 55, 1, 9643, 9643, 9695, 9695, 8153, 8153, 53, 50, 0, 5, 22, 14, 3032, 19, 0, 3719, 3972, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 19, 5, 0, 7, 15, {69,85,82}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Ceuta And Melilla
- { 112, 7, 101, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 222, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {73,68,82}, 2, 0, 7, 6, 7 }, // Sundanese/Latin/Indonesia
- { 113, 7, 210, 0, 0, 694, 694, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 9729, 9729, 9729, 9729, 83, 83, 0, 0, 619, 914, 22, 182,13534, 8, 0, 3987, 1585, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 66, 5, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Swahili/Latin/Tanzania
- { 113, 7, 49, 0, 0, 694, 694, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 9729, 9729, 9729, 9729, 83, 83, 0, 0, 619, 914, 22, 32,13600, 8, 0, 3987, 3996, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 2, 54, 5, 0, 9, 32, {67,68,70}, 2, 1, 1, 6, 7 }, // Swahili/Latin/Congo Kinshasa
- { 113, 7, 111, 0, 0, 694, 694, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 9729, 9729, 9729, 9729, 83, 83, 0, 0, 619, 914, 22, 2,13654, 8, 0, 3987, 1161, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 57, 5, 0, 9, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Swahili/Latin/Kenya
- { 113, 7, 221, 0, 0, 694, 694, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 9729, 9729, 9729, 9729, 83, 83, 0, 0, 619, 914, 22, 187,13711, 8, 0, 3987, 1650, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 60, 5, 0, 9, 6, {85,71,88}, 0, 0, 1, 7, 7 }, // Swahili/Latin/Uganda
- { 114, 7, 205, 0, 0, 702, 702, 6, 1, 14, 2, 3, 38, 5, 47, 11, 11, 13, 13, 97, 70, 346, 0, 9788, 9788, 9837, 9837, 2284, 2284, 308, 277, 0, 5, 22, 145,13771, 19, 0, 4028, 4035, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 16, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 2, 44, 5, 0, 7, 7, {83,69,75}, 2, 0, 1, 6, 7 }, // Swedish/Latin/Sweden
- { 114, 7, 73, 0, 0, 702, 702, 6, 1, 14, 2, 3, 38, 5, 47, 11, 11, 13, 13, 97, 70, 346, 0, 9788, 9788, 9837, 9837, 2284, 2284, 308, 277, 0, 5, 22, 14, 3032, 19, 0, 4028, 1063, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 16, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // Swedish/Latin/Finland
- { 114, 7, 248, 0, 0, 702, 702, 6, 1, 14, 2, 3, 38, 5, 47, 11, 11, 13, 13, 97, 70, 346, 0, 9788, 9788, 9837, 9837, 2284, 2284, 308, 277, 0, 5, 22, 14, 3032, 19, 0, 4028, 4042, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 16, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 7, 5, {69,85,82}, 2, 1, 1, 6, 7 }, // Swedish/Latin/Aland Islands
- { 115, 7, 106, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Sardinian/Latin/Italy
- { 116, 2, 209, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 45, 0, 0, 9865, 9865, 9919, 9919, 9946, 9946, 0, 0, 0, 5, 22, 298,13815, 19, 0, 4047, 4053, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 18, 5, 0, 6, 10, {84,74,83}, 2, 1, 1, 6, 7 }, // Tajik/Cyrillic/Tajikistan
- { 117, 27, 100, 0, 0, 711, 711, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 259, 362, 315, 9959, 9959,10007,10007,10045,10045, 310, 279, 965, 5, 22, 119,13833, 4, 13, 4063, 4068, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 1, 48, 4, 6, 5, 7, {73,78,82}, 2, 1, 7, 7, 7 }, // Tamil/Tamil/India
- { 117, 27, 130, 0, 0, 711, 711, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 259, 362, 315, 9959, 9959,10007,10007,10045,10045, 310, 279, 965, 5, 22, 168,13881, 4, 13, 4063, 4075, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 2, 60, 4, 6, 5, 7, {77,89,82}, 2, 1, 1, 6, 7 }, // Tamil/Tamil/Malaysia
- { 117, 27, 190, 0, 0, 711, 711, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 259, 362, 315, 9959, 9959,10007,10007,10045,10045, 310, 279, 965, 5, 22, 6,13941, 4, 13, 4063, 4082, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 1, 60, 4, 6, 5, 11, {83,71,68}, 2, 1, 7, 6, 7 }, // Tamil/Tamil/Singapore
- { 117, 27, 198, 0, 0, 711, 711, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 259, 0, 0, 9959, 9959,10007,10007,10045,10045, 310, 279, 965, 5, 22, 302,14001, 4, 13, 4063, 4093, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 10, 5, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 3, 48, 4, 6, 5, 6, {76,75,82}, 2, 1, 1, 6, 7 }, // Tamil/Tamil/Sri Lanka
- { 118, 2, 178, 0, 0, 724, 724, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1134, 501, 1, 1,10064,10064,10119,10119,10154,10154, 0, 0, 0, 5, 22, 121,14049, 19, 0, 4099, 3454, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 9, 4, 55, 55, 35, 35, 13, 13, 2, 2, 4, 17, 23, 1, 20, 5, 0, 5, 6, {82,85,66}, 2, 1, 1, 6, 7 }, // Tatar/Cyrillic/Russia
- { 119, 28, 100, 0, 0, 733, 733, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1157, 347, 10, 22,10167,10167,10226,10226,10257,10257, 0, 0, 972, 979, 22, 119,14069, 4, 13, 4104, 4110, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 59, 59, 31, 31, 17, 17, 2, 2, 7, 29, 23, 1, 25, 4, 6, 6, 8, {73,78,82}, 2, 1, 7, 7, 7 }, // Telugu/Telugu/India
- { 120, 30, 211, 120, 120, 744, 752, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1175, 259, 374, 0,10274,10274,10341,10341,10363,10363, 318, 287, 1008, 5, 22, 305,14094, 4, 13, 4118, 4118, 5, 5, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 6, 28, 5, 67, 67, 22, 22, 15, 15, 10, 10, 4, 17, 23, 1, 15, 4, 6, 3, 3, {84,72,66}, 2, 1, 7, 6, 7 }, // Thai/Thai/Thailand
- { 121, 31, 44, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1194, 70, 10, 22,10378,10378,10456,10456,10506,10506, 328, 297, 0, 5, 22, 130,14109, 8, 0, 4121, 4129, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 12, 7, 78, 78, 50, 50, 26, 26, 7, 8, 4, 17, 23, 1, 6, 5, 0, 8, 6, {67,78,89}, 2, 1, 7, 6, 7 }, // Tibetan/Tibetan/China
- { 121, 31, 100, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1194, 70, 10, 22,10378,10378,10456,10456,10506,10506, 328, 297, 0, 5, 22, 119,14115, 8, 0, 4121, 4135, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 12, 7, 78, 78, 50, 50, 26, 26, 7, 8, 4, 17, 23, 1, 12, 5, 0, 8, 7, {73,78,82}, 2, 1, 7, 7, 7 }, // Tibetan/Tibetan/India
- { 122, 14, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1217, 45, 10, 22,10532,10532,10560,10560,10580,10593, 335, 305, 0, 5, 22, 0, 254, 4, 0, 4142, 92, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 12, 7, 28, 28, 20, 20, 13, 13, 7, 7, 4, 17, 23, 2, 9, 4, 0, 4, 5, {69,84,66}, 2, 1, 7, 6, 7 }, // Tigrinya/Ethiopic/Ethiopia
- { 122, 14, 67, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 12, 13, 10, 11, 1217, 45, 10, 22,10532,10532,10560,10560,10593,10593, 335, 305, 0, 5, 22, 39, 0, 4, 0, 4142, 4146, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 12, 7, 28, 28, 20, 20, 13, 13, 7, 7, 4, 17, 23, 3, 0, 4, 0, 4, 4, {69,82,78}, 2, 1, 1, 6, 7 }, // Tigrinya/Ethiopic/Eritrea
- { 123, 7, 214, 759, 759, 759, 759, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 259, 10, 22,10606,10606,10665,10665,10693,10693, 342, 312, 1012, 1017, 1076, 185,14127, 8, 0, 4150, 1600, 8, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 59, 59, 28, 28, 13, 13, 10, 6, 5, 59, 65, 2, 40, 5, 0, 13, 5, {84,79,80}, 2, 1, 1, 6, 7 }, // Tongan/Latin/Tonga
- { 124, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Tsonga/Latin/South Africa
- { 125, 7, 217, 0, 0, 767, 767, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1240, 502, 0, 0,10706,10706,10759,10759,10786,10786, 352, 318, 195, 5, 22, 236,14167, 4, 13, 4163, 4169, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 10, 5, 53, 53, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 39, 4, 6, 6, 7, {84,82,89}, 2, 1, 1, 6, 7 }, // Turkish/Latin/Turkey
- { 125, 7, 56, 0, 0, 767, 767, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1240, 502, 10, 22,10706,10706,10759,10759,10786,10786, 352, 318, 195, 5, 22, 14, 8263, 4, 13, 4163, 4176, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 12, 7, 53, 53, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 4, 6, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Turkish/Latin/Cyprus
- { 126, 7, 218, 0, 0, 775, 775, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 10, 11, 1240, 501, 0, 0,10799,10852,10905,10932,10959,10959, 354, 320, 1141, 5, 22, 306,14206, 19, 0, 4182, 4194, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 53, 53, 27, 27, 13, 13, 13, 14, 4, 17, 23, 3, 48, 5, 0, 12, 12, {84,77,84}, 2, 1, 1, 6, 7 }, // Turkmen/Latin/Turkmenistan
- { 128, 1, 44, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 16, 15, 18, 17, 1256, 70, 10, 22,10972,10972,11026,11026,11046,11046, 367, 334, 0, 5, 22, 227,14254, 4, 13, 4206, 4214, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 54, 54, 20, 20, 13, 13, 12, 12, 4, 17, 23, 1, 39, 4, 6, 8, 5, {67,78,89}, 2, 1, 7, 6, 7 }, // Uighur/Arabic/China
- { 129, 2, 222, 0, 0, 136, 136, 6, 1, 14, 2, 3, 4, 5, 63, 15, 16, 40, 10, 1273, 166, 0, 0,11059,11059, 1466, 1466,11114,11114, 379, 346, 1145, 668, 22, 272,14293, 19, 0, 4219, 4229, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 10, 5, 55, 55, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 48, 5, 0, 10, 7, {85,65,72}, 2, 1, 1, 6, 7 }, // Ukrainian/Cyrillic/Ukraine
- { 130, 1, 163, 560, 560, 783, 793, 6, 0, 1, 2, 3, 33, 35, 9, 11, 10, 13, 12, 1295, 259, 10, 22,11127,11127,11127,11127, 83, 83, 0, 0, 1150, 1154, 22, 170,14341, 4, 13, 4236, 3170, 6, 6, 10, 9, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 18, 6, 12, 7, 35, 35, 35, 35, 13, 13, 2, 2, 4, 20, 23, 2, 48, 4, 6, 4, 7, {80,75,82}, 2, 0, 7, 6, 7 }, // Urdu/Arabic/Pakistan
- { 130, 1, 100, 560, 560, 783, 793, 6, 19, 20, 2, 52, 33, 53, 56, 11, 10, 13, 12, 1295, 259, 10, 22,11127,11127,11127,11127, 83, 83, 0, 0, 1150, 1154, 22, 119,14389, 4, 13, 4236, 4240, 6, 6, 10, 9, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 6, 12, 7, 35, 35, 35, 35, 13, 13, 2, 2, 4, 20, 23, 1, 41, 4, 6, 4, 5, {73,78,82}, 2, 1, 7, 7, 7 }, // Urdu/Arabic/India
- { 131, 7, 228, 0, 0, 802, 802, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 13, 12, 1313, 45, 55, 0,11162,11162,11222,11222,11253,11253, 381, 348, 195, 5, 22, 309,14430, 19, 0, 4245, 4251, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 11, 5, 60, 60, 31, 31, 13, 13, 2, 2, 4, 17, 23, 4, 57, 5, 0, 6, 11, {85,90,83}, 2, 0, 1, 6, 7 }, // Uzbek/Latin/Uzbekistan
- { 131, 1, 1, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 1331, 390, 55, 1, 7574, 7574,11266,11266, 83, 83, 0, 0, 0, 5, 22, 252, 9961, 19, 0, 4262, 3161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 33, 8, 11, 4, 48, 48, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 6, 9, {65,70,78}, 0, 0, 6, 4, 5 }, // Uzbek/Arabic/Afghanistan
- { 131, 2, 228, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 637, 45, 54, 0,11286,11286,11338,11338,11365,11365, 383, 350, 0, 5, 22, 313,14487, 19, 0, 4268, 4275, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 12, 5, 52, 52, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 48, 5, 0, 7, 10, {85,90,83}, 2, 0, 1, 6, 7 }, // Uzbek/Cyrillic/Uzbekistan
- { 132, 7, 232, 0, 0, 810, 810, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 45, 0, 0,11378,11378,11432,11432,11464,11464, 385, 352, 0, 5, 22, 316,14535, 19, 0, 4285, 4295, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 54, 54, 32, 32, 20, 20, 2, 2, 4, 17, 23, 1, 32, 5, 0, 10, 8, {86,78,68}, 0, 0, 1, 6, 7 }, // Vietnamese/Latin/Vietnam
- { 133, 7, 260, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1364, 70, 0, 0,11484,11484,11526,11546,11573,11573, 0, 0, 0, 5, 22, 0, 0, 8, 0, 4303, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 42, 42, 20, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 7, 0, {0,0,0}, 2, 1, 1, 6, 7 }, // Volapuk/Latin/World
- { 134, 7, 224, 0, 0, 818, 829, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,11586,11586,11662,11690,11719,11719, 387, 354, 1174, 5, 22, 117,14567, 4, 13, 4310, 4317, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 76, 76, 28, 29, 14, 14, 2, 2, 7, 17, 23, 1, 90, 4, 6, 7, 16, {71,66,80}, 2, 1, 1, 6, 7 }, // Welsh/Latin/United Kingdom
- { 135, 7, 187, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1387, 511, 0, 0,11733,11733,11782,11782,11782,11782, 389, 356, 0, 5, 22, 33,14657, 8, 0, 4333, 4338, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 49, 49, 27, 27, 27, 27, 3, 3, 4, 17, 23, 3, 64, 5, 0, 5, 8, {88,79,70}, 0, 0, 1, 6, 7 }, // Wolof/Latin/Senegal
- { 136, 7, 195, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 12, 13, 10, 11, 53, 70, 0, 0,11809,11809,11869,11869, 83, 83, 0, 0, 0, 5, 22, 5,14721, 4, 0, 4346, 4354, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 60, 60, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 78, 4, 0, 8, 15, {90,65,82}, 2, 1, 7, 6, 7 }, // Xhosa/Latin/South Africa
- { 137, 18, 260, 0, 0, 839, 839, 6, 0, 1, 2, 3, 4, 5, 9, 11, 11, 13, 13, 1404, 45, 0, 0,11896,11896,11896,11896, 83, 83, 392, 359, 0, 5, 22, 0, 0, 8, 0, 4369, 4375, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 10, 5, 53, 53, 53, 53, 13, 13, 11, 10, 4, 17, 23, 0, 0, 5, 0, 6, 5, {0,0,0}, 2, 1, 1, 6, 7 }, // Yiddish/Hebrew/World
- { 138, 7, 157, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1423, 398, 0, 1,11949,11992,12060,12060,12092,12092, 403, 369, 0, 5, 22, 172,14799, 4, 13, 4380, 4390, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 3, 43, 68, 32, 32, 13, 13, 5, 5, 4, 17, 23, 1, 48, 4, 6, 10, 19, {78,71,78}, 2, 1, 1, 6, 7 }, // Yoruba/Latin/Nigeria
- { 138, 7, 23, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1423, 398, 0, 1,12105,12148,12216,12216,12248,12248, 408, 374, 0, 5, 22, 33,14847, 4, 13, 4380, 4409, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 3, 43, 68, 32, 32, 13, 13, 5, 5, 4, 17, 23, 3, 27, 4, 6, 10, 16, {88,79,70}, 0, 0, 1, 6, 7 }, // Yoruba/Latin/Benin
- { 140, 7, 195, 0, 0, 848, 857, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 0, 0,12261,12261,12334,12334,12361,12361, 0, 0, 0, 5, 22, 5,14874, 4, 13, 4425, 4432, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 10, 5, 73, 73, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 66, 4, 6, 7, 17, {90,65,82}, 2, 1, 7, 6, 7 }, // Zulu/Latin/South Africa
- { 141, 7, 161, 0, 0, 190, 190, 6, 1, 14, 2, 3, 38, 5, 9, 15, 16, 12, 13, 461, 501, 346, 0,12374,12374,12424,12451, 2284, 2284, 413, 379, 0, 5, 22, 145, 9765, 19, 0, 4449, 4456, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 16, 5, 50, 50, 27, 27, 13, 13, 9, 11, 4, 17, 23, 2, 43, 5, 0, 7, 5, {78,79,75}, 2, 0, 1, 6, 7 }, // Norwegian Nynorsk/Latin/Norway
- { 142, 7, 27, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 11, 12, 13, 420, 1439, 0, 0, 1982, 1982, 2039, 2039, 2066, 2079, 422, 390, 315, 5, 22, 141,14940, 19, 0, 4461, 629, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 11, 10, 5, 57, 57, 27, 27, 13, 13, 10, 7, 7, 17, 23, 2,169, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7 }, // Bosnian/Latin/Bosnia And Herzegowina
- { 142, 2, 27, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 1020, 1040, 0, 0,12478,12478,12533,12533, 8655, 8655, 264, 397, 0, 5, 22, 276,15109, 19, 0, 4469, 3551, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 55, 55, 27, 27, 13, 13, 11, 13, 4, 17, 23, 2,151, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7 }, // Bosnian/Cyrillic/Bosnia And Herzegowina
- { 143, 29, 131, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {77,86,82}, 2, 1, 5, 6, 7 }, // Divehi/Thaana/Maldives
- { 144, 7, 251, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 80, 45, 0, 0,12560,12560,12616,12616, 83, 83, 64, 61, 0, 5, 22, 117, 0, 4, 0, 4477, 4482, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 56, 56, 29, 29, 13, 13, 4, 4, 4, 17, 23, 1, 0, 4, 0, 5, 12, {71,66,80}, 2, 1, 1, 6, 7 }, // Manx/Latin/Isle Of Man
- { 145, 7, 224, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 45, 0, 0,12645,12645,12705,12705, 83, 83, 64, 61, 0, 5, 22, 117, 0, 4, 0, 4494, 4502, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 60, 60, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 0, 4, 0, 8, 14, {71,66,80}, 2, 1, 1, 6, 7 }, // Cornish/Latin/United Kingdom
- { 146, 7, 83, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1450, 547, 10, 22,12732,12732,12780,12780,12807,12807, 432, 410, 0, 5, 22, 163,15260, 4, 0, 4516, 4520, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 48, 48, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 10, 4, 0, 4, 5, {71,72,83}, 2, 1, 1, 6, 7 }, // Akan/Latin/Ghana
- { 147, 13, 100, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 192, 10, 22,12820,12820,12820,12820,12868,12868, 0, 0, 1181, 5, 22, 119,15270, 4, 13, 4525, 2599, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 48, 48, 48, 48, 19, 19, 2, 2, 4, 17, 23, 1, 30, 4, 6, 6, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Konkani/Devanagari/India
- { 148, 7, 83, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {71,72,83}, 2, 1, 1, 6, 7 }, // Ga/Latin/Ghana
- { 149, 7, 157, 0, 0, 865, 694, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 0, 0,12887,12887,12940,12940, 83, 83, 434, 412, 0, 5, 22, 172,15300, 4, 13, 4531, 4541, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 53, 53, 28, 28, 13, 13, 7, 7, 4, 17, 23, 1, 5, 4, 6, 10, 8, {78,71,78}, 2, 1, 1, 6, 7 }, // Igbo/Latin/Nigeria
- { 150, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,12968,12968,13041,13041,13068,13068, 441, 419, 0, 5, 22, 2,15305, 4, 13, 4549, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 73, 73, 27, 27, 13, 13, 9, 7, 4, 17, 23, 3, 16, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Kamba/Latin/Kenya
- { 151, 33, 103, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {73,81,68}, 0, 0, 6, 5, 6 }, // Syriac/Syriac/Iraq
- { 152, 14, 67, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,82,78}, 2, 1, 1, 6, 7 }, // Blin/Ethiopic/Eritrea
- { 153, 14, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7 }, // Geez/Ethiopic/Ethiopia
- { 155, 7, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7 }, // Sidamo/Latin/Ethiopia
- { 156, 7, 157, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 172, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7 }, // Atsam/Latin/Nigeria
- { 157, 14, 67, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,82,78}, 2, 1, 1, 6, 7 }, // Tigre/Ethiopic/Eritrea
- { 158, 7, 157, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 172, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7 }, // Jju/Latin/Nigeria
- { 159, 7, 106, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 1468, 45, 0, 0,13081,13081,13130,13130, 3015, 3015, 53, 50, 0, 5, 22, 14, 3032, 8, 0, 4556, 2453, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 19, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Friulian/Latin/Italy
- { 160, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Venda/Latin/South Africa
- { 161, 7, 83, 0, 0, 874, 885, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1495, 521, 402, 402,13157,13157,13200,13200,13227,13227, 450, 426, 0, 5, 22, 163,15321, 4, 13, 4562, 4568, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 17, 12, 43, 43, 27, 27, 13, 13, 3, 5, 4, 17, 23, 3, 36, 4, 6, 6, 12, {71,72,83}, 2, 1, 1, 6, 7 }, // Ewe/Latin/Ghana
- { 161, 7, 212, 0, 0, 874, 885, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1495, 521, 0, 0,13157,13157,13200,13200,13227,13227, 450, 426, 0, 5, 22, 33,15357, 4, 13, 4562, 4580, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 10, 5, 43, 43, 27, 27, 13, 13, 3, 5, 4, 17, 23, 3,105, 4, 6, 6, 11, {88,79,70}, 0, 0, 1, 6, 7 }, // Ewe/Latin/Togo
- { 162, 14, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7 }, // Walamo/Ethiopic/Ethiopia
- { 163, 7, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 10, 22,13240,13240,13296,13296, 83, 83, 0, 0, 0, 5, 22, 6, 0, 4, 13, 4591, 4605, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 6, 14, 19, {85,83,68}, 2, 1, 7, 6, 7 }, // Hawaiian/Latin/United States
- { 164, 7, 157, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 172, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7 }, // Tyap/Latin/Nigeria
- { 165, 7, 129, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {77,87,75}, 2, 1, 1, 6, 7 }, // Nyanja/Latin/Malawi
- { 166, 7, 170, 0, 0, 895, 904, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22,13316,13316,13370,13370,13370,13370, 0, 0, 0, 5, 22, 173,15462, 4, 13, 4624, 4632, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 54, 54, 27, 27, 27, 27, 2, 2, 5, 17, 23, 1, 57, 4, 6, 8, 9, {80,72,80}, 2, 1, 7, 6, 7 }, // Filipino/Latin/Philippines
- { 167, 7, 206, 0, 0, 267, 267, 6, 0, 13, 2, 3, 38, 5, 9, 15, 16, 17, 18, 420, 166, 0, 0,13397,13397,13459,13459, 3613, 3613, 453, 431, 0, 5, 22, 208,15519, 19, 0, 4641, 4641, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 3, 54, 5, 0, 16, 7, {67,72,70}, 2, 0, 1, 6, 7 }, // Swiss German/Latin/Switzerland
- { 167, 7, 74, 0, 0, 267, 267, 6, 0, 13, 2, 3, 38, 5, 9, 15, 16, 17, 18, 420, 166, 0, 0,13397,13397,13459,13459, 3613, 3613, 453, 431, 0, 5, 22, 14, 8263, 19, 0, 4641, 4657, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 1, 18, 5, 0, 16, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // Swiss German/Latin/France
- { 167, 7, 123, 0, 0, 267, 267, 6, 0, 13, 2, 3, 38, 5, 9, 15, 16, 17, 18, 420, 166, 0, 0,13397,13397,13459,13459, 3613, 3613, 453, 431, 0, 5, 22, 208,15519, 19, 0, 4641, 4667, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 3, 54, 5, 0, 16, 13, {67,72,70}, 2, 0, 1, 6, 7 }, // Swiss German/Latin/Liechtenstein
- { 168, 34, 44, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 10, 22,13486,13486,13513,13513,13533,13533, 465, 442, 0, 5, 22, 130, 0, 8, 0, 4680, 4683, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 3, 2, {67,78,89}, 2, 1, 7, 6, 7 }, // Sichuan Yi/Yi/China
- { 169, 7, 121, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {76,82,68}, 2, 1, 1, 6, 7 }, // Kpelle/Latin/Liberia
- { 170, 7, 82, 0, 0, 459, 459, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 1518, 167, 419, 438,13546,13546,13610,13610, 3613, 3613, 0, 0, 0, 5, 22, 14,15573, 19, 0, 4685, 4699, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 7, 19, 10, 64, 64, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 14, 5, 0, 14, 11, {69,85,82}, 2, 1, 1, 6, 7 }, // Low German/Latin/Germany
- { 170, 7, 151, 0, 0, 459, 459, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 1518, 167, 419, 438,13546,13546,13610,13610, 3613, 3613, 0, 0, 0, 5, 22, 14,15573, 19, 0, 4685, 4710, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 7, 19, 10, 64, 64, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 14, 5, 0, 14, 12, {69,85,82}, 2, 1, 1, 6, 7 }, // Low German/Latin/Netherlands
- { 171, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // South Ndebele/Latin/South Africa
- { 172, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Northern Sotho/Latin/South Africa
- { 173, 7, 161, 0, 0, 226, 226, 6, 1, 14, 2, 3, 38, 5, 64, 11, 11, 13, 13, 53, 70, 0, 0,13637,13637,13711,13711,13743,13743, 467, 444, 0, 5, 22, 145,15587, 19, 0, 4722, 4737, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 74, 74, 32, 32, 13, 13, 11, 13, 4, 17, 23, 2, 62, 5, 0, 15, 5, {78,79,75}, 2, 0, 1, 6, 7 }, // Northern Sami/Latin/Norway
- { 173, 7, 73, 0, 0, 226, 226, 6, 1, 14, 2, 3, 38, 5, 64, 11, 11, 13, 13, 97, 501, 0, 0,13756,13756,13825,13825,13845,13845, 478, 457, 0, 5, 22, 14,15649, 19, 0, 4722, 4742, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 10, 5, 69, 69, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 22, 5, 0, 15, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Northern Sami/Latin/Finland
- { 173, 7, 205, 0, 0, 226, 226, 6, 1, 14, 2, 3, 38, 5, 64, 11, 11, 13, 13, 53, 70, 0, 0,13637,13637,13711,13711,13743,13743, 467, 444, 0, 5, 22, 145,15671, 19, 0, 4722, 4748, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 74, 74, 32, 32, 13, 13, 11, 13, 4, 17, 23, 2, 62, 5, 0, 15, 6, {83,69,75}, 2, 0, 1, 6, 7 }, // Northern Sami/Latin/Sweden
- { 174, 7, 208, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 317, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {84,87,68}, 2, 0, 7, 6, 7 }, // Taroko/Latin/Taiwan
- { 175, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,13858,13858,13919,13919,13946,13946, 480, 459, 0, 5, 22, 2,13654, 4, 13, 4754, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 6, 3, 4, 17, 23, 3, 17, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Gusii/Latin/Kenya
- { 176, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,13959,13959,14063,14063,14090,14090, 486, 462, 0, 5, 22, 2,13654, 4, 13, 4762, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5,104,104, 27, 27, 13, 13, 10, 10, 4, 17, 23, 3, 17, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Taita/Latin/Kenya
- { 177, 7, 187, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 33,15733, 19, 0, 4769, 4338, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 19, 5, 0, 6, 8, {88,79,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Senegal
- { 177, 7, 34, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 33,15733, 19, 0, 4769, 4775, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 19, 5, 0, 6, 14, {88,79,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Burkina Faso
- { 177, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 32,15752, 19, 0, 4769, 4789, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 4, 18, 5, 0, 6, 8, {88,65,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Cameroon
- { 177, 7, 80, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 10, 22,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 162,15770, 19, 0, 4769, 4797, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 13, 5, 0, 6, 6, {71,77,68}, 2, 1, 1, 6, 7 }, // Fulah/Latin/Gambia
- { 177, 7, 83, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 10, 22,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 163, 0, 19, 0, 4769, 4803, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 0, 5, 0, 6, 5, {71,72,83}, 2, 1, 1, 6, 7 }, // Fulah/Latin/Ghana
- { 177, 7, 91, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 201, 0, 19, 0, 4769, 4808, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 0, 5, 0, 6, 4, {71,78,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea
- { 177, 7, 92, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 33,15733, 19, 0, 4769, 4812, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 19, 5, 0, 6, 12, {88,79,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea Bissau
- { 177, 7, 121, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 10, 22,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 6,15783, 19, 0, 4769, 4824, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 16, 5, 0, 6, 9, {76,82,68}, 2, 1, 1, 6, 7 }, // Fulah/Latin/Liberia
- { 177, 7, 136, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 10, 22,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 203,15799, 19, 0, 4769, 4833, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 15, 5, 0, 6, 8, {77,82,85}, 2, 1, 1, 6, 7 }, // Fulah/Latin/Mauritania
- { 177, 7, 156, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 33,15733, 19, 0, 4769, 4841, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 19, 5, 0, 6, 6, {88,79,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Niger
- { 177, 7, 157, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 172,15814, 19, 0, 4769, 4847, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 16, 5, 0, 6, 9, {78,71,78}, 2, 1, 1, 6, 7 }, // Fulah/Latin/Nigeria
- { 177, 7, 189, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 10, 22,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 7,15830, 19, 0, 4769, 4856, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 18, 5, 0, 6, 11, {83,76,76}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Sierra Leone
- { 177, 134, 91, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 201, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {71,78,70}, 0, 0, 1, 6, 7 }, // Fulah/Adlam/Guinea
- { 178, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,14201,14201,14263,14263,14290,14290, 502, 479, 0, 5, 22, 2,15848, 4, 13, 4867, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 62, 62, 27, 27, 13, 13, 6, 8, 4, 17, 23, 3, 16, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Kikuyu/Latin/Kenya
- { 179, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,14303,14303,14407,14407,14434,14434, 508, 487, 0, 5, 22, 2,15864, 4, 13, 4873, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5,104,104, 27, 27, 13, 13, 7, 5, 4, 17, 23, 3, 18, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Samburu/Latin/Kenya
- { 180, 7, 146, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 398, 0, 0,14447,14447,14501,14501,14528,14528, 0, 0, 0, 5, 22, 260,15882, 0, 0, 4881, 3301, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 21, 4, 0, 4, 10, {77,90,78}, 2, 1, 7, 6, 7 }, // Sena/Latin/Mozambique
- { 181, 7, 240, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,14541,14541,14590,14590,14617,14617, 0, 0, 0, 5, 22, 156,15903, 4, 13, 4885, 1780, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 10, 8, {85,83,68}, 2, 1, 7, 6, 7 }, // North Ndebele/Latin/Zimbabwe
- { 182, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,14630,14630,14694,14694,14722,14722, 515, 492, 0, 5, 22, 182,15920, 4, 0, 4895, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 64, 64, 28, 28, 13, 13, 8, 7, 4, 17, 23, 3, 18, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Rombo/Latin/Tanzania
- { 183, 9, 145, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 11, 97, 398, 0, 0,14735,14735,14781,14781, 83, 83, 523, 499, 0, 5, 22, 0,15938, 0, 0, 4904, 4911, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 46, 46, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 7, 6, {77,65,68}, 2, 1, 1, 6, 7 }, // Tachelhit/Tifinagh/Morocco
- { 183, 7, 145, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 11, 97, 398, 0, 0,14810,14810,14857,14857, 83, 83, 529, 507, 0, 5, 22, 0,15952, 0, 0, 4917, 4927, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 47, 47, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 10, 6, {77,65,68}, 2, 1, 1, 6, 7 }, // Tachelhit/Latin/Morocco
- { 184, 7, 3, 0, 0, 912, 924, 6, 1, 14, 2, 3, 4, 5, 68, 15, 16, 10, 11, 97, 398, 10, 22,14886,14919,14969,14996,15025,15038, 535, 515, 1185, 1192, 22, 195,15966, 0, 0, 4933, 4942, 6, 6, 12, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 33, 50, 27, 29, 13, 13, 7, 9, 7, 21, 23, 2, 52, 4, 0, 9, 8, {68,90,68}, 2, 1, 6, 5, 6 }, // Kabyle/Latin/Algeria
- { 185, 7, 221, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15051,15051,15124,15124,15151,15151, 0, 0, 0, 5, 22, 187,16018, 4, 0, 4950, 1650, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 73, 73, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 10, 6, {85,71,88}, 0, 0, 1, 7, 7 }, // Nyankole/Latin/Uganda
- { 186, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15164,15164,15245,15245,15272,15272, 542, 524, 0, 5, 22, 182,16037, 0, 0, 4960, 4966, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 81, 81, 27, 27, 13, 13, 7, 7, 4, 17, 23, 3, 22, 4, 0, 6, 10, {84,90,83}, 2, 0, 1, 6, 7 }, // Bena/Latin/Tanzania
- { 187, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15285,15285,15346,15346,15373,15373, 549, 531, 0, 5, 22, 182,13534, 4, 0, 4976, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 8, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Vunjo/Latin/Tanzania
- { 188, 7, 132, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 398, 0, 0,15386,15386,15429,15429,15456,15456, 0, 0, 0, 5, 22, 33,16059, 4, 13, 4984, 2143, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 43, 43, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 9, 4, {88,79,70}, 0, 0, 1, 6, 7 }, // Bambara/Latin/Mali
- { 188, 75, 132, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 33, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {88,79,70}, 0, 0, 1, 6, 7 }, // Bambara/Nko/Mali
- { 189, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15469,15469,15532,15532,15559,15559, 554, 540, 0, 5, 22, 2,13654, 4, 13, 4993, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 63, 63, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Embu/Latin/Kenya
- { 190, 12, 225, 0, 0, 935, 944, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22,15572,15572,15620,15620,15647,15647, 556, 542, 1213, 5, 22, 6,16076, 4, 13, 4999, 5002, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 27, 27, 13, 13, 3, 6, 6, 17, 23, 1, 24, 4, 6, 3, 15, {85,83,68}, 2, 1, 7, 6, 7 }, // Cherokee/Cherokee/United States
- { 191, 7, 137, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,15660,15660,15707,15707,15733,15733, 0, 0, 0, 5, 22, 170,16100, 8, 0, 5017, 5031, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 47, 47, 26, 26, 13, 13, 2, 2, 4, 17, 23, 2, 14, 5, 0, 14, 5, {77,85,82}, 2, 0, 1, 6, 7 }, // Morisyen/Latin/Mauritius
- { 192, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15746,15746,15878,15878,14722,14722, 559, 548, 0, 5, 22, 182,13534, 4, 13, 5036, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5,132,132, 27, 27, 13, 13, 4, 5, 4, 17, 23, 3, 20, 4, 6, 10, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Makonde/Latin/Tanzania
- { 193, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 11, 11, 13, 13, 0, 45, 0, 0,15905,15905,15967,15967,16002,16002, 563, 553, 0, 5, 22, 182,16114, 8, 0, 5046, 5054, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 62, 62, 35, 35, 13, 13, 3, 3, 4, 17, 23, 3, 22, 5, 0, 8, 9, {84,90,83}, 2, 0, 1, 6, 7 }, // Langi/Latin/Tanzania
- { 194, 7, 221, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16015,16015,16080,16080,16107,16107, 0, 0, 0, 5, 22, 187,16136, 0, 0, 5063, 5070, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 65, 65, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 7, 7, {85,71,88}, 0, 0, 1, 7, 7 }, // Ganda/Latin/Uganda
- { 195, 7, 239, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22,16120,16120,16120,16120, 83, 83, 566, 556, 0, 5, 22, 2, 0, 4, 13, 5077, 1774, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 79, 79, 79, 79, 13, 13, 8, 7, 4, 17, 23, 1, 0, 4, 6, 9, 6, {90,77,87}, 2, 1, 1, 6, 7 }, // Bemba/Latin/Zambia
- { 196, 7, 39, 0, 0, 161, 161, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1541, 45, 0, 0,16199,16271,16343,16343,16370,16370, 68, 65, 0, 5, 22, 259,16155, 19, 24, 5086, 5098, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 10, 5, 72, 72, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 42, 5, 7, 12, 10, {67,86,69}, 2, 1, 1, 6, 7 }, // Kabuverdianu/Latin/Cape Verde
- { 197, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16383,16383,16433,16433,16460,16460, 574, 563, 0, 5, 22, 2,13654, 4, 13, 5108, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 50, 50, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Meru/Latin/Kenya
- { 198, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16473,16473,16525,16525,16552,16552, 576, 565, 0, 5, 22, 2,16197, 4, 13, 5114, 5122, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 52, 52, 27, 27, 13, 13, 6, 10, 4, 17, 23, 3, 19, 4, 6, 8, 12, {75,69,83}, 2, 1, 7, 6, 7 }, // Kalenjin/Latin/Kenya
- { 199, 7, 148, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22,16565,16565,16656,16656,16678,16678, 582, 575, 0, 5, 22, 6,16216, 4, 0, 5134, 5147, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 91, 91, 22, 22, 13, 13, 7, 5, 4, 17, 23, 1, 15, 4, 0, 13, 8, {78,65,68}, 2, 1, 1, 6, 7 }, // Nama/Latin/Namibia
- { 200, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15285,15285,15346,15346,15373,15373, 549, 531, 0, 5, 22, 182,13534, 4, 0, 5155, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Machame/Latin/Tanzania
- { 201, 7, 82, 0, 0, 459, 459, 6, 1, 14, 2, 3, 38, 5, 47, 40, 10, 46, 12, 1568, 1070, 0, 0,16691,16691,16762,16762, 3613, 3613, 589, 580, 0, 5, 22, 14, 234, 19, 0, 5164, 5170, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 23, 10, 10, 5, 71, 71, 27, 27, 13, 13, 16, 16, 4, 17, 23, 1, 4, 5, 0, 6, 11, {69,85,82}, 2, 1, 1, 6, 7 }, // Colognian/Latin/Germany
- { 202, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16789,16789,15346,15346,14722,14722, 605, 596, 0, 5, 22, 2,16231, 4, 13, 740, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 18, 4, 6, 3, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Masai/Latin/Kenya
- { 202, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16789,16789,15346,15346,14722,14722, 605, 596, 0, 5, 22, 182,16249, 4, 13, 740, 5181, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 21, 4, 6, 3, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Masai/Latin/Tanzania
- { 203, 7, 221, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16846,16846,16910,16910,16944,16944, 614, 602, 0, 5, 22, 187,16136, 19, 0, 5189, 5070, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 64, 64, 34, 34, 13, 13, 6, 6, 4, 17, 23, 3, 19, 5, 0, 7, 7, {85,71,88}, 0, 0, 1, 7, 7 }, // Soga/Latin/Uganda
- { 204, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 40, 10, 46, 12, 0, 45, 0, 0,16957,16957,17031,17031, 83, 83, 64, 61, 0, 5, 22, 2,16270, 4, 68, 5196, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 74, 74, 20, 20, 13, 13, 4, 4, 4, 17, 23, 3, 16, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Luyia/Latin/Kenya
- { 205, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 9729, 9729,17051,17051,15373,15373, 620, 608, 0, 5, 22, 182,16286, 19, 0, 5203, 5209, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 27, 27, 13, 13, 9, 8, 4, 17, 23, 3, 21, 5, 0, 6, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Asu/Latin/Tanzania
- { 206, 7, 221, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,17078,17078,17146,17146,17173,17173, 629, 616, 0, 5, 22, 187,16307, 4, 13, 5217, 1650, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 68, 68, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 21, 4, 6, 6, 6, {85,71,88}, 0, 0, 1, 7, 7 }, // Teso/Latin/Uganda
- { 206, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,17078,17078,17146,17146,17173,17173, 629, 616, 0, 5, 22, 2,16328, 4, 13, 5217, 5223, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 68, 68, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 20, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Teso/Latin/Kenya
- { 207, 7, 67, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,82,78}, 2, 1, 1, 6, 7 }, // Saho/Latin/Eritrea
- { 208, 7, 132, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,17186,17186,17238,17238,17265,17265, 638, 622, 0, 5, 22, 33,16348, 0, 0, 5228, 5239, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 52, 52, 27, 27, 13, 13, 6, 6, 4, 17, 23, 3, 16, 4, 0, 11, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // Koyra Chiini/Latin/Mali
- { 209, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15285,15285,15346,15346,15373,15373, 549, 531, 0, 5, 22, 182,13534, 0, 0, 5244, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 6, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Rwa/Latin/Tanzania
- { 210, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,17278,17278,17346,17346,17373,17373, 644, 628, 0, 5, 22, 2,16364, 0, 0, 5250, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 68, 68, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 16, 4, 0, 6, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Luo/Latin/Kenya
- { 211, 7, 221, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15051,15051,15124,15124,15151,15151, 0, 0, 0, 5, 22, 187,16018, 4, 0, 5256, 1650, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 73, 73, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 6, 6, {85,71,88}, 0, 0, 1, 7, 7 }, // Chiga/Latin/Uganda
- { 212, 7, 145, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,17386,17386,17433,17433,17460,17460, 646, 630, 0, 5, 22, 0,16380, 19, 0, 5262, 5279, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 47, 47, 27, 27, 13, 13, 9, 10, 4, 17, 23, 0, 15, 5, 0, 17, 6, {77,65,68}, 2, 1, 1, 6, 7 }, // Central Morocco Tamazight/Latin/Morocco
- { 213, 7, 132, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,17473,17473,17526,17526,17265,17265, 638, 622, 0, 5, 22, 33,16348, 0, 0, 5285, 5239, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 53, 53, 27, 27, 13, 13, 6, 6, 4, 17, 23, 3, 16, 4, 0, 15, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // Koyraboro Senni/Latin/Mali
- { 214, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,17553,17553,17615,17615,17642,17642, 655, 640, 0, 5, 22, 182,13556, 0, 0, 5300, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 62, 62, 27, 27, 13, 13, 5, 8, 4, 17, 23, 3, 20, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Shambala/Latin/Tanzania
- { 215, 13, 100, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22,17655,17655,17708,17708,17740,17740, 660, 648, 0, 5, 22, 119,16395, 8, 0, 5309, 2599, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 53, 53, 32, 32, 18, 18, 3, 6, 4, 17, 23, 1, 3, 5, 0, 4, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Bodo/Devanagari/India
- { 218, 2, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0,17758,17758,17802,17802,17826,17802, 0, 0, 0, 5, 22, 121,16398, 19, 0, 5313, 3454, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 44, 44, 24, 24, 16, 24, 2, 2, 4, 17, 23, 1, 42, 5, 0, 7, 5, {82,85,66}, 2, 1, 1, 6, 7 }, // Chechen/Cyrillic/Russia
- { 219, 2, 178, 0, 0, 952, 952, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 1591, 967, 0, 0,17842,17842,17909,17909,11114,11114, 0, 0, 0, 5, 22, 121,16440, 19, 0, 5320, 5339, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 67, 67, 36, 36, 13, 13, 2, 2, 4, 17, 23, 1, 43, 5, 0, 19, 7, {82,85,66}, 2, 1, 1, 6, 7 }, // Church/Cyrillic/Russia
- { 220, 2, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 121, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {82,85,66}, 2, 1, 1, 6, 7 }, // Chuvash/Cyrillic/Russia
- { 230, 7, 49, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,17945,17945,17994,17994,18021,18021, 663, 654, 0, 5, 22, 32,16483, 0, 0, 5346, 5354, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 49, 49, 27, 27, 13, 13, 5, 6, 4, 17, 23, 2, 17, 4, 0, 8, 16, {67,68,70}, 2, 1, 1, 6, 7 }, // Luba Katanga/Latin/Congo Kinshasa
- { 231, 7, 125, 0, 0, 960, 960, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0,18034,18034,18098,18125, 3613, 3613, 668, 660, 441, 5, 22, 14, 8263, 19, 0, 5370, 5370, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 64, 64, 27, 34, 13, 13, 5, 8, 5, 17, 23, 1, 18, 5, 0, 14, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // Luxembourgish/Latin/Luxembourg
- { 236, 7, 21, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Walloon/Latin/Belgium
- { 237, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,18159,18159,18230,18230,18257,18257, 673, 668, 0, 5, 22, 32,16500, 0, 0, 5384, 5389, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 71, 71, 27, 27, 13, 13, 3, 3, 4, 17, 23, 4, 14, 4, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Aghem/Latin/Cameroon
- { 238, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 97, 398, 0, 0,18270,18270,18339,18339,18366,18366, 676, 671, 0, 5, 22, 32,16514, 19, 0, 5396, 5401, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 69, 69, 27, 27, 13, 13, 10, 9, 4, 17, 23, 4, 15, 5, 0, 5, 8, {88,65,70}, 0, 0, 1, 6, 7 }, // Basaa/Latin/Cameroon
- { 239, 7, 156, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,18379,18379,17526,17526,18431,18431, 686, 680, 0, 5, 22, 33,16348, 0, 0, 5409, 5419, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 52, 52, 27, 27, 13, 13, 8, 10, 4, 17, 23, 3, 16, 4, 0, 10, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // Zarma/Latin/Niger
- { 240, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 12, 13, 97, 398, 0, 0,18444,18444,18488,18488,18515,18515, 694, 690, 0, 5, 22, 32, 0, 19, 0, 5424, 1946, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 44, 44, 27, 27, 13, 13, 5, 6, 4, 17, 23, 4, 0, 5, 0, 5, 8, {88,65,70}, 0, 0, 1, 6, 7 }, // Duala/Latin/Cameroon
- { 241, 7, 187, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 398, 0, 0,18528,18528,18577,18577,18604,18604, 0, 0, 0, 5, 22, 33,16529, 19, 0, 5429, 5434, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 16, 5, 0, 5, 7, {88,79,70}, 0, 0, 1, 6, 7 }, // Jola Fonyi/Latin/Senegal
- { 242, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 398, 0, 0,18617,18617,18701,18701,18730,18730, 699, 696, 0, 5, 22, 32,16545, 19, 0, 5441, 5447, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 84, 84, 29, 29, 13, 13, 7, 9, 4, 17, 23, 4, 16, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Ewondo/Latin/Cameroon
- { 243, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 12, 13, 97, 398, 0, 0,18743,18743,18787,18787,18815,18815, 706, 705, 0, 5, 22, 32,16561, 19, 0, 5454, 5459, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 44, 44, 28, 28, 13, 13, 6, 7, 4, 17, 23, 4, 4, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Bafia/Latin/Cameroon
- { 244, 7, 146, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,18828,18828,18886,18886,18913,18913, 712, 712, 0, 5, 22, 260, 0, 8, 0, 5466, 5471, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 58, 58, 27, 27, 13, 13, 8, 10, 4, 17, 23, 3, 0, 5, 0, 5, 10, {77,90,78}, 2, 1, 7, 6, 7 }, // Makhuwa Meetto/Latin/Mozambique
- { 245, 7, 37, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 398, 0, 0,18926,18926,18999,18999,19026,19026, 720, 722, 0, 5, 22, 32,16565, 4, 13, 5481, 5487, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 73, 73, 27, 27, 13, 13, 5, 5, 4, 17, 23, 4, 10, 4, 6, 6, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Mundang/Latin/Cameroon
- { 246, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 15, 16, 97, 398, 0, 0,19039,19039,19127,19127,19156,19156, 725, 727, 0, 5, 22, 32,16575, 19, 0, 5494, 5500, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 88, 88, 29, 29, 13, 13, 4, 4, 4, 17, 23, 4, 13, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Kwasio/Latin/Cameroon
- { 247, 7, 254, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 46, 448, 22,19169,19169,19247,19247,19284,19284, 729, 731, 0, 5, 22, 117, 0, 4, 13, 5507, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 12, 7, 78, 78, 37, 37, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 6, 9, 0, {83,83,80}, 2, 1, 1, 6, 7 }, // Nuer/Latin/South Sudan
- { 248, 2, 178, 0, 0, 970, 970, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 1614, 253, 0, 0,19297,19297,19367,19367,19387,19387, 731, 733, 1219, 1224, 22, 121,16588, 19, 0, 5516, 5525, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 6, 10, 5, 70, 70, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 46, 5, 0, 9, 9, {82,85,66}, 2, 1, 1, 6, 7 }, // Sakha/Cyrillic/Russia
- { 249, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,19400,19400,19459,19459,19486,19486, 733, 735, 0, 5, 22, 182,16634, 0, 0, 5534, 5543, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 27, 27, 13, 13, 9, 9, 4, 17, 23, 3, 18, 4, 0, 9, 9, {84,90,83}, 2, 0, 1, 6, 7 }, // Sangu/Latin/Tanzania
- { 251, 7, 156, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,17473,17473,17526,17526,17265,17265, 686, 680, 0, 5, 22, 33,16348, 0, 0, 5552, 5419, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 53, 53, 27, 27, 13, 13, 8, 10, 4, 17, 23, 3, 16, 4, 0, 13, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // Tasawaq/Latin/Niger
- { 252, 35, 121, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22,19499,19499,19499,19499, 83, 83, 0, 0, 0, 5, 22, 6,16652, 4, 13, 5565, 5567, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 29, 29, 29, 29, 13, 13, 2, 2, 4, 17, 23, 1, 8, 4, 6, 2, 4, {76,82,68}, 2, 1, 1, 6, 7 }, // Vai/Vai/Liberia
- { 252, 7, 121, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22,19528,19528,19528,19528, 83, 83, 0, 0, 0, 5, 22, 6,16660, 4, 13, 5571, 5574, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 47, 47, 47, 47, 13, 13, 2, 2, 4, 17, 23, 1, 13, 4, 6, 3, 8, {76,82,68}, 2, 1, 1, 6, 7 }, // Vai/Latin/Liberia
- { 253, 7, 206, 0, 0, 267, 267, 6, 1, 13, 2, 3, 4, 5, 9, 15, 16, 17, 18, 420, 70, 0, 0,19575,19575,19627,19627,19654,19654, 0, 0, 0, 5, 22, 0, 0, 8, 0, 5582, 5588, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 6, 6, {67,72,70}, 2, 0, 1, 6, 7 }, // Walser/Latin/Switzerland
- { 254, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 398, 0, 0,19667,19667,19737,19737,19757,19757, 742, 744, 0, 5, 22, 32, 0, 19, 24, 5594, 5600, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 70, 70, 20, 20, 13, 13, 8, 8, 4, 17, 23, 4, 0, 5, 7, 6, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Yangben/Latin/Cameroon
- { 256, 7, 197, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 355, 259, 0, 0,19770,19770,19823,19823, 3373, 3373, 750, 752, 0, 5, 22, 14, 3032, 19, 0, 5607, 2381, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 10, 5, 53, 53, 27, 27, 13, 13, 12, 11, 5, 17, 23, 1, 19, 5, 0, 9, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Asturian/Latin/Spain
- { 257, 7, 37, 981, 981, 992, 1008, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 17, 18, 1450, 70, 0, 0,19850,19850,19850,19850,19909,19909, 762, 763, 0, 5, 22, 32,16673, 8, 0, 5616, 5621, 11, 11, 16, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 59, 59, 59, 59, 24, 24, 8, 13, 4, 17, 23, 4, 5, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Ngomba/Latin/Cameroon
- { 258, 7, 37, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 17, 18, 80, 1644, 0, 0,19933,19933,19933,19933,19986,19986, 0, 0, 0, 5, 22, 32,14657, 8, 0, 5628, 5632, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 53, 53, 53, 53, 20, 20, 2, 2, 4, 17, 23, 4, 9, 5, 0, 4, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Kako/Latin/Cameroon
- { 259, 7, 37, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1450, 70, 0, 0,20006,20006,20006,20006,20054,20054, 0, 0, 0, 5, 22, 32,16678, 8, 0, 5639, 5644, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 48, 48, 48, 48, 20, 20, 2, 2, 4, 17, 23, 4, 5, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Meta/Latin/Cameroon
- { 260, 7, 37, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 1654, 45, 0, 0,20074,20074,20074,20074, 83, 83, 770, 776, 0, 5, 22, 32,16683, 8, 0, 5651, 5667, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 32, 8, 10, 5,110,110,110,110, 13, 13, 9, 8, 4, 17, 23, 4, 9, 5, 0, 16, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Ngiemboon/Latin/Cameroon
- { 261, 7, 197, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Aragonese/Latin/Spain
- { 272, 46, 18, 0, 0, 1017, 1017, 6, 0, 1, 2, 69, 4, 5, 9, 10, 11, 12, 13, 174, 259, 10, 22,20184,20184,20310,20310,20394,20394, 0, 0, 1241, 5, 22, 122,16692, 0, 31, 5674, 5686, 6, 6, 12, 12, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7,126,126, 84, 84, 38, 38, 2, 2, 8, 17, 23, 1, 69, 4, 6, 12, 14, {66,68,84}, 2, 1, 7, 6, 7 }, // Chakma/Chakma/Bangladesh
- { 272, 46, 100, 0, 0, 1017, 1017, 6, 0, 1, 2, 69, 4, 5, 9, 10, 11, 12, 13, 174, 259, 10, 22,20184,20184,20310,20310,20394,20394, 0, 0, 1241, 5, 22, 119,16761, 0, 31, 5674, 5700, 6, 6, 12, 12, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7,126,126, 84, 84, 38, 38, 2, 2, 8, 17, 23, 1, 87, 4, 6, 12, 10, {73,78,82}, 2, 1, 7, 7, 7 }, // Chakma/Chakma/India
- { 290, 11, 100, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 119, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {73,78,82}, 2, 1, 7, 7, 7 }, // Manipuri/Bengali/India
- { 309, 100, 232, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 316, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {86,78,68}, 0, 0, 1, 6, 7 }, // Tai Dam/Tai Viet/Vietnam
- { 312, 7, 37, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 32, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 0, 5, 0, 0, 0, {88,65,70}, 0, 0, 1, 6, 7 }, // Akoose/Latin/Cameroon
- { 313, 7, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22,20432,20432,20432,20432, 83,20518, 0, 0, 0, 5, 22, 6, 0, 8, 0, 5710, 5722, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 86, 86, 86, 86, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 22, {85,83,68}, 2, 1, 7, 6, 7 }, // Lakota/Latin/United States
- { 314, 9, 145, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 11, 97, 398, 0, 0,20531,20531,14781,14781, 83, 83, 523, 499, 0, 5, 22, 0,15938, 0, 0, 5744, 4911, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 47, 47, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 8, 6, {77,65,68}, 2, 1, 1, 6, 7 }, // Standard Moroccan Tamazight/Tifinagh/Morocco
- { 315, 7, 43, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {67,76,80}, 0, 0, 1, 6, 7 }, // Mapuche/Latin/Chile
- { 316, 1, 103, 0, 0, 0, 0, 53, 19, 20, 21, 23, 71, 73, 28, 10, 11, 12, 13, 53, 70, 10, 22,20578,20578,20578,20578,20635,20635, 779, 784, 0, 5, 22, 42,16848, 19, 0, 5752, 5766, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 57, 57, 57, 57, 13, 13, 3, 3, 4, 17, 23, 5, 13, 5, 0, 14, 5, {73,81,68}, 0, 0, 6, 5, 6 }, // Central Kurdish/Arabic/Iraq
- { 316, 1, 102, 0, 0, 0, 0, 53, 19, 20, 21, 23, 71, 73, 28, 10, 11, 12, 13, 53, 70, 0, 0,20578,20578,20578,20578,20635,20635, 779, 784, 0, 5, 22, 0,16861, 19, 0, 5752, 5771, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 57, 57, 13, 13, 3, 3, 4, 17, 23, 0, 12, 5, 0, 14, 5, {73,82,82}, 0, 0, 6, 5, 5 }, // Central Kurdish/Arabic/Iran
- { 317, 7, 82, 0, 0, 183, 183, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 113, 1, 1,20648,20648,20700,20700,20727,20727, 782, 787, 0, 5, 22, 14,16873, 19, 0, 5776, 5790, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 9, 4, 52, 52, 27, 27, 13, 13, 9, 10, 4, 17, 23, 1, 26, 5, 0, 14, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Lower Sorbian/Latin/Germany
- { 318, 7, 82, 0, 0, 183, 183, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 113, 1, 460,20740,20740,20792,20792,20819,20819, 782, 797, 1249, 5, 22, 14,16899, 19, 0, 5796, 5811, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 9, 12, 52, 52, 27, 27, 13, 13, 9, 9, 5, 17, 23, 1, 28, 5, 0, 15, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Upper Sorbian/Latin/Germany
- { 319, 7, 37, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 32, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 0, 5, 0, 0, 0, {88,65,70}, 0, 0, 1, 6, 7 }, // Kenyang/Latin/Cameroon
- { 320, 7, 38, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 224, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7 }, // Mohawk/Latin/Canada
- { 321, 75, 91, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 201, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {71,78,70}, 0, 0, 1, 6, 7 }, // Nko/Nko/Guinea
- { 322, 7, 260, 0, 0, 1029, 1029, 6, 1, 14, 2, 3, 4, 5, 9, 40, 10, 40, 10, 1686, 166, 0, 0,20832,20832,20900,20900,20927,20927, 0, 0, 0, 5, 22, 0, 0, 19, 0, 5817, 5826, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 68, 68, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 9, 6, {0,0,0}, 2, 1, 1, 6, 7 }, // Prussian/Latin/World
- { 323, 7, 90, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 285, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {71,84,81}, 2, 1, 7, 6, 7 }, // Kiche/Latin/Guatemala
- { 324, 7, 205, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 145, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {83,69,75}, 2, 0, 1, 6, 7 }, // Southern Sami/Latin/Sweden
- { 325, 7, 205, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 145, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {83,69,75}, 2, 0, 1, 6, 7 }, // Lule Sami/Latin/Sweden
- { 326, 7, 73, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1713, 581, 176, 167,20940,21009,21081,21081, 83,21108, 791, 806, 0, 5, 22, 14, 242, 19, 0, 5832, 5843, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 9, 4, 69, 72, 27, 27, 13, 13, 3, 3, 4, 17, 23, 1, 4, 5, 0, 11, 5, {69,85,82}, 2, 1, 1, 6, 7 }, // Inari Sami/Latin/Finland
- { 327, 7, 73, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Skolt Sami/Latin/Finland
- { 328, 7, 13, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 225, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {65,85,68}, 2, 1, 7, 6, 7 }, // Warlpiri/Latin/Australia
- { 346, 1, 102, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 15, 16, 17, 18, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 714, 1254, 22, 320,16927, 8, 0, 5848, 3182, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 39, 23, 3, 26, 5, 0, 7, 5, {73,82,82}, 0, 0, 6, 5, 5 }, // Mazanderani/Arabic/Iran
- { 349, 1, 102, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 5855, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {73,82,82}, 0, 0, 6, 5, 5 }, // Northern Luri/Arabic/Iran
- { 349, 1, 103, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 53, 70, 10, 22, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 42, 0, 8, 0, 5855, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 12, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 0, 5, 0, 11, 0, {73,81,68}, 0, 0, 6, 5, 6 }, // Northern Luri/Arabic/Iraq
- { 357, 6, 97, 168, 168, 1037, 1037, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 406, 390, 153, 27, 1902, 1902, 1902, 1902, 1949, 1949, 58, 55, 0, 5, 22, 131,16953, 4, 13, 5866, 5868, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 13, 6, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 10, 4, 6, 2, 14, {72,75,68}, 2, 1, 7, 6, 7 }, // Cantonese/Traditional Han/Hong Kong
- { 357, 5, 44, 168, 168, 1037, 1037, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 377, 390, 142, 27, 1902, 1902, 1929, 1929, 1949, 1949, 58, 55, 0, 5, 22, 227, 3051, 4, 13, 5882, 5884, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 12, 4, 6, 2, 7, {67,78,89}, 2, 1, 7, 6, 7 }, // Cantonese/Simplified Han/China
- { 358, 138, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 156, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7 }, // Osage/Osage/United States
- { 360, 7, 260, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7 }, // Ido/Latin/World
- { 361, 7, 260, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7 }, // Lojban/Latin/World
- { 362, 7, 106, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Sicilian/Latin/Italy
- { 363, 1, 102, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {73,82,82}, 0, 0, 6, 5, 5 }, // Southern Kurdish/Arabic/Iran
- { 364, 1, 163, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 170, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {80,75,82}, 2, 0, 7, 6, 7 }, // Western Balochi/Arabic/Pakistan
- { 365, 7, 170, 0, 0, 895, 904, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22,21121,21121,21176,21176,21200,21200, 0, 0, 1293, 5, 22, 173,16963, 4, 13, 5891, 4632, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 55, 55, 24, 24, 13, 13, 2, 2, 8, 17, 23, 1, 55, 4, 6, 8, 9, {80,72,80}, 2, 1, 7, 6, 7 }, // Cebuano/Latin/Philippines
- { 366, 2, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 121, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {82,85,66}, 2, 1, 1, 6, 7 }, // Erzya/Cyrillic/Russia
- { 367, 7, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 156, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7 }, // Chickasaw/Latin/United States
- { 368, 7, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 156, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7 }, // Muscogee/Latin/United States
- { 369, 7, 172, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 257, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {80,76,78}, 2, 1, 1, 6, 7 }, // Silesian/Latin/Poland
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0,0,0}, 0, 0, 0, 0, 0 } // trailing zeros
+static constexpr QLocaleData locale_data[] = {
+ // lang script terr lStrt lpMid lpEnd lPair lDelm dec group prcnt zero minus plus exp qtOpn qtEnd altQO altQE lDFmt sDFmt lTFmt sTFmt slDay lDays ssDys sDays snDay nDays am pm byte siQnt iecQn crSym crDsp crFmt crFNg ntLng ntTer currISO curDgt curRnd dow1st wknd+ wknd- grpTop grpMid grpEnd
+ { 1, 0, 0, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 8, 0, 17, 0, 0, 0, 0, 56, 56, 83, 96, 0, 0, 0, 5, 22, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 8, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 4, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // C/AnyScript/AnyTerritory
+ { 2, 27, 90, 0, 0, 7, 7, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 27, 49, 10, 0, 109, 109, 157, 157, 179, 179, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 6, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 48, 48, 22, 22, 15, 15, 2, 2, 4, 17, 23, 1, 0, 5, 0, 6, 9, {71,69,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Abkhazian/Cyrillic/Georgia
+ { 3, 66, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 59, 78, 23, 38, 194, 194, 245, 245, 272, 272, 0, 0, 0, 5, 22, 1, 0, 2, 0, 15, 20, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 7, 51, 51, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 4, 0, 5, 7, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Afar/Latin/Ethiopia
+ { 3, 66, 67, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 59, 78, 23, 38, 194, 194, 245, 245, 272, 272, 0, 0, 0, 5, 22, 3, 0, 2, 0, 15, 27, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 7, 51, 51, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 5, 7, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // Afar/Latin/Djibouti
+ { 3, 66, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 59, 78, 23, 38, 194, 194, 245, 245, 272, 272, 0, 0, 0, 5, 22, 6, 0, 2, 0, 15, 34, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 7, 51, 51, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 5, 7, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Afar/Latin/Eritrea
+ { 4, 66, 216, 0, 0, 16, 16, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 86, 103, 10, 0, 285, 285, 342, 342, 369, 369, 2, 2, 45, 5, 22, 9, 0, 2, 9, 41, 50, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 57, 57, 27, 27, 13, 13, 3, 3, 5, 17, 23, 1, 20, 4, 6, 9, 11, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Afrikaans/Latin/South Africa
+ { 4, 66, 162, 0, 0, 16, 16, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 103, 23, 38, 285, 285, 342, 342, 369, 369, 2, 2, 45, 5, 22, 10, 20, 2, 9, 41, 61, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 57, 57, 27, 27, 13, 13, 3, 3, 5, 17, 23, 1, 16, 4, 6, 9, 7, {78,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Afrikaans/Latin/Namibia
+ { 5, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 382, 382, 453, 453, 480, 480, 5, 5, 0, 5, 22, 11, 36, 0, 0, 68, 73, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 71, 71, 27, 27, 13, 13, 3, 3, 4, 17, 23, 4, 14, 4, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Aghem/Latin/Cameroon
+ { 6, 66, 92, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 155, 23, 38, 493, 493, 541, 541, 568, 568, 8, 8, 0, 5, 22, 15, 50, 2, 0, 80, 84, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 48, 48, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 10, 4, 0, 4, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Akan/Latin/Ghana
+ { 8, 66, 40, 0, 0, 24, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 11, 60, 15, 0, 89, 95, 6, 6, 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 10, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Akoose/Latin/Cameroon
+ { 9, 66, 3, 0, 0, 29, 29, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 0, 180, 45, 38, 581, 581, 638, 638, 665, 665, 10, 10, 50, 5, 22, 18, 70, 4, 20, 102, 107, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 16, 7, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 4, 13, 5, 7, 5, 8, {65,76,76}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Albanian/Latin/Albania
+ { 9, 66, 126, 0, 0, 29, 29, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 0, 180, 10, 0, 581, 581, 638, 638, 665, 665, 10, 10, 50, 5, 22, 22, 83, 4, 20, 102, 115, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 1, 6, 5, 7, 5, 6, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Albanian/Latin/Kosovo
+ { 9, 66, 140, 0, 0, 29, 29, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 0, 180, 10, 0, 581, 581, 638, 638, 665, 665, 10, 10, 50, 5, 22, 23, 89, 4, 20, 102, 121, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 3, 16, 5, 7, 5, 18, {77,75,68}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Albanian/Latin/Macedonia
+ { 11, 33, 77, 38, 38, 44, 53, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 19, 20, 163, 186, 61, 76, 679, 679, 706, 706, 732, 732, 21, 20, 54, 57, 22, 26, 105, 2, 9, 139, 143, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 27, 27, 26, 26, 13, 13, 3, 4, 3, 23, 23, 2, 9, 4, 6, 4, 5, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Amharic/Ethiopic/Ethiopia
+ { 14, 4, 71, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 28, 114, 27, 0, 148, 155, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 9, 6, 0, 7, 3, {69,71,80}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Egypt
+ { 14, 4, 4, 61, 61, 61, 61, 6, 1, 0, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 33, 123, 33, 38, 148, 158, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 12, 5, 7, 7, 7, {68,90,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Algeria
+ { 14, 4, 19, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 38, 135, 27, 0, 148, 165, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 12, 6, 0, 7, 7, {66,72,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Bahrain
+ { 14, 4, 48, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 11, 147, 27, 0, 148, 172, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 4, 15, 6, 0, 7, 4, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Chad
+ { 14, 4, 55, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 10, 0, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 12, 162, 27, 0, 148, 176, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 13, 5, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 2, 14, 6, 0, 7, 9, {75,77,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Comoros
+ { 14, 4, 67, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 3, 176, 27, 0, 148, 185, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 3, 11, 6, 0, 7, 6, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Djibouti
+ { 14, 4, 74, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 6, 187, 27, 0, 148, 191, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 3, 12, 6, 0, 7, 7, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Eritrea
+ { 14, 4, 113, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 43, 199, 27, 0, 148, 198, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 6, 0, 7, 6, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Iraq
+ { 14, 4, 116, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 11, 1, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 48, 210, 27, 0, 148, 204, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 4, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 18, 6, 0, 7, 7, {73,76,83}, 2, 1, 7, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Israel
+ { 14, 4, 122, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 49, 228, 27, 0, 148, 211, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 6, 0, 7, 6, {74,79,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Jordan
+ { 14, 4, 127, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 54, 239, 27, 0, 148, 217, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 6, 0, 7, 6, {75,87,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Kuwait
+ { 14, 4, 132, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 59, 250, 27, 0, 148, 223, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 6, 0, 7, 5, {76,66,80}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Lebanon
+ { 14, 4, 135, 61, 61, 61, 61, 6, 1, 0, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 64, 261, 33, 38, 148, 228, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 5, 7, 7, 5, {76,89,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Libya
+ { 14, 4, 149, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 69, 271, 27, 0, 148, 233, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 4, 15, 6, 0, 7, 9, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Mauritania
+ { 14, 4, 159, 61, 61, 61, 61, 6, 1, 0, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 10, 0, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 73, 286, 33, 38, 148, 242, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 13, 5, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 5, 7, 7, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Morocco
+ { 14, 4, 176, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 78, 296, 27, 0, 148, 248, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 6, 0, 7, 5, {79,77,82}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Oman
+ { 14, 4, 180, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 48, 210, 27, 0, 148, 253, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 18, 6, 0, 7, 18, {73,76,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Palestinian Territories
+ { 14, 4, 190, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 83, 306, 27, 0, 148, 271, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 9, 6, 0, 7, 3, {81,65,82}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Qatar
+ { 14, 4, 205, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 88, 315, 27, 0, 148, 274, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 6, 0, 7, 24, {83,65,82}, 2, 1, 7, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Saudi Arabia
+ { 14, 4, 215, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 93, 325, 27, 0, 148, 298, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 10, 6, 0, 7, 7, {83,79,83}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Somalia
+ { 14, 4, 219, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 94, 335, 27, 0, 148, 305, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 17, 6, 0, 7, 12, {83,83,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/South Sudan
+ { 14, 4, 222, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 95, 352, 27, 0, 148, 317, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 4, 11, 6, 0, 7, 7, {83,68,71}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Sudan
+ { 14, 4, 227, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 99, 363, 27, 0, 148, 324, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 6, 0, 7, 5, {83,89,80}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Syria
+ { 14, 4, 238, 61, 61, 61, 61, 6, 1, 0, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 104, 373, 33, 38, 148, 329, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 5, 7, 7, 4, {84,78,68}, 3, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Tunisia
+ { 14, 4, 245, 61, 61, 61, 61, 6, 0, 1, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 109, 384, 33, 38, 148, 333, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 12, 5, 7, 7, 24, {65,69,68}, 2, 1, 6, 6, 7, 1, 3, 3 }, // Arabic/Arabic/United Arab Emirates
+ { 14, 4, 257, 61, 61, 61, 61, 6, 0, 1, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 73, 286, 33, 38, 148, 357, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 5, 7, 7, 15, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Western Sahara
+ { 14, 4, 258, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 0, 0, 27, 0, 372, 394, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 0, 0, 6, 0, 22, 6, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/world
+ { 14, 4, 259, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 114, 396, 27, 0, 148, 400, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 9, 6, 0, 7, 5, {89,69,82}, 0, 0, 7, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Yemen
+ { 15, 66, 220, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 15, 15, 223, 129, 11, 1, 809, 809, 860, 860, 887, 887, 0, 0, 0, 5, 22, 22, 405, 2, 9, 405, 413, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 12, 4, 51, 51, 27, 27, 16, 16, 2, 2, 4, 17, 23, 1, 4, 4, 6, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Aragonese/Latin/Spain
+ { 17, 5, 12, 0, 0, 75, 75, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 11, 12, 245, 49, 10, 0, 903, 903, 964, 964, 991, 991, 0, 0, 121, 127, 22, 119, 409, 4, 0, 420, 427, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 8, 13, 5, 61, 61, 27, 27, 13, 13, 2, 2, 6, 17, 23, 1, 13, 5, 0, 7, 8, {65,77,68}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Armenian/Armenian/Armenia
+ { 18, 9, 110, 0, 0, 82, 82, 6, 0, 1, 2, 39, 4, 5, 10, 14, 15, 16, 17, 265, 283, 83, 83, 1004, 1004, 1061, 1061, 1092, 1092, 25, 25, 144, 148, 22, 120, 422, 2, 9, 435, 442, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 57, 57, 31, 31, 13, 13, 9, 7, 4, 37, 23, 1, 12, 4, 6, 7, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Assamese/Bangla/India
+ { 19, 66, 220, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 223, 129, 10, 0, 1105, 1105, 1158, 1158, 1185, 1185, 34, 32, 0, 5, 22, 22, 405, 4, 0, 446, 455, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 13, 5, 53, 53, 27, 27, 13, 13, 12, 11, 5, 17, 23, 1, 4, 5, 0, 9, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Asturian/Latin/Spain
+ { 20, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 1198, 1198, 1257, 1257, 1284, 1284, 46, 43, 0, 5, 22, 121, 434, 4, 0, 461, 467, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 27, 27, 13, 13, 9, 8, 4, 17, 23, 3, 21, 5, 0, 6, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Asu/Latin/Tanzania
+ { 21, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 155, 10, 0, 1297, 1297, 1383, 1383, 83, 83, 0, 0, 0, 5, 22, 124, 455, 15, 0, 475, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 86, 86, 33, 33, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 5, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Atsam/Latin/Nigeria
+ { 25, 66, 17, 0, 0, 91, 91, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 291, 49, 10, 0, 1416, 1416, 1482, 1508, 96, 96, 0, 0, 185, 5, 22, 125, 459, 4, 0, 480, 490, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 66, 66, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 17, 5, 0, 10, 10, {65,90,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Azerbaijani/Latin/Azerbaijan
+ { 25, 4, 112, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 500, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 6, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Azerbaijani/Arabic/Iran
+ { 25, 4, 113, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 500, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 6, 0, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Azerbaijani/Arabic/Iraq
+ { 25, 4, 239, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 126, 0, 15, 0, 500, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 6, 0, {84,82,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Azerbaijani/Arabic/Turkey
+ { 25, 27, 17, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 19, 20, 291, 49, 10, 0, 1534, 1534, 1600, 1600, 96, 96, 55, 51, 0, 5, 22, 125, 476, 4, 0, 506, 516, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 66, 66, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 5, 5, 0, 10, 10, {65,90,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Azerbaijani/Cyrillic/Azerbaijan
+ { 26, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 16, 17, 113, 129, 10, 0, 1626, 1626, 1670, 1670, 1698, 1698, 57, 53, 0, 5, 22, 11, 481, 4, 0, 526, 531, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 44, 44, 28, 28, 13, 13, 6, 7, 4, 17, 23, 4, 4, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Bafia/Latin/Cameroon
+ { 28, 66, 145, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 10, 0, 1711, 1711, 1754, 1754, 1781, 1781, 0, 0, 0, 5, 22, 127, 485, 2, 9, 538, 547, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 43, 43, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 17, 4, 6, 9, 4, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Bambara/Latin/Mali
+ { 28, 90, 145, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 127, 0, 2, 9, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 0, 4, 6, 0, 0, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Bambara/Nko/Mali
+ { 30, 9, 20, 0, 0, 99, 99, 6, 0, 1, 2, 39, 4, 5, 10, 14, 15, 16, 17, 265, 129, 61, 76, 1794, 1794, 1851, 1851, 1887, 1887, 0, 0, 144, 5, 22, 132, 502, 0, 45, 551, 556, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 57, 57, 36, 36, 17, 17, 2, 2, 4, 17, 23, 1, 14, 4, 6, 5, 8, {66,68,84}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Bangla/Bangla/Bangladesh
+ { 30, 9, 110, 0, 0, 99, 99, 6, 0, 1, 2, 39, 4, 5, 10, 14, 15, 16, 17, 265, 129, 61, 76, 1794, 1794, 1851, 1851, 1887, 1887, 0, 0, 144, 5, 22, 120, 516, 2, 9, 551, 564, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 57, 57, 36, 36, 17, 17, 2, 2, 4, 17, 23, 1, 12, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Bangla/Bangla/India
+ { 31, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 113, 129, 10, 0, 1904, 1904, 1973, 1973, 2000, 2000, 63, 60, 0, 5, 22, 11, 528, 4, 0, 568, 573, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 69, 69, 27, 27, 13, 13, 10, 9, 4, 17, 23, 4, 15, 5, 0, 5, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Basaa/Latin/Cameroon
+ { 32, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 133, 0, 15, 0, 581, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 0, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bashkir/Cyrillic/Russia
+ { 33, 66, 220, 0, 0, 108, 108, 6, 1, 0, 2, 3, 48, 5, 10, 11, 12, 14, 15, 308, 344, 98, 0, 2013, 2013, 2080, 2080, 2107, 2107, 0, 0, 189, 5, 22, 22, 543, 4, 20, 593, 600, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 6, 15, 5, 67, 67, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 5, 5, 7, 7, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Basque/Latin/Spain
+ { 35, 27, 22, 0, 0, 117, 117, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 50, 113, 0, 2120, 2120, 2175, 2175, 2195, 2195, 0, 0, 196, 201, 22, 1, 548, 4, 0, 608, 618, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 7, 14, 5, 55, 55, 20, 20, 13, 13, 2, 2, 5, 17, 23, 2, 16, 5, 0, 10, 8, {66,89,78}, 2, 0, 1, 6, 7, 2, 3, 3 }, // Belarusian/Cyrillic/Belarus
+ { 36, 66, 260, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 2208, 2208, 2208, 2208, 83, 83, 73, 69, 0, 5, 22, 134, 0, 2, 9, 626, 635, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 79, 79, 79, 79, 13, 13, 8, 7, 4, 17, 23, 1, 0, 4, 6, 9, 6, {90,77,87}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bemba/Latin/Zambia
+ { 37, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 2287, 2287, 2368, 2368, 2395, 2395, 81, 76, 0, 5, 22, 121, 564, 0, 0, 641, 647, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 81, 81, 27, 27, 13, 13, 7, 7, 4, 17, 23, 3, 22, 4, 0, 6, 10, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Bena/Latin/Tanzania
+ { 38, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 163, 103, 61, 76, 2408, 2408, 2408, 2408, 83, 83, 88, 83, 0, 5, 22, 120, 0, 2, 0, 657, 664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 55, 55, 55, 55, 13, 13, 3, 4, 4, 17, 23, 1, 0, 4, 0, 7, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Bhojpuri/Devanagari/India
+ { 40, 33, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 372, 78, 61, 76, 2463, 2463, 2505, 2505, 2530, 2530, 0, 0, 0, 5, 22, 6, 0, 2, 0, 668, 671, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 15, 7, 42, 42, 25, 25, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 3, 4, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Blin/Ethiopic/Eritrea
+ { 41, 29, 110, 0, 0, 124, 134, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 291, 394, 127, 142, 2543, 2597, 2650, 2650, 2682, 2682, 91, 87, 0, 5, 22, 120, 586, 2, 9, 675, 664, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 10, 54, 53, 32, 32, 17, 17, 3, 6, 4, 17, 23, 1, 11, 4, 6, 3, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Bodo/Devanagari/India
+ { 42, 66, 29, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 13, 15, 16, 17, 404, 423, 10, 0, 2699, 2699, 2756, 2756, 2783, 2796, 94, 93, 218, 5, 22, 135, 597, 4, 0, 678, 686, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 11, 13, 5, 57, 57, 27, 27, 13, 13, 10, 7, 7, 17, 23, 2, 40, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bosnian/Latin/Bosnia and Herzegovina
+ { 42, 27, 29, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 434, 454, 10, 0, 2809, 2809, 2864, 2864, 2891, 2891, 104, 100, 0, 5, 22, 137, 637, 4, 0, 705, 713, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 13, 5, 55, 55, 27, 27, 13, 13, 11, 13, 4, 17, 23, 2, 19, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bosnian/Cyrillic/Bosnia and Herzegovina
+ { 43, 66, 84, 0, 0, 157, 157, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 186, 10, 0, 2904, 2904, 2946, 2946, 2978, 2978, 115, 113, 225, 232, 249, 22, 405, 4, 0, 732, 741, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 42, 42, 32, 32, 17, 17, 4, 4, 7, 17, 23, 1, 4, 5, 0, 9, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Breton/Latin/France
+ { 45, 27, 36, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 13, 14, 13, 14, 350, 461, 152, 1, 2995, 2995, 3049, 3049, 3069, 3069, 119, 117, 272, 5, 22, 139, 656, 4, 20, 746, 755, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 12, 17, 4, 54, 54, 20, 20, 13, 13, 6, 6, 7, 17, 23, 3, 13, 5, 7, 9, 8, {66,71,78}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Bulgarian/Cyrillic/Bulgaria
+ { 46, 86, 161, 165, 165, 172, 172, 182, 0, 1, 2, 50, 4, 5, 10, 14, 15, 16, 17, 473, 129, 169, 1, 3082, 3082, 3082, 3082, 3135, 3135, 125, 123, 279, 5, 22, 134, 669, 15, 0, 763, 763, 7, 7, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 4, 53, 53, 53, 53, 13, 13, 5, 3, 5, 17, 23, 1, 11, 5, 0, 6, 6, {77,77,75}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Burmese/Myanmar/Myanmar
+ { 47, 137, 107, 183, 183, 188, 188, 6, 0, 1, 2, 3, 4, 5, 10, 51, 52, 53, 54, 491, 505, 182, 43, 3148, 3148, 3148, 3148, 3175, 3175, 130, 126, 0, 5, 22, 142, 680, 2, 9, 769, 771, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 16, 6, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 2, 4, 6, 2, 14, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Cantonese/Traditional Han/Hong Kong
+ { 47, 118, 50, 183, 183, 188, 188, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 513, 505, 169, 0, 3148, 3148, 3188, 3188, 3175, 3175, 130, 126, 0, 5, 22, 145, 682, 2, 9, 785, 787, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 13, 5, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 3, 4, 6, 2, 7, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Cantonese/Simplified Han/China
+ { 48, 66, 220, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 526, 129, 99, 1, 3208, 3208, 3267, 3267, 3267, 3267, 132, 128, 0, 5, 22, 22, 405, 4, 20, 794, 413, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 14, 4, 59, 59, 27, 27, 27, 27, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/Spain
+ { 48, 66, 6, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 526, 129, 99, 1, 3208, 3208, 3267, 3267, 3267, 3267, 132, 128, 0, 5, 22, 22, 405, 4, 20, 794, 800, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 14, 4, 59, 59, 27, 27, 27, 27, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/Andorra
+ { 48, 66, 84, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 526, 129, 99, 1, 3208, 3208, 3267, 3267, 3267, 3267, 132, 128, 0, 5, 22, 22, 405, 4, 20, 794, 807, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 14, 4, 59, 59, 27, 27, 27, 27, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/France
+ { 48, 66, 117, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 526, 129, 99, 1, 3208, 3208, 3267, 3267, 3267, 3267, 132, 128, 0, 5, 22, 22, 405, 4, 20, 794, 813, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 14, 4, 59, 59, 27, 27, 27, 27, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/Italy
+ { 49, 66, 185, 0, 0, 193, 202, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 3294, 3294, 3349, 3349, 3376, 3376, 0, 0, 284, 5, 22, 146, 685, 2, 9, 819, 826, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 55, 55, 27, 27, 13, 13, 2, 2, 8, 17, 23, 1, 15, 4, 6, 7, 9, {80,72,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Cebuano/Latin/Philippines
+ { 50, 66, 159, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 3389, 3389, 3436, 3436, 3463, 3463, 137, 133, 0, 5, 22, 0, 700, 4, 0, 835, 852, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 47, 47, 27, 27, 13, 13, 9, 10, 4, 17, 23, 0, 15, 5, 0, 17, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Central Atlas Tamazight/Latin/Morocco
+ { 51, 4, 113, 0, 0, 0, 0, 67, 21, 22, 23, 25, 55, 57, 59, 14, 15, 16, 17, 163, 103, 61, 76, 3476, 3476, 3476, 3476, 3533, 3533, 146, 143, 0, 5, 22, 43, 715, 4, 0, 858, 872, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 57, 57, 57, 57, 13, 13, 3, 3, 4, 17, 23, 5, 13, 5, 0, 14, 5, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Central Kurdish/Arabic/Iraq
+ { 51, 4, 112, 0, 0, 0, 0, 67, 21, 22, 23, 25, 55, 57, 59, 14, 15, 16, 17, 163, 103, 10, 0, 3476, 3476, 3476, 3476, 3533, 3533, 146, 143, 0, 5, 22, 0, 728, 4, 0, 858, 877, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 13, 5, 57, 57, 57, 57, 13, 13, 3, 3, 4, 17, 23, 0, 12, 5, 0, 14, 5, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Central Kurdish/Arabic/Iran
+ { 52, 21, 20, 0, 0, 210, 210, 6, 0, 1, 2, 61, 4, 5, 10, 14, 15, 16, 17, 265, 129, 61, 76, 3546, 3546, 3672, 3672, 3756, 3756, 0, 0, 292, 5, 22, 132, 740, 0, 45, 882, 894, 6, 6, 12, 12, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7,126,126, 84, 84, 38, 38, 2, 2, 8, 17, 23, 1, 21, 4, 6, 12, 14, {66,68,84}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Chakma/Chakma/Bangladesh
+ { 52, 21, 110, 0, 0, 210, 210, 6, 0, 1, 2, 61, 4, 5, 10, 14, 15, 16, 17, 265, 129, 61, 76, 3546, 3546, 3672, 3672, 3756, 3756, 0, 0, 292, 5, 22, 120, 761, 0, 45, 882, 908, 6, 6, 12, 12, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7,126,126, 84, 84, 38, 38, 2, 2, 8, 17, 23, 1, 27, 4, 6, 12, 10, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Chakma/Chakma/India
+ { 54, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 3794, 3794, 3838, 3838, 3862, 3838, 0, 0, 0, 5, 22, 133, 788, 4, 0, 918, 925, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 44, 44, 24, 24, 16, 24, 2, 2, 4, 17, 23, 1, 11, 5, 0, 7, 5, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Chechen/Cyrillic/Russia
+ { 55, 23, 248, 0, 0, 222, 231, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 61, 76, 3878, 3878, 3926, 3926, 3953, 3953, 149, 146, 300, 5, 22, 10, 799, 2, 9, 930, 933, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 48, 48, 27, 27, 13, 13, 3, 6, 6, 17, 23, 1, 6, 4, 6, 3, 15, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Cherokee/Cherokee/United States
+ { 56, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 3966, 3966, 3966, 3966, 83, 83, 0, 0, 0, 5, 22, 10, 0, 15, 0, 948, 964, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 87, 87, 87, 87, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 16, 13, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chickasaw/Latin/United States
+ { 57, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 4053, 4053, 4126, 4126, 4153, 4153, 0, 0, 0, 5, 22, 147, 805, 2, 0, 977, 983, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 73, 73, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 6, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Chiga/Latin/Uganda
+ { 58, 118, 50, 183, 183, 239, 239, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 513, 505, 169, 0, 3148, 3148, 3188, 3188, 3175, 3175, 130, 126, 306, 5, 22, 150, 682, 2, 9, 989, 993, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 13, 5, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 1, 3, 4, 6, 4, 2, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/China
+ { 58, 118, 107, 183, 183, 239, 239, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 513, 129, 198, 43, 3148, 3148, 3188, 3188, 3175, 3175, 130, 126, 306, 5, 22, 142, 824, 2, 9, 989, 995, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 14, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 3, 2, 4, 6, 4, 9, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/Hong Kong
+ { 58, 118, 139, 183, 183, 239, 239, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 513, 129, 198, 43, 3148, 3148, 3188, 3188, 3175, 3175, 130, 126, 306, 5, 22, 151, 826, 2, 9, 989, 1004, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 14, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 4, 3, 4, 6, 4, 9, {77,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/Macao
+ { 58, 118, 210, 183, 183, 239, 239, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 513, 78, 198, 43, 3148, 3148, 3188, 3188, 3175, 3175, 130, 126, 306, 5, 22, 10, 829, 2, 9, 989, 1013, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 14, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 1, 4, 4, 6, 4, 3, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/Singapore
+ { 58, 137, 107, 183, 183, 244, 244, 6, 0, 1, 2, 3, 4, 5, 10, 51, 52, 53, 54, 513, 129, 182, 43, 3148, 3148, 4166, 4166, 3175, 3175, 130, 126, 308, 5, 22, 142, 824, 2, 9, 1016, 1020, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 16, 6, 27, 27, 20, 20, 13, 13, 2, 2, 3, 17, 23, 3, 2, 4, 6, 4, 9, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Traditional Han/Hong Kong
+ { 58, 137, 139, 183, 183, 244, 244, 6, 0, 1, 2, 3, 4, 5, 10, 51, 52, 53, 54, 513, 129, 182, 43, 3148, 3148, 4166, 4166, 3175, 3175, 130, 126, 308, 5, 22, 151, 833, 2, 9, 1016, 1029, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 16, 6, 27, 27, 20, 20, 13, 13, 2, 2, 3, 17, 23, 4, 3, 4, 6, 4, 9, {77,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Traditional Han/Macao
+ { 58, 137, 228, 183, 183, 239, 239, 6, 0, 1, 2, 3, 4, 5, 10, 51, 52, 53, 54, 491, 505, 182, 43, 3148, 3148, 4166, 4166, 3175, 3175, 130, 126, 0, 5, 22, 10, 836, 2, 9, 1016, 1038, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 16, 6, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 3, 4, 6, 4, 2, {84,87,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Chinese/Traditional Han/Taiwan
+ { 59, 27, 193, 0, 0, 249, 249, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 573, 596, 10, 0, 4186, 4186, 4253, 4253, 4289, 4289, 0, 0, 0, 5, 22, 133, 839, 4, 0, 1040, 1059, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 67, 67, 36, 36, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 19, 7, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Church/Cyrillic/Russia
+ { 60, 27, 193, 0, 0, 257, 257, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 606, 49, 10, 0, 4302, 4302, 4367, 4367, 4399, 4399, 0, 0, 0, 5, 22, 133, 857, 4, 0, 1066, 1071, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 65, 65, 32, 32, 13, 13, 2, 2, 4, 17, 23, 1, 12, 5, 0, 5, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Chuvash/Cyrillic/Russia
+ { 61, 66, 91, 0, 0, 267, 267, 6, 1, 9, 2, 3, 48, 5, 63, 13, 14, 18, 16, 628, 423, 10, 0, 4412, 4412, 4483, 4483, 4510, 4510, 152, 152, 0, 5, 22, 22, 83, 4, 0, 1077, 1083, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 23, 10, 13, 5, 71, 71, 27, 27, 13, 13, 16, 16, 4, 17, 23, 1, 4, 5, 0, 6, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Colognian/Latin/Germany
+ { 63, 66, 246, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 186, 10, 0, 4523, 4523, 4583, 4583, 83, 83, 168, 168, 0, 5, 22, 94, 0, 2, 0, 1094, 1102, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 60, 60, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 0, 4, 0, 8, 14, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Cornish/Latin/United Kingdom
+ { 64, 66, 84, 0, 0, 275, 275, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 11, 12, 651, 186, 10, 0, 4610, 4610, 4660, 4660, 4694, 4694, 0, 0, 0, 5, 22, 155, 405, 4, 51, 1116, 1121, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 10, 13, 5, 50, 50, 34, 34, 13, 13, 2, 2, 4, 17, 23, 3, 4, 5, 7, 5, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Corsican/Latin/France
+ { 66, 66, 60, 0, 0, 143, 143, 6, 1, 0, 2, 3, 48, 5, 10, 13, 14, 18, 16, 404, 676, 98, 0, 2699, 2699, 2756, 2756, 2783, 2796, 0, 0, 218, 5, 22, 22, 405, 4, 0, 1128, 1136, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 13, 15, 5, 57, 57, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 4, 5, 0, 8, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Croatian/Latin/Croatia
+ { 66, 66, 29, 0, 0, 143, 143, 6, 1, 0, 2, 3, 48, 5, 10, 13, 14, 18, 16, 404, 689, 98, 0, 2699, 2699, 2756, 2756, 2796, 2796, 0, 0, 218, 5, 22, 135, 618, 4, 0, 1128, 686, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 9, 15, 5, 57, 57, 27, 27, 13, 13, 2, 2, 7, 17, 23, 2, 19, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Croatian/Latin/Bosnia and Herzegovina
+ { 67, 66, 64, 0, 0, 282, 282, 6, 1, 9, 2, 3, 4, 5, 10, 13, 14, 18, 16, 698, 49, 114, 1, 4707, 4707, 4755, 4755, 4775, 4775, 172, 172, 311, 5, 22, 158, 869, 4, 0, 1144, 1151, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 4, 48, 48, 20, 20, 13, 13, 4, 4, 5, 17, 23, 2, 12, 5, 0, 7, 5, {67,90,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Czech/Latin/Czechia
+ { 68, 66, 65, 0, 0, 289, 289, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 715, 49, 212, 212, 4788, 4788, 4838, 4838, 4874, 4874, 0, 0, 0, 5, 22, 160, 881, 4, 0, 1156, 1161, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 50, 50, 36, 36, 13, 13, 2, 2, 5, 17, 23, 3, 11, 5, 0, 5, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Danish/Latin/Denmark
+ { 68, 66, 95, 0, 0, 289, 289, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 715, 49, 212, 212, 4788, 4788, 4838, 4838, 4874, 4874, 0, 0, 0, 5, 22, 160, 881, 4, 0, 1156, 1168, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 50, 50, 36, 36, 13, 13, 2, 2, 5, 17, 23, 3, 11, 5, 0, 5, 8, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Danish/Latin/Greenland
+ { 69, 132, 144, 0, 0, 0, 0, 2, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 283, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 163, 0, 15, 0, 1176, 1186, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 10, 13, {77,86,82}, 2, 1, 5, 6, 7, 1, 3, 3 }, // Divehi/Thaana/Maldives
+ { 70, 29, 110, 0, 0, 297, 306, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 738, 129, 61, 76, 4887, 4887, 4937, 4937, 4966, 4988, 176, 176, 0, 5, 22, 120, 892, 2, 0, 1199, 664, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 50, 50, 29, 29, 22, 24, 4, 9, 4, 17, 23, 1, 10, 4, 0, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Dogri/Devanagari/India
+ { 71, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 16, 17, 113, 129, 10, 0, 5012, 5012, 5056, 5056, 5083, 5083, 180, 185, 0, 5, 22, 11, 0, 4, 0, 1204, 1209, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 44, 44, 27, 27, 13, 13, 5, 6, 4, 17, 23, 4, 0, 5, 0, 5, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Duala/Latin/Cameroon
+ { 72, 66, 165, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 22, 83, 15, 58, 1217, 1217, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 7, 10, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Netherlands
+ { 72, 66, 13, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 165, 902, 15, 58, 1217, 1227, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 16, 5, 7, 10, 5, {65,87,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Aruba
+ { 72, 66, 23, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 187, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 22, 83, 15, 58, 1232, 1238, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Belgium
+ { 72, 66, 44, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 10, 918, 15, 58, 1217, 1244, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 7, 10, 19, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Caribbean Netherlands
+ { 72, 66, 62, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 169, 936, 15, 58, 1217, 1263, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 30, 5, 7, 10, 7, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Curacao
+ { 72, 66, 211, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 169, 936, 15, 58, 1217, 1270, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 30, 5, 7, 10, 12, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Sint Maarten
+ { 72, 66, 223, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 10, 966, 15, 58, 1217, 1282, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 17, 5, 7, 10, 8, {83,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Suriname
+ { 73, 134, 27, 314, 314, 314, 314, 6, 0, 1, 2, 67, 4, 5, 10, 14, 15, 16, 17, 756, 103, 225, 255, 5187, 5187, 5265, 5265, 5298, 5298, 185, 191, 0, 5, 22, 173, 983, 2, 0, 1290, 1296, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 10, 30, 22, 78, 78, 33, 33, 26, 26, 5, 6, 4, 17, 23, 3, 8, 4, 0, 6, 5, {66,84,78}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Dzongkha/Tibetan/Bhutan
+ { 74, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 5324, 5324, 5387, 5387, 5414, 5414, 190, 197, 0, 5, 22, 176, 991, 2, 9, 1301, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 63, 63, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Embu/Latin/Kenya
+ { 75, 66, 248, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1312, 964, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 16, 13, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/United States
+ { 75, 28, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 5427, 5427, 5511, 5511, 5559, 5559, 192, 199, 0, 5, 22, 10, 0, 15, 0, 1328, 1338, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 84, 84, 48, 48, 20, 20, 4, 4, 4, 17, 23, 1, 0, 5, 0, 10, 25, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Deseret/United States
+ { 75, 66, 5, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 1363, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 14, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/American Samoa
+ { 75, 66, 8, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 1377, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 8, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Anguilla
+ { 75, 66, 10, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 1385, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 17, {88,67,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Antigua and Barbuda
+ { 75, 66, 15, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 6, 14, 15, 16, 17, 113, 129, 23, 38, 0, 0, 56, 56, 83, 5579, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1402, 1402, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 56, 56, 27, 27, 13, 24, 2, 2, 5, 17, 23, 1, 17, 4, 6, 18, 9, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Australia
+ { 75, 66, 16, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 15, 0, 1321, 1420, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Austria
+ { 75, 66, 18, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1055, 2, 9, 1321, 1427, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {66,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Bahamas
+ { 75, 66, 21, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1070, 2, 9, 1321, 1434, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 8, {66,66,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Barbados
+ { 75, 66, 23, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 78, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 4, 0, 1321, 1442, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Belgium
+ { 75, 66, 24, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 78, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1086, 2, 9, 1321, 1449, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 13, 4, 6, 7, 6, {66,90,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Belize
+ { 75, 66, 26, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1099, 2, 9, 1321, 1455, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 7, {66,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Bermuda
+ { 75, 66, 30, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 78, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 153, 1115, 2, 9, 1321, 1462, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 8, {66,87,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Botswana
+ { 75, 66, 33, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 1470, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 30, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/British Indian Ocean Territory
+ { 75, 66, 34, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 1500, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 22, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/British Virgin Islands
+ { 75, 66, 38, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 10, 0, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 182, 1129, 2, 9, 1321, 1522, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 15, 4, 6, 7, 7, {66,73,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Burundi
+ { 75, 66, 40, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 11, 1144, 2, 9, 1321, 1529, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 25, 4, 6, 7, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cameroon
+ { 75, 66, 41, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 103, 23, 38, 0, 0, 56, 56, 83, 83, 168, 168, 0, 5, 22, 10, 1169, 2, 9, 1537, 1553, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 15, 7, 56, 56, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 15, 4, 6, 16, 6, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // English/Latin/Canada
+ { 75, 66, 45, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1184, 2, 9, 1321, 1559, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 14, {75,89,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cayman Islands
+ { 75, 66, 51, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 1573, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 16, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Christmas Island
+ { 75, 66, 53, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 1589, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 23, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cocos Islands
+ { 75, 66, 58, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1205, 2, 9, 1321, 1612, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 12, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cook Islands
+ { 75, 66, 63, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 2, 9, 1321, 1624, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 4, 6, 7, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cyprus
+ { 75, 66, 65, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 212, 212, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 160, 1223, 4, 0, 1321, 1630, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 12, 5, 0, 7, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Denmark
+ { 75, 66, 66, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 1637, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 12, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Diego Garcia
+ { 75, 66, 68, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 1649, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 8, {88,67,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Dominica
+ { 75, 66, 74, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 6, 1235, 2, 9, 1321, 1657, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 14, 4, 6, 7, 7, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Eritrea
+ { 75, 66, 76, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 155, 1249, 2, 9, 1321, 1664, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 8, {83,90,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Eswatini
+ { 75, 66, 78, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 0, 0, 4, 0, 1321, 1672, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 5, 0, 7, 6, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Europe
+ { 75, 66, 80, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1264, 2, 9, 1321, 1678, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 22, 4, 6, 7, 16, {70,75,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Falkland Islands
+ { 75, 66, 82, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1286, 2, 9, 1321, 1694, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 13, 4, 6, 7, 4, {70,74,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Fiji
+ { 75, 66, 83, 0, 0, 333, 333, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 213, 213, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 4, 0, 1321, 1698, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 4, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Finland
+ { 75, 66, 89, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 185, 1299, 2, 9, 1321, 1705, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 6, {71,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Gambia
+ { 75, 66, 91, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 4, 0, 1321, 1711, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Germany
+ { 75, 66, 92, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 15, 1313, 2, 9, 1321, 1718, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 13, 4, 6, 7, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Ghana
+ { 75, 66, 93, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1326, 2, 9, 1321, 1723, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 9, {71,73,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Gibraltar
+ { 75, 66, 96, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 1732, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 7, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Grenada
+ { 75, 66, 98, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 1739, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 4, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Guam
+ { 75, 66, 100, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1341, 2, 9, 1321, 1743, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 8, 4, 6, 7, 8, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Guernsey
+ { 75, 66, 103, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1349, 2, 9, 1321, 1751, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 6, {71,89,68}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Guyana
+ { 75, 66, 107, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 142, 1365, 2, 9, 1321, 1757, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 16, 4, 6, 7, 19, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Hong Kong
+ { 75, 66, 110, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 804, 78, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 120, 1381, 2, 9, 1321, 1478, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 12, 4, 6, 7, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // English/Latin/India
+ { 75, 66, 111, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 212, 212, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 186, 1393, 2, 9, 1321, 1776, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 17, 4, 6, 7, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // English/Latin/Indonesia
+ { 75, 66, 114, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 186, 10, 0, 0, 0, 56, 56, 83, 83, 168, 168, 0, 5, 22, 22, 83, 2, 9, 1321, 1785, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 56, 56, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 4, 4, 6, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Ireland
+ { 75, 66, 115, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1341, 2, 9, 1321, 1792, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 8, 4, 6, 7, 11, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Isle of Man
+ { 75, 66, 116, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 11, 1, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 48, 1410, 2, 9, 1321, 1803, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 4, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 6, {73,76,83}, 2, 1, 7, 5, 6, 1, 3, 3 }, // English/Latin/Israel
+ { 75, 66, 119, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1428, 2, 9, 1321, 1809, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {74,77,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Jamaica
+ { 75, 66, 121, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1341, 2, 9, 1321, 1816, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 8, 4, 6, 7, 6, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Jersey
+ { 75, 66, 124, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 176, 1443, 2, 9, 1321, 1307, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 15, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Kenya
+ { 75, 66, 125, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 1822, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 8, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Kiribati
+ { 75, 66, 133, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 9, 1458, 2, 9, 1321, 1830, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 7, {90,65,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Lesotho
+ { 75, 66, 134, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1476, 2, 9, 1321, 1837, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Liberia
+ { 75, 66, 139, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 151, 1491, 2, 9, 1321, 1844, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 15, 4, 6, 7, 15, {77,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Macao
+ { 75, 66, 141, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 188, 1506, 2, 9, 1321, 1859, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 10, {77,71,65}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Madagascar
+ { 75, 66, 142, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 190, 1521, 2, 9, 1321, 1869, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 6, {77,87,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Malawi
+ { 75, 66, 143, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 192, 1536, 2, 9, 1321, 1875, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 17, 4, 6, 7, 8, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Malaysia
+ { 75, 66, 144, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 283, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 194, 1553, 15, 0, 1321, 1883, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 17, 5, 0, 7, 8, {77,86,82}, 2, 1, 5, 6, 7, 1, 3, 3 }, // English/Latin/Maldives
+ { 75, 66, 146, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 2, 9, 1321, 1891, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 4, 6, 7, 5, {69,85,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Malta
+ { 75, 66, 147, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 1896, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 16, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Marshall Islands
+ { 75, 66, 150, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 196, 1570, 2, 9, 1321, 1912, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 9, {77,85,82}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Mauritius
+ { 75, 66, 153, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 1921, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 10, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Micronesia
+ { 75, 66, 158, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 1931, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 10, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Montserrat
+ { 75, 66, 162, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1585, 2, 9, 1321, 1941, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {78,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Namibia
+ { 75, 66, 163, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 1948, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 5, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Nauru
+ { 75, 66, 165, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 15, 58, 1321, 1953, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 7, 7, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Netherlands
+ { 75, 66, 167, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1205, 2, 9, 1321, 1964, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 11, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/New Zealand
+ { 75, 66, 169, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 124, 1600, 2, 9, 1321, 1975, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 7, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Nigeria
+ { 75, 66, 171, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1205, 2, 9, 1321, 1982, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 4, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Niue
+ { 75, 66, 172, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 1986, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 14, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Norfolk Island
+ { 75, 66, 173, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 2000, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 24, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Northern Mariana Islands
+ { 75, 66, 178, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 196, 1614, 2, 9, 1321, 2024, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 8, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // English/Latin/Pakistan
+ { 75, 66, 179, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 2032, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 5, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Palau
+ { 75, 66, 182, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 134, 1629, 2, 9, 1321, 2037, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 22, 4, 6, 7, 16, {80,71,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Papua New Guinea
+ { 75, 66, 185, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 146, 685, 2, 9, 1321, 2053, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 11, {80,72,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Philippines
+ { 75, 66, 186, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1205, 2, 9, 1321, 2064, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 16, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Pitcairn
+ { 75, 66, 189, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 2080, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 11, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Puerto Rico
+ { 75, 66, 194, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 198, 1651, 2, 9, 1321, 2091, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 13, 4, 6, 7, 6, {82,87,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Rwanda
+ { 75, 66, 196, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1664, 2, 9, 1321, 2097, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 9, {83,72,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Helena
+ { 75, 66, 197, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 2106, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 16, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Kitts and Nevis
+ { 75, 66, 198, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 2122, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 8, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Lucia
+ { 75, 66, 201, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 2130, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 27, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Vincent and Grenadines
+ { 75, 66, 202, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 200, 1679, 2, 9, 1321, 1372, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 11, 4, 6, 7, 5, {87,83,84}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Samoa
+ { 75, 66, 208, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 203, 1690, 2, 9, 1321, 2157, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 17, 4, 6, 7, 10, {83,67,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Seychelles
+ { 75, 66, 209, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 18, 1707, 2, 9, 1321, 2167, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 20, 4, 6, 7, 12, {83,76,69}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Sierra Leone
+ { 75, 66, 210, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1727, 2, 9, 1321, 2179, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 9, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Singapore
+ { 75, 66, 211, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 169, 1743, 2, 9, 1321, 2188, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 29, 4, 6, 7, 12, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Sint Maarten
+ { 75, 66, 213, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 6, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 4, 20, 1321, 2200, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 7, 7, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Slovenia
+ { 75, 66, 214, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1772, 2, 9, 1321, 2208, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 22, 4, 6, 7, 15, {83,66,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Solomon Islands
+ { 75, 66, 216, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 821, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 9, 1458, 2, 9, 1321, 2223, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 12, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/South Africa
+ { 75, 66, 219, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1794, 2, 9, 1321, 2235, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 20, 4, 6, 7, 11, {83,83,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/South Sudan
+ { 75, 66, 222, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 0, 1814, 2, 9, 1321, 2246, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 14, 4, 6, 7, 5, {83,68,71}, 2, 1, 6, 5, 6, 1, 3, 3 }, // English/Latin/Sudan
+ { 75, 66, 225, 0, 0, 333, 333, 6, 1, 9, 2, 3, 4, 5, 63, 14, 15, 16, 17, 0, 103, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 160, 1828, 4, 0, 1321, 2251, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 13, 5, 0, 7, 6, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Sweden
+ { 75, 66, 226, 0, 0, 333, 333, 6, 0, 17, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 49, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 0, 1841, 15, 65, 1321, 2257, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 11, 5, 5, 7, 11, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Switzerland
+ { 75, 66, 230, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 121, 1852, 2, 9, 1321, 2268, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 18, 4, 6, 7, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tanzania
+ { 75, 66, 234, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1205, 2, 9, 1321, 2276, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 7, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tokelau
+ { 75, 66, 235, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 205, 1870, 2, 9, 1321, 2283, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 14, 4, 6, 7, 5, {84,79,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tonga
+ { 75, 66, 236, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1884, 2, 9, 1321, 2288, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 24, 4, 6, 7, 17, {84,84,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Trinidad and Tobago
+ { 75, 66, 241, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 2305, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 22, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Turks and Caicos Islands
+ { 75, 66, 242, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 2327, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 6, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tuvalu
+ { 75, 66, 243, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 147, 1908, 2, 9, 1321, 983, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 16, 4, 6, 7, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // English/Latin/Uganda
+ { 75, 66, 245, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 1924, 2, 9, 1321, 2333, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 27, 4, 6, 7, 20, {65,69,68}, 2, 1, 6, 6, 7, 1, 3, 3 }, // English/Latin/United Arab Emirates
+ { 75, 66, 246, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1951, 2, 9, 2353, 2368, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 13, 4, 6, 15, 14, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/United Kingdom
+ { 75, 66, 247, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 2382, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 21, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/United States Outlying Islands
+ { 75, 66, 249, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 2403, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 19, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/United States Virgin Islands
+ { 75, 66, 252, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 207, 1964, 2, 9, 1321, 2422, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 12, 4, 6, 7, 7, {86,85,86}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Vanuatu
+ { 75, 66, 258, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 0, 0, 2, 9, 1321, 2429, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 4, 6, 7, 5, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/world
+ { 75, 66, 260, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 134, 1976, 2, 9, 1321, 635, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 6, {90,77,87}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Zambia
+ { 75, 66, 261, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 129, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 2434, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 8, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Zimbabwe
+ { 75, 115, 246, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 5603, 5603, 5690, 5690, 5731, 5731, 196, 205, 0, 5, 22, 94, 0, 15, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 87, 87, 41, 41, 20, 20, 4, 4, 4, 17, 23, 1, 0, 5, 0, 0, 0, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Shavian/United Kingdom
+ { 76, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 5751, 5811, 5892, 5892, 83, 83, 0, 0, 0, 5, 22, 133, 0, 15, 0, 2442, 2453, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 60, 81, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 11, 13, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Erzya/Cyrillic/Russia
+ { 77, 66, 258, 0, 0, 342, 342, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 831, 105, 10, 0, 5919, 5919, 5969, 5969, 5989, 5989, 200, 209, 316, 5, 22, 0, 0, 4, 0, 2466, 2475, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 8, 13, 5, 50, 50, 20, 20, 13, 13, 3, 3, 6, 17, 23, 0, 0, 5, 0, 9, 5, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Esperanto/Latin/world
+ { 78, 66, 75, 0, 0, 351, 351, 6, 1, 9, 2, 3, 48, 5, 63, 13, 14, 18, 16, 404, 49, 10, 0, 6002, 6002, 6064, 6064, 6064, 6064, 0, 0, 322, 5, 22, 22, 405, 4, 20, 2480, 2485, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 18, 8, 13, 5, 62, 62, 13, 13, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 5, 5, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Estonian/Latin/Estonia
+ { 79, 66, 92, 0, 0, 359, 370, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 862, 567, 277, 277, 6077, 6077, 6120, 6120, 6147, 6147, 203, 212, 0, 5, 22, 15, 1990, 2, 9, 2490, 2496, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 20, 12, 43, 43, 27, 27, 13, 13, 3, 5, 4, 17, 23, 3, 10, 4, 6, 6, 12, {71,72,83}, 2, 1, 1, 6, 7, 3, 3, 3 }, // Ewe/Latin/Ghana
+ { 79, 66, 233, 0, 0, 359, 370, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 862, 567, 10, 0, 6077, 6077, 6120, 6120, 6147, 6147, 203, 212, 0, 5, 22, 127, 2000, 2, 9, 2490, 2508, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 13, 5, 43, 43, 27, 27, 13, 13, 3, 5, 4, 17, 23, 5, 33, 4, 6, 6, 11, {88,79,70}, 0, 0, 1, 6, 7, 3, 3, 3 }, // Ewe/Latin/Togo
+ { 80, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 10, 0, 6160, 6160, 6244, 6244, 6273, 6273, 206, 217, 0, 5, 22, 11, 2033, 4, 0, 2519, 2525, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 84, 84, 29, 29, 13, 13, 7, 9, 4, 17, 23, 4, 16, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Ewondo/Latin/Cameroon
+ { 81, 66, 81, 0, 0, 380, 289, 6, 1, 0, 2, 3, 48, 5, 10, 14, 15, 16, 17, 404, 49, 10, 0, 6286, 6286, 6359, 6386, 6420, 6420, 0, 0, 328, 5, 22, 160, 2049, 4, 20, 2532, 2540, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 73, 73, 27, 34, 13, 13, 2, 2, 3, 17, 23, 2, 11, 5, 7, 8, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Faroese/Latin/Faroe Islands
+ { 81, 66, 65, 0, 0, 380, 289, 6, 1, 0, 2, 3, 48, 5, 10, 14, 15, 16, 17, 404, 49, 10, 0, 6286, 6286, 6359, 6386, 6420, 6420, 0, 0, 328, 5, 22, 160, 2049, 4, 20, 2532, 1161, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 73, 73, 27, 34, 13, 13, 2, 2, 3, 17, 23, 3, 11, 5, 7, 8, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Faroese/Latin/Denmark
+ { 83, 66, 185, 0, 0, 389, 398, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 6433, 6433, 6487, 6487, 6487, 6487, 0, 0, 0, 5, 22, 146, 2060, 2, 9, 2547, 826, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 54, 54, 27, 27, 27, 27, 2, 2, 5, 17, 23, 1, 17, 4, 6, 8, 9, {80,72,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Filipino/Latin/Philippines
+ { 84, 66, 83, 0, 0, 351, 351, 6, 1, 9, 2, 3, 48, 5, 10, 15, 15, 17, 17, 698, 885, 213, 213, 6514, 6580, 6660, 6660, 6680, 6680, 213, 226, 331, 336, 353, 22, 405, 4, 0, 2555, 2560, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 4, 66, 80, 20, 20, 13, 13, 3, 3, 5, 17, 23, 1, 4, 5, 0, 5, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Finnish/Latin/Finland
+ { 85, 66, 84, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2573, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/France
+ { 85, 66, 4, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 209, 2077, 4, 20, 2565, 2579, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {68,90,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // French/Latin/Algeria
+ { 85, 66, 23, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 79, 297, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2586, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 7, 26, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Belgium
+ { 85, 66, 25, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 2594, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Benin
+ { 85, 66, 37, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 2599, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 12, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Burkina Faso
+ { 85, 66, 38, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 182, 2108, 4, 20, 2565, 1522, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 15, 5, 7, 8, 7, {66,73,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Burundi
+ { 85, 66, 40, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 216, 229, 376, 232, 249, 11, 2123, 4, 20, 2565, 1209, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 5, 4, 6, 17, 23, 4, 16, 5, 7, 8, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Cameroon
+ { 85, 66, 41, 0, 0, 406, 406, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 15, 14, 113, 103, 323, 323, 6693, 6693, 6744, 6744, 6778, 6778, 168, 168, 376, 232, 249, 10, 2139, 4, 20, 2611, 1553, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 27, 9, 51, 51, 34, 34, 13, 13, 4, 4, 6, 17, 23, 1, 15, 5, 7, 17, 6, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // French/Latin/Canada
+ { 85, 66, 46, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2123, 4, 20, 2565, 2628, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 25, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Central African Republic
+ { 85, 66, 48, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2123, 4, 20, 2565, 2653, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 5, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Chad
+ { 85, 66, 55, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 12, 2154, 4, 20, 2565, 2658, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {75,77,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Comoros
+ { 85, 66, 56, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2123, 4, 20, 2565, 2665, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 17, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Congo - Brazzaville
+ { 85, 66, 57, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2168, 4, 20, 2565, 2682, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 15, 5, 7, 8, 14, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Congo - Kinshasa
+ { 85, 66, 67, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 3, 2183, 4, 20, 2565, 2696, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 16, 5, 7, 8, 8, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // French/Latin/Djibouti
+ { 85, 66, 73, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2123, 4, 20, 2565, 2704, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 18, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Equatorial Guinea
+ { 85, 66, 85, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2722, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 16, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/French Guiana
+ { 85, 66, 86, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 211, 2199, 4, 20, 2565, 2738, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 9, 5, 7, 8, 19, {88,80,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/French Polynesia
+ { 85, 66, 88, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2123, 4, 20, 2565, 2757, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 5, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Gabon
+ { 85, 66, 97, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2762, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Guadeloupe
+ { 85, 66, 102, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 215, 2208, 4, 20, 2565, 2704, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 13, 5, 7, 8, 6, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Guinea
+ { 85, 66, 104, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 15, 2221, 4, 20, 2565, 2772, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 16, 5, 7, 8, 5, {72,84,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Haiti
+ { 85, 66, 118, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 2777, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 13, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Ivory Coast
+ { 85, 66, 138, 0, 0, 406, 406, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2790, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Luxembourg
+ { 85, 66, 141, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 188, 2237, 4, 20, 2565, 1859, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 15, 5, 7, 8, 10, {77,71,65}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Madagascar
+ { 85, 66, 145, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 547, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 4, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mali
+ { 85, 66, 148, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2800, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Martinique
+ { 85, 66, 149, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 217, 2252, 4, 20, 2565, 2810, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 19, 5, 7, 8, 10, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mauritania
+ { 85, 66, 150, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 196, 2271, 4, 20, 2565, 2820, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 18, 5, 7, 8, 7, {77,85,82}, 2, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mauritius
+ { 85, 66, 151, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2827, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mayotte
+ { 85, 66, 155, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2834, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Monaco
+ { 85, 66, 159, 0, 0, 406, 406, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 168, 168, 376, 232, 249, 0, 2289, 4, 20, 2565, 2840, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 4, 4, 6, 17, 23, 0, 15, 5, 7, 8, 5, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Morocco
+ { 85, 66, 166, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 211, 2199, 4, 20, 2565, 2845, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 9, 5, 7, 8, 18, {88,80,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/New Caledonia
+ { 85, 66, 170, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 1975, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Niger
+ { 85, 66, 191, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2863, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Reunion
+ { 85, 66, 194, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 198, 2304, 4, 20, 2565, 2091, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 6, {82,87,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Rwanda
+ { 85, 66, 195, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2873, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 16, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Saint Barthelemy
+ { 85, 66, 199, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2889, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 12, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Saint Martin
+ { 85, 66, 200, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2901, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 24, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Saint Pierre and Miquelon
+ { 85, 66, 206, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 2925, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 7, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Senegal
+ { 85, 66, 208, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 203, 2318, 4, 20, 2565, 2157, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 21, 5, 7, 8, 10, {83,67,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Seychelles
+ { 85, 66, 226, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 19, 20, 0, 49, 350, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 0, 2339, 4, 20, 2932, 2947, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 17, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 0, 12, 5, 7, 15, 6, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Switzerland
+ { 85, 66, 227, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 219, 2351, 4, 20, 2565, 2953, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 5, {83,89,80}, 0, 0, 6, 5, 6, 1, 3, 3 }, // French/Latin/Syria
+ { 85, 66, 233, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 2508, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 4, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Togo
+ { 85, 66, 238, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 221, 2365, 4, 20, 2565, 2958, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {84,78,68}, 3, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Tunisia
+ { 85, 66, 252, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 207, 2379, 4, 20, 2565, 2422, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {86,85,86}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Vanuatu
+ { 85, 66, 256, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 211, 2199, 4, 20, 2565, 2965, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 9, 5, 7, 8, 16, {88,80,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Wallis and Futuna
+ { 86, 66, 117, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 14, 15, 893, 78, 10, 0, 6791, 6791, 6840, 6840, 6778, 6778, 5, 128, 0, 5, 22, 22, 405, 15, 0, 2981, 2987, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Friulian/Latin/Italy
+ { 87, 66, 206, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 127, 2393, 4, 0, 2993, 2999, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 8, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Senegal
+ { 87, 1, 37, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 223, 2412, 15, 0, 3007, 3017, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 25, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Burkina Faso
+ { 87, 1, 40, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 229, 2463, 15, 0, 3007, 3042, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 8, 44, 5, 0, 10, 16, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Cameroon
+ { 87, 1, 89, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 61, 76, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 185, 2507, 15, 0, 3007, 3058, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 15, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 1, 29, 5, 0, 10, 14, {71,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Gambia
+ { 87, 1, 92, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 61, 76, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 15, 2536, 15, 0, 3007, 3072, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 15, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 3, 23, 5, 0, 10, 8, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Ghana
+ { 87, 1, 101, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 223, 2412, 15, 0, 3007, 3080, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 23, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Guinea-Bissau
+ { 87, 1, 102, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 215, 2559, 15, 0, 3007, 3080, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 2, 25, 5, 0, 10, 8, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Guinea
+ { 87, 1, 134, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 61, 76, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 10, 2584, 15, 0, 3007, 3103, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 15, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 1, 31, 5, 0, 10, 18, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Liberia
+ { 87, 1, 149, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 61, 76, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 217, 2615, 15, 0, 3007, 3121, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 15, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 2, 37, 5, 0, 10, 16, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Mauritania
+ { 87, 1, 169, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 124, 2652, 15, 0, 3007, 3137, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 1, 33, 5, 0, 10, 18, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Nigeria
+ { 87, 1, 170, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 223, 2412, 15, 0, 3007, 3155, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 12, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Niger
+ { 87, 1, 206, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 223, 2412, 15, 0, 3007, 3167, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 16, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Senegal
+ { 87, 1, 209, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 61, 76, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 18, 2685, 15, 0, 3007, 3183, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 15, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 2, 33, 5, 0, 10, 14, {83,76,69}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Sierra Leone
+ { 87, 66, 37, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 127, 2393, 4, 0, 2993, 3197, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 14, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Burkina Faso
+ { 87, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 11, 2718, 4, 0, 2993, 3211, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 4, 18, 5, 0, 6, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Cameroon
+ { 87, 66, 89, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 23, 38, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 185, 2736, 4, 0, 2993, 3219, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 13, 5, 0, 6, 6, {71,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Gambia
+ { 87, 66, 92, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 23, 38, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 15, 0, 4, 0, 2993, 3225, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 0, 5, 0, 6, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Ghana
+ { 87, 66, 101, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 127, 2393, 4, 0, 2993, 3230, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 12, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Guinea-Bissau
+ { 87, 66, 102, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 215, 0, 4, 0, 2993, 3230, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 0, 5, 0, 6, 4, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Guinea
+ { 87, 66, 134, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 23, 38, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 10, 2749, 4, 0, 2993, 3242, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 16, 5, 0, 6, 9, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Liberia
+ { 87, 66, 149, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 23, 38, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 217, 2765, 4, 0, 2993, 3251, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 15, 5, 0, 6, 8, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Mauritania
+ { 87, 66, 169, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 124, 2780, 4, 0, 2993, 3259, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 16, 5, 0, 6, 9, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Nigeria
+ { 87, 66, 170, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 127, 2393, 4, 0, 2993, 3268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 6, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Niger
+ { 87, 66, 209, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 23, 38, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 18, 2796, 4, 0, 2993, 3274, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 18, 5, 0, 6, 11, {83,76,69}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Sierra Leone
+ { 88, 66, 246, 0, 0, 445, 445, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 937, 186, 10, 0, 7157, 7157, 7225, 7225, 7252, 7252, 3, 135, 421, 5, 22, 94, 2814, 2, 9, 3285, 3293, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 10, 13, 5, 68, 68, 27, 27, 13, 13, 1, 1, 6, 17, 23, 1, 15, 4, 6, 8, 22, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Gaelic/Latin/United Kingdom
+ { 89, 66, 92, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 7265, 7265, 7297, 7297, 7323, 7323, 0, 0, 0, 5, 22, 15, 50, 2, 9, 3315, 1718, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 32, 32, 26, 26, 13, 13, 2, 2, 4, 17, 23, 3, 10, 4, 6, 2, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ga/Latin/Ghana
+ { 90, 66, 220, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 78, 10, 0, 7336, 7336, 7384, 7384, 1185, 7418, 168, 168, 0, 5, 22, 22, 405, 4, 0, 3317, 455, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 48, 48, 34, 34, 13, 20, 4, 4, 5, 17, 23, 1, 4, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Galician/Latin/Spain
+ { 91, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 7438, 7438, 7503, 7503, 7530, 7530, 0, 0, 0, 5, 22, 147, 2829, 0, 0, 3323, 3330, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 65, 65, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 7, 7, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Ganda/Latin/Uganda
+ { 92, 33, 77, 0, 0, 0, 0, 6, 0, 74, 2, 3, 4, 5, 10, 14, 15, 16, 17, 985, 78, 61, 76, 7543, 7543, 7543, 7543, 7571, 7571, 0, 0, 0, 5, 22, 0, 105, 15, 0, 3337, 143, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 15, 7, 28, 28, 28, 28, 13, 13, 2, 2, 4, 17, 23, 0, 9, 5, 0, 4, 5, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Geez/Ethiopic/Ethiopia
+ { 92, 33, 74, 0, 0, 0, 0, 6, 0, 74, 2, 3, 4, 5, 10, 14, 15, 16, 17, 985, 78, 61, 76, 7543, 7543, 7543, 7543, 7571, 7571, 0, 0, 0, 5, 22, 6, 0, 15, 0, 3337, 671, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 15, 7, 28, 28, 28, 28, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 4, 4, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Geez/Ethiopic/Eritrea
+ { 93, 35, 90, 0, 0, 455, 455, 6, 1, 9, 2, 3, 4, 5, 10, 13, 14, 11, 12, 1008, 49, 10, 0, 7584, 7584, 7645, 7645, 7672, 7672, 0, 0, 427, 432, 22, 0, 2848, 4, 0, 3341, 3348, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 13, 5, 61, 61, 27, 27, 13, 13, 2, 2, 5, 29, 23, 1, 12, 5, 0, 7, 10, {71,69,76}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Georgian/Georgian/Georgia
+ { 94, 66, 91, 0, 0, 463, 463, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 22, 83, 4, 0, 3358, 3365, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Germany
+ { 94, 66, 16, 0, 0, 463, 463, 6, 1, 9, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 22, 83, 15, 0, 3376, 3376, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 24, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Austria
+ { 94, 66, 23, 0, 0, 463, 463, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 22, 83, 4, 0, 3358, 3400, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Belgium
+ { 94, 66, 117, 0, 0, 463, 463, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 22, 83, 4, 0, 3358, 3407, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Italy
+ { 94, 66, 136, 0, 0, 463, 463, 6, 0, 17, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 0, 2860, 15, 0, 3358, 3414, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 0, 17, 5, 0, 7, 13, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // German/Latin/Liechtenstein
+ { 94, 66, 138, 0, 0, 463, 463, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 22, 83, 4, 0, 3358, 3427, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Luxembourg
+ { 94, 66, 226, 0, 0, 463, 463, 6, 0, 17, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 0, 2860, 15, 65, 3436, 3436, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 0, 17, 5, 5, 21, 7, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // German/Latin/Switzerland
+ { 96, 39, 94, 0, 0, 472, 472, 6, 1, 0, 2, 3, 4, 5, 6, 11, 12, 14, 15, 113, 129, 23, 38, 7791, 7791, 7845, 7845, 7872, 7872, 231, 244, 0, 5, 22, 22, 2877, 4, 0, 3457, 3465, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 54, 54, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Greek/Greek/Greece
+ { 96, 39, 63, 0, 0, 472, 472, 6, 1, 0, 2, 3, 4, 5, 6, 11, 12, 14, 15, 113, 129, 23, 38, 7791, 7791, 7845, 7845, 7872, 7872, 231, 244, 0, 5, 22, 22, 2877, 4, 0, 3457, 3471, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 54, 54, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Greek/Greek/Cyprus
+ { 97, 66, 183, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 7885, 7885, 7885, 7885, 83, 83, 0, 0, 0, 5, 22, 237, 0, 15, 0, 3477, 3484, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 53, 53, 53, 53, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 7, 8, {80,89,71}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Guarani/Latin/Paraguay
+ { 98, 40, 110, 0, 0, 481, 481, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 367, 383, 7938, 7938, 7990, 7990, 8021, 8021, 0, 0, 466, 5, 22, 120, 2881, 2, 9, 3492, 3499, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 16, 8, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 13, 4, 6, 7, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Gujarati/Gujarati/India
+ { 99, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 8039, 8039, 8100, 8100, 8127, 8127, 235, 248, 0, 5, 22, 176, 991, 2, 9, 3503, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 61, 61, 27, 27, 13, 13, 6, 3, 4, 17, 23, 3, 17, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Gusii/Latin/Kenya
+ { 101, 66, 169, 0, 0, 490, 499, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 804, 129, 10, 0, 8140, 8140, 8191, 8191, 8218, 8218, 241, 251, 0, 470, 511, 124, 2894, 15, 0, 3511, 3259, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 51, 51, 27, 27, 13, 13, 6, 5, 5, 41, 47, 1, 15, 5, 0, 5, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Hausa/Latin/Nigeria
+ { 101, 4, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 8231, 8231, 8287, 8287, 83, 83, 0, 0, 0, 5, 22, 124, 2909, 15, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 30, 30, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Hausa/Arabic/Nigeria
+ { 101, 4, 222, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 8231, 8231, 8287, 8287, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 30, 30, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {83,68,71}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Hausa/Arabic/Sudan
+ { 101, 66, 92, 0, 0, 490, 499, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 804, 129, 23, 38, 8140, 8140, 8191, 8191, 8218, 8218, 241, 251, 0, 470, 511, 15, 2915, 15, 0, 3511, 3225, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 51, 51, 27, 27, 13, 13, 6, 5, 5, 41, 47, 3, 13, 5, 0, 5, 4, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Hausa/Latin/Ghana
+ { 101, 66, 170, 0, 0, 490, 499, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 804, 129, 10, 0, 8140, 8140, 8191, 8191, 8218, 8218, 241, 251, 0, 470, 511, 127, 2928, 15, 0, 3511, 3516, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 51, 51, 27, 27, 13, 13, 6, 5, 5, 41, 47, 5, 29, 5, 0, 5, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Hausa/Latin/Niger
+ { 102, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 23, 38, 8317, 8317, 8373, 8373, 83, 83, 0, 0, 0, 5, 22, 10, 0, 2, 9, 3521, 3535, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 56, 56, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 6, 14, 19, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Hawaiian/Latin/United States
+ { 103, 47, 116, 0, 0, 507, 507, 6, 0, 1, 2, 3, 35, 37, 10, 15, 15, 17, 17, 1027, 885, 11, 1, 8393, 8393, 8457, 8457, 8502, 8502, 247, 256, 558, 5, 22, 48, 2957, 70, 77, 3554, 3559, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 18, 8, 12, 4, 64, 64, 45, 45, 20, 20, 6, 5, 4, 17, 23, 1, 7, 7, 9, 5, 5, {73,76,83}, 2, 1, 7, 5, 6, 1, 3, 3 }, // Hebrew/Hebrew/Israel
+ { 105, 29, 110, 0, 0, 513, 522, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76, 8522, 8522, 8574, 8574, 8605, 8605, 82, 203, 562, 5, 22, 120, 2964, 2, 0, 3564, 664, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 12, 4, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Hindi/Devanagari/India
+ { 105, 66, 110, 0, 0, 530, 540, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 804, 186, 23, 38, 8623, 8623, 8689, 8689, 8727, 8727, 0, 0, 0, 5, 22, 120, 1381, 2, 0, 3570, 1478, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 66, 66, 38, 38, 21, 21, 2, 2, 5, 17, 23, 1, 12, 4, 0, 13, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Hindi/Latin/India
+ { 107, 66, 108, 0, 0, 549, 549, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 12, 11, 1045, 1064, 11, 1, 8748, 8748, 8799, 8799, 8817, 8817, 253, 261, 566, 5, 22, 238, 2976, 4, 0, 3583, 3589, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 13, 12, 4, 51, 51, 18, 18, 16, 16, 3, 3, 4, 17, 23, 2, 13, 5, 0, 6, 12, {72,85,70}, 2, 0, 1, 6, 7, 2, 3, 3 }, // Hungarian/Latin/Hungary
+ { 108, 66, 109, 0, 0, 289, 289, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 885, 10, 0, 8833, 8833, 8913, 8913, 8947, 8947, 256, 264, 570, 5, 22, 160, 2989, 4, 0, 3601, 3609, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 80, 80, 34, 34, 13, 13, 4, 4, 4, 17, 23, 3, 13, 5, 0, 8, 6, {73,83,75}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Icelandic/Latin/Iceland
+ { 109, 66, 258, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 3615, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 3, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ido/Latin/world
+ { 110, 66, 169, 0, 0, 557, 566, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 10, 0, 8960, 8960, 9013, 9013, 83, 83, 260, 268, 0, 5, 22, 124, 3002, 2, 9, 3618, 3622, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 53, 53, 28, 28, 13, 13, 7, 7, 4, 17, 23, 1, 5, 4, 6, 4, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Igbo/Latin/Nigeria
+ { 111, 66, 83, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1077, 885, 213, 213, 9041, 9110, 9182, 9182, 83, 9209, 267, 275, 0, 5, 22, 22, 405, 4, 0, 3630, 3641, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 4, 69, 72, 27, 27, 13, 13, 3, 3, 4, 17, 23, 1, 4, 5, 0, 11, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Inari Sami/Latin/Finland
+ { 112, 66, 111, 0, 0, 574, 584, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 78, 212, 212, 9222, 9222, 9264, 9264, 9291, 9291, 0, 0, 0, 5, 22, 186, 3007, 2, 0, 1776, 1776, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 42, 42, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 16, 4, 0, 9, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Indonesian/Latin/Indonesia
+ { 114, 66, 258, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 14, 15, 1095, 394, 10, 0, 9304, 9304, 9360, 9360, 9387, 9387, 0, 0, 0, 5, 22, 0, 0, 15, 58, 3646, 3657, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 5, 7, 11, 5, {0,0,0}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Interlingua/Latin/world
+ { 115, 66, 75, 0, 0, 0, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 180, 10, 0, 9400, 9400, 9451, 9451, 9485, 9485, 270, 278, 574, 232, 249, 22, 405, 15, 86, 3662, 3673, 6, 6, 6, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 13, 5, 51, 51, 34, 34, 13, 13, 9, 8, 7, 17, 23, 1, 4, 5, 6, 11, 7, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Interlingue/Latin/Estonia
+ { 116, 18, 41, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 1121, 61, 76, 9498, 9498, 9498, 9498, 83, 83, 0, 0, 0, 5, 22, 240, 0, 15, 0, 3680, 3686, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 15, 7, 54, 54, 54, 54, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 6, 4, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Inuktitut/Canadian Aboriginal/Canada
+ { 116, 66, 41, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 240, 0, 15, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Inuktitut/Latin/Canada
+ { 118, 66, 114, 0, 0, 445, 445, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 186, 10, 0, 9552, 9552, 9626, 9626, 9662, 9662, 279, 286, 581, 5, 22, 22, 83, 2, 9, 3690, 3697, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 74, 74, 36, 36, 13, 13, 4, 4, 6, 17, 23, 1, 4, 4, 6, 7, 4, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Irish/Latin/Ireland
+ { 118, 66, 246, 0, 0, 445, 445, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 186, 10, 0, 9552, 9552, 9626, 9626, 9662, 9662, 279, 286, 581, 5, 22, 94, 3023, 2, 9, 3690, 3701, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 74, 74, 36, 36, 13, 13, 4, 4, 6, 17, 23, 1, 14, 4, 6, 7, 19, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Irish/Latin/United Kingdom
+ { 119, 66, 117, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 78, 10, 0, 9675, 9675, 9731, 9731, 4694, 4694, 0, 0, 0, 5, 22, 22, 405, 4, 0, 3720, 3728, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/Italy
+ { 119, 66, 203, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 78, 10, 0, 9675, 9675, 9731, 9731, 4694, 4694, 0, 0, 0, 5, 22, 22, 405, 4, 0, 3720, 3734, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/San Marino
+ { 119, 66, 226, 0, 0, 414, 414, 6, 0, 17, 2, 3, 4, 5, 10, 11, 12, 19, 20, 0, 49, 10, 0, 9675, 9675, 9731, 9731, 4694, 4694, 0, 0, 0, 5, 22, 0, 3037, 15, 65, 3720, 3744, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 15, 5, 5, 8, 8, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/Switzerland
+ { 119, 66, 253, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 78, 10, 0, 9675, 9675, 9731, 9731, 4694, 4694, 0, 0, 0, 5, 22, 22, 405, 4, 0, 3720, 3752, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 8, 18, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/Vatican City
+ { 120, 53, 120, 183, 183, 183, 183, 6, 0, 1, 2, 3, 4, 5, 10, 51, 52, 53, 54, 513, 821, 391, 1, 9758, 9758, 9785, 9785, 9785, 9785, 283, 290, 587, 590, 22, 145, 3052, 2, 9, 3770, 3770, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 10, 13, 4, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 3, 4, 6, 3, 2, {74,80,89}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Japanese/Japanese/Japan
+ { 121, 66, 111, 0, 0, 593, 603, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 394, 10, 0, 9798, 9798, 9838, 9838, 9866, 9866, 285, 292, 607, 5, 22, 186, 3007, 15, 0, 3773, 3777, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 40, 40, 28, 28, 13, 13, 4, 5, 4, 17, 23, 2, 16, 5, 0, 4, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Javanese/Latin/Indonesia
+ { 122, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 155, 10, 0, 9879, 9879, 9922, 9922, 83, 83, 0, 0, 0, 5, 22, 124, 3055, 15, 0, 3786, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 43, 43, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 7, 5, 0, 4, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Jju/Latin/Nigeria
+ { 123, 66, 206, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 10, 0, 9949, 9949, 9998, 9998,10025,10025, 0, 0, 0, 5, 22, 127, 3062, 4, 0, 3790, 3795, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 16, 5, 0, 5, 7, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Jola-Fonyi/Latin/Senegal
+ { 124, 66, 43, 0, 0, 143, 143, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1131, 186, 10, 0,10038,10038,10110,10110,10137,10137, 82, 203, 0, 5, 22, 243, 3078, 4, 20, 3802, 3814, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 13, 5, 72, 72, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 7, 12, 10, {67,86,69}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kabuverdianu/Latin/Cape Verde
+ { 125, 66, 4, 0, 0, 612, 620, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 23, 38,10150,10183,10233,10260,10289,10302, 289, 297, 611, 618, 22, 209, 3096, 0, 0, 3824, 3833, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 33, 50, 27, 29, 13, 13, 7, 9, 7, 21, 23, 2, 14, 4, 0, 9, 8, {68,90,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Kabyle/Latin/Algeria
+ { 126, 66, 40, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 19, 20, 86, 1158, 10, 0,10315,10315,10315,10315,10368,10368, 0, 0, 0, 5, 22, 11, 3110, 15, 0, 3841, 3845, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 53, 53, 53, 53, 20, 20, 2, 2, 4, 17, 23, 4, 9, 5, 0, 4, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kako/Latin/Cameroon
+ { 127, 66, 95, 0, 0, 627, 627, 6, 1, 0, 2, 3, 48, 5, 63, 12, 11, 20, 19, 86, 103, 212, 212,10388,10388,10485,10485,10512,10512, 0, 0, 0, 5, 22, 160, 3119, 2, 92, 3852, 3863, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 13, 5, 97, 97, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 5, 11, 16, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Kalaallisut/Latin/Greenland
+ { 128, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,10525,10525,10577,10577,10604,10604, 296, 306, 0, 5, 22, 176, 3138, 2, 9, 3879, 3887, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 52, 52, 27, 27, 13, 13, 6, 10, 4, 17, 23, 3, 19, 4, 6, 8, 12, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kalenjin/Latin/Kenya
+ { 129, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,10617,10617,10690,10690,10717,10717, 302, 316, 0, 5, 22, 176, 3157, 2, 9, 3899, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 73, 73, 27, 27, 13, 13, 9, 7, 4, 17, 23, 3, 16, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kamba/Latin/Kenya
+ { 130, 56, 110, 0, 0, 638, 650, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 129, 367, 383,10730,10730,10783,10783,10815,10815, 311, 323, 639, 647, 22, 120, 3173, 2, 9, 3906, 3911, 6, 6, 12, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 16, 8, 53, 53, 32, 32, 19, 19, 9, 7, 8, 35, 23, 1, 13, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Kannada/Kannada/India
+ { 132, 4, 110, 661, 661, 667, 677, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 549, 567, 61, 76,10834,10834,10885,10885,10934,10934, 320, 330, 0, 5, 22, 120, 3186, 2, 0, 3915, 3920, 6, 6, 10, 9, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 6, 15, 7, 51, 51, 49, 49, 13, 13, 6, 6, 4, 17, 23, 1, 16, 4, 0, 5, 9, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Kashmiri/Arabic/India
+ { 132, 29, 110, 0, 0, 686, 695, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 127, 127,10947,10996,10947,11045,11092,11092, 326, 336, 0, 5, 22, 120, 3202, 15, 0, 3929, 3934, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 49, 49, 49, 47, 13, 13, 5, 5, 4, 17, 23, 1, 11, 5, 0, 5, 10, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Kashmiri/Devanagari/India
+ { 133, 27, 123, 0, 0, 0, 703, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 1168, 49, 10, 0,11105,11105,11160,11160,11180,11180, 0, 0, 196, 682, 699, 244, 3213, 4, 0, 3944, 3954, 6, 6, 6, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 13, 5, 55, 55, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 17, 5, 0, 10, 9, {75,90,84}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kazakh/Cyrillic/Kazakhstan
+ { 134, 66, 40, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 11, 0, 15, 0, 3963, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 0, 5, 0, 6, 0, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kenyang/Latin/Cameroon
+ { 135, 60, 39, 0, 0, 713, 722, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 61, 76,11193,11238,11284,11284,11323,11323, 0, 0, 722, 5, 22, 245, 3230, 0, 45, 3969, 3974, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 45, 46, 39, 39, 13, 13, 2, 2, 2, 17, 23, 1, 11, 4, 6, 5, 7, {75,72,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Khmer/Khmer/Cambodia
+ { 136, 66, 99, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 246, 0, 15, 0, 3981, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 7, 0, {71,84,81}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kiche/Latin/Guatemala
+ { 137, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,11336,11336,11398,11398,11425,11425, 331, 341, 0, 5, 22, 176, 3241, 2, 9, 3988, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 27, 27, 13, 13, 6, 8, 4, 17, 23, 3, 16, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kikuyu/Latin/Kenya
+ { 138, 66, 194, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 16, 17, 163, 103, 10, 0,11438,11438,11521,11521, 83, 83, 0, 0, 0, 5, 22, 198, 0, 15, 0, 3994, 4005, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 83, 83, 34, 34, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 11, 8, {82,87,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kinyarwanda/Latin/Rwanda
+ { 141, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 283, 61, 76,11555,11555,11555,11555,11605,11623, 337, 349, 724, 5, 22, 120, 2964, 2, 9, 4013, 664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 50, 50, 50, 50, 18, 19, 4, 4, 4, 17, 23, 1, 12, 4, 6, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Konkani/Devanagari/India
+ { 142, 63, 218, 0, 0, 731, 731, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1190, 1208, 404, 127,11642,11642,11669,11669,11669,11669, 341, 353, 728, 5, 22, 247, 3257, 2, 9, 4019, 4022, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 16, 7, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 6, 4, 6, 3, 4, {75,82,87}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Korean/Korean/South Korea
+ { 142, 63, 50, 0, 0, 731, 731, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1190, 1208, 169, 0,11642,11642,11669,11669,11669,11669, 341, 353, 728, 5, 22, 248, 3263, 2, 9, 4019, 4026, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 13, 5, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 3, 6, 4, 6, 3, 2, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Korean/Korean/China
+ { 142, 63, 174, 0, 0, 731, 731, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1190, 1208, 404, 127,11642,11642,11669,11669,11669,11669, 341, 353, 728, 5, 22, 247, 3269, 2, 9, 4019, 4028, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 16, 7, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 16, 4, 6, 3, 11, {75,80,87}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Korean/Korean/North Korea
+ { 144, 66, 145, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,11682,11682,11735,11735,11762,11762, 343, 355, 0, 5, 22, 127, 3285, 0, 0, 4039, 4054, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 53, 53, 27, 27, 13, 13, 6, 6, 4, 17, 23, 5, 16, 4, 0, 15, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Koyraboro Senni/Latin/Mali
+ { 145, 66, 145, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,11775,11775,11827,11827,11762,11762, 343, 355, 0, 5, 22, 127, 3285, 0, 0, 4059, 4054, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 52, 52, 27, 27, 13, 13, 6, 6, 4, 17, 23, 5, 16, 4, 0, 11, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Koyra Chiini/Latin/Mali
+ { 146, 66, 134, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 23, 38, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 0, 15, 0, 4070, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 6, 0, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kpelle/Latin/Liberia
+ { 146, 66, 102, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 215, 0, 15, 0, 4070, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 6, 0, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kpelle/Latin/Guinea
+ { 148, 66, 239, 0, 0, 738, 738, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1217, 49, 10, 0,11854,11854,11896,11896,11923,11923, 349, 361, 0, 5, 22, 126, 3301, 4, 20, 4076, 4092, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 13, 5, 42, 42, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 12, 5, 7, 16, 7, {84,82,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kurdish/Latin/Turkey
+ { 149, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 11, 12, 113, 129, 10, 0,11936,11936,12024,12024,12053,12053, 351, 363, 0, 5, 22, 11, 3313, 4, 0, 4099, 4105, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 88, 88, 29, 29, 13, 13, 4, 4, 4, 17, 23, 4, 13, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kwasio/Latin/Cameroon
+ { 150, 27, 128, 0, 0, 745, 745, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 1244, 129, 10, 0,12066,12066,12122,12122,12159,12159, 355, 367, 196, 731, 22, 251, 3326, 4, 0, 4112, 4120, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 13, 5, 56, 56, 37, 37, 13, 13, 5, 14, 4, 18, 23, 3, 15, 5, 0, 8, 10, {75,71,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kyrgyz/Cyrillic/Kyrgyzstan
+ { 151, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38,12172,12172,12172,12172, 83,12258, 0, 0, 0, 5, 22, 10, 0, 15, 0, 4130, 4142, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 86, 86, 86, 86, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 22, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Lakota/Latin/United States
+ { 152, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 15, 15, 17, 17, 0, 186, 10, 0,12271,12271,12333,12333,12368,12368, 360, 381, 0, 5, 22, 121, 3341, 15, 0, 4164, 4172, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 35, 35, 13, 13, 3, 3, 4, 17, 23, 3, 22, 5, 0, 8, 9, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Langi/Latin/Tanzania
+ { 153, 65, 129, 0, 0, 0, 755, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1267, 129, 420, 1,12381,12381,12437,12437,12472,12472, 363, 384, 0, 5, 22, 254, 3363, 2, 65, 4181, 4181, 6, 6, 6, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 27, 4, 56, 56, 35, 35, 16, 16, 8, 8, 4, 17, 23, 1, 7, 4, 5, 3, 3, {76,65,75}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Lao/Lao/Laos
+ { 154, 66, 253, 0, 0, 406, 406, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1286, 1309, 10, 0,12488,12488,12572,12572, 83, 83, 0, 0, 0, 5, 22, 22, 83, 15, 0, 4184, 4190, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 13, 5, 84, 84, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 6, 16, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Latin/Latin/Vatican City
+ { 155, 66, 131, 0, 0, 267, 267, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1317, 49, 10, 0,12599,12670,12741,12791,12841,12841, 371, 392, 749, 5, 22, 22, 3370, 4, 0, 4206, 4214, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 8, 13, 5, 71, 71, 50, 50, 13, 13, 14, 11, 5, 17, 23, 1, 4, 5, 0, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Latvian/Latin/Latvia
+ { 158, 66, 57, 0, 0, 764, 764, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,12854,12854,12953,12953,12980,12980, 385, 403, 0, 5, 22, 11, 3374, 4, 0, 4221, 4228, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 2, 16, 5, 0, 7, 30, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Congo - Kinshasa
+ { 158, 66, 7, 0, 0, 764, 764, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,12854,12854,12953,12953,12980,12980, 385, 403, 0, 5, 22, 255, 3390, 4, 0, 4221, 4258, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 2, 16, 5, 0, 7, 6, {65,79,65}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Angola
+ { 158, 66, 46, 0, 0, 764, 764, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,12854,12854,12953,12953,12980,12980, 385, 403, 0, 5, 22, 11, 3406, 4, 0, 4221, 4264, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 4, 16, 5, 0, 7, 26, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Central African Republic
+ { 158, 66, 56, 0, 0, 764, 764, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,12854,12854,12953,12953,12980,12980, 385, 403, 0, 5, 22, 11, 3406, 4, 0, 4221, 4290, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 4, 16, 5, 0, 7, 5, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Congo - Brazzaville
+ { 160, 66, 137, 0, 0, 773, 773, 6, 1, 9, 2, 3, 48, 5, 63, 13, 14, 13, 14, 1343, 103, 10, 0,12993,12993,13081,13081,13101,13101, 393, 409, 754, 5, 22, 22, 3422, 4, 0, 4295, 4303, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 27, 10, 13, 5, 88, 88, 20, 20, 13, 13, 9, 6, 6, 17, 23, 1, 5, 5, 0, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lithuanian/Latin/Lithuania
+ { 161, 66, 258, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 4310, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lojban/Latin/world
+ { 162, 66, 91, 0, 0, 781, 781, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 180, 11, 1,13114,13114,13166,13166,13193,13193, 402, 415, 0, 5, 22, 22, 405, 4, 0, 4321, 4335, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 4, 52, 52, 27, 27, 13, 13, 9, 10, 4, 17, 23, 1, 4, 5, 0, 14, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lower Sorbian/Latin/Germany
+ { 163, 66, 91, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 1370, 50, 447, 469,13206,13206,13270,13270, 4510, 4510, 0, 0, 0, 5, 22, 22, 83, 4, 0, 4341, 4355, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 7, 22, 10, 64, 64, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 14, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Low German/Latin/Germany
+ { 163, 66, 165, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 1370, 50, 447, 469,13206,13206,13270,13270, 4510, 4510, 0, 0, 0, 5, 22, 22, 83, 4, 0, 4341, 4366, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 7, 22, 10, 64, 64, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 14, 12, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Low German/Latin/Netherlands
+ { 164, 66, 57, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,13297,13297,13346,13346,13373,13373, 411, 425, 0, 5, 22, 11, 3427, 0, 0, 4378, 4386, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 49, 49, 27, 27, 13, 13, 5, 6, 4, 17, 23, 2, 17, 4, 0, 8, 16, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Luba-Katanga/Latin/Congo - Kinshasa
+ { 165, 66, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 160, 0, 15, 0, 4402, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 15, 0, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Lule Sami/Latin/Sweden
+ { 165, 66, 175, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 160, 0, 15, 0, 4402, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 15, 0, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Lule Sami/Latin/Norway
+ { 166, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,13386,13386,13454,13454,13481,13481, 416, 431, 0, 5, 22, 176, 3444, 0, 0, 4417, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 68, 68, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 16, 4, 0, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Luo/Latin/Kenya
+ { 167, 66, 138, 0, 0, 788, 788, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0,13494,13494,13558,13585, 4510, 4510, 418, 433, 461, 5, 22, 22, 83, 4, 0, 4423, 4423, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 64, 64, 27, 34, 13, 13, 5, 8, 5, 17, 23, 1, 4, 5, 0, 14, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Luxembourgish/Latin/Luxembourg
+ { 168, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 13, 14, 18, 16, 0, 186, 10, 0,13619,13619,13693,13693, 83, 83, 168, 168, 0, 5, 22, 176, 3460, 2, 97, 4437, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 74, 74, 20, 20, 13, 13, 4, 4, 4, 17, 23, 3, 16, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Luyia/Latin/Kenya
+ { 169, 27, 140, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 0, 180, 10, 0,13713,13713,13766,13766, 3069, 3069, 423, 441, 760, 5, 22, 257, 3476, 4, 0, 4444, 4454, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 53, 53, 34, 34, 13, 13, 7, 5, 5, 17, 23, 4, 16, 5, 0, 10, 18, {77,75,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Macedonian/Cyrillic/Macedonia
+ { 170, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,13800,13800,13861,13861, 1284, 1284, 430, 446, 0, 5, 22, 121, 3492, 2, 0, 4472, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Machame/Latin/Tanzania
+ { 171, 29, 110, 0, 0, 513, 522, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76,13888,13888, 8574, 8574, 8605, 8605, 88, 83, 0, 5, 22, 120, 2964, 15, 0, 4481, 664, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 63, 63, 31, 31, 18, 18, 3, 4, 4, 17, 23, 1, 12, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Maithili/Devanagari/India
+ { 172, 66, 160, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,13951,13951,14009,14009,14036,14036, 435, 455, 0, 5, 22, 261, 0, 15, 0, 4487, 4492, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 58, 58, 27, 27, 13, 13, 8, 10, 4, 17, 23, 3, 0, 5, 0, 5, 10, {77,90,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Makhuwa-Meetto/Latin/Mozambique
+ { 173, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,14049,14049,14181,14181,14208,14208, 443, 465, 0, 5, 22, 121, 3492, 2, 9, 4502, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5,132,132, 27, 27, 13, 13, 4, 5, 4, 17, 23, 3, 20, 4, 6, 10, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Makonde/Latin/Tanzania
+ { 174, 66, 141, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 103, 10, 0,14221,14221,14280,14280,14313,14313, 0, 0, 0, 5, 22, 188, 1515, 2, 0, 4512, 4520, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 59, 59, 33, 33, 13, 13, 2, 2, 4, 17, 23, 2, 6, 4, 0, 8, 12, {77,71,65}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Malagasy/Latin/Madagascar
+ { 175, 74, 110, 0, 0, 798, 811, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1393, 129, 61, 76,14326,14402,14477,14477,14517,14538, 0, 0, 765, 771, 22, 120, 3512, 2, 9, 4532, 4538, 6, 6, 13, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 76, 75, 40, 40, 21, 20, 2, 2, 6, 27, 23, 1, 11, 4, 6, 6, 6, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Malayalam/Malayalam/India
+ { 176, 66, 143, 0, 0, 584, 584, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 79, 23, 38,14558,14558,14600,14600,14627,14627, 447, 470, 749, 5, 22, 192, 3523, 2, 9, 4544, 1875, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 15, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 2, 16, 4, 6, 6, 8, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Latin/Malaysia
+ { 176, 4, 35, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 15, 14, 17, 16, 91, 79, 61, 76,14640,14640,14640,14640, 83, 83, 0, 0, 0, 5, 22, 10, 3539, 2, 9, 4550, 4560, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 7, 15, 7, 34, 34, 34, 34, 13, 13, 2, 2, 4, 17, 23, 1, 10, 4, 6, 10, 5, {66,78,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Arabic/Brunei
+ { 176, 4, 143, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 15, 14, 17, 16, 196, 79, 61, 76,14640,14640,14640,14640, 83, 83, 0, 0, 0, 5, 22, 192, 3549, 2, 9, 4550, 4565, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 15, 7, 34, 34, 34, 34, 13, 13, 2, 2, 4, 17, 23, 2, 13, 4, 6, 10, 6, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Arabic/Malaysia
+ { 176, 66, 35, 0, 0, 584, 584, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 91, 79, 23, 38,14558,14558,14600,14600,14627,14627, 447, 470, 749, 5, 22, 10, 3562, 2, 9, 4544, 4571, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 7, 15, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 1, 12, 4, 6, 6, 6, {66,78,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Latin/Brunei
+ { 176, 66, 111, 0, 0, 584, 584, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 78, 212, 212,14558,14558,14600,14600,14627,14627, 447, 470, 749, 5, 22, 186, 3007, 2, 0, 4544, 1776, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 2, 16, 4, 0, 6, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Malay/Latin/Indonesia
+ { 176, 66, 210, 0, 0, 584, 584, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 79, 23, 38,14558,14558,14600,14600,14627,14627, 447, 470, 749, 5, 22, 10, 3574, 2, 9, 4544, 4577, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 15, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 1, 15, 4, 6, 6, 9, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Malay/Latin/Singapore
+ { 177, 66, 146, 0, 0, 823, 831, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1411, 186, 10, 0,14674,14674,14736,14736,14763,14783, 0, 0, 0, 5, 22, 22, 3589, 2, 0, 4586, 1891, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 62, 62, 27, 27, 20, 19, 2, 2, 4, 17, 23, 1, 4, 4, 0, 5, 5, {69,85,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Maltese/Latin/Malta
+ { 179, 9, 110, 0, 0, 838, 838, 6, 0, 1, 2, 39, 4, 5, 10, 14, 15, 16, 17, 1434, 129, 61, 76,14802,14802,14802,14802,14860,14885, 449, 473, 0, 5, 22, 120, 3593, 15, 0, 4591, 4599, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 58, 58, 58, 58, 25, 29, 4, 5, 4, 17, 23, 1, 14, 5, 0, 8, 8, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Manipuri/Bangla/India
+ { 179, 78, 110, 0, 0, 0, 0, 6, 0, 1, 2, 75, 4, 5, 10, 14, 15, 16, 17, 265, 283, 479, 494, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 120, 0, 15, 0, 4607, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 8, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 7, 0, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Manipuri/Meitei Mayek/India
+ { 180, 66, 115, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 86, 78, 10, 0,14914,14914,14970,14970, 83, 83, 168, 168, 0, 5, 22, 94, 0, 2, 0, 4614, 4619, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 56, 56, 29, 29, 13, 13, 4, 4, 4, 17, 23, 1, 0, 4, 0, 5, 12, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Manx/Latin/Isle of Man
+ { 181, 66, 167, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 394, 23, 38,14999,14999,15046,15046,15073,15073, 0, 0, 0, 5, 22, 10, 3607, 15, 0, 4631, 4636, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 47, 47, 27, 27, 15, 15, 2, 2, 4, 17, 23, 1, 15, 5, 0, 5, 8, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Maori/Latin/New Zealand
+ { 182, 66, 49, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 0, 15, 0, 4644, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 10, 0, {67,76,80}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Mapuche/Latin/Chile
+ { 183, 29, 110, 0, 0, 849, 849, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 265, 129, 61, 76,15088,15088,15140,15140, 8605, 8605, 0, 0, 562, 5, 22, 120, 2964, 2, 9, 4654, 664, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 12, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Marathi/Devanagari/India
+ { 185, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,15171,15171,13861,13861,14208,14208, 453, 478, 0, 5, 22, 176, 3622, 2, 9, 1275, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 57, 57, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 18, 4, 6, 3, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Masai/Latin/Kenya
+ { 185, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,15171,15171,13861,13861,14208,14208, 453, 478, 0, 5, 22, 121, 3640, 2, 9, 1275, 4659, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 57, 57, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 21, 4, 6, 3, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Masai/Latin/Tanzania
+ { 186, 4, 112, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 798, 802, 22, 0, 3661, 15, 0, 4667, 4674, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 39, 23, 0, 10, 5, 0, 7, 5, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Mazanderani/Arabic/Iran
+ { 188, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,15228,15228,15278,15278,15305,15305, 462, 484, 0, 5, 22, 176, 991, 2, 9, 4679, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 50, 50, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Meru/Latin/Kenya
+ { 189, 66, 40, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 103, 10, 0,15318,15318,15318,15318,15366,15366, 0, 0, 0, 5, 22, 11, 3671, 15, 0, 4685, 4690, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 13, 5, 48, 48, 48, 48, 20, 20, 2, 2, 4, 17, 23, 4, 5, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Meta/Latin/Cameroon
+ { 190, 66, 41, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 23, 38, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 240, 0, 15, 0, 4697, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 11, 0, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Mohawk/Latin/Canada
+ { 191, 27, 156, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1452, 596, 98, 0,15386,15428,15470,15470,15470,15470, 464, 486, 196, 841, 22, 264, 3676, 15, 0, 4708, 4714, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 35, 10, 15, 5, 42, 42, 20, 20, 20, 20, 4, 4, 4, 17, 23, 1, 13, 5, 0, 6, 6, {77,78,84}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Mongolian/Cyrillic/Mongolia
+ { 191, 83, 50, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 248, 3689, 15, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 4, 5, 0, 0, 0, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Mongolian/Mongolian/China
+ { 191, 83, 156, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1487, 596, 98, 0,15490,15490,15532,15555,15578,15578, 468, 490, 0, 5, 22, 264, 3693, 2, 0, 4720, 4720, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 10, 15, 5, 42, 42, 23, 23, 23, 22, 4, 5, 4, 17, 23, 1, 8, 4, 0, 6, 6, {77,78,84}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Mongolian/Mongolian/Mongolia
+ { 192, 66, 150, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,15601,15601,15648,15648,15674,15674, 0, 0, 0, 5, 22, 196, 3701, 15, 0, 4726, 4740, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 47, 47, 26, 26, 13, 13, 2, 2, 4, 17, 23, 2, 14, 5, 0, 14, 5, {77,85,82}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Morisyen/Latin/Mauritius
+ { 193, 66, 40, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 10, 0,15687,15687,15760,15760,15787,15787, 472, 495, 0, 5, 22, 11, 3715, 2, 9, 4745, 4751, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 73, 73, 27, 27, 13, 13, 5, 5, 4, 17, 23, 4, 10, 4, 6, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Mundang/Latin/Cameroon
+ { 194, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38,15800,15800,15800,15800, 83, 83, 0, 0, 0, 5, 22, 10, 0, 15, 0, 4758, 964, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7,106,106,106,106, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 7, 13, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Muscogee/Latin/United States
+ { 195, 66, 162, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38,15906,15906,15997,15997,16019,16019, 477, 500, 0, 5, 22, 10, 3725, 2, 0, 4765, 4778, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 91, 91, 22, 22, 13, 13, 7, 5, 4, 17, 23, 1, 15, 4, 0, 13, 8, {78,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nama/Latin/Namibia
+ { 197, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 179, 0, 15, 0, 4786, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 11, 0, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Navajo/Latin/United States
+ { 199, 29, 164, 858, 0, 863, 863, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 163, 344, 10, 0,16032,16032,16085,16085,16117,16117, 484, 505, 562, 858, 22, 265, 3740, 15, 0, 4797, 4797, 5, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 53, 53, 32, 32, 17, 17, 9, 7, 4, 19, 23, 4, 14, 5, 0, 6, 5, {78,80,82}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Nepali/Devanagari/Nepal
+ { 199, 29, 110, 858, 0, 863, 863, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 163, 344, 61, 76,16032,16032,16085,16085,16117,16117, 484, 505, 562, 858, 22, 120, 3754, 15, 0, 4797, 664, 5, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 53, 53, 32, 32, 17, 17, 9, 7, 4, 19, 23, 1, 14, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Nepali/Devanagari/India
+ { 201, 66, 40, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 1523, 78, 10, 0,16134,16134,16134,16134, 83, 83, 493, 512, 0, 5, 22, 11, 3768, 15, 0, 4803, 4819, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 32, 8, 13, 5,110,110,110,110, 13, 13, 9, 8, 4, 17, 23, 4, 9, 5, 0, 16, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Ngiemboon/Latin/Cameroon
+ { 202, 66, 40, 870, 870, 881, 897, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 19, 20, 137, 103, 10, 0,16244,16244,16244,16244,16303,16303, 502, 520, 0, 5, 22, 11, 3777, 15, 0, 4826, 4831, 11, 11, 16, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 13, 5, 59, 59, 59, 59, 24, 24, 8, 13, 4, 17, 23, 4, 5, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Ngomba/Latin/Cameroon
+ { 203, 66, 169, 0, 0, 906, 915, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,16327,16327,16378,16378, 83, 83, 510, 533, 877, 5, 22, 124, 3782, 2, 0, 4838, 4852, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 51, 51, 32, 32, 13, 13, 9, 8, 8, 17, 23, 1, 14, 4, 0, 14, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nigerian Pidgin/Latin/Nigeria
+ { 204, 90, 102, 0, 0, 0, 0, 6, 0, 76, 2, 77, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,16410,16410,16470,16502,16536,16536, 519, 541, 0, 5, 22, 269, 3796, 15, 0, 4860, 4863, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 60, 60, 32, 34, 13, 13, 1, 1, 4, 17, 23, 1, 22, 5, 0, 3, 6, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Nko/Nko/Guinea
+ { 205, 4, 112, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 4869, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Northern Luri/Arabic/Iran
+ { 205, 4, 113, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 61, 76, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 43, 0, 15, 0, 4869, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 15, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 0, 5, 0, 11, 0, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Northern Luri/Arabic/Iraq
+ { 206, 66, 175, 0, 0, 351, 351, 6, 1, 9, 2, 3, 48, 5, 78, 15, 15, 17, 17, 163, 103, 10, 0,16549,16549,16623,16623,16655,16655, 520, 542, 0, 5, 22, 160, 3818, 4, 0, 4880, 4895, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 13, 5, 74, 74, 32, 32, 13, 13, 11, 13, 4, 17, 23, 2, 14, 5, 0, 15, 5, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Northern Sami/Latin/Norway
+ { 206, 66, 83, 0, 0, 351, 351, 6, 1, 9, 2, 3, 48, 5, 78, 15, 15, 17, 17, 113, 49, 10, 0,16668,16668,16737,16737,16757,16757, 531, 185, 0, 5, 22, 22, 405, 4, 0, 4880, 4900, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 13, 5, 69, 69, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 15, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Northern Sami/Latin/Finland
+ { 206, 66, 225, 0, 0, 351, 351, 6, 1, 9, 2, 3, 48, 5, 78, 15, 15, 17, 17, 163, 103, 10, 0,16549,16549,16623,16623,16655,16655, 520, 542, 0, 5, 22, 160, 3832, 4, 0, 4880, 4906, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 13, 5, 74, 74, 32, 32, 13, 13, 11, 13, 4, 17, 23, 2, 14, 5, 0, 15, 6, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Northern Sami/Latin/Sweden
+ { 207, 66, 216, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,16770,16770,16833,16833,16859,16859, 0, 0, 0, 5, 22, 9, 0, 2, 0, 4912, 4928, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 63, 63, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 16, 12, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Northern Sotho/Latin/South Africa
+ { 208, 66, 261, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,16872,16872,16921,16921,16948,16948, 0, 0, 0, 5, 22, 179, 3846, 2, 9, 4940, 2434, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 10, 8, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // North Ndebele/Latin/Zimbabwe
+ { 209, 66, 175, 0, 0, 289, 289, 6, 1, 9, 2, 3, 48, 5, 10, 11, 12, 16, 17, 698, 49, 10, 0, 4788, 4788,16961,16961, 4874, 4874, 168, 168, 0, 5, 22, 160, 3863, 15, 58, 4950, 4962, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 50, 50, 34, 34, 13, 13, 4, 4, 4, 17, 23, 2, 13, 5, 7, 12, 5, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Norwegian Bokmal/Latin/Norway
+ { 209, 66, 224, 0, 0, 289, 289, 6, 1, 9, 2, 3, 48, 5, 10, 11, 12, 16, 17, 698, 49, 10, 0, 4788, 4788,16961,16961, 4874, 4874, 168, 168, 0, 5, 22, 160, 3863, 15, 58, 4950, 4967, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 50, 50, 34, 34, 13, 13, 4, 4, 4, 17, 23, 2, 13, 5, 7, 12, 21, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Norwegian Bokmal/Latin/Svalbard and Jan Mayen
+ { 210, 66, 175, 0, 0, 289, 289, 6, 1, 9, 2, 3, 48, 5, 10, 11, 12, 16, 17, 698, 49, 502, 0,16995,16995,17045,17072, 4874, 4874, 533, 555, 0, 5, 22, 160, 3863, 4, 0, 4988, 5001, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 19, 5, 50, 50, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 13, 5, 0, 13, 5, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Norwegian Nynorsk/Latin/Norway
+ { 211, 66, 219, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 187, 521, 38,17099,17099,17177,17177,17214,17214, 537, 559, 0, 5, 22, 94, 0, 2, 9, 5006, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 15, 7, 78, 78, 37, 37, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 6, 9, 0, {83,83,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nuer/Latin/South Sudan
+ { 212, 66, 142, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 23, 38,17227,17227,17293,17293, 83, 83, 0, 0, 0, 5, 22, 0, 1521, 15, 0, 5015, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 66, 66, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 15, 5, 0, 6, 0, {77,87,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nyanja/Latin/Malawi
+ { 213, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 4053, 4053, 4126, 4126, 4153, 4153, 0, 0, 0, 5, 22, 147, 805, 2, 0, 5021, 983, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 73, 73, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 10, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Nyankole/Latin/Uganda
+ { 214, 66, 84, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 11, 12, 1555, 79, 10, 536,17320,17320,17320,17320,17376,17376, 0, 0, 376, 232, 249, 22, 405, 0, 45, 5031, 807, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 7, 13, 6, 56, 56, 56, 56, 20, 20, 2, 2, 6, 17, 23, 1, 4, 4, 6, 7, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Occitan/Latin/France
+ { 214, 66, 220, 0, 0, 414, 414, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 79, 99, 1,17396,17396,17453,17453,17480,17480, 0, 0, 376, 232, 249, 22, 405, 0, 0, 5031, 5038, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 14, 4, 57, 57, 27, 27, 13, 13, 2, 2, 6, 17, 23, 1, 4, 4, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Occitan/Latin/Spain
+ { 215, 91, 110, 0, 0, 923, 931, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 61, 76,17493,17493,17546,17546,17578,17578, 0, 0, 885, 5, 22, 120, 3876, 2, 9, 5045, 5050, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 53, 53, 32, 32, 17, 17, 2, 2, 5, 17, 23, 1, 12, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Odia/Odia/India
+ { 220, 66, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 23, 38,17595,17595,17649,17649, 83, 83, 539, 561, 0, 5, 22, 1, 3888, 2, 0, 5054, 5060, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 17, 4, 0, 6, 10, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Oromo/Latin/Ethiopia
+ { 220, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 10, 0,17595,17595,17649,17649,17676,17676, 539, 561, 0, 5, 22, 176, 0, 2, 0, 5054, 5070, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 6, 8, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Oromo/Latin/Kenya
+ { 221, 101, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 61, 76,17689,17689,17689,17689, 83,17869, 0, 0, 0, 5, 22, 10, 0, 15, 0, 5078, 964, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7,180,180,180,180, 13, 20, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 13, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Osage/Osage/United States
+ { 222, 27, 90, 0, 0, 938, 938, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 1576, 49, 10, 0,17889,17949,18009,18036,18063,18063, 541, 563, 0, 5, 22, 0, 3905, 15, 0, 5090, 5094, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 13, 5, 60, 60, 27, 27, 13, 13, 15, 15, 4, 17, 23, 1, 3, 5, 0, 4, 11, {71,69,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ossetic/Cyrillic/Georgia
+ { 222, 27, 193, 0, 0, 938, 938, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 1576, 49, 10, 0,17889,17949,18009,18036,18063,18063, 541, 563, 0, 5, 22, 133, 3908, 15, 0, 5090, 5105, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 13, 5, 60, 60, 27, 27, 13, 13, 15, 15, 4, 17, 23, 1, 3, 5, 0, 4, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ossetic/Cyrillic/Russia
+ { 226, 66, 62, 0, 0, 143, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 394, 10, 0,18076,18076,18076,18076,18138,18138, 0, 0, 0, 5, 22, 0, 3911, 15, 0, 5111, 5121, 6, 6, 7, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 62, 62, 20, 20, 2, 2, 4, 17, 23, 0, 6, 5, 0, 10, 6, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Papiamento/Latin/Curacao
+ { 226, 66, 13, 0, 0, 143, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 394, 10, 0,18076,18076,18076,18076,18138,18138, 0, 0, 0, 5, 22, 0, 3917, 15, 0, 5111, 1227, 6, 6, 7, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 62, 62, 20, 20, 2, 2, 4, 17, 23, 0, 15, 5, 0, 10, 5, {65,87,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Papiamento/Latin/Aruba
+ { 227, 4, 1, 661, 661, 947, 956, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 1599, 505, 99, 1,18158,18158,18158,18158, 83, 83, 556, 578, 890, 5, 22, 270, 3932, 2, 9, 5127, 5131, 6, 6, 9, 8, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 20, 8, 14, 4, 38, 38, 38, 38, 13, 13, 4, 4, 5, 17, 23, 1, 6, 4, 6, 4, 9, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Pashto/Arabic/Afghanistan
+ { 227, 4, 178, 661, 661, 947, 956, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 1599, 505, 61, 76,18158,18158,18158,18158, 83, 83, 556, 578, 890, 5, 22, 196, 3938, 2, 9, 5127, 5140, 6, 6, 9, 8, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 20, 8, 15, 7, 38, 38, 38, 38, 13, 13, 4, 4, 5, 17, 23, 2, 15, 4, 6, 4, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Pashto/Arabic/Pakistan
+ { 228, 4, 112, 964, 964, 971, 979, 67, 21, 22, 23, 40, 82, 37, 44, 11, 12, 19, 20, 113, 505, 99, 1,18196,18196,18196,18196,18244,18244, 560, 582, 798, 5, 22, 271, 3953, 103, 109, 5147, 4674, 7, 7, 8, 7, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 16, 8, 14, 4, 48, 48, 48, 48, 13, 13, 9, 8, 4, 17, 23, 4, 10, 6, 8, 5, 5, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Persian/Arabic/Iran
+ { 228, 4, 1, 964, 964, 971, 979, 67, 21, 22, 23, 40, 82, 37, 44, 11, 12, 19, 20, 113, 505, 99, 1,18196,18196,18196,18196,18244,18244, 560, 582, 798, 5, 22, 270, 3963, 15, 109, 5152, 5131, 7, 7, 8, 7, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 16, 8, 14, 4, 48, 48, 48, 48, 13, 13, 9, 8, 4, 17, 23, 1, 16, 5, 8, 3, 9, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Persian/Arabic/Afghanistan
+ { 230, 66, 187, 0, 0, 143, 143, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 11, 12, 0, 50, 10, 0,18257,18257,18315,18315,18348,18361, 0, 0, 311, 5, 22, 275, 3979, 4, 20, 5155, 5161, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 9, 13, 5, 58, 58, 33, 33, 13, 13, 2, 2, 5, 17, 23, 2, 12, 5, 7, 6, 6, {80,76,78}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Polish/Latin/Poland
+ { 231, 66, 32, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 186, 10, 0,18374,18374,18452,18452,18486,18486, 0, 0, 0, 5, 22, 9, 3991, 15, 0, 5167, 5176, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 13, 5, 78, 78, 34, 34, 13, 13, 2, 2, 5, 17, 23, 2, 15, 5, 0, 9, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Portuguese/Latin/Brazil
+ { 231, 66, 7, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 255, 4006, 4, 20, 5167, 5182, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 2, 15, 5, 7, 9, 6, {65,79,65}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Portuguese/Latin/Angola
+ { 231, 66, 43, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 243, 4021, 4, 20, 5167, 5188, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 20, 5, 7, 9, 10, {67,86,69}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Cape Verde
+ { 231, 66, 73, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 11, 4041, 4, 20, 5167, 5198, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 4, 17, 5, 7, 9, 16, {88,65,70}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Equatorial Guinea
+ { 231, 66, 101, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 127, 4058, 4, 20, 5167, 5214, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 5, 18, 5, 7, 9, 12, {88,79,70}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Guinea-Bissau
+ { 231, 66, 138, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 22, 405, 4, 20, 5167, 5226, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 4, 5, 7, 9, 10, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Luxembourg
+ { 231, 66, 139, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 23, 38,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 151, 4076, 4, 20, 5167, 5236, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 4, 15, 5, 7, 9, 19, {77,79,80}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Macao
+ { 231, 66, 160, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 261, 4091, 4, 20, 5167, 5255, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 19, 5, 7, 9, 10, {77,90,78}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Mozambique
+ { 231, 66, 188, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 22, 405, 4, 20, 5265, 5282, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 4, 5, 7, 17, 8, {69,85,82}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Portugal
+ { 231, 66, 204, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 277, 4110, 4, 20, 5167, 5290, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 2, 28, 5, 7, 9, 19, {83,84,78}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Sao Tome and Principe
+ { 231, 66, 226, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 0, 4138, 4, 20, 5167, 5309, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 0, 12, 5, 7, 9, 5, {67,72,70}, 2, 0, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Switzerland
+ { 231, 66, 232, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 179, 4150, 4, 20, 5167, 5314, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 24, 5, 7, 9, 11, {85,83,68}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Timor-Leste
+ { 232, 66, 187, 0, 0, 986, 986, 6, 1, 9, 2, 3, 4, 5, 10, 13, 14, 13, 14, 1619, 49, 10, 0,18547,18547,18615,18615,18642,18642, 577, 598, 0, 5, 22, 275, 0, 4, 0, 5325, 5334, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 68, 68, 27, 27, 13, 13, 10, 14, 4, 17, 23, 2, 0, 5, 0, 9, 4, {80,76,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Prussian/Latin/Poland
+ { 233, 41, 110, 0, 0, 994, 994, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76,18655,18655,18711,18711,18746,18746, 587, 612, 895, 5, 22, 120, 4174, 15, 0, 5338, 5344, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 56, 56, 35, 35, 22, 22, 6, 6, 4, 17, 23, 1, 11, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Punjabi/Gurmukhi/India
+ { 233, 4, 178, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 786, 186, 61, 76,18768,18768,18768,18768, 83, 83, 0, 0, 0, 5, 22, 78, 4185, 15, 0, 5348, 5140, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 10, 15, 7, 36, 36, 36, 36, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 6, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Punjabi/Arabic/Pakistan
+ { 234, 66, 184, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 23, 38,18804,18804,18856,18856,18883,18883, 168, 168, 0, 5, 22, 279, 4191, 15, 0, 5354, 5362, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 11, 5, 0, 8, 4, {80,69,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Quechua/Latin/Peru
+ { 234, 66, 28, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 23, 38,18804,18804,18856,18856,18883,18883, 168, 168, 0, 5, 22, 281, 4202, 15, 0, 5354, 5366, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 9, 5, 0, 8, 7, {66,79,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Quechua/Latin/Bolivia
+ { 234, 66, 70, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 23, 38,18804,18804,18856,18856,18883,18883, 168, 168, 0, 5, 22, 10, 4211, 15, 0, 5354, 5373, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 15, 5, 0, 8, 7, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Quechua/Latin/Ecuador
+ { 235, 66, 192, 0, 0, 1003, 1003, 6, 1, 0, 2, 3, 4, 5, 10, 13, 15, 11, 12, 0, 49, 10, 0,18896,18896,18943,18943, 6778, 6778, 168, 168, 899, 5, 22, 283, 4226, 4, 20, 5380, 5386, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 47, 47, 33, 33, 13, 13, 4, 4, 4, 17, 23, 3, 12, 5, 7, 6, 7, {82,79,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Romanian/Latin/Romania
+ { 235, 66, 154, 0, 0, 1003, 1003, 6, 1, 0, 2, 3, 4, 5, 10, 13, 15, 11, 12, 0, 49, 10, 0,18896,18896,18976,18976,19003,19003, 168, 168, 899, 5, 22, 18, 4238, 4, 20, 5380, 5393, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 47, 47, 27, 27, 15, 15, 4, 4, 4, 17, 23, 1, 15, 5, 7, 6, 17, {77,68,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Romanian/Latin/Moldova
+ { 236, 66, 226, 0, 0, 414, 414, 6, 0, 17, 2, 3, 48, 5, 10, 11, 12, 19, 20, 1646, 394, 10, 0,19018,19018,19073,19073,19095,19095, 0, 0, 0, 5, 22, 0, 4253, 4, 0, 5410, 5419, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 13, 5, 55, 55, 22, 22, 13, 13, 2, 2, 5, 17, 23, 0, 13, 5, 0, 9, 6, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Romansh/Latin/Switzerland
+ { 237, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,19108,19108,19172,19172,14208,14208, 593, 618, 0, 5, 22, 121, 4266, 2, 0, 5425, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 64, 64, 28, 28, 13, 13, 8, 7, 4, 17, 23, 3, 18, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Rombo/Latin/Tanzania
+ { 238, 66, 38, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 15, 15, 17, 17, 113, 129, 10, 0,19200,19200,19288,19288, 83, 83, 601, 625, 0, 5, 22, 182, 4284, 0, 0, 5434, 5442, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 88, 88, 33, 33, 13, 13, 5, 5, 4, 17, 23, 3, 20, 4, 0, 8, 8, {66,73,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Rundi/Latin/Burundi
+ { 239, 27, 193, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 133, 4304, 4, 0, 5450, 5457, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 16, 5, 0, 7, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Russia
+ { 239, 27, 22, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 1, 4320, 4, 0, 5450, 618, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 2, 17, 5, 0, 7, 8, {66,89,78}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Belarus
+ { 239, 27, 123, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 244, 4337, 4, 0, 5450, 5463, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 15, 5, 0, 7, 9, {75,90,84}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Kazakhstan
+ { 239, 27, 128, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 251, 4352, 4, 0, 5450, 5472, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 3, 14, 5, 0, 7, 8, {75,71,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Kyrgyzstan
+ { 239, 27, 154, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 18, 4366, 4, 0, 5450, 5480, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 14, 5, 0, 7, 7, {77,68,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Moldova
+ { 239, 27, 244, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 286, 4380, 4, 0, 5450, 5487, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 17, 5, 0, 7, 7, {85,65,72}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Russian/Cyrillic/Ukraine
+ { 240, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,13800,13800,13861,13861, 1284, 1284, 430, 446, 0, 5, 22, 121, 3492, 0, 0, 5494, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 6, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Rwa/Latin/Tanzania
+ { 241, 66, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 59, 78, 23, 38,19415,19415,19470,19470,19497,19497, 0, 0, 0, 5, 22, 6, 0, 2, 0, 5500, 34, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 7, 55, 55, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 4, 7, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Saho/Latin/Eritrea
+ { 242, 27, 193, 0, 0, 1011, 1011, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 1669, 344, 10, 0,19510,19510,19580,19580,19600,19600, 606, 630, 903, 908, 22, 133, 4397, 4, 0, 5504, 5513, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 6, 13, 5, 70, 70, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 20, 5, 0, 9, 9, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sakha/Cyrillic/Russia
+ { 243, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,19613,19613,19717,19717,19744,19744, 608, 632, 0, 5, 22, 176, 4417, 2, 9, 5522, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5,104,104, 27, 27, 13, 13, 7, 5, 4, 17, 23, 3, 18, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Samburu/Latin/Kenya
+ { 245, 66, 46, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 10, 0,19757,19757,19822,19822,19849,19849, 615, 637, 0, 5, 22, 11, 4435, 2, 65, 5530, 5535, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 65, 65, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 18, 4, 5, 5, 22, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Sango/Latin/Central African Republic
+ { 246, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,19862,19862,19921,19921,19948,19948, 617, 639, 0, 5, 22, 121, 4453, 0, 0, 5557, 5566, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 27, 27, 13, 13, 9, 9, 4, 17, 23, 3, 18, 4, 0, 9, 9, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Sangu/Latin/Tanzania
+ { 247, 29, 110, 0, 0, 1022, 1032, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76,19961,19961, 8574, 8574, 8605, 8605, 484, 505, 0, 5, 22, 120, 4471, 15, 0, 5575, 5587, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 66, 66, 31, 31, 18, 18, 9, 7, 4, 17, 23, 1, 15, 5, 0, 12, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Sanskrit/Devanagari/India
+ { 248, 93, 110, 0, 0, 0, 0, 6, 0, 1, 2, 84, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76,20027,20027,20068,20068,20093,20093, 626, 648, 0, 5, 22, 120, 4486, 15, 0, 5592, 5599, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 41, 41, 25, 25, 13, 13, 5, 5, 4, 17, 23, 1, 16, 5, 0, 7, 6, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Santali/Ol Chiki/India
+ { 248, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 120, 0, 15, 0, 5605, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 8, 0, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Santali/Devanagari/India
+ { 249, 66, 117, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 1699, 186, 10, 0,20106,20106,20160,20160,20187,20187, 0, 0, 0, 5, 22, 22, 4502, 4, 0, 5613, 813, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 10, 13, 5, 54, 54, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 5, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sardinian/Latin/Italy
+ { 251, 66, 160, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 10, 0,20200,20200,20254,20254,20281,20281, 0, 0, 0, 5, 22, 261, 4506, 0, 0, 5618, 5255, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 21, 4, 0, 4, 10, {77,90,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Sena/Latin/Mozambique
+ { 252, 27, 207, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20294,20294,20345,20345, 2891, 2891, 0, 0, 925, 5, 22, 0, 4527, 4, 20, 5622, 5628, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 51, 51, 27, 27, 13, 13, 2, 2, 7, 17, 23, 0, 12, 5, 7, 6, 6, {82,83,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Serbia
+ { 252, 27, 29, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0, 2809, 2809, 2864, 2864, 2891, 2891, 104, 653, 925, 5, 22, 137, 4539, 4, 20, 5622, 713, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 55, 55, 27, 27, 13, 13, 11, 8, 7, 17, 23, 2, 40, 5, 7, 6, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Bosnia and Herzegovina
+ { 252, 27, 126, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20294,20294,20345,20345, 2891, 2891, 0, 0, 925, 5, 22, 22, 4579, 4, 20, 5622, 5634, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 51, 51, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Kosovo
+ { 252, 27, 157, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20372,20372,20345,20345, 2891, 2891, 104, 653, 925, 5, 22, 22, 4579, 4, 20, 5622, 5640, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 54, 54, 27, 27, 13, 13, 11, 8, 7, 17, 23, 1, 4, 5, 7, 6, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Montenegro
+ { 252, 66, 29, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0, 2699, 2699, 2756, 2756, 2783, 2783, 631, 661, 218, 5, 22, 135, 597, 4, 20, 5649, 686, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 57, 57, 27, 27, 13, 13, 11, 8, 7, 17, 23, 2, 40, 5, 7, 6, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Bosnia and Herzegovina
+ { 252, 66, 126, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20426,20426,20479,20479, 2783, 2783, 0, 0, 218, 5, 22, 22, 4583, 4, 20, 5649, 5655, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 53, 53, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Kosovo
+ { 252, 66, 157, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20506,20506,20479,20479, 2783, 2783, 631, 661, 218, 5, 22, 22, 4583, 4, 20, 5649, 5661, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 56, 56, 27, 27, 13, 13, 11, 8, 7, 17, 23, 1, 4, 5, 7, 6, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Montenegro
+ { 252, 66, 207, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20426,20426,20479,20479, 2783, 2783, 0, 0, 218, 5, 22, 0, 4587, 4, 20, 5649, 5670, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 53, 53, 27, 27, 13, 13, 2, 2, 7, 17, 23, 0, 12, 5, 7, 6, 6, {82,83,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Serbia
+ { 253, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,20562,20562,20624,20624,20651,20651, 642, 669, 0, 5, 22, 121, 4599, 0, 0, 5676, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 27, 27, 13, 13, 5, 8, 4, 17, 23, 3, 20, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Shambala/Latin/Tanzania
+ { 254, 66, 261, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 15, 15, 17, 17, 163, 103, 10, 0,20664,20664,20718,20718,20745,20745, 0, 0, 0, 5, 22, 179, 4619, 2, 9, 5685, 2434, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 15, 4, 6, 8, 8, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Shona/Latin/Zimbabwe
+ { 255, 141, 50, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,20758,20758,20785,20785,20805,20805, 647, 677, 0, 5, 22, 150, 0, 15, 0, 5693, 5696, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 3, 2, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sichuan Yi/Yi/China
+ { 256, 66, 117, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,20818,20818,20818,20818, 83, 83, 0, 0, 0, 5, 22, 22, 0, 15, 0, 5698, 3728, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 62, 62, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 9, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sicilian/Latin/Italy
+ { 257, 66, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 59, 78, 23, 38,20880,20880,20930,20930,20957,20957, 0, 0, 0, 5, 22, 1, 0, 2, 0, 5707, 5718, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 7, 50, 50, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 4, 0, 11, 11, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Sidamo/Latin/Ethiopia
+ { 258, 66, 187, 0, 0, 143, 143, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 12, 11, 0, 49, 10, 0,20970,20970,21030,21030,13193,13193, 649, 679, 311, 5, 22, 275, 0, 15, 0, 5729, 5161, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 60, 60, 27, 27, 13, 13, 11, 11, 5, 17, 23, 2, 0, 5, 0, 7, 6, {80,76,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Silesian/Latin/Poland
+ { 259, 4, 178, 0, 0, 1041, 1049, 67, 21, 22, 23, 25, 26, 28, 59, 14, 15, 16, 17, 549, 103, 61, 76,21057,21057,21057,21057,21091,21091, 660, 690, 932, 938, 22, 196, 4634, 4, 0, 5736, 5740, 6, 6, 8, 7, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 18, 10, 15, 7, 34, 34, 34, 34, 30, 30, 11, 11, 6, 25, 23, 2, 12, 5, 0, 4, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Sindhi/Arabic/Pakistan
+ { 259, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 61, 76,21121,21148,21189,21211,21239,21239, 671, 701, 0, 5, 22, 120, 4646, 15, 0, 5747, 664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 27, 41, 22, 28, 20, 20, 8, 6, 4, 17, 23, 1, 17, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Sindhi/Devanagari/India
+ { 260, 119, 221, 0, 0, 1056, 1065, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 212, 212,21259,21259,21320,21320,21358,21358, 679, 707, 963, 968, 22, 287, 4663, 2, 9, 5753, 5758, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 61, 61, 38, 38, 18, 18, 5, 4, 5, 42, 23, 3, 17, 4, 6, 5, 11, {76,75,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sinhala/Sinhala/Sri Lanka
+ { 261, 66, 83, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 22, 0, 15, 0, 5769, 5779, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 10, 12, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Skolt Sami/Latin/Finland
+ { 262, 66, 212, 0, 0, 781, 282, 6, 1, 9, 2, 3, 4, 5, 6, 13, 14, 18, 16, 698, 423, 11, 1,21376,21376,21427,21427,21447,21447, 0, 0, 311, 5, 22, 22, 405, 4, 20, 5791, 5801, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 4, 51, 51, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 7, 10, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Slovak/Latin/Slovakia
+ { 263, 66, 213, 0, 0, 1073, 1073, 6, 1, 0, 2, 3, 48, 5, 6, 13, 14, 18, 16, 404, 423, 10, 0,21460,21460,21511,21511,21545,21545, 172, 711, 50, 5, 22, 22, 4680, 4, 20, 5810, 5821, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 51, 51, 34, 34, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 7, 11, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Slovenian/Latin/Slovenia
+ { 264, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,21558,21558,21622,21622,21656,21656, 684, 715, 0, 5, 22, 147, 2829, 4, 0, 5830, 3330, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 64, 64, 34, 34, 13, 13, 6, 6, 4, 17, 23, 3, 19, 5, 0, 7, 7, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Soga/Latin/Uganda
+ { 265, 66, 215, 0, 0, 1081, 1081, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 23, 38,21669,21669,21715,21715,21746,21746, 690, 721, 1010, 1016, 22, 93, 4684, 2, 9, 5837, 5845, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 1, 20, 4, 6, 8, 10, {83,79,83}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Somali/Latin/Somalia
+ { 265, 66, 67, 0, 0, 1081, 1081, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 23, 38,21669,21669,21715,21715,21746,21746, 690, 721, 1010, 1016, 22, 3, 4704, 2, 9, 5837, 5855, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 3, 13, 4, 6, 8, 7, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // Somali/Latin/Djibouti
+ { 265, 66, 77, 0, 0, 1081, 1081, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 23, 38,21669,21669,21715,21715,21746,21746, 690, 721, 1010, 1016, 22, 1, 4717, 2, 9, 5837, 5862, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 2, 15, 4, 6, 8, 8, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Somali/Latin/Ethiopia
+ { 265, 66, 124, 0, 0, 1081, 1081, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 10, 0,21669,21669,21715,21715,21746,21746, 690, 721, 1010, 1016, 22, 176, 4732, 2, 9, 5837, 1307, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 3, 15, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Somali/Latin/Kenya
+ { 266, 4, 112, 0, 0, 0, 0, 67, 21, 22, 23, 25, 26, 28, 59, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 5870, 0, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Southern Kurdish/Arabic/Iran
+ { 266, 4, 113, 0, 0, 0, 0, 67, 21, 22, 23, 25, 26, 28, 59, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 5870, 0, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Southern Kurdish/Arabic/Iraq
+ { 267, 66, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 160, 0, 15, 0, 5881, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 19, 0, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Southern Sami/Latin/Sweden
+ { 267, 66, 175, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 160, 0, 15, 0, 5881, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 19, 0, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Southern Sami/Latin/Norway
+ { 268, 66, 216, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,21760,21760,21820,21820, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 4912, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 60, 60, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 7, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Southern Sotho/Latin/South Africa
+ { 268, 66, 133, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 23, 38,21760,21760,21820,21820, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 4912, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 60, 60, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 7, 0, {90,65,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Southern Sotho/Latin/Lesotho
+ { 269, 66, 216, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,21846,21846,21911,21911, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 4940, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 65, 65, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 10, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // South Ndebele/Latin/South Africa
+ { 270, 66, 220, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 99, 1,21937,21937,21989,21989,18883,18883, 132, 128, 0, 5, 22, 22, 405, 4, 0, 5900, 455, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 14, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 4, 5, 0, 17, 6, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Spain
+ { 270, 66, 11, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 4747, 15, 58, 5900, 5917, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 14, 5, 7, 7, 9, {65,82,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Argentina
+ { 270, 66, 24, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 10, 0,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 10, 4761, 2, 0, 5900, 5926, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 13, 5, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 14, 4, 0, 7, 6, {66,90,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Belize
+ { 270, 66, 28, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 281, 4775, 2, 0, 5900, 5366, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 2, 9, 4, 0, 7, 7, {66,79,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Bolivia
+ { 270, 66, 32, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 10, 0,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 9, 4784, 2, 0, 5900, 5176, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 13, 5, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 2, 14, 4, 0, 7, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Brazil
+ { 270, 66, 42, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 99, 1,21937,21937,21989,21989,18883,18883, 132, 128, 0, 5, 22, 22, 405, 4, 0, 5900, 5932, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 14, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 4, 5, 0, 7, 8, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Canary Islands
+ { 270, 66, 47, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 99, 1,21937,21937,21989,21989,18883,18883, 132, 128, 0, 5, 22, 22, 405, 4, 0, 5900, 5940, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 14, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 4, 5, 0, 7, 15, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Ceuta and Melilla
+ { 270, 66, 49, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 394, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 4798, 2, 65, 5900, 5955, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 12, 4, 5, 7, 5, {67,76,80}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Chile
+ { 270, 66, 54, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 79, 23, 38,21937,21937,21989,21989, 9387,22016, 132, 128, 0, 5, 22, 10, 4810, 15, 0, 5900, 5960, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 15, 5, 0, 7, 8, {67,79,80}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Colombia
+ { 270, 66, 59, 0, 0, 68, 68, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 290, 4825, 2, 0, 5900, 5968, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 19, 4, 0, 7, 10, {67,82,67}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Costa Rica
+ { 270, 66, 61, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 10, 4844, 2, 0, 5900, 5978, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 11, 4, 0, 7, 4, {67,85,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Cuba
+ { 270, 66, 69, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 291, 4855, 2, 9, 5900, 5982, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 3, 15, 4, 6, 7, 20, {68,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Dominican Republic
+ { 270, 66, 70, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 4870, 2, 65, 5900, 5373, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 20, 4, 5, 7, 7, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Ecuador
+ { 270, 66, 72, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 4870, 2, 0, 5900, 6002, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 20, 4, 0, 7, 11, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/El Salvador
+ { 270, 66, 73, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 99, 1,21937,21937,21989,21989,18883,18883, 132, 128, 0, 5, 22, 11, 4890, 2, 0, 5900, 6013, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 14, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 4, 28, 4, 0, 7, 17, {88,65,70}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Equatorial Guinea
+ { 270, 66, 99, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 79, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 246, 4918, 2, 0, 5900, 6030, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 7, 4, 0, 7, 9, {71,84,81}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Guatemala
+ { 270, 66, 106, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1730, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 18, 4925, 2, 0, 5900, 6039, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 17, 4, 0, 7, 8, {72,78,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Honduras
+ { 270, 66, 130, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 0, 0, 2, 0, 6047, 6070, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 0, 0, 4, 0, 23, 13, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Latin America
+ { 270, 66, 152, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 78, 23, 38,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 10, 4942, 2, 0, 6083, 6100, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 13, 4, 0, 17, 6, {77,88,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Mexico
+ { 270, 66, 168, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 294, 4955, 2, 0, 5900, 6106, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 2, 20, 4, 0, 7, 9, {78,73,79}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Nicaragua
+ { 270, 66, 181, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 1121, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 296, 4975, 2, 0, 5900, 6115, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 3, 15, 4, 0, 7, 6, {80,65,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Panama
+ { 270, 66, 183, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 299, 4990, 15, 86, 5900, 6121, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 3, 17, 5, 6, 7, 8, {80,89,71}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Paraguay
+ { 270, 66, 184, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 79, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 279, 5007, 15, 0, 5900, 5362, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 2, 11, 5, 0, 7, 4, {80,69,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Peru
+ { 270, 66, 185, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989,18883,18883, 132, 128, 0, 5, 22, 146, 5018, 4, 0, 5900, 6129, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 13, 5, 0, 7, 9, {80,72,80}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Spanish/Latin/Philippines
+ { 270, 66, 189, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 1121, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 4870, 2, 0, 5900, 2080, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 20, 4, 0, 7, 11, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Puerto Rico
+ { 270, 66, 248, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 10, 4870, 2, 0, 5900, 6138, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 20, 4, 0, 7, 14, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/United States
+ { 270, 66, 250, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 5031, 15, 58, 5900, 6152, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 13, 5, 7, 7, 7, {85,89,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Uruguay
+ { 270, 66, 254, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 302, 5044, 2, 65, 5900, 6159, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 4, 16, 4, 5, 7, 9, {86,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Venezuela
+ { 271, 135, 159, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 15, 113, 129, 10, 0,22029,22029,22076,22076, 83, 83, 692, 723, 0, 5, 22, 0, 5060, 0, 0, 6168, 6176, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 47, 47, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 8, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Standard Moroccan Tamazight/Tifinagh/Morocco
+ { 272, 66, 111, 0, 0, 1090, 1103, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 213, 213,22105,22105,22148,22148, 9291, 9291, 0, 0, 0, 5, 22, 186, 5074, 2, 0, 6182, 1776, 6, 6, 13, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 4, 43, 43, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 15, 4, 0, 10, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Sundanese/Latin/Indonesia
+ { 273, 66, 230, 0, 0, 566, 566, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 1198, 1198, 1198, 1198, 83, 83, 0, 0, 749, 1033, 22, 121, 3492, 15, 0, 6192, 2268, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 20, 5, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swahili/Latin/Tanzania
+ { 273, 66, 57, 0, 0, 566, 566, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 1198, 1198, 1198, 1198, 83, 83, 0, 0, 749, 1033, 22, 11, 5089, 15, 0, 6192, 6201, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 2, 16, 5, 0, 9, 32, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swahili/Latin/Congo - Kinshasa
+ { 273, 66, 124, 0, 0, 566, 566, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 1198, 1198, 1198, 1198, 83, 83, 0, 0, 749, 1033, 22, 176, 991, 15, 0, 6192, 1307, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 17, 5, 0, 9, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Swahili/Latin/Kenya
+ { 273, 66, 243, 0, 0, 566, 566, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 1198, 1198, 1198, 1198, 83, 83, 0, 0, 749, 1033, 22, 147, 5105, 15, 0, 6192, 983, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 18, 5, 0, 9, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Swahili/Latin/Uganda
+ { 274, 66, 216, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,22175,22175,22242,22242, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 6233, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 67, 67, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 7, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Swati/Latin/South Africa
+ { 274, 66, 76, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 23, 38,22175,22175,22242,22242, 83, 83, 0, 0, 0, 5, 22, 155, 0, 2, 0, 6233, 6240, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 67, 67, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 7, 8, {83,90,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swati/Latin/Eswatini
+ { 275, 66, 225, 0, 0, 1115, 1115, 6, 1, 9, 2, 3, 48, 5, 63, 15, 15, 17, 17, 113, 103, 10, 0,22268,22268,22317,22317, 4874, 4874, 698, 731, 0, 5, 22, 160, 5123, 4, 0, 6248, 6255, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 13, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 2, 12, 5, 0, 7, 7, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swedish/Latin/Sweden
+ { 275, 66, 2, 0, 0, 1115, 1115, 6, 1, 9, 2, 3, 48, 5, 63, 15, 15, 17, 17, 113, 103, 10, 0,22268,22268,22317,22317, 4874, 4874, 698, 731, 0, 5, 22, 22, 405, 4, 0, 6248, 6262, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 13, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 7, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swedish/Latin/Aland Islands
+ { 275, 66, 83, 0, 0, 1115, 1115, 6, 1, 9, 2, 3, 48, 5, 63, 15, 15, 17, 17, 113, 103, 10, 0,22268,22268,22317,22317, 4874, 4874, 698, 731, 0, 5, 22, 22, 405, 4, 0, 6248, 1698, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 13, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swedish/Latin/Finland
+ { 276, 66, 226, 0, 0, 463, 463, 6, 0, 17, 2, 3, 48, 5, 10, 11, 12, 19, 20, 404, 49, 10, 0,22345,22345,22407,22407, 4510, 4510, 700, 733, 0, 5, 22, 0, 5135, 4, 0, 6267, 6267, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 0, 16, 5, 0, 16, 7, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swiss German/Latin/Switzerland
+ { 276, 66, 84, 0, 0, 463, 463, 6, 0, 17, 2, 3, 48, 5, 10, 11, 12, 19, 20, 404, 49, 10, 0,22345,22345,22407,22407, 4510, 4510, 700, 733, 0, 5, 22, 22, 83, 4, 0, 6267, 6283, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 1, 4, 5, 0, 16, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swiss German/Latin/France
+ { 276, 66, 136, 0, 0, 463, 463, 6, 0, 17, 2, 3, 48, 5, 10, 11, 12, 19, 20, 404, 49, 10, 0,22345,22345,22407,22407, 4510, 4510, 700, 733, 0, 5, 22, 0, 5135, 4, 0, 6267, 6293, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 0, 16, 5, 0, 16, 13, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swiss German/Latin/Liechtenstein
+ { 277, 123, 113, 1124, 1124, 1124, 1124, 6, 0, 1, 2, 3, 4, 5, 10, 15, 14, 17, 16, 1757, 395, 61, 76,22434,22434,22486,22486,22515,22515, 712, 744, 1084, 5, 22, 0, 0, 15, 0, 6306, 6312, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 15, 7, 52, 52, 29, 29, 13, 13, 4, 4, 4, 17, 23, 0, 0, 5, 0, 6, 4, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Syriac/Syriac/Iraq
+ { 277, 123, 227, 1124, 1124, 1124, 1124, 6, 0, 1, 2, 3, 4, 5, 10, 15, 14, 17, 16, 1757, 395, 61, 76,22434,22434,22486,22486,22515,22515, 712, 744, 1084, 5, 22, 99, 0, 15, 0, 6306, 6316, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 15, 7, 52, 52, 29, 29, 13, 13, 4, 4, 4, 17, 23, 5, 0, 5, 0, 6, 5, {83,89,80}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Syriac/Syriac/Syria
+ { 278, 135, 159, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 15, 113, 129, 10, 0,22528,22528,22076,22076, 83, 83, 692, 723, 0, 5, 22, 0, 5060, 0, 0, 6321, 6176, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 46, 46, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 7, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tachelhit/Tifinagh/Morocco
+ { 278, 66, 159, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 15, 113, 129, 10, 0,22574,22574,22621,22621, 83, 83, 716, 748, 0, 5, 22, 0, 5151, 0, 0, 6328, 6338, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 47, 47, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 10, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tachelhit/Latin/Morocco
+ { 280, 127, 255, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 306, 0, 15, 0, 6344, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 4, 0, {86,78,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Tai Dam/Tai Viet/Vietnam
+ { 281, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,22650,22650,22754,22754,22781,22781, 722, 756, 0, 5, 22, 176, 991, 2, 9, 6348, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5,104,104, 27, 27, 13, 13, 10, 10, 4, 17, 23, 3, 17, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Taita/Latin/Kenya
+ { 282, 27, 229, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 12, 11, 16, 17, 786, 78, 10, 0,22794,22794,22848,22848,22875,22875, 0, 0, 0, 5, 22, 307, 5165, 4, 0, 6355, 6361, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 6, 5, 0, 6, 10, {84,74,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tajik/Cyrillic/Tajikistan
+ { 283, 129, 110, 0, 0, 1130, 1130, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 127, 127,22888,22888,22936,22936,22974,22974, 0, 766, 1088, 5, 22, 120, 5171, 2, 9, 6371, 6376, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 48, 48, 38, 38, 19, 19, 2, 8, 7, 17, 23, 1, 13, 4, 6, 5, 7, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Tamil/Tamil/India
+ { 283, 129, 143, 0, 0, 1130, 1130, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 127, 127,22888,22888,22936,22936,22974,22974, 0, 766, 1088, 5, 22, 192, 5184, 2, 9, 6371, 6383, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 48, 48, 38, 38, 19, 19, 2, 8, 7, 17, 23, 2, 17, 4, 6, 5, 7, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tamil/Tamil/Malaysia
+ { 283, 129, 210, 0, 0, 1130, 1130, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 127, 127,22888,22888,22936,22936,22974,22974, 0, 766, 1088, 5, 22, 10, 5201, 2, 9, 6371, 6390, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 48, 48, 38, 38, 19, 19, 2, 8, 7, 17, 23, 1, 17, 4, 6, 5, 11, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tamil/Tamil/Singapore
+ { 283, 129, 221, 0, 0, 1130, 1130, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 10, 0,22888,22888,22936,22936,22974,22974, 0, 766, 1088, 5, 22, 311, 5218, 2, 9, 6371, 6401, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 5, 48, 48, 38, 38, 19, 19, 2, 8, 7, 17, 23, 3, 13, 4, 6, 5, 6, {76,75,82}, 2, 1, 1, 6, 7, 1, 2, 3 }, // Tamil/Tamil/Sri Lanka
+ { 284, 66, 228, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 103, 23, 38,22993,22993,23164,23164,23191,23191, 0, 0, 0, 5, 22, 314, 5231, 15, 0, 6407, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 15, 7,171,171, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 11, 5, 0, 12, 0, {84,87,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Taroko/Latin/Taiwan
+ { 285, 66, 170, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,11682,11682,11735,11735,11762,11762, 732, 774, 0, 5, 22, 127, 3285, 0, 0, 6419, 6432, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 53, 53, 27, 27, 13, 13, 8, 10, 4, 17, 23, 5, 16, 4, 0, 13, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Tasawaq/Latin/Niger
+ { 286, 27, 193, 0, 0, 1143, 1143, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1775, 49, 11, 1,23204,23204,23259,23259,23294,23294, 0, 0, 0, 5, 22, 133, 5242, 4, 0, 6437, 5457, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 12, 4, 55, 55, 35, 35, 13, 13, 2, 2, 4, 17, 23, 1, 11, 5, 0, 5, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tatar/Cyrillic/Russia
+ { 287, 131, 110, 0, 0, 1152, 1152, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1798, 394, 61, 76,23307,23307,23366,23366,23397,23397, 0, 0, 1095, 1102, 22, 120, 5253, 2, 9, 6442, 6448, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 59, 59, 31, 31, 17, 17, 2, 2, 7, 29, 23, 1, 14, 4, 6, 6, 8, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Telugu/Telugu/India
+ { 288, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,23414,23414,23482,23482,23509,23509, 740, 784, 0, 5, 22, 147, 5267, 2, 9, 6456, 983, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 68, 68, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 21, 4, 6, 6, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Teso/Latin/Uganda
+ { 288, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,23414,23414,23482,23482,23509,23509, 740, 784, 0, 5, 22, 176, 5288, 2, 9, 6456, 6462, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 68, 68, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 20, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Teso/Latin/Kenya
+ { 289, 133, 231, 24, 24, 1163, 1171, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1816, 129, 542, 0,23522,23522,23589,23589,23611,23611, 749, 790, 1131, 5, 22, 317, 5308, 2, 9, 6467, 6467, 5, 5, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 6, 31, 5, 67, 67, 22, 22, 15, 15, 10, 10, 4, 17, 23, 1, 3, 4, 6, 3, 3, {84,72,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Thai/Thai/Thailand
+ { 290, 134, 50, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1835, 103, 10, 0,23626,23626,23704,23704,23754,23754, 759, 800, 0, 5, 22, 150, 5311, 15, 0, 6470, 6478, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 78, 78, 50, 50, 26, 26, 7, 8, 4, 17, 23, 1, 6, 5, 0, 8, 6, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tibetan/Tibetan/China
+ { 290, 134, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1835, 103, 61, 76,23626,23626,23704,23704,23754,23754, 759, 800, 0, 5, 22, 120, 5317, 15, 0, 6470, 6484, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 15, 7, 78, 78, 50, 50, 26, 26, 7, 8, 4, 17, 23, 1, 12, 5, 0, 8, 7, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Tibetan/Tibetan/India
+ { 291, 33, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1858, 78, 61, 76,23780,23780,23820,23820,23846,23846, 0, 0, 0, 5, 22, 6, 0, 2, 0, 6491, 671, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 8, 15, 7, 40, 40, 26, 26, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 3, 4, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tigre/Ethiopic/Eritrea
+ { 292, 33, 77, 38, 38, 1178, 1178, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 14, 15, 1879, 78, 61, 76,23859,23859,23887,23887,23907,23907, 766, 808, 0, 5, 22, 1, 112, 2, 0, 6494, 143, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 15, 7, 28, 28, 20, 20, 13, 13, 4, 4, 4, 17, 23, 2, 2, 4, 0, 4, 5, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tigrinya/Ethiopic/Ethiopia
+ { 292, 33, 74, 38, 38, 1178, 1178, 6, 0, 1, 2, 3, 4, 5, 10, 16, 17, 14, 15, 1879, 78, 61, 76,23859,23859,23887,23887,23907,23907, 766, 808, 0, 5, 22, 6, 5329, 2, 0, 6494, 671, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 15, 7, 28, 28, 20, 20, 13, 13, 4, 4, 4, 17, 23, 3, 3, 4, 0, 4, 4, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tigrinya/Ethiopic/Eritrea
+ { 294, 66, 182, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 787, 78, 573, 589,23920,23920,23964,23964, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 6498, 6507, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 16, 8, 44, 44, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 9, 13, {80,71,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tok Pisin/Latin/Papua New Guinea
+ { 295, 66, 235, 1185, 1185, 1185, 1185, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 23, 38,23991,23991,24050,24050,24078,24078, 770, 812, 1135, 1140, 1199, 205, 5332, 15, 0, 6520, 2283, 8, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 59, 59, 28, 28, 13, 13, 10, 6, 5, 59, 65, 2, 17, 5, 0, 13, 5, {84,79,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tongan/Latin/Tonga
+ { 296, 66, 216, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,24091,24091,24162,24162, 83, 83, 0, 0, 0, 5, 22, 9, 0, 15, 0, 6533, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 71, 71, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 8, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tsonga/Latin/South Africa
+ { 297, 66, 216, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,24188,24188,24251,24251, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 6541, 6549, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 63, 63, 31, 31, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 8, 13, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tswana/Latin/South Africa
+ { 297, 66, 30, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,24188,24188,24251,24251, 83, 83, 0, 0, 0, 5, 22, 153, 0, 2, 0, 6541, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 63, 63, 31, 31, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 8, 0, {66,87,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tswana/Latin/Botswana
+ { 298, 66, 239, 0, 0, 1193, 1193, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1896, 50, 10, 0,24282,24282,24335,24335,24362,24362, 780, 818, 185, 5, 22, 126, 5349, 2, 9, 6562, 6568, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 13, 5, 53, 53, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 11, 4, 6, 6, 7, {84,82,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Turkish/Latin/Turkey
+ { 298, 66, 63, 0, 0, 1193, 1193, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1896, 50, 23, 38,24282,24282,24335,24335,24362,24362, 780, 818, 185, 5, 22, 22, 83, 2, 9, 6562, 6575, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 15, 7, 53, 53, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 4, 6, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Turkish/Latin/Cyprus
+ { 299, 66, 240, 0, 0, 1201, 1201, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 14, 15, 1896, 49, 10, 0,24375,24428,24481,24508,24535,24535, 782, 820, 1264, 5, 22, 0, 5360, 4, 0, 6581, 6593, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 53, 53, 27, 27, 13, 13, 13, 14, 4, 17, 23, 0, 14, 5, 0, 12, 12, {84,77,84}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Turkmen/Latin/Turkmenistan
+ { 301, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 155, 10, 0,24548,24548,24589,24589, 83, 83, 0, 0, 0, 5, 22, 124, 5374, 15, 0, 6605, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 41, 41, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 5, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tyap/Latin/Nigeria
+ { 303, 27, 244, 0, 0, 117, 117, 6, 1, 9, 2, 3, 4, 5, 85, 11, 12, 13, 14, 1912, 49, 10, 0,24616,24671, 3049, 3049, 4289, 4289, 795, 834, 1268, 841, 22, 286, 5378, 4, 0, 6610, 6620, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 13, 5, 55, 55, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 17, 5, 0, 10, 7, {85,65,72}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ukrainian/Cyrillic/Ukraine
+ { 304, 66, 91, 0, 0, 781, 781, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 180, 11, 597,24726,24726,24778,24778,24805,24805, 402, 836, 1273, 5, 22, 22, 405, 4, 0, 6627, 6642, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 12, 52, 52, 27, 27, 13, 13, 9, 9, 5, 17, 23, 1, 4, 5, 0, 15, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Upper Sorbian/Latin/Germany
+ { 305, 4, 178, 661, 661, 1209, 1219, 6, 0, 1, 2, 3, 35, 37, 10, 15, 14, 17, 16, 1934, 129, 61, 76,24818,24818,24818,24818, 83, 83, 0, 0, 1278, 1282, 22, 196, 5395, 2, 9, 6648, 5140, 6, 6, 10, 9, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 18, 6, 15, 7, 35, 35, 35, 35, 13, 13, 2, 2, 4, 20, 23, 2, 14, 4, 6, 4, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Urdu/Arabic/Pakistan
+ { 305, 4, 110, 661, 661, 1209, 1219, 6, 21, 22, 2, 40, 35, 41, 44, 15, 14, 17, 16, 1934, 129, 61, 76,24818,24818,24818,24818, 83, 83, 0, 0, 1278, 1282, 22, 120, 5409, 2, 9, 6648, 6652, 6, 6, 10, 9, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 6, 15, 7, 35, 35, 35, 35, 13, 13, 2, 2, 4, 20, 23, 1, 12, 4, 6, 4, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Urdu/Arabic/India
+ { 306, 4, 50, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 12, 11, 20, 19, 1952, 103, 10, 0,24853,24853,24907,24907,24927,24927, 797, 845, 0, 5, 22, 145, 5421, 2, 9, 6657, 6665, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 54, 54, 20, 20, 13, 13, 12, 12, 4, 17, 23, 1, 11, 4, 6, 8, 5, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Uyghur/Arabic/China
+ { 307, 66, 251, 0, 0, 1228, 1228, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 17, 16, 1969, 78, 99, 0,24940,24940,25000,25000,25031,25031, 360, 857, 185, 5, 22, 318, 5432, 2, 9, 6670, 6676, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 14, 5, 60, 60, 31, 31, 13, 13, 2, 2, 4, 17, 23, 4, 17, 4, 6, 6, 11, {85,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Uzbek/Latin/Uzbekistan
+ { 307, 4, 1, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 1987, 505, 99, 1,18196,18196,25044,25044, 83, 83, 0, 0, 0, 5, 22, 270, 3963, 4, 0, 6687, 5131, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 33, 8, 14, 4, 48, 48, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 6, 9, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Uzbek/Arabic/Afghanistan
+ { 307, 27, 251, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1008, 78, 98, 0,25064,25064,25116,25116,25143,25143, 809, 859, 0, 5, 22, 322, 5449, 4, 0, 6693, 6700, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 5, 52, 52, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 14, 5, 0, 7, 10, {85,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Uzbek/Cyrillic/Uzbekistan
+ { 308, 139, 134, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 61, 76,25156,25156,25156,25156, 83, 83, 0, 0, 0, 5, 22, 10, 5463, 2, 9, 6710, 6712, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 29, 29, 29, 29, 13, 13, 2, 2, 4, 17, 23, 1, 8, 4, 6, 2, 4, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Vai/Vai/Liberia
+ { 308, 66, 134, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38,25185,25185,25185,25185, 83, 83, 0, 0, 0, 5, 22, 10, 5471, 2, 9, 6716, 6719, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 47, 47, 47, 47, 13, 13, 2, 2, 4, 17, 23, 1, 13, 4, 6, 3, 8, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Vai/Latin/Liberia
+ { 309, 66, 216, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,25232,25232,25301,25301, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 6727, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 69, 69, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 9, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Venda/Latin/South Africa
+ { 310, 66, 255, 0, 0, 1236, 1236, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 10, 0,25327,25327,25381,25381,25413,25413, 811, 861, 0, 5, 22, 306, 5484, 4, 0, 6736, 6746, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 5, 54, 54, 32, 32, 20, 20, 2, 2, 4, 17, 23, 1, 13, 5, 0, 10, 8, {86,78,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Vietnamese/Latin/Vietnam
+ { 311, 66, 258, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2020, 103, 10, 0,25433,25433,25475,25495,25522,25522, 0, 0, 0, 5, 22, 0, 0, 15, 0, 6754, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 42, 42, 20, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 7, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Volapuk/Latin/world
+ { 312, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,13800,13800,13861,13861, 1284, 1284, 430, 446, 0, 5, 22, 121, 3492, 2, 0, 6761, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 8, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Vunjo/Latin/Tanzania
+ { 313, 66, 23, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 22, 0, 15, 0, 6769, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 5, 0, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Walloon/Latin/Belgium
+ { 314, 66, 226, 0, 0, 463, 463, 6, 1, 17, 2, 3, 4, 5, 10, 11, 12, 19, 20, 404, 103, 10, 0,25535,25535,25587,25587,25614,25614, 0, 0, 0, 5, 22, 0, 0, 15, 0, 6774, 6780, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 13, 5, 52, 52, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 6, 6, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Walser/Latin/Switzerland
+ { 315, 66, 15, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 241, 0, 15, 0, 6786, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 8, 0, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Warlpiri/Latin/Australia
+ { 316, 66, 246, 0, 0, 1244, 1255, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 78, 10, 0,25627,25627,25703,25731,25760,25760, 813, 863, 1302, 5, 22, 94, 5497, 2, 9, 6794, 6801, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 76, 76, 28, 29, 14, 14, 2, 2, 7, 17, 23, 1, 12, 4, 6, 7, 16, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Welsh/Latin/United Kingdom
+ { 317, 4, 178, 661, 661, 971, 979, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 196, 5509, 15, 0, 6817, 0, 6, 6, 8, 7, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 13, 5, 0, 14, 0, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Western Balochi/Arabic/Pakistan
+ { 317, 4, 1, 661, 661, 971, 979, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 270, 5522, 15, 0, 6817, 0, 6, 6, 8, 7, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 17, 5, 0, 14, 0, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Western Balochi/Arabic/Afghanistan
+ { 317, 4, 112, 661, 661, 971, 979, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 271, 5539, 15, 0, 6817, 0, 6, 6, 8, 7, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 11, 5, 0, 14, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Western Balochi/Arabic/Iran
+ { 317, 4, 176, 661, 661, 971, 979, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 6817, 6831, 6, 6, 8, 7, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 14, 5, {79,77,82}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Western Balochi/Arabic/Oman
+ { 317, 4, 245, 661, 661, 971, 979, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 6817, 6836, 6, 6, 8, 7, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 14, 19, {65,69,68}, 2, 1, 6, 6, 7, 1, 3, 3 }, // Western Balochi/Arabic/United Arab Emirates
+ { 318, 66, 165, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 394, 10, 0,25774,25774,25827,25827, 83, 83, 0, 0, 0, 5, 22, 22, 83, 15, 58, 6855, 6860, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 53, 53, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 7, 5, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Western Frisian/Latin/Netherlands
+ { 319, 33, 77, 0, 0, 0, 0, 6, 0, 17, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2043, 78, 61, 76,25847,25847,25847,25847,25873,25873, 0, 0, 0, 5, 22, 1, 105, 2, 0, 6868, 143, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 15, 7, 26, 26, 26, 26, 13, 13, 2, 2, 4, 17, 23, 2, 9, 4, 0, 5, 5, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Wolaytta/Ethiopic/Ethiopia
+ { 320, 66, 206, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2065, 394, 10, 0,25886,25886,25935,25935,25935,25935, 732, 865, 0, 5, 22, 127, 5550, 15, 0, 6873, 2999, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 49, 49, 27, 27, 27, 27, 3, 3, 4, 17, 23, 5, 29, 5, 0, 5, 8, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Wolof/Latin/Senegal
+ { 321, 66, 216, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 10, 0,25962,25962,26022,26049,26078,26098, 0, 0, 0, 5, 22, 9, 5579, 2, 0, 6878, 6886, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 5, 60, 60, 27, 29, 20, 21, 2, 2, 4, 17, 23, 1, 25, 4, 0, 8, 15, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Xhosa/Latin/South Africa
+ { 322, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 129, 10, 0,26119,26119,26189,26189,26209,26209, 815, 868, 0, 5, 22, 11, 0, 4, 20, 6901, 6907, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 70, 70, 20, 20, 13, 13, 8, 8, 4, 17, 23, 4, 0, 5, 7, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Yangben/Latin/Cameroon
+ { 323, 47, 244, 0, 0, 1265, 1265, 6, 0, 1, 2, 3, 4, 5, 10, 15, 15, 17, 17, 2082, 78, 10, 0,26222,26222,26222,26222, 83, 83, 823, 876, 0, 5, 22, 286, 0, 15, 0, 6914, 6920, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 13, 5, 53, 53, 53, 53, 13, 13, 11, 10, 4, 17, 23, 1, 0, 5, 0, 6, 9, {85,65,72}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Yiddish/Hebrew/Ukraine
+ { 324, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2101, 129, 10, 1,26275,26318,26386,26386,26418,26418, 834, 886, 1309, 1320, 22, 124, 5604, 2, 9, 6929, 6939, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 3, 43, 68, 32, 32, 13, 13, 5, 5, 11, 37, 23, 1, 14, 4, 6, 10, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Yoruba/Latin/Nigeria
+ { 324, 66, 25, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2101, 129, 10, 1,26431,26474,26542,26542,26574,26574, 839, 891, 1357, 1320, 22, 127, 5618, 2, 9, 6929, 6947, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 3, 43, 68, 32, 32, 13, 13, 5, 5, 11, 37, 23, 5, 26, 4, 6, 10, 6, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Yoruba/Latin/Benin
+ { 325, 66, 170, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,26587,26587,11735,11735,26639,26639, 732, 774, 0, 5, 22, 127, 3285, 0, 0, 6953, 6432, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 52, 52, 27, 27, 13, 13, 8, 10, 4, 17, 23, 5, 16, 4, 0, 10, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Zarma/Latin/Niger
+ { 326, 66, 50, 0, 0, 1274, 1274, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,26652,26652,26652,26652, 83, 83, 844, 896, 0, 5, 22, 150, 5644, 15, 0, 6963, 6972, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 89, 89, 89, 89, 13, 13, 7, 12, 4, 17, 23, 1, 10, 5, 0, 9, 8, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Zhuang/Latin/China
+ { 327, 66, 216, 0, 0, 1285, 1294, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 10, 0,26741,26741,26814,26814,26841,26841, 0, 0, 0, 5, 22, 9, 5654, 2, 9, 6980, 6987, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 5, 73, 73, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 20, 4, 6, 7, 17, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Zulu/Latin/South Africa
+ { 328, 66, 32, 0, 0, 1302, 1302, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2117, 186, 10, 0,26854,26854,26940,26940,26974,26974, 0, 0, 1368, 5, 22, 9, 5674, 15, 0, 7004, 7011, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 86, 86, 34, 34, 20, 20, 2, 2, 7, 17, 23, 2, 12, 5, 0, 7, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kaingang/Latin/Brazil
+ { 329, 66, 32, 0, 0, 1311, 1311, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,26994,26994,27058,27058,27085,27085, 0, 0, 1375, 5, 22, 9, 5686, 15, 0, 7017, 7025, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 64, 64, 27, 27, 13, 13, 2, 2, 8, 17, 23, 2, 15, 5, 0, 8, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Nheengatu/Latin/Brazil
+ { 329, 66, 54, 0, 0, 1311, 1311, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38,26994,26994,27058,27058,27085,27085, 132, 128, 1375, 5, 22, 10, 5701, 15, 0, 7031, 7038, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 64, 64, 27, 27, 13, 13, 5, 5, 8, 17, 23, 1, 17, 5, 0, 7, 8, {67,79,80}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Nheengatu/Latin/Colombia
+ { 329, 66, 254, 0, 0, 1311, 1311, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38,26994,26994,27058,27058,27085,27085, 132, 128, 1375, 5, 22, 302, 5718, 15, 0, 7031, 7046, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 64, 64, 27, 27, 13, 13, 5, 5, 8, 17, 23, 4, 22, 5, 0, 7, 9, {86,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Nheengatu/Latin/Venezuela
+ { 330, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 163, 103, 61, 76,27098,27098,27098,27098, 83, 83, 851, 83, 0, 5, 22, 120, 0, 15, 0, 7055, 664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 54, 54, 54, 54, 13, 13, 4, 4, 4, 17, 23, 1, 0, 5, 0, 8, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Haryanvi/Devanagari/India
+ { 331, 66, 91, 0, 0, 915, 915, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 404, 78, 10, 0,27152,27152,27208,27208, 83, 83, 0, 0, 0, 5, 22, 22, 83, 15, 0, 7063, 7073, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 10, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Northern Frisian/Latin/Germany
+ { 332, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 163, 103, 61, 76, 8522, 8522, 8522, 8522, 83, 83, 855, 908, 0, 5, 22, 120, 0, 15, 0, 7082, 664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 52, 52, 52, 52, 13, 13, 5, 4, 4, 17, 23, 1, 0, 5, 0, 9, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Rajasthani/Devanagari/India
+ { 333, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 133, 0, 15, 0, 7091, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 0, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Moksha/Cyrillic/Russia
+ { 334, 66, 258, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,27235,27235,27235,27235, 83, 83, 860, 912, 0, 5, 22, 0, 0, 2, 0, 7103, 7112, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 90, 90, 90, 90, 13, 13, 12, 12, 4, 17, 23, 0, 0, 4, 0, 9, 6, {0,0,0}, 2, 1, 1, 6, 7, 1, 2, 2 }, // Toki Pona/Latin/world
+ { 335, 66, 214, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,27325,27325,27325,27325, 83, 83, 0, 0, 0, 5, 22, 10, 0, 15, 0, 7118, 7123, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 46, 46, 46, 46, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 5, 13, {83,66,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Pijin/Latin/Solomon Islands
+ { 336, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 124, 0, 15, 0, 7136, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 5, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Obolo/Latin/Nigeria
+ { 337, 4, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 367, 383,27371,27371,27417,27417, 83, 83, 0, 0, 0, 5, 22, 196, 5395, 15, 0, 7141, 5140, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 16, 8, 46, 46, 24, 24, 13, 13, 2, 2, 4, 17, 23, 2, 13, 5, 0, 5, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Baluchi/Arabic/Pakistan
+ { 337, 66, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 573, 589,27441,27441,27511,27511, 83, 83, 0, 0, 0, 5, 22, 196, 5740, 15, 0, 7146, 7153, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 16, 8, 70, 70, 26, 26, 13, 13, 2, 2, 4, 17, 23, 2, 14, 5, 0, 7, 8, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Baluchi/Latin/Pakistan
+ { 338, 66, 117, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 2140, 78, 10, 0,27537,27537,27591,27591,27625,27625, 0, 0, 0, 5, 22, 22, 405, 4, 20, 7161, 3728, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 8, 13, 5, 54, 54, 34, 34, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ligurian/Latin/Italy
+ { 339, 142, 161, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 1, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 134, 0, 15, 0, 7167, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 4, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 18, 0, {77,77,75}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Rohingya/Hanifi/Myanmar
+ { 339, 142, 20, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 61, 76, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 132, 0, 15, 0, 7167, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 18, 0, {66,68,84}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Rohingya/Hanifi/Bangladesh
+ { 340, 4, 178, 1321, 1321, 1326, 1335, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1934, 129, 61, 76,27638,27638,27638,27638,27695,27695, 0, 0, 1278, 1282, 22, 196, 5395, 15, 0, 7185, 5140, 5, 5, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 57, 57, 57, 57, 13, 13, 2, 2, 4, 20, 23, 2, 14, 5, 0, 7, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Torwali/Arabic/Pakistan
+ { 341, 66, 25, 0, 0, 566, 566, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 2161, 2178, 10, 0,27708,27708,27766,27766,27800,27800, 872, 924, 0, 5, 22, 127, 5754, 15, 86, 7192, 7203, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 58, 58, 34, 34, 20, 20, 13, 13, 4, 17, 23, 5, 33, 5, 6, 11, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Anii/Latin/Benin
+ { 342, 29, 110, 0, 0, 1343, 1353, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76,27820,27820,27872,27872,27905,27905, 885, 937, 0, 5, 22, 120, 5787, 2, 0, 7208, 664, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 52, 52, 33, 33, 18, 18, 6, 11, 4, 17, 23, 1, 14, 4, 0, 7, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Kangri/Devanagari/India
+ { 343, 66, 117, 0, 0, 414, 414, 6, 1, 68, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 78, 10, 0,27923,27923,27967,27967,27625,27625, 0, 0, 0, 5, 22, 155, 405, 117, 0, 7215, 3728, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 44, 44, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 4, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Venetian/Latin/Italy
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0,0,0}, 0, 0, 0, 0, 0, 0, 0, 0 } // trailing zeros
};
-static const char16_t list_pattern_part_data[] = {
-0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x3b, 0x25, 0x31, 0x20, 0x65, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x68,
-0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x1363, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x648, 0x25, 0x32, 0x61b, 0x25, 0x31, 0x20, 0x587, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x986, 0x9f0, 0x9c1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x259, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x65, 0x74, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x98f, 0x9ac, 0x982, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xf51,
-0xf44, 0xf0b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x68, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0x25, 0x32, 0x25, 0x31, 0x1014, 0x103e, 0x1004, 0x1037, 0x103a, 0x20, 0x25, 0x32, 0x104a, 0x25, 0x31, 0x20, 0x456,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x200b, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x69, 0x20, 0x25, 0x32, 0x25, 0x31, 0x3001, 0x25, 0x32, 0x25, 0x31, 0x548c, 0x25, 0x32, 0x25, 0x31,
-0x53ca, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6f, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0x6b, 0x61, 0x6a, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6a, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x74, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x10d3, 0x10d0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x3ba,
-0x3b1, 0x3b9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x61, 0x6d, 0x6d, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xa85,
-0xaa8, 0xac7, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d5, 0x25, 0x32, 0x25,
-0x31, 0x2c, 0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xe9,
-0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x64, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61, 0x6e,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6c, 0x61,
-0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6c, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xcae, 0xca4, 0xccd,
-0xca4, 0xcc1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436,
-0x4d9, 0x43d, 0x435, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436, 0x430, 0x43d, 0x430, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xbc0f,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xfb, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xec1, 0xea5, 0xeb0, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x75, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6d, 0x70, 0xe9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69,
-0x72, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x20, 0xd0e, 0xd28, 0xd4d, 0xd28, 0xd3f, 0xd35, 0x25, 0x31, 0x20,
-0xd15, 0xd42, 0xd1f, 0xd3e, 0xd24, 0xd46, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x75, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0x75, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x906, 0x923, 0x93f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xb13, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xb13, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x60c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x627, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627, 0x648,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x200f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xa05, 0xa24, 0xa47, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x219, 0x69, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x4d5, 0x43c, 0x4d5, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x6fd, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x6fd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xdc3, 0xdc4,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0xa0, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x69, 0x79, 0x6f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x79, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6e, 0x61, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x6f, 0x63, 0x68, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xbae, 0xbb1, 0xbcd, 0xbb1, 0xbc1, 0xbae,
-0xbcd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x4bb, 0x4d9, 0x43c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xc2e, 0xc30, 0xc3f, 0xc2f,
-0xc41, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x6d, 0x6f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x77, 0x65,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x627, 0x648, 0x631, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627, 0x648, 0x631, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0xe0, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x2c, 0x20, 0x61, 0x28, 0x63, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x28, 0x63, 0x29, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x5d0, 0x5d5, 0x5df, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31, 0x20,
-0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6b, 0x70,
-0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61,
-0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x6b, 0x6b, 0x65,
-0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6b, 0x6b, 0x65, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x13a0,
-0x13b4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x13a0, 0x13b4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438, 0x486, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0x61, 0x28, 0x6e, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x443, 0x43e, 0x43d, 0x43d, 0x430, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x2c, 0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x1e3f, 0x62, 0x25b, 0x6e,
-0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x70, 0x254, 0x70, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0xd804, 0xdd03, 0xd804, 0xdd33, 0xd804, 0xdd03, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x62, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x540c,
-0x25, 0x32
+static constexpr char16_t list_pattern_part_data[] = {
+0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x3b, 0x25, 0x31, 0x2d, 0x438, 0x20,
+0x25, 0x32, 0x2d, 0x438, 0x25, 0x31, 0x20, 0x65, 0x6e, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x68, 0x65, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x1363, 0x20, 0x25, 0x32, 0x25, 0x31, 0x1363, 0x20,
+0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x12a5, 0x1293, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x648, 0x25, 0x32, 0x61b, 0x25, 0x31, 0x20, 0x79,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x587, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x986, 0x9f0, 0x9c1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x259,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x98f, 0x9ac, 0x982, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x65, 0x74, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x456, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x906, 0x930, 0x94b, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x906, 0x930, 0x94b, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x69, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x68, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x2d, 0x20, 0x25, 0x32, 0x25, 0x31, 0x1014, 0x103e, 0x1004, 0x1037, 0x103a, 0x20,
+0x25, 0x32, 0x104a, 0x25, 0x31, 0x3001, 0x25, 0x32, 0x25, 0x31, 0x540c, 0x25,
+0x32, 0x25, 0x31, 0x2c, 0x20, 0x75, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x75, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xd804, 0xdd03, 0xd804,
+0xdd33, 0xd804, 0xdd03, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x13a0, 0x13b4,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x13a0, 0x13b4, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x548c, 0x25, 0x32, 0x25, 0x31, 0x53ca, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x438, 0x486, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x442, 0x430, 0x442, 0x430,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0xe8, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0xa0, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x6f, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c,
+0x20, 0x924, 0x947, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x924, 0x947, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0xf51, 0xf44, 0xf0b, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x61, 0x6a,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6a, 0x61, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x2c, 0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20,
+0x6f, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x74, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x65, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x2e41, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2e41, 0x20, 0xd83a,
+0xdd2b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xd83a, 0xdd2b, 0x20, 0x25, 0x32,
+0x204f, 0x25, 0x31, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x10d3, 0x10d0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e,
+0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x3ba, 0x3b1, 0x3b9, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0xa85, 0xaa8, 0xac7, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x2c, 0x20, 0x64, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d5, 0x25, 0x32, 0x25, 0x31, 0x2c,
+0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x914, 0x930, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x75, 0x72, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x61, 0x75, 0x72, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0xe9, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x61, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x6e, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x2c, 0x20, 0x64, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64,
+0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6c, 0x61, 0x6e,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6c, 0x61, 0x6e, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x2c, 0x20, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x61, 0x6d, 0x6d, 0x61, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x60c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x62a,
+0x655, 0x6c1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x62a, 0x655, 0x6c1, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x924, 0x93f, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x924, 0x93f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436, 0x4d9,
+0x43d, 0x435, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x200b, 0x25, 0x32, 0x25,
+0x31, 0x20, 0xbc0f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xfb, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x436, 0x430, 0x43d, 0x430, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0xec1, 0xea5, 0xeb0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6d,
+0x70, 0xe9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x72, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61,
+0x28, 0x6e, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x25, 0x32,
+0x20, 0xd0e, 0xd28, 0xd4d, 0xd28, 0xd3f, 0xd35, 0x25, 0x31, 0x20, 0xd15, 0xd42,
+0xd1f, 0xd3e, 0xd24, 0xd46, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x75,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x985, 0x9ae, 0x9b8, 0x9c1, 0x982, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x906, 0x923, 0x93f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x14b, 0x301,
+0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x1e3f, 0x62, 0x25b,
+0x6e, 0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x70, 0x254, 0x70, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x6e,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x2c, 0x20, 0xb13, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xb13, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x4d5, 0x43c, 0x4d5, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x60c, 0x20, 0x627, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627,
+0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x200f, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x60c, 0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x648, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x62, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0xa05, 0xa24, 0xa47, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x219, 0x69,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x443, 0x43e, 0x43d, 0x43d, 0x430, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x924, 0x925, 0x93e, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x924, 0x925, 0x93e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c,
+0x20, 0x6fd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6fd, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x2c, 0x20, 0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x6e, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x2c, 0x20, 0x73, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x73, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x6f, 0x63, 0x68, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x718,
+0x25, 0x32, 0x25, 0x31, 0x20, 0xbae, 0xbb1, 0xbcd, 0xbb1, 0xbc1, 0xbae, 0xbcd,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x4bb, 0x4d9, 0x43c, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0xc2e, 0xc30, 0xc3f, 0xc2f, 0xc41, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0xe41, 0xe25, 0xe30,
+0x25, 0x32, 0x25, 0x31, 0x1295, 0x20, 0x25, 0x32, 0x1295, 0x25, 0x31, 0x20,
+0x6d, 0x6f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x65, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x77, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c,
+0x20, 0x627, 0x648, 0x631, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627, 0x648,
+0x631, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x61, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x76, 0xe0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20,
+0x61, 0x28, 0x63, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x28,
+0x63, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d0, 0x5d5, 0x5df, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x63, 0x61, 0x65, 0x75, 0x71, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x61, 0x72,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x73, 0x75, 0xed, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x60c, 0x25, 0x32, 0x25, 0x31, 0x20, 0x60c, 0x622, 0x6ba,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x622, 0x6ba, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x2c, 0x20, 0x915, 0x928, 0x947, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x915, 0x928, 0x947, 0x20, 0x25, 0x32
};
-static const char16_t single_character_data[] = {
-0x2e, 0x2c, 0x25, 0x30, 0x2d, 0x2b, 0x65, 0x22, 0x27, 0x45, 0x201c, 0x201d, 0x2018, 0x2019, 0xa0, 0xab, 0xbb, 0x2039, 0x203a, 0x66b,
-0x66c, 0x66a, 0x61c, 0x660, 0x61c, 0x2d, 0x61c, 0x2b, 0x627, 0x633, 0x200e, 0x25, 0x200e, 0x200e, 0x2d, 0x200e, 0x2b, 0x9e6, 0x2212, 0xf20,
-0x201e, 0x1040, 0x300c, 0x300d, 0x300e, 0x300f, 0x201a, 0xd7, 0x31, 0x30, 0x5e, 0x202f, 0x6f0, 0x200e, 0x2b, 0x200e, 0xd7, 0x6f1, 0x6f0, 0x5e,
-0x966, 0x200e, 0x2212, 0x415, 0xb7, 0x31, 0x30, 0x5e, 0x5a, 0xd804, 0xdd36, 0x200f, 0x2d, 0x200f, 0x2b
+static constexpr char16_t single_character_data[] = {
+0x2e, 0x2c, 0x25, 0x30, 0x2d, 0x2b, 0x65, 0x22, 0x27, 0xa0, 0x45, 0xab,
+0xbb, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2039, 0x203a, 0x66b, 0x66c, 0x66a,
+0x61c, 0x660, 0x61c, 0x2d, 0x61c, 0x2b, 0x623, 0x633, 0x200e, 0x25, 0x200e, 0x200e,
+0x2d, 0x200e, 0x2b, 0x9e6, 0x6f0, 0x200e, 0x2b, 0x200e, 0xd7, 0x6f1, 0x6f0, 0x5e,
+0x2212, 0x966, 0x1040, 0x300c, 0x300d, 0x300e, 0x300f, 0x200f, 0x2d, 0x200f, 0x2b, 0x627,
+0x633, 0xd804, 0xdd36, 0xd7, 0x31, 0x30, 0x5e, 0xf20, 0x202f, 0x2e41, 0xd83a, 0xdd50,
+0xd83a, 0xdd09, 0x12c8, 0xabf0, 0x60c, 0x7c0, 0xb7, 0x31, 0x30, 0x5e, 0x200e, 0x2212,
+0x1c50, 0x415
};
-static const char16_t date_format_data[] = {
-0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x20, 0x4d,
-0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c,
-0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x4d, 0x4d, 0x2d, 0x64, 0x64,
-0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
-0x64, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x64,
-0x64, 0x64, 0x64, 0x60c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x200f, 0x2f, 0x4d,
-0x200f, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x569, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64,
-0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79,
-0x79, 0x28, 0x27, 0x65, 0x27, 0x29, 0x27, 0x6b, 0x6f, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x72, 0x65, 0x6e, 0x27,
-0x20, 0x64, 0x28, 0x27, 0x61, 0x27, 0x29, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2f, 0x4d, 0x2f, 0x64, 0x64,
-0x2f, 0x4d, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf63, 0xf7c, 0xf0b, 0x79,
-0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0xf5a, 0xf7a, 0xf66, 0xf0b, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x433, 0x27, 0x2e, 0x64, 0x2e, 0x4d,
-0x4d, 0x2e, 0x79, 0x79, 0x20, 0x27, 0x433, 0x27, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x104a, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
-0x64, 0x104a, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79,
-0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d, 0x2f, 0x64, 0x64, 0x2f,
-0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x20, 0x64, 0x64, 0x64, 0x64,
-0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64,
-0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79,
-0x2e, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
-0x64, 0x64, 0x20, 0x27, 0x64, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
-0x79, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79, 0x79,
-0x79, 0x4d, 0x2f, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
-0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x64, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
-0x79, 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x27, 0x6d, 0x68, 0x27,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64,
-0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
-0x64, 0x2c, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64,
-0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
-0x20, 0x5d1, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x4d,
-0x4d, 0x20, 0x64, 0x2e, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20,
-0x64, 0x64, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x20, 0x27, 0x6c, 0x65, 0x27, 0x20, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x436, 0x27, 0x2e, 0x20, 0x64,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x27, 0x436, 0x27, 0x2e,
-0x2c, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0xb144, 0x20,
-0x4d, 0xc6d4, 0x20, 0x64, 0xc77c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x64, 0x2e, 0x64,
-0x64, 0x64, 0x64, 0x20, 0xe97, 0xeb5, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
-0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x27, 0x67, 0x61, 0x64, 0x61, 0x27, 0x20, 0x64, 0x2e, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x6d, 0x27, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64,
-0x20, 0x27, 0x64, 0x27, 0x2e, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x4d, 0x4d, 0x4d,
-0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x74, 0x61,
-0x27, 0x2019, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x43e, 0x43d,
-0x44b, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x44b, 0x43d, 0x27, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x20,
-0x27, 0x433, 0x430, 0x440, 0x430, 0x433, 0x27, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x4d, 0x4d, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x64, 0x20, 0x62f, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x62f, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64,
-0x64, 0x2c, 0x20, 0x27, 0x69, 0x6c, 0x73, 0x27, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e,
-0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c,
-0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x430, 0x437, 0x27, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64,
-0x64, 0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65,
-0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
-0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x435, 0x43b, 0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xe17,
-0xe35, 0xe48, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0xf60, 0xf72, 0xf0b, 0xf5a, 0xf7a, 0xf66, 0xf0b, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x64, 0x1363, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x1218, 0x12d3, 0x120d, 0x1272, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79,
-0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x440, 0x27, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x60c,
-0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
-0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x646, 0x686, 0x6cc, 0x20,
-0x6cc, 0x6cc, 0x644, 0x20, 0x64, 0x20, 0x646, 0x686, 0x6cc, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x20,
-0x6a9, 0x648, 0x646, 0x6cc, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x27,
-0x2e, 0x20, 0x64, 0x27, 0x69, 0x64, 0x27, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x2c, 0x20,
-0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x5d8, 0x5df, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79,
-0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64,
-0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x61, 0x6c, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x6c, 0x69, 0x61, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
-0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
-0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27,
-0x64, 0x69, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0xe4, 0x27, 0x20, 0x64,
-0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x43b, 0x27, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27,
-0x441, 0x44b, 0x43b, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x43a, 0x4af, 0x43d, 0x44d, 0x27, 0x2c, 0x20,
-0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x2c,
-0x20, 0x27, 0x6c, 0x79, 0x25b, 0x27, 0x30c, 0x2bc, 0x20, 0x64, 0x20, 0x27, 0x6e, 0x61, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
-0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x6d, 0x65,
-0x74, 0x74, 0x61, 0x73, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79
+static constexpr char16_t date_format_data[] = {
+0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x448, 0x27,
+0x2e, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x64,
+0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64,
+0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f,
+0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2d,
+0x4d, 0x4d, 0x2d, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2f, 0x4d,
+0x2f, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x79,
+0x79, 0x2f, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64,
+0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f,
+0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x60c, 0x20, 0x64, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x200f, 0x2f,
+0x4d, 0x200f, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x569, 0x2e,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2d, 0x4d, 0x2d, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79,
+0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79,
+0x28, 0x27, 0x65, 0x27, 0x29, 0x27, 0x6b, 0x6f, 0x27, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x27, 0x72, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x28, 0x27, 0x61,
+0x27, 0x29, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2f, 0x4d,
+0x2f, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x202f, 0x27, 0x433, 0x27, 0x2e,
+0x64, 0x64, 0x64, 0x64, 0x1361, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x20, 0x130d, 0x122d, 0x130b, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
+0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64,
+0x2c, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79,
+0x79, 0x79, 0x2e, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x2e, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e,
+0x4d, 0x2e, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79,
+0x202f, 0x27, 0x433, 0x27, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x104a, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x104a, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79,
+0x79, 0x79, 0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x20, 0x64, 0x64, 0x64,
+0x64, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d, 0x2f, 0x64, 0x79, 0x79, 0x79,
+0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
+0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27,
+0x64, 0x65, 0x6c, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
+0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x4d, 0x2f, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64,
+0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x43b,
+0x27, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x79, 0x79, 0x79, 0x79,
+0x2e, 0x4d, 0x4d, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x202f,
+0x27, 0x4ab, 0x27, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64,
+0xe4, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x27, 0x75, 0x27, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79,
+0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20,
+0x27, 0x64, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
+0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf63,
+0xf7c, 0xf0b, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0xf5a, 0xf7a, 0xf66, 0xf0b, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
+0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d, 0x4d,
+0x2f, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x6c, 0x61,
+0x27, 0x20, 0x64, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x65, 0x27,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
+0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27,
+0x6c, 0x69, 0x61, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x4d,
+0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20,
+0x27, 0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64,
+0x61, 0x6c, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64,
+0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2e41, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x27, 0x6d, 0x68, 0x27,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
+0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x1365, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x1218, 0x12d3, 0x120d, 0x1275, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x64, 0x20, 0x5d1, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x64, 0x2e, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79,
+0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20, 0x64, 0x64, 0x2e, 0x64, 0x64, 0x64,
+0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2e, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x27, 0x6c, 0x65, 0x27,
+0x20, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x2f, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27,
+0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x69,
+0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x202f, 0x27, 0x436, 0x27,
+0x2e, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64,
+0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0xb144, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
+0x20, 0x64, 0xc77c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2e, 0x20,
+0x4d, 0x2e, 0x20, 0x64, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
+0x27, 0xea, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x61, 0x27, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x27, 0x61, 0x6e, 0x27, 0x79, 0x79, 0x79, 0x79,
+0x2d, 0x27, 0x436, 0x27, 0x2e, 0x2c, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d,
+0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20,
+0xe97, 0xeb5, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79,
+0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0x69, 0x65,
+0x27, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x20, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
+0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x27, 0x67, 0x61,
+0x64, 0x61, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x79,
+0x79, 0x79, 0x79, 0x20, 0x27, 0x6d, 0x27, 0x2e, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x20, 0x64, 0x20, 0x27, 0x64, 0x27, 0x2e, 0x2c, 0x20, 0x64, 0x64,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0x65, 0x27,
+0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x64, 0x20, 0x27, 0x74, 0x61, 0x27, 0x2019, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64,
+0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64,
+0x79, 0x79, 0x79, 0x79, 0x202f, 0x27, 0x43e, 0x43d, 0x44b, 0x27, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x27, 0x44b, 0x43d, 0x27, 0x20, 0x64, 0x2c, 0x20, 0x64,
+0x64, 0x64, 0x64, 0x20, 0x27, 0x433, 0x430, 0x440, 0x430, 0x433, 0x27, 0x79,
+0x79, 0x79, 0x79, 0x20, 0x1823, 0x1828, 0x20, 0x180e, 0x180e, 0x180e, 0x1824, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x180e, 0x180e, 0x1822, 0x1822, 0x1828, 0x64, 0x2e, 0x20,
+0x64, 0x64, 0x64, 0x64, 0x20, 0x180b, 0x182d, 0x1820, 0x1837, 0x1820, 0x182d, 0x64,
+0x64, 0x64, 0x64, 0x20, 0x2c, 0x20, 0x27, 0x6c, 0x79, 0x25b, 0x27, 0x30c,
+0x2bc, 0x20, 0x64, 0x20, 0x27, 0x6e, 0x61, 0x27, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x202f, 0x27,
+0x430, 0x437, 0x27, 0x64, 0x64, 0x64, 0x64, 0x20, 0x62f, 0x20, 0x79, 0x79,
+0x79, 0x79, 0x20, 0x62f, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64,
+0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x6d,
+0x65, 0x74, 0x74, 0x61, 0x73, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x69, 0x6c, 0x73,
+0x27, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x79, 0x79, 0x79, 0x79, 0x202f, 0x27, 0x441, 0x44b, 0x43b, 0x27, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x43a, 0x4af, 0x43d, 0x44d,
+0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20,
+0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x27, 0x64, 0x65, 0x27, 0x20, 0x27, 0x73, 0x75, 0x27, 0x20, 0x79, 0x79,
+0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x27, 0x64,
+0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x60c, 0x20, 0x64,
+0x20, 0x712, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x202f,
+0x27, 0x435, 0x43b, 0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xe17, 0xe35, 0xe48, 0x20,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79,
+0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0xf60, 0xf72, 0xf0b, 0xf5a,
+0xf7a, 0xf66, 0xf0b, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
+0x64, 0x64, 0x1361, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x12ee, 0x121d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x1363,
+0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x202f, 0x27, 0x440,
+0x27, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x60c, 0x20, 0x64, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x60c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79,
+0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20, 0x64, 0x64, 0x64,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d,
+0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20,
+0x646, 0x686, 0x6cc, 0x20, 0x6cc, 0x6cc, 0x644, 0x20, 0x64, 0x20, 0x646, 0x686,
+0x6cc, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x20,
+0x6a9, 0x648, 0x646, 0x6cc, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x27, 0x2e, 0x20, 0x64, 0x27,
+0x69, 0x64, 0x27, 0x64, 0x64, 0x64, 0x64, 0x1365, 0x20, 0x64, 0x64, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x130b, 0x120b, 0x1233, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
+0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
+0x64, 0x5d8, 0x5df, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
+0x20, 0x27, 0x6e, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x6f, 0x27, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x64, 0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x2f, 0x64, 0x2f, 0x79, 0x79,
+0x79, 0x79
};
-static const char16_t time_format_data[] = {
-0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50,
-0x20, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x2c,
-0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a,
-0x73, 0x73, 0x20, 0x28, 0x74, 0x29, 0xf46, 0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b,
-0xf58, 0xf0b, 0x20, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x20, 0x74, 0xf46, 0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b,
-0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58, 0xf0b, 0x20, 0x6d, 0x6d, 0x20, 0x41, 0x50, 0x74, 0x20, 0x48, 0x48, 0x3a,
-0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x42, 0x20, 0x48, 0x3a, 0x6d, 0x6d, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x2c,
-0x20, 0x74, 0x74, 0x20, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a,
-0x73, 0x73, 0x20, 0x5b, 0x74, 0x5d, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x2e, 0x6d, 0x6d,
-0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x68, 0x6f, 0x72, 0x6f, 0x27, 0x20, 0x27, 0x6b,
-0x61, 0x6a, 0x27, 0x20, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20, 0x27,
-0x6d, 0x69, 0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x48, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20,
-0x6d, 0x6d, 0x20, 0x27, 0x6d, 0x69, 0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x48, 0x48, 0x2e,
-0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x27, 0x68, 0x27, 0x20, 0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20,
-0x41, 0x50, 0x20, 0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x50, 0x48, 0x6642, 0x6d, 0x6d, 0x5206, 0x73, 0x73, 0x79d2,
-0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0xc2dc, 0x20, 0x6d, 0xbd84, 0x20, 0x73, 0xcd08, 0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x3a,
-0x6d, 0x6d, 0x48, 0x20, 0xec2, 0xea1, 0xe87, 0x20, 0x6d, 0x20, 0xe99, 0xeb2, 0xe97, 0xeb5, 0x20, 0x73, 0x73, 0x20, 0xea7, 0xeb4,
-0xe99, 0xeb2, 0xe97, 0xeb5, 0x20, 0x74, 0x27, 0x6b, 0x6c, 0x27, 0x2e, 0x20, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73,
-0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x48, 0x20, 0xe19, 0xe32, 0xe2c, 0xe34,
-0xe01, 0xe32, 0x20, 0x6d, 0x6d, 0x20, 0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x73, 0x73, 0x20, 0xe27, 0xe34, 0xe19, 0xe32, 0xe17, 0xe35,
-0x20, 0x74, 0x41, 0x50, 0x20, 0x27, 0x67, 0x61, 0x27, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x27,
-0x4b, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28, 0x74, 0x29, 0x27, 0x4b,
-0x6c, 0x27, 0x2e, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x74, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50,
-0x48, 0x3a, 0x6d, 0x6d, 0x20, 0x27, 0x68, 0x6f, 0x64, 0x17a, 0x27, 0x2e
+static constexpr char16_t time_format_data[] = {
+0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x48, 0x48,
+0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x74, 0x74, 0x74, 0x68,
+0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x202f, 0x41, 0x70, 0x20, 0x74, 0x74,
+0x74, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x202f, 0x41, 0x70, 0x68, 0x3a, 0x6d,
+0x6d, 0x3a, 0x73, 0x73, 0x202f, 0x41, 0x70, 0x2c, 0x20, 0x74, 0x74, 0x74,
+0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x70, 0x20,
+0x74, 0x74, 0x74, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x70, 0x41,
+0x70, 0x20, 0x68, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x74,
+0x74, 0x74, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28,
+0x74, 0x74, 0x74, 0x74, 0x29, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73,
+0x73, 0x2c, 0x20, 0x74, 0x74, 0x74, 0x74, 0x41, 0x70, 0x20, 0x68, 0x3a,
+0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x74, 0x74, 0x74, 0x41, 0x70,
+0x20, 0x928, 0x93f, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x48, 0x3a, 0x6d, 0x6d,
+0x3a, 0x73, 0x73, 0x20, 0x27, 0x447, 0x27, 0x2e, 0x20, 0x74, 0x74, 0x74,
+0x74, 0x74, 0x74, 0x74, 0x74, 0x20, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a,
+0x73, 0x73, 0x41, 0x70, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20,
+0x5b, 0x74, 0x74, 0x74, 0x74, 0x5d, 0x74, 0x74, 0x74, 0x74, 0x20, 0x41,
+0x70, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x48, 0x48, 0x2e, 0x6d,
+0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x74, 0x74, 0x74, 0xf46, 0xf74, 0xf0b,
+0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58,
+0xf0b, 0x20, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x70, 0x20, 0x74,
+0x74, 0x74, 0x74, 0xf46, 0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68,
+0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58, 0xf0b, 0x20, 0x6d, 0x6d, 0x20, 0x41,
+0x70, 0x41, 0x70, 0x20, 0x27, 0x67, 0x61, 0x27, 0x20, 0x68, 0x3a, 0x6d,
+0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x74, 0x74, 0x74, 0x48, 0x20, 0x27,
+0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20, 0x27, 0x6d, 0x69, 0x6e, 0x27, 0x20,
+0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x74, 0x74, 0x74, 0x48,
+0x48, 0x20, 0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20, 0x27, 0x6d, 0x69,
+0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x74,
+0x74, 0x74, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x27,
+0x68, 0x27, 0x20, 0x74, 0x74, 0x74, 0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d,
+0x3a, 0x73, 0x73, 0x20, 0x41, 0x70, 0x20, 0x74, 0x74, 0x74, 0x74, 0x68,
+0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x70, 0x48, 0x6642, 0x6d, 0x6d, 0x5206,
+0x73, 0x73, 0x79d2, 0x20, 0x74, 0x74, 0x74, 0x74, 0x41, 0x70, 0x20, 0x68,
+0xc2dc, 0x20, 0x6d, 0xbd84, 0x20, 0x73, 0xcd08, 0x20, 0x74, 0x74, 0x74, 0x74,
+0x48, 0x20, 0xec2, 0xea1, 0xe87, 0x20, 0x6d, 0x20, 0xe99, 0xeb2, 0xe97, 0xeb5,
+0x20, 0x73, 0x73, 0x20, 0xea7, 0xeb4, 0xe99, 0xeb2, 0xe97, 0xeb5, 0x20, 0x74,
+0x74, 0x74, 0x74, 0x27, 0x4b, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x20, 0x48,
+0x2e, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28, 0x74, 0x74, 0x74, 0x74,
+0x29, 0x27, 0x4b, 0x6c, 0x27, 0x2e, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x68,
+0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x41, 0x70, 0x20, 0x74, 0x74,
+0x74, 0x74, 0x68, 0x2e, 0x6d, 0x6d, 0x2e, 0x20, 0x41, 0x70, 0x27, 0x6b,
+0x6c, 0x27, 0x2e, 0x20, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73,
+0x20, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x20, 0x68, 0x3a,
+0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x202f, 0x41, 0x70, 0x48, 0x27, 0x68, 0x27,
+0x6d, 0x6d, 0x48, 0x20, 0xe19, 0xe32, 0xe2c, 0xe34, 0xe01, 0xe32, 0x20, 0x6d,
+0x6d, 0x20, 0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x73, 0x73, 0x20, 0xe27, 0xe34,
+0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x74, 0x74, 0x74, 0x74, 0x68, 0x68, 0x3a,
+0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x202f, 0x41, 0x70, 0x20, 0x74, 0x74, 0x74,
+0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d, 0x202f, 0x41, 0x70, 0x48, 0x3a, 0x6d,
+0x6d, 0x20, 0x27, 0x68, 0x6f, 0x64, 0x17a, 0x27, 0x2e
};
-static const char16_t days_data[] = {
-0x53, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x4d, 0x6f, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x54, 0x75, 0x65, 0x73, 0x64, 0x61,
-0x79, 0x3b, 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79,
-0x3b, 0x46, 0x72, 0x69, 0x64, 0x61, 0x79, 0x3b, 0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79, 0x53, 0x75, 0x6e, 0x3b,
-0x4d, 0x6f, 0x6e, 0x3b, 0x54, 0x75, 0x65, 0x3b, 0x57, 0x65, 0x64, 0x3b, 0x54, 0x68, 0x75, 0x3b, 0x46, 0x72, 0x69, 0x3b,
-0x53, 0x61, 0x74, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x53, 0x37, 0x3b, 0x31, 0x3b,
-0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x44, 0x69, 0x6c, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x57, 0x69, 0x69,
-0x78, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x69, 0x62, 0x78, 0x61, 0x74, 0x61, 0x3b, 0x52, 0x6f, 0x6f, 0x62, 0x69, 0x69, 0x3b,
-0x4b, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x4a, 0x69, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x6e, 0x62,
-0x61, 0x74, 0x61, 0x44, 0x69, 0x6c, 0x3b, 0x57, 0x69, 0x78, 0x3b, 0x51, 0x69, 0x62, 0x3b, 0x52, 0x6f, 0x62, 0x3b, 0x4b,
-0x61, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x53, 0x61, 0x6e, 0x44, 0x3b, 0x57, 0x3b, 0x51, 0x3b, 0x52, 0x3b, 0x4b, 0x3b,
-0x4a, 0x3b, 0x53, 0x53, 0x6f, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x69,
-0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x57, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65,
-0x72, 0x64, 0x61, 0x67, 0x3b, 0x56, 0x72, 0x79, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67,
-0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x57, 0x6f, 0x2e, 0x3b, 0x44, 0x6f, 0x2e, 0x3b,
-0x56, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x53,
-0x65, 0x20, 0x64, 0x69, 0x65, 0x6c, 0x3b, 0x65, 0x20, 0x68, 0xeb, 0x6e, 0xeb, 0x3b, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x74,
-0xeb, 0x3b, 0x65, 0x20, 0x6d, 0xeb, 0x72, 0x6b, 0x75, 0x72, 0xeb, 0x3b, 0x65, 0x20, 0x65, 0x6e, 0x6a, 0x74, 0x65, 0x3b,
-0x65, 0x20, 0x70, 0x72, 0x65, 0x6d, 0x74, 0x65, 0x3b, 0x65, 0x20, 0x73, 0x68, 0x74, 0x75, 0x6e, 0xeb, 0x64, 0x69, 0x65,
-0x3b, 0x68, 0xeb, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0xeb, 0x72, 0x3b, 0x65, 0x6e, 0x6a, 0x3b, 0x70, 0x72, 0x65,
-0x3b, 0x73, 0x68, 0x74, 0x44, 0x69, 0x65, 0x3b, 0x48, 0xeb, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0xeb, 0x72, 0x3b,
-0x45, 0x6e, 0x6a, 0x3b, 0x50, 0x72, 0x65, 0x3b, 0x53, 0x68, 0x74, 0x64, 0x3b, 0x68, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x65,
-0x3b, 0x70, 0x3b, 0x73, 0x68, 0x12a5, 0x1211, 0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x129e, 0x3b, 0x1228, 0x1261, 0x12d5,
-0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x12a5, 0x1211, 0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b,
-0x12ad, 0x1230, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x12a5, 0x3b,
-0x1230, 0x3b, 0x121b, 0x3b, 0x1228, 0x3b, 0x1210, 0x3b, 0x12d3, 0x3b, 0x1245, 0x627, 0x644, 0x623, 0x62d, 0x62f, 0x3b, 0x627, 0x644, 0x627,
-0x62b, 0x646, 0x64a, 0x646, 0x3b, 0x627, 0x644, 0x62b, 0x644, 0x627, 0x62b, 0x627, 0x621, 0x3b, 0x627, 0x644, 0x623, 0x631, 0x628, 0x639,
-0x627, 0x621, 0x3b, 0x627, 0x644, 0x62e, 0x645, 0x64a, 0x633, 0x3b, 0x627, 0x644, 0x62c, 0x645, 0x639, 0x629, 0x3b, 0x627, 0x644, 0x633,
-0x628, 0x62a, 0x62d, 0x3b, 0x646, 0x3b, 0x62b, 0x3b, 0x631, 0x3b, 0x62e, 0x3b, 0x62c, 0x3b, 0x633, 0x56f, 0x56b, 0x580, 0x561, 0x56f,
-0x56b, 0x3b, 0x565, 0x580, 0x56f, 0x578, 0x582, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x565, 0x580, 0x565, 0x584, 0x577, 0x561, 0x562,
-0x569, 0x56b, 0x3b, 0x579, 0x578, 0x580, 0x565, 0x584, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x570, 0x56b, 0x576, 0x563, 0x577, 0x561,
-0x562, 0x569, 0x56b, 0x3b, 0x578, 0x582, 0x580, 0x562, 0x561, 0x569, 0x3b, 0x577, 0x561, 0x562, 0x561, 0x569, 0x56f, 0x56b, 0x580, 0x3b,
-0x565, 0x580, 0x56f, 0x3b, 0x565, 0x580, 0x584, 0x3b, 0x579, 0x580, 0x584, 0x3b, 0x570, 0x576, 0x563, 0x3b, 0x578, 0x582, 0x580, 0x3b,
-0x577, 0x562, 0x569, 0x53f, 0x3b, 0x535, 0x3b, 0x535, 0x3b, 0x549, 0x3b, 0x540, 0x3b, 0x548, 0x3b, 0x547, 0x9a6, 0x9c7, 0x993, 0x9ac,
-0x9be, 0x9f0, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ac,
-0x9c1, 0x9a7, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b6, 0x9c1,
-0x995, 0x9cd, 0x9f0, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x9a6, 0x9c7, 0x993, 0x3b, 0x9b8, 0x9cb, 0x9ae,
-0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0,
-0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9a6, 0x3b, 0x9b8, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x3b, 0x9ac, 0x3b, 0x9b6, 0x3b, 0x9b6, 0x62, 0x61, 0x7a,
-0x61, 0x72, 0x3b, 0x62, 0x61, 0x7a, 0x61, 0x72, 0x20, 0x65, 0x72, 0x74, 0x259, 0x73, 0x69, 0x3b, 0xe7, 0x259, 0x72, 0x15f,
-0x259, 0x6e, 0x62, 0x259, 0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259,
-0x3b, 0x63, 0xfc, 0x6d, 0x259, 0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0x63, 0xfc, 0x6d, 0x259, 0x3b, 0x15f, 0x259,
-0x6e, 0x62, 0x259, 0x42, 0x2e, 0x3b, 0x42, 0x2e, 0x45, 0x2e, 0x3b, 0xc7, 0x2e, 0x41, 0x2e, 0x3b, 0xc7, 0x2e, 0x3b, 0x43,
-0x2e, 0x41, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x42, 0x2e, 0x3b, 0x42, 0x2e, 0x65, 0x2e, 0x3b, 0xc7, 0x2e, 0x61,
-0x2e, 0x3b, 0xc7, 0x2e, 0x3b, 0x43, 0x2e, 0x61, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x431, 0x430, 0x437, 0x430, 0x440,
-0x3b, 0x431, 0x430, 0x437, 0x430, 0x440, 0x20, 0x435, 0x440, 0x442, 0x4d9, 0x441, 0x438, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d,
-0x431, 0x4d9, 0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x3b, 0x4b9,
-0x4af, 0x43c, 0x4d9, 0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x3b, 0x448, 0x4d9, 0x43d, 0x431,
-0x4d9, 0x411, 0x2e, 0x3b, 0x411, 0x2e, 0x415, 0x2e, 0x3b, 0x427, 0x2e, 0x410, 0x2e, 0x3b, 0x427, 0x2e, 0x3b, 0x4b8, 0x2e, 0x410,
-0x2e, 0x3b, 0x4b8, 0x2e, 0x3b, 0x428, 0x2e, 0x69, 0x67, 0x61, 0x6e, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x6c,
-0x65, 0x68, 0x65, 0x6e, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x72, 0x74, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65,
-0x61, 0x7a, 0x6b, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74, 0x65, 0x67, 0x75, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74, 0x69,
-0x72, 0x61, 0x6c, 0x61, 0x3b, 0x6c, 0x61, 0x72, 0x75, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x69, 0x67, 0x2e, 0x3b, 0x61, 0x6c,
-0x2e, 0x3b, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x7a, 0x2e, 0x3b, 0x6f, 0x67, 0x2e, 0x3b, 0x6f, 0x72, 0x2e, 0x3b, 0x6c, 0x72,
-0x2e, 0x49, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x4c, 0x9b0, 0x9ac, 0x9bf, 0x9ac, 0x9be, 0x9b0,
-0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c1, 0x9a7,
-0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd,
-0x9b0, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x9b0, 0x9ac, 0x9bf, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae,
-0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x3b, 0x9b6, 0x9c1,
-0x995, 0x9cd, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x9c1, 0x3b, 0x9ac, 0x9c3, 0x3b,
-0x9b6, 0x9c1, 0x3b, 0x9b6, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72,
-0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f,
-0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b,
-0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b,
-0xf58, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b,
-0x3b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0x3b, 0xf49, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72,
-0xf62, 0x3b, 0xf63, 0xfb7, 0xf42, 0x3b, 0xf55, 0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xfb6, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x3b, 0xf49,
-0xf72, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x7a, 0x68, 0x3b, 0x4d, 0x65, 0x72, 0x63,
-0x2bc, 0x68, 0x65, 0x72, 0x3b, 0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x53, 0x61, 0x64,
-0x6f, 0x72, 0x6e, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x2e, 0x3b, 0x4d, 0x65, 0x72, 0x2e,
-0x3b, 0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x64, 0x2e, 0x53, 0x75, 0x3b, 0x4c, 0x3b,
-0x4d, 0x7a, 0x3b, 0x4d, 0x63, 0x3b, 0x59, 0x3b, 0x47, 0x3b, 0x53, 0x61, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44f, 0x3b, 0x43f,
-0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440,
-0x44f, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x44a, 0x440, 0x442, 0x44a, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x44a, 0x43a, 0x3b,
-0x441, 0x44a, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x442,
-0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x43d, 0x3b, 0x43f, 0x3b, 0x432, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x1010,
-0x1014, 0x1004, 0x103a, 0x1039, 0x1002, 0x1014, 0x103d, 0x1031, 0x3b, 0x1010, 0x1014, 0x1004, 0x103a, 0x1039, 0x101c, 0x102c, 0x3b, 0x1021, 0x1004, 0x103a,
-0x1039, 0x1002, 0x102b, 0x3b, 0x1017, 0x102f, 0x1012, 0x1039, 0x1013, 0x101f, 0x1030, 0x1038, 0x3b, 0x1000, 0x103c, 0x102c, 0x101e, 0x1015, 0x1010, 0x1031,
-0x1038, 0x3b, 0x101e, 0x1031, 0x102c, 0x1000, 0x103c, 0x102c, 0x3b, 0x1005, 0x1014, 0x1031, 0x1010, 0x3b, 0x1010, 0x3b, 0x1021, 0x3b, 0x1017, 0x3b,
-0x1000, 0x3b, 0x101e, 0x3b, 0x1005, 0x43d, 0x44f, 0x434, 0x437, 0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x430, 0x43d, 0x44f, 0x434, 0x437, 0x435,
-0x43b, 0x430, 0x43a, 0x3b, 0x430, 0x45e, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x430, 0x434, 0x430, 0x3b, 0x447,
-0x430, 0x446, 0x432, 0x435, 0x440, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x456, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430,
-0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x430, 0x45e, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x446, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431,
-0x43d, 0x3b, 0x43f, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799,
-0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a,
-0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x17b6,
-0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x17d0, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796,
-0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b,
-0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2,
-0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f,
-0x17c5, 0x179a, 0x17cd, 0x17a2, 0x3b, 0x1785, 0x3b, 0x17a2, 0x3b, 0x1796, 0x3b, 0x1796, 0x3b, 0x179f, 0x3b, 0x179f, 0x64, 0x69, 0x75, 0x6d,
-0x65, 0x6e, 0x67, 0x65, 0x3b, 0x64, 0x69, 0x6c, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72, 0x74, 0x73,
-0x3b, 0x64, 0x69, 0x6d, 0x65, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76,
-0x65, 0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65, 0x64, 0x67, 0x2e, 0x3b, 0x64,
-0x6c, 0x2e, 0x3b, 0x64, 0x74, 0x2e, 0x3b, 0x64, 0x63, 0x2e, 0x3b, 0x64, 0x6a, 0x2e, 0x3b, 0x64, 0x76, 0x2e, 0x3b, 0x64,
-0x73, 0x2e, 0x64, 0x67, 0x3b, 0x64, 0x6c, 0x3b, 0x64, 0x74, 0x3b, 0x64, 0x63, 0x3b, 0x64, 0x6a, 0x3b, 0x64, 0x76, 0x3b,
-0x64, 0x73, 0x661f, 0x671f, 0x65e5, 0x3b, 0x661f, 0x671f, 0x4e00, 0x3b, 0x661f, 0x671f, 0x4e8c, 0x3b, 0x661f, 0x671f, 0x4e09, 0x3b, 0x661f, 0x671f,
-0x56db, 0x3b, 0x661f, 0x671f, 0x4e94, 0x3b, 0x661f, 0x671f, 0x516d, 0x5468, 0x65e5, 0x3b, 0x5468, 0x4e00, 0x3b, 0x5468, 0x4e8c, 0x3b, 0x5468, 0x4e09,
-0x3b, 0x5468, 0x56db, 0x3b, 0x5468, 0x4e94, 0x3b, 0x5468, 0x516d, 0x65e5, 0x3b, 0x4e00, 0x3b, 0x4e8c, 0x3b, 0x4e09, 0x3b, 0x56db, 0x3b, 0x4e94,
-0x3b, 0x516d, 0x9031, 0x65e5, 0x3b, 0x9031, 0x4e00, 0x3b, 0x9031, 0x4e8c, 0x3b, 0x9031, 0x4e09, 0x3b, 0x9031, 0x56db, 0x3b, 0x9031, 0x4e94, 0x3b,
-0x9031, 0x516d, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a,
-0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65,
-0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x6e,
-0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x69, 0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70,
-0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x4e,
-0x3b, 0x50, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x6e, 0x65, 0x64, 0x11b, 0x6c, 0x65, 0x3b, 0x70,
-0x6f, 0x6e, 0x64, 0x11b, 0x6c, 0xed, 0x3b, 0xfa, 0x74, 0x65, 0x72, 0xfd, 0x3b, 0x73, 0x74, 0x159, 0x65, 0x64, 0x61, 0x3b,
-0x10d, 0x74, 0x76, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0xe1, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61,
-0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0xfa, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x10d, 0x74, 0x3b, 0x70, 0xe1, 0x3b, 0x73, 0x6f,
-0x4e, 0x3b, 0x50, 0x3b, 0xda, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b,
-0x6d, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61,
-0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf8, 0x72,
-0x64, 0x61, 0x67, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0x61, 0x6e, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74,
-0x6f, 0x72, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf8, 0x72, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x6e, 0x2e, 0x3b,
-0x74, 0x69, 0x72, 0x2e, 0x3b, 0x6f, 0x6e, 0x73, 0x2e, 0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b,
-0x6c, 0xf8, 0x72, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x4c, 0x7a, 0x6f, 0x6e,
-0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b,
-0x77, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x76,
-0x72, 0x69, 0x6a, 0x64, 0x61, 0x67, 0x3b, 0x7a, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x7a, 0x6f, 0x3b, 0x6d, 0x61,
-0x3b, 0x64, 0x69, 0x3b, 0x77, 0x6f, 0x3b, 0x64, 0x6f, 0x3b, 0x76, 0x72, 0x3b, 0x7a, 0x61, 0x5a, 0x3b, 0x4d, 0x3b, 0x44,
-0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x5a, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0x2e, 0x3b, 0x54, 0x75, 0x2e, 0x3b, 0x57,
-0x2e, 0x3b, 0x54, 0x68, 0x2e, 0x3b, 0x46, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x75, 0x6e, 0x2e, 0x3b, 0x4d, 0x6f, 0x6e,
-0x2e, 0x3b, 0x54, 0x75, 0x65, 0x2e, 0x3b, 0x57, 0x65, 0x64, 0x2e, 0x3b, 0x54, 0x68, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x69,
-0x2e, 0x3b, 0x53, 0x61, 0x74, 0x2e, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x109, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x6f, 0x3b,
-0x6d, 0x61, 0x72, 0x64, 0x6f, 0x3b, 0x6d, 0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x135, 0x61, 0x16d, 0x64, 0x6f,
-0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x69, 0x3b, 0x6c,
-0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x135, 0x61, 0x3b, 0x76, 0x65, 0x3b, 0x73, 0x61, 0x44, 0x3b, 0x4c, 0x3b,
-0x4d, 0x3b, 0x4d, 0x3b, 0x134, 0x3b, 0x56, 0x3b, 0x53, 0x70, 0xfc, 0x68, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x65, 0x73,
-0x6d, 0x61, 0x73, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x74, 0x65, 0x69, 0x73, 0x69, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6b, 0x6f,
-0x6c, 0x6d, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6e, 0x65, 0x6c, 0x6a, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x72, 0x65,
-0x65, 0x64, 0x65, 0x3b, 0x6c, 0x61, 0x75, 0x70, 0xe4, 0x65, 0x76, 0x50, 0x3b, 0x45, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4e,
-0x3b, 0x52, 0x3b, 0x4c, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x61, 0x64,
-0x61, 0x67, 0x75, 0x72, 0x3b, 0x74, 0xfd, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0x6b, 0x75, 0x64, 0x61,
-0x67, 0x75, 0x72, 0x3b, 0x68, 0xf3, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x72, 0xed, 0x67, 0x67, 0x6a, 0x61,
-0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x65, 0x79, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x73, 0x75, 0x6e,
-0x3b, 0x6d, 0xe1, 0x6e, 0x3b, 0x74, 0xfd, 0x73, 0x3b, 0x6d, 0x69, 0x6b, 0x3b, 0x68, 0xf3, 0x73, 0x3b, 0x66, 0x72, 0xed,
-0x3b, 0x6c, 0x65, 0x79, 0x73, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0x74, 0xfd, 0x73, 0x2e, 0x3b, 0x6d,
-0x69, 0x6b, 0x2e, 0x3b, 0x68, 0xf3, 0x73, 0x2e, 0x3b, 0x66, 0x72, 0xed, 0x2e, 0x3b, 0x6c, 0x65, 0x79, 0x2e, 0x53, 0x3b,
-0x4d, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x46, 0x3b, 0x4c, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69,
-0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x6b,
-0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x70,
-0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x73, 0x75, 0x6e,
-0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61,
-0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b,
-0x6b, 0x6f, 0x6e, 0x61, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x70, 0x65, 0x72, 0x6a, 0x61,
-0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x73, 0x75, 0x3b,
-0x6d, 0x61, 0x3b, 0x74, 0x69, 0x3b, 0x6b, 0x65, 0x3b, 0x74, 0x6f, 0x3b, 0x70, 0x65, 0x3b, 0x6c, 0x61, 0x53, 0x3b, 0x4d,
-0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x4c, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x3b, 0x6c,
-0x75, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65, 0x64, 0x69, 0x3b,
-0x6a, 0x65, 0x75, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x65, 0x64,
-0x69, 0x64, 0x69, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e,
-0x3b, 0x6a, 0x65, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x6d, 0x2e, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
-0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x73, 0x6e, 0x65, 0x69, 0x6e, 0x3b, 0x6d, 0x6f, 0x61, 0x6e, 0x64, 0x65,
-0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x77, 0x6f, 0x61, 0x6e, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x74,
-0x6f, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x66, 0x72, 0x65, 0x65, 0x64, 0x3b, 0x73, 0x6e, 0x65, 0x6f,
-0x6e, 0x73, 0x69, 0x3b, 0x6d, 0x6f, 0x3b, 0x74, 0x69, 0x3b, 0x77, 0x6f, 0x3b, 0x74, 0x6f, 0x3b, 0x66, 0x72, 0x3b, 0x73,
-0x6f, 0x44, 0x69, 0x44, 0xf2, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x4c, 0x75, 0x61, 0x69, 0x6e,
-0x3b, 0x44, 0x69, 0x4d, 0xe0, 0x69, 0x72, 0x74, 0x3b, 0x44, 0x69, 0x43, 0x69, 0x61, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x44,
-0x69, 0x61, 0x72, 0x44, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x68, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x44, 0x69,
-0x53, 0x61, 0x74, 0x68, 0x61, 0x69, 0x72, 0x6e, 0x65, 0x44, 0x69, 0x44, 0x3b, 0x44, 0x69, 0x4c, 0x3b, 0x44, 0x69, 0x4d,
-0x3b, 0x44, 0x69, 0x43, 0x3b, 0x44, 0x69, 0x61, 0x3b, 0x44, 0x69, 0x68, 0x3b, 0x44, 0x69, 0x53, 0x44, 0x3b, 0x4c, 0x3b,
-0x4d, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x53, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e,
-0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x58, 0x6f,
-0x76, 0x65, 0x73, 0x3b, 0x56, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d,
-0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0xe9, 0x72,
-0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x78, 0x6f, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x73,
-0xe1, 0x62, 0x61, 0x64, 0x6f, 0x44, 0x6f, 0x6d, 0x2e, 0x3b, 0x4c, 0x75, 0x6e, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b,
-0x4d, 0xe9, 0x72, 0x2e, 0x3b, 0x58, 0x6f, 0x76, 0x2e, 0x3b, 0x56, 0x65, 0x6e, 0x2e, 0x3b, 0x53, 0xe1, 0x62, 0x2e, 0x64,
-0x6f, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0xe9, 0x72, 0x2e, 0x3b, 0x78,
-0x6f, 0x76, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d,
-0x3b, 0x58, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x2e, 0x3b, 0x6c, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x78, 0x2e,
-0x3b, 0x76, 0x2e, 0x3b, 0x73, 0x2e, 0x10d9, 0x10d5, 0x10d8, 0x10e0, 0x10d0, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8,
-0x3b, 0x10e1, 0x10d0, 0x10db, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10dd, 0x10d7, 0x10ee, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8,
-0x3b, 0x10ee, 0x10e3, 0x10d7, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x10d0, 0x10e1, 0x10d9, 0x10d4, 0x10d5, 0x10d8,
-0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x10d9, 0x10d5, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x3b, 0x10dd,
-0x10d7, 0x10ee, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d9, 0x3b, 0x10dd, 0x3b, 0x10e1, 0x3b,
-0x10dd, 0x3b, 0x10ee, 0x3b, 0x10de, 0x3b, 0x10e8, 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x6f, 0x6e, 0x74, 0x61,
-0x67, 0x3b, 0x44, 0x69, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b,
-0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x74, 0x61, 0x67, 0x3b, 0x53,
-0x61, 0x6d, 0x73, 0x74, 0x61, 0x67, 0x53, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x44, 0x69, 0x3b, 0x4d, 0x69, 0x3b, 0x44, 0x6f,
-0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x69,
-0x2e, 0x3b, 0x44, 0x6f, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x4d,
-0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x53, 0x39a, 0x3c5, 0x3c1, 0x3b9, 0x3b1, 0x3ba, 0x3ae, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3c4, 0x3ad, 0x3c1,
-0x3b1, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3c4, 0x3b7, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3ac, 0x3c1, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3ad, 0x3bc, 0x3c0,
-0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b1, 0x3c3, 0x3ba, 0x3b5, 0x3c5, 0x3ae, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b2, 0x3b1, 0x3c4, 0x3bf,
-0x39a, 0x3c5, 0x3c1, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3b, 0x3a0, 0x3ad, 0x3bc, 0x3b,
-0x3a0, 0x3b1, 0x3c1, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x39a, 0x3b, 0x394, 0x3b, 0x3a4, 0x3b, 0x3a4, 0x3b, 0x3a0, 0x3b, 0x3a0, 0x3b, 0x3a3,
-0x73, 0x61, 0x70, 0x61, 0x61, 0x74, 0x3b, 0x61, 0x74, 0x61, 0x61, 0x73, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65,
-0x71, 0x3b, 0x6d, 0x61, 0x72, 0x6c, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x70, 0x69, 0x6e, 0x67,
-0x61, 0x73, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x73, 0x69, 0x73, 0x61, 0x6d, 0x61, 0x6e, 0x6e,
-0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x61, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e,
-0x65, 0x71, 0x3b, 0x61, 0x72, 0x66, 0x69, 0x6e, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x73, 0x61, 0x70,
-0x3b, 0x61, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x69, 0x6e, 0x3b, 0x73, 0x69, 0x73, 0x3b, 0x74, 0x61, 0x6c,
-0x3b, 0x61, 0x72, 0x66, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x41, 0xab0, 0xab5, 0xabf,
-0xab5, 0xabe, 0xab0, 0x3b, 0xab8, 0xacb, 0xaae, 0xab5, 0xabe, 0xab0, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0xab5, 0xabe, 0xab0, 0x3b, 0xaac,
-0xac1, 0xaa7, 0xab5, 0xabe, 0xab0, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd, 0xab0, 0xab5,
-0xabe, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab5, 0xabe, 0xab0, 0xab0, 0xab5, 0xabf, 0x3b, 0xab8, 0xacb, 0xaae, 0x3b, 0xaae, 0xa82, 0xa97,
-0xab3, 0x3b, 0xaac, 0xac1, 0xaa7, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf,
-0xab0, 0x3b, 0xab8, 0xacb, 0x3b, 0xaae, 0xa82, 0x3b, 0xaac, 0xac1, 0x3b, 0xa97, 0xac1, 0x3b, 0xab6, 0xac1, 0x3b, 0xab6, 0x4c, 0x61,
-0x68, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69, 0x74, 0x69, 0x6e, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b,
-0x4c, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x6d, 0x61,
-0x2bc, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x4c, 0x61, 0x68, 0x3b, 0x4c, 0x69, 0x74, 0x3b, 0x54, 0x61, 0x6c,
-0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x4c, 0x3b, 0x4c, 0x3b,
-0x54, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x41, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d0, 0x5e9, 0x5d5, 0x5df, 0x3b, 0x5d9,
-0x5d5, 0x5dd, 0x20, 0x5e9, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5dc, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd,
-0x20, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d7, 0x5de, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd,
-0x20, 0x5e9, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d1, 0x5ea, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d0, 0x5f3, 0x3b,
-0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d2, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d3, 0x5f3,
-0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d4, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0x5d0, 0x5f3,
-0x3b, 0x5d1, 0x5f3, 0x3b, 0x5d2, 0x5f3, 0x3b, 0x5d3, 0x5f3, 0x3b, 0x5d4, 0x5f3, 0x3b, 0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5f3, 0x930, 0x935,
-0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b,
-0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930,
-0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902,
-0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928,
-0x93f, 0x930, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x76,
-0x61, 0x73, 0xe1, 0x72, 0x6e, 0x61, 0x70, 0x3b, 0x68, 0xe9, 0x74, 0x66, 0x151, 0x3b, 0x6b, 0x65, 0x64, 0x64, 0x3b, 0x73,
-0x7a, 0x65, 0x72, 0x64, 0x61, 0x3b, 0x63, 0x73, 0xfc, 0x74, 0xf6, 0x72, 0x74, 0xf6, 0x6b, 0x3b, 0x70, 0xe9, 0x6e, 0x74,
-0x65, 0x6b, 0x3b, 0x73, 0x7a, 0x6f, 0x6d, 0x62, 0x61, 0x74, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x65, 0x3b,
-0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x6f, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x3b, 0x43, 0x73, 0x3b,
-0x50, 0x3b, 0x53, 0x7a, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x75, 0x64,
-0x61, 0x67, 0x75, 0x72, 0x3b, 0xfe, 0x72, 0x69, 0xf0, 0x6a, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0xf0,
-0x76, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x69, 0x6d, 0x6d, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75,
-0x72, 0x3b, 0x66, 0xf6, 0x73, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x61, 0x75, 0x67, 0x61, 0x72, 0x64,
-0x61, 0x67, 0x75, 0x72, 0x73, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0xfe, 0x72, 0x69, 0x2e, 0x3b, 0x6d,
-0x69, 0xf0, 0x2e, 0x3b, 0x66, 0x69, 0x6d, 0x2e, 0x3b, 0x66, 0xf6, 0x73, 0x2e, 0x3b, 0x6c, 0x61, 0x75, 0x2e, 0x53, 0x3b,
-0x4d, 0x3b, 0xde, 0x3b, 0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x4c, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75, 0x3b, 0x53, 0x65,
-0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69,
-0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x4d, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6e,
-0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62,
-0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
-0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72,
-0x63, 0x75, 0x72, 0x69, 0x64, 0x69, 0x3b, 0x6a, 0x6f, 0x76, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64,
-0x69, 0x3b, 0x73, 0x61, 0x62, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72,
-0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x6a, 0x6f, 0x76, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x64, 0x3b, 0x6c, 0x3b,
-0x6d, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x76, 0x3b, 0x73, 0x44, 0xe9, 0x20, 0x44, 0x6f, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x67,
-0x68, 0x3b, 0x44, 0xe9, 0x20, 0x4c, 0x75, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b,
-0x44, 0xe9, 0x20, 0x43, 0xe9, 0x61, 0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x64, 0x61, 0x6f, 0x69,
-0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x68, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x44, 0xe9, 0x20, 0x53, 0x61, 0x74, 0x68, 0x61,
-0x69, 0x72, 0x6e, 0x44, 0x6f, 0x6d, 0x68, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x3b, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x43,
-0xe9, 0x61, 0x64, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x3b, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x68, 0x44,
-0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x44, 0x3b, 0x41, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61,
-0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x65, 0x72, 0x63,
-0x6f, 0x6c, 0x65, 0x64, 0xec, 0x3b, 0x67, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec, 0x3b, 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64,
-0xec, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
-0x6d, 0x65, 0x72, 0x3b, 0x67, 0x69, 0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
-0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x65e5, 0x66dc, 0x65e5, 0x3b, 0x6708, 0x66dc, 0x65e5, 0x3b, 0x706b, 0x66dc, 0x65e5, 0x3b,
-0x6c34, 0x66dc, 0x65e5, 0x3b, 0x6728, 0x66dc, 0x65e5, 0x3b, 0x91d1, 0x66dc, 0x65e5, 0x3b, 0x571f, 0x66dc, 0x65e5, 0x65e5, 0x3b, 0x6708, 0x3b, 0x706b,
-0x3b, 0x6c34, 0x3b, 0x6728, 0x3b, 0x91d1, 0x3b, 0x571f, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6e, 0x69, 0x6e, 0x3b, 0x53,
-0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c,
-0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x41, 0x3b, 0x53, 0x3b,
-0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0xcad, 0xcbe, 0xca8, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb8, 0xccb, 0xcae,
-0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcac, 0xcc1, 0xca7, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xc97,
-0xcc1, 0xcb0, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0xcb5,
-0xcbe, 0xcb0, 0xcad, 0xcbe, 0xca8, 0xcc1, 0x3b, 0xcb8, 0xccb, 0xcae, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0x3b, 0xcac, 0xcc1, 0xca7, 0x3b,
-0xc97, 0xcc1, 0xcb0, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0xcad, 0xcbe, 0x3b, 0xcb8, 0xccb, 0x3b,
-0xcae, 0xc82, 0x3b, 0xcac, 0xcc1, 0x3b, 0xc97, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0x3b, 0xcb6, 0x627, 0x64e, 0x62a, 0x6be, 0x648, 0x627, 0x631,
-0x3b, 0x698, 0x654, 0x646, 0x62f, 0x631, 0x655, 0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631, 0x3b, 0x628,
-0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648, 0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628,
-0x679, 0x648, 0x627, 0x631, 0x622, 0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654, 0x646, 0x62f, 0x655, 0x631, 0x648, 0x627, 0x631,
-0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648,
-0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648, 0x627, 0x631, 0x627, 0x3b, 0x698, 0x3b, 0x628, 0x3b, 0x628,
-0x3b, 0x628, 0x3b, 0x62c, 0x3b, 0x628, 0x436, 0x435, 0x43a, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x434, 0x4af, 0x439, 0x441, 0x435,
-0x43d, 0x431, 0x456, 0x3b, 0x441, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441, 0x4d9, 0x440, 0x441, 0x435, 0x43d, 0x431,
-0x456, 0x3b, 0x431, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x436, 0x4b1, 0x43c, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x431,
-0x456, 0x436, 0x441, 0x3b, 0x434, 0x441, 0x3b, 0x441, 0x441, 0x3b, 0x441, 0x440, 0x3b, 0x431, 0x441, 0x3b, 0x436, 0x43c, 0x3b, 0x441,
-0x431, 0x416, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x421, 0x3b, 0x411, 0x3b, 0x416, 0x3b, 0x421, 0x4b, 0x75, 0x20, 0x63, 0x79, 0x75,
-0x6d, 0x77, 0x65, 0x72, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x77,
-0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75,
-0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61,
-0x6e, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x75, 0x63, 0x79, 0x75,
-0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e,
-0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0x436, 0x435, 0x43a, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b,
-0x434, 0x4af, 0x439, 0x448, 0x4e9, 0x43c, 0x431, 0x4af, 0x3b, 0x448, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x448, 0x430,
-0x440, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x431, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x436, 0x443, 0x43c, 0x430,
-0x3b, 0x438, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x436, 0x435, 0x43a, 0x2e, 0x3b, 0x434, 0x4af, 0x439, 0x2e, 0x3b, 0x448, 0x435, 0x439,
-0x448, 0x2e, 0x3b, 0x448, 0x430, 0x440, 0x448, 0x2e, 0x3b, 0x431, 0x435, 0x439, 0x448, 0x2e, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b,
-0x438, 0x448, 0x43c, 0x2e, 0x416, 0x3b, 0x414, 0x3b, 0x428, 0x3b, 0x428, 0x3b, 0x411, 0x3b, 0x416, 0x3b, 0x418, 0xc77c, 0xc694, 0xc77c,
-0x3b, 0xc6d4, 0xc694, 0xc77c, 0x3b, 0xd654, 0xc694, 0xc77c, 0x3b, 0xc218, 0xc694, 0xc77c, 0x3b, 0xbaa9, 0xc694, 0xc77c, 0x3b, 0xae08, 0xc694, 0xc77c,
-0x3b, 0xd1a0, 0xc694, 0xc77c, 0xc77c, 0x3b, 0xc6d4, 0x3b, 0xd654, 0x3b, 0xc218, 0x3b, 0xbaa9, 0x3b, 0xae08, 0x3b, 0xd1a0, 0x79, 0x65, 0x6b,
-0x15f, 0x65, 0x6d, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6d, 0x3b, 0x73, 0xea, 0x15f, 0x65, 0x6d, 0x3b, 0xe7, 0x61, 0x72, 0x15f,
-0x65, 0x6d, 0x3b, 0x70, 0xea, 0x6e, 0x63, 0x15f, 0x65, 0x6d, 0x3b, 0xee, 0x6e, 0x3b, 0x15f, 0x65, 0x6d, 0xee, 0x79, 0x15f,
-0x3b, 0x64, 0x15f, 0x3b, 0x73, 0x15f, 0x3b, 0xe7, 0x15f, 0x3b, 0x70, 0x15f, 0x3b, 0xee, 0x6e, 0x3b, 0x15f, 0x59, 0x3b, 0x44,
-0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0xce, 0x3b, 0x15e, 0x4b, 0x75, 0x20, 0x77, 0x2019, 0x69, 0x6e, 0x64, 0x77, 0x69,
-0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6b,
-0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4b,
-0x75, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61,
-0x6e, 0x75, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x75, 0x63, 0x75,
-0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e,
-0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b,
-0xea7, 0xeb1, 0xe99, 0xe88, 0xeb1, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99,
-0xe9e, 0xeb8, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xeaa, 0xeb8, 0xe81, 0x3b,
-0xea7, 0xeb1, 0xe99, 0xec0, 0xeaa, 0xebb, 0xeb2, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xe88, 0xeb1, 0xe99, 0x3b, 0xead, 0xeb1, 0xe87,
-0xe84, 0xeb2, 0xe99, 0x3b, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xeaa, 0xeb8, 0xe81, 0x3b, 0xec0, 0xeaa,
-0xebb, 0xeb2, 0xead, 0xeb2, 0x3b, 0xe88, 0x3b, 0xead, 0x3b, 0xe9e, 0x3b, 0xe9e, 0xeab, 0x3b, 0xeaa, 0xeb8, 0x3b, 0xeaa, 0x53, 0x76,
-0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x4f, 0x74,
-0x72, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x43, 0x65, 0x74,
-0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b,
-0x53, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x73, 0x76, 0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70,
-0x69, 0x72, 0x6d, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x74, 0x72,
-0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b,
-0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61,
-0x53, 0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x2e, 0x3b, 0x4f, 0x74, 0x72, 0x64, 0x2e, 0x3b,
-0x54, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b, 0x43, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x65, 0x6b,
-0x74, 0x64, 0x2e, 0x3b, 0x53, 0x65, 0x73, 0x74, 0x64, 0x2e, 0x73, 0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69, 0x72,
-0x6d, 0x64, 0x2e, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x2e, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b, 0x63, 0x65, 0x74,
-0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64, 0x2e,
-0x53, 0x3b, 0x50, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x65, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b,
-0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x6d, 0x6f, 0x6b,
-0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c,
-0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20,
-0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0xe9, 0x69, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6d,
-0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x6d, 0x70, 0x254, 0x301, 0x73, 0x254, 0x65, 0x79, 0x65, 0x3b, 0x79, 0x62, 0x6f, 0x3b,
-0x6d, 0x62, 0x6c, 0x3b, 0x6d, 0x73, 0x74, 0x3b, 0x6d, 0x69, 0x6e, 0x3b, 0x6d, 0x74, 0x6e, 0x3b, 0x6d, 0x70, 0x73, 0x65,
-0x3b, 0x79, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x70, 0x73, 0x65, 0x6b, 0x6d, 0x61, 0x64, 0x69, 0x65,
-0x6e, 0x69, 0x73, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x61, 0x6e, 0x74, 0x72,
-0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x74, 0x72, 0x65, 0x10d, 0x69, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
-0x3b, 0x6b, 0x65, 0x74, 0x76, 0x69, 0x72, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x70, 0x65, 0x6e, 0x6b,
-0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x161, 0x65, 0x161, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
-0x73, 0x6b, 0x3b, 0x70, 0x72, 0x3b, 0x61, 0x6e, 0x3b, 0x74, 0x72, 0x3b, 0x6b, 0x74, 0x3b, 0x70, 0x6e, 0x3b, 0x161, 0x74,
-0x53, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x160, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x430, 0x3b,
-0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441,
-0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x43e, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x43e, 0x43a, 0x3b,
-0x441, 0x430, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b, 0x432, 0x442, 0x43e, 0x2e,
-0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447, 0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441, 0x430, 0x431, 0x2e,
-0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b, 0x432, 0x442, 0x2e, 0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447,
-0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441, 0x430, 0x431, 0x2e, 0x41, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x79,
-0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x79, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b,
-0x41, 0x6c, 0x61, 0x72, 0x6f, 0x62, 0x69, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x61, 0x6d, 0x69, 0x73, 0x79, 0x3b, 0x5a,
-0x6f, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x6f, 0x74, 0x73, 0x79, 0x41, 0x6c, 0x61, 0x68, 0x3b, 0x41, 0x6c, 0x61,
-0x74, 0x73, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x3b, 0x5a, 0x6f, 0x6d,
-0x3b, 0x41, 0x73, 0x61, 0x62, 0x41, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x5a, 0x3b, 0x41, 0x41, 0x68,
-0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75,
-0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75,
-0x41, 0x68, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x68, 0x61, 0x3b,
-0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x41, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53,
-0xd1e, 0xd3e, 0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c,
-0xd1a, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d,
-0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f,
-0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0xd1e, 0xd3e, 0xd2f, 0xd31,
-0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1a, 0xd4a,
-0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d,
-0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c,
-0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0xd1e, 0xd3e, 0xd2f, 0xd7c, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d,
-0xd15, 0xd7e, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd7b, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd02,
-0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd1e, 0xd3e, 0x3b, 0xd24, 0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b,
-0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0xd1e, 0x3b, 0xd24, 0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b,
-0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0x49, 0x6c, 0x2d, 0x126, 0x61, 0x64, 0x64, 0x3b,
-0x49, 0x74, 0x2d, 0x54, 0x6e, 0x65, 0x6a, 0x6e, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6c, 0x69, 0x65, 0x74, 0x61, 0x3b, 0x4c,
-0x2d, 0x45, 0x72, 0x62, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x6c, 0x2d, 0x126, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x49, 0x6c, 0x2d,
-0x120, 0x69, 0x6d, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x73, 0x2d, 0x53, 0x69, 0x62, 0x74, 0x126, 0x61, 0x64, 0x3b, 0x54, 0x6e,
-0x65, 0x3b, 0x54, 0x6c, 0x69, 0x3b, 0x45, 0x72, 0x62, 0x3b, 0x126, 0x61, 0x6d, 0x3b, 0x120, 0x69, 0x6d, 0x3b, 0x53, 0x69,
-0x62, 0x126, 0x64, 0x3b, 0x54, 0x6e, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126, 0x6d, 0x3b, 0x120, 0x6d, 0x3b, 0x53,
-0x62, 0x126, 0x64, 0x3b, 0x54, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126, 0x6d, 0x3b, 0x120, 0x6d, 0x3b, 0x53, 0x62,
-0x52, 0x101, 0x74, 0x61, 0x70, 0x75, 0x3b, 0x52, 0x101, 0x68, 0x69, 0x6e, 0x61, 0x3b, 0x52, 0x101, 0x74, 0x16b, 0x3b, 0x52,
-0x101, 0x61, 0x70, 0x61, 0x3b, 0x52, 0x101, 0x70, 0x61, 0x72, 0x65, 0x3b, 0x52, 0x101, 0x6d, 0x65, 0x72, 0x65, 0x3b, 0x52,
-0x101, 0x68, 0x6f, 0x72, 0x6f, 0x69, 0x54, 0x61, 0x70, 0x3b, 0x48, 0x69, 0x6e, 0x3b, 0x54, 0x16b, 0x3b, 0x41, 0x70, 0x61,
-0x3b, 0x50, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x48, 0x6f, 0x72, 0x54, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b,
-0x50, 0x3b, 0x4d, 0x3b, 0x48, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e,
-0x902, 0x917, 0x933, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e,
-0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x930, 0x935, 0x93f,
-0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936,
-0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x41d, 0x44f, 0x43c, 0x3b, 0x414, 0x430, 0x432, 0x430, 0x430, 0x3b, 0x41c, 0x44f,
-0x433, 0x43c, 0x430, 0x440, 0x3b, 0x41b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x41f, 0x4af, 0x440, 0x44d, 0x432, 0x3b, 0x411, 0x430,
-0x430, 0x441, 0x430, 0x43d, 0x3b, 0x411, 0x44f, 0x43c, 0x431, 0x430, 0x43d, 0x44f, 0x43c, 0x3b, 0x434, 0x430, 0x432, 0x430, 0x430, 0x3b,
-0x43c, 0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x43b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x43f, 0x4af, 0x440, 0x44d, 0x432, 0x3b,
-0x431, 0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x431, 0x44f, 0x43c, 0x431, 0x430, 0x41d, 0x44f, 0x3b, 0x414, 0x430, 0x3b, 0x41c, 0x44f,
-0x3b, 0x41b, 0x445, 0x3b, 0x41f, 0x4af, 0x3b, 0x411, 0x430, 0x3b, 0x411, 0x44f, 0x906, 0x907, 0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938,
-0x94b, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e,
-0x930, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936,
-0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x906, 0x907, 0x924, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x3b, 0x92c,
-0x941, 0x927, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x906, 0x3b, 0x938,
-0x94b, 0x3b, 0x92e, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0xb30, 0xb2c, 0xb3f, 0xb2c, 0xb3e, 0xb30,
-0x3b, 0xb38, 0xb4b, 0xb2e, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2c, 0xb41, 0xb27,
-0xb2c, 0xb3e, 0xb30, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0xb2c, 0xb3e, 0xb30,
-0x3b, 0xb36, 0xb28, 0xb3f, 0xb2c, 0xb3e, 0xb30, 0xb30, 0xb2c, 0xb3f, 0x3b, 0xb38, 0xb4b, 0xb2e, 0x3b, 0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33,
-0x3b, 0xb2c, 0xb41, 0xb27, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb30,
-0x3b, 0xb38, 0xb4b, 0x3b, 0xb2e, 0x3b, 0xb2c, 0xb41, 0x3b, 0xb17, 0xb41, 0x3b, 0xb36, 0xb41, 0x3b, 0xb36, 0x64a, 0x648, 0x646, 0x6cd,
-0x3b, 0x62f, 0x648, 0x646, 0x6cd, 0x3b, 0x62f, 0x631, 0x6d0, 0x646, 0x6cd, 0x3b, 0x685, 0x644, 0x631, 0x646, 0x6cd, 0x3b, 0x67e, 0x64a,
-0x646, 0x681, 0x646, 0x6cd, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b, 0x627, 0x648, 0x646, 0x6cd, 0x6cc, 0x6a9, 0x634, 0x646, 0x628, 0x647,
-0x3b, 0x62f, 0x648, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x633, 0x647, 0x200c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x686, 0x647, 0x627, 0x631,
-0x634, 0x646, 0x628, 0x647, 0x3b, 0x67e, 0x646, 0x62c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b, 0x634, 0x646,
-0x628, 0x647, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634, 0x6e, 0x69, 0x65, 0x64, 0x7a,
-0x69, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x61, 0x142, 0x65, 0x6b, 0x3b, 0x77, 0x74,
-0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x15b, 0x72, 0x6f, 0x64, 0x61, 0x3b, 0x63, 0x7a, 0x77, 0x61, 0x72, 0x74, 0x65, 0x6b, 0x3b,
-0x70, 0x69, 0x105, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x2e, 0x3b,
-0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x77, 0x74, 0x2e, 0x3b, 0x15b, 0x72, 0x2e, 0x3b, 0x63, 0x7a, 0x77, 0x2e, 0x3b, 0x70, 0x74,
-0x2e, 0x3b, 0x73, 0x6f, 0x62, 0x2e, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x15a, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x6e,
-0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x15b, 0x3b, 0x63, 0x3b, 0x70, 0x3b, 0x73, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b,
-0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0xe7, 0x61, 0x2d,
-0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x71,
-0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x2d, 0x66, 0x65,
-0x69, 0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x73, 0x65, 0x67, 0x2e, 0x3b,
-0x74, 0x65, 0x72, 0x2e, 0x3b, 0x71, 0x75, 0x61, 0x2e, 0x3b, 0x71, 0x75, 0x69, 0x2e, 0x3b, 0x73, 0x65, 0x78, 0x2e, 0x3b,
-0x73, 0xe1, 0x62, 0x2e, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x53, 0x3b, 0x53, 0x64, 0x6f, 0x6d,
-0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x3b, 0x74, 0x65, 0x72, 0xe7, 0x61, 0x3b, 0x71,
-0x75, 0x61, 0x72, 0x74, 0x61, 0x3b, 0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x3b, 0x73,
-0xe1, 0x62, 0x61, 0x64, 0x6f, 0xa10, 0xa24, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa4b, 0xa2e, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2e, 0xa70,
-0xa17, 0xa32, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa35, 0xa40, 0xa30, 0xa35, 0xa3e, 0xa30,
-0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a, 0xa30, 0xa35, 0xa3e,
-0xa30, 0xa10, 0xa24, 0x3b, 0xa38, 0xa4b, 0xa2e, 0x3b, 0xa2e, 0xa70, 0xa17, 0xa32, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0x3b, 0xa35, 0xa40,
-0xa30, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a, 0xa30, 0xa10, 0x3b, 0xa38, 0xa4b,
-0x3b, 0xa2e, 0xa70, 0x3b, 0xa2c, 0xa41, 0xa71, 0x3b, 0xa35, 0xa40, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0x3b, 0xa38, 0xa3c, 0x627, 0x62a,
-0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x64f, 0x62f, 0x6be, 0x3b, 0x62c, 0x645,
-0x639, 0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67,
-0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0xe9, 0x72, 0x63,
-0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x4a, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x56, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b,
-0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69,
-0xe9, 0x3b, 0x4a, 0x75, 0x65, 0x3b, 0x56, 0x69, 0x65, 0x3b, 0x53, 0x61, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x58,
-0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x69, 0x61, 0x3b, 0x67, 0x6c, 0x69, 0x6e, 0x64,
-0x65, 0x73, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x73, 0x65, 0x6d, 0x6e, 0x61, 0x3b, 0x67,
-0x69, 0x65, 0x76, 0x67, 0x69, 0x61, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x69, 0x3b, 0x73, 0x6f, 0x6e, 0x64,
-0x61, 0x64, 0x75, 0x3b, 0x67, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x67, 0x69, 0x65, 0x3b, 0x76, 0x65,
-0x3b, 0x73, 0x6f, 0x44, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x75, 0x6d, 0x69,
-0x6e, 0x69, 0x63, 0x103, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x21b, 0x69, 0x3b, 0x6d, 0x69, 0x65, 0x72,
-0x63, 0x75, 0x72, 0x69, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x65, 0x72, 0x69, 0x3b, 0x73, 0xe2, 0x6d, 0x62,
-0x103, 0x74, 0x103, 0x64, 0x75, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x69,
-0x65, 0x2e, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x2e, 0x3b, 0x73, 0xe2, 0x6d, 0x2e, 0x44, 0x75, 0x6d, 0x3b,
-0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x65, 0x3b, 0x4a, 0x6f, 0x69, 0x3b, 0x56, 0x69, 0x6e, 0x3b,
-0x53, 0xe2, 0x6d, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x61, 0x3b, 0x4d, 0x69, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x432, 0x43e,
-0x441, 0x43a, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x435, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44c, 0x43d, 0x438,
-0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432,
-0x435, 0x440, 0x433, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x431, 0x43e, 0x442, 0x430, 0x432,
-0x441, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x412,
-0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x42, 0x69, 0x6b, 0x75, 0x61, 0x2d, 0xf4, 0x6b,
-0x6f, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0xfb, 0x73, 0x65, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x70, 0x74,
-0xe2, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x75, 0x73, 0xef, 0xf6, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x6f,
-0x6b, 0xfc, 0x3b, 0x4c, 0xe2, 0x70, 0xf4, 0x73, 0xf6, 0x3b, 0x4c, 0xe2, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x42, 0x6b, 0x31,
-0x3b, 0x42, 0x6b, 0x32, 0x3b, 0x42, 0x6b, 0x33, 0x3b, 0x42, 0x6b, 0x34, 0x3b, 0x42, 0x6b, 0x35, 0x3b, 0x4c, 0xe2, 0x70,
-0x3b, 0x4c, 0xe2, 0x79, 0x4b, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x59, 0x43d, 0x435, 0x434,
-0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a,
-0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430,
-0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b,
-0x441, 0x440, 0x435, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x43d, 0x3b, 0x43f, 0x3b, 0x443,
-0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e,
-0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65,
-0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b, 0x73, 0x75,
-0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x3b, 0x73, 0x72, 0x3b, 0x10d, 0x65,
-0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f,
-0x3b, 0x73, 0x72, 0x65, 0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x64, 0x65,
-0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61,
-0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74,
-0x61, 0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d,
-0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435, 0x434,
-0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431,
-0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x435, 0x442,
-0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x425, 0x443, 0x44b, 0x446, 0x430, 0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x41a, 0x44a,
-0x443, 0x44b, 0x440, 0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x414, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x4d4, 0x440, 0x442, 0x44b, 0x446,
-0x446, 0x4d5, 0x433, 0x3b, 0x426, 0x44b, 0x43f, 0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x41c, 0x430, 0x439, 0x440, 0x4d5, 0x43c, 0x431,
-0x43e, 0x43d, 0x3b, 0x421, 0x430, 0x431, 0x430, 0x442, 0x445, 0x443, 0x44b, 0x446, 0x430, 0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x43a, 0x44a,
-0x443, 0x44b, 0x440, 0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x434, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x4d5, 0x440, 0x442, 0x44b, 0x446,
-0x446, 0x4d5, 0x433, 0x3b, 0x446, 0x44b, 0x43f, 0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x43c, 0x430, 0x439, 0x440, 0x4d5, 0x43c, 0x431,
-0x43e, 0x43d, 0x3b, 0x441, 0x430, 0x431, 0x430, 0x442, 0x425, 0x446, 0x431, 0x3b, 0x41a, 0x440, 0x441, 0x3b, 0x414, 0x446, 0x433, 0x3b,
-0x4d4, 0x440, 0x442, 0x3b, 0x426, 0x43f, 0x440, 0x3b, 0x41c, 0x440, 0x431, 0x3b, 0x421, 0x431, 0x442, 0x445, 0x446, 0x431, 0x3b, 0x43a,
-0x440, 0x441, 0x3b, 0x434, 0x446, 0x433, 0x3b, 0x4d5, 0x440, 0x442, 0x3b, 0x446, 0x43f, 0x440, 0x3b, 0x43c, 0x440, 0x431, 0x3b, 0x441,
-0x431, 0x442, 0x425, 0x3b, 0x41a, 0x3b, 0x414, 0x3b, 0x4d4, 0x3b, 0x426, 0x3b, 0x41c, 0x3b, 0x421, 0x53, 0x76, 0x6f, 0x6e, 0x64,
-0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x68, 0x75, 0x72, 0x6f, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68,
-0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75,
-0x3b, 0x4d, 0x75, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x53, 0x76, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x3b, 0x43, 0x68, 0x70,
-0x3b, 0x43, 0x68, 0x74, 0x3b, 0x43, 0x68, 0x6e, 0x3b, 0x43, 0x68, 0x73, 0x3b, 0x4d, 0x75, 0x67, 0x53, 0x3b, 0x4d, 0x3b,
-0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4d, 0x622, 0x686, 0x631, 0x3b, 0x633, 0x648, 0x645, 0x631, 0x3b, 0x627, 0x6b1,
-0x627, 0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639, 0x3b, 0x62e, 0x645, 0x64a, 0x633, 0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687,
-0x646, 0x687, 0x631, 0x622, 0x686, 0x631, 0x3b, 0x633, 0x648, 0x3b, 0x627, 0x6b1, 0x627, 0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639,
-0x3b, 0x62e, 0x645, 0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687, 0x646, 0x687, 0x631, 0xd89, 0xdbb, 0xdd2, 0xdaf, 0xdcf, 0x3b, 0xdc3,
-0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0xdbb, 0xdd4, 0xdc0, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf,
-0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0xdb4, 0xdad, 0xdd2, 0xdb1, 0xdca, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4,
-0xdbb, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xdc3, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0xd89, 0xdbb, 0xdd2, 0xdaf, 0xdcf, 0x3b,
-0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb,
-0xdc4, 0xdc3, 0xdca, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xd89, 0x3b, 0xdc3, 0x3b, 0xd85, 0x3b, 0xdb6, 0x3b,
-0xdb6, 0xdca, 0x200d, 0xdbb, 0x3b, 0xdc3, 0xdd2, 0x3b, 0xdc3, 0xdd9, 0x6e, 0x65, 0x64, 0x65, 0x13e, 0x61, 0x3b, 0x70, 0x6f, 0x6e,
-0x64, 0x65, 0x6c, 0x6f, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x6f, 0x6b, 0x3b, 0x73, 0x74, 0x72, 0x65, 0x64, 0x61, 0x3b,
-0x161, 0x74, 0x76, 0x72, 0x74, 0x6f, 0x6b, 0x3b, 0x70, 0x69, 0x61, 0x74, 0x6f, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74,
-0x61, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0x75, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x161, 0x74, 0x3b, 0x70, 0x69, 0x3b, 0x73,
-0x6f, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x161, 0x3b, 0x70, 0x3b, 0x73, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a,
-0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x65, 0x6b, 0x3b, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x73,
-0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x65, 0x6b, 0x3b, 0x73,
-0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b,
-0x73, 0x72, 0x65, 0x2e, 0x3b, 0x10d, 0x65, 0x74, 0x2e, 0x3b, 0x70, 0x65, 0x74, 0x2e, 0x3b, 0x73, 0x6f, 0x62, 0x2e, 0x6e,
-0x3b, 0x70, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x41, 0x78, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e,
-0x69, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x61, 0x63, 0x6f, 0x3b, 0x4b,
-0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x3b, 0x4a, 0x69, 0x6d, 0x63, 0x6f, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x69, 0x41, 0x78,
-0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x54, 0x6c, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x63, 0x3b, 0x4b, 0x68, 0x6d, 0x73,
-0x3b, 0x4a, 0x6d, 0x63, 0x3b, 0x53, 0x62, 0x74, 0x69, 0x41, 0x3b, 0x49, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x4b, 0x68, 0x3b,
-0x4a, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72,
-0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x6a, 0x75, 0x65, 0x76, 0x65, 0x73,
-0x3b, 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x2e, 0x3b,
-0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x69, 0xe9, 0x2e, 0x3b, 0x6a, 0x75, 0x65, 0x2e, 0x3b,
-0x76, 0x69, 0x65, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
-0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x73, 0xf6, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61,
-0x67, 0x3b, 0x74, 0x69, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73,
-0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf6, 0x72, 0x64, 0x61, 0x67, 0x73, 0xf6, 0x6e,
-0x3b, 0x6d, 0xe5, 0x6e, 0x3b, 0x74, 0x69, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x66, 0x72,
-0x65, 0x3b, 0x6c, 0xf6, 0x72, 0x42f, 0x43a, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x414, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x435,
-0x3b, 0x421, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x427, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x41f, 0x430,
-0x43d, 0x4b7, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x4b6, 0x443, 0x43c, 0x44a, 0x430, 0x3b, 0x428, 0x430, 0x43d, 0x431, 0x435, 0x42f,
-0x448, 0x431, 0x3b, 0x414, 0x448, 0x431, 0x3b, 0x421, 0x448, 0x431, 0x3b, 0x427, 0x448, 0x431, 0x3b, 0x41f, 0x448, 0x431, 0x3b, 0x4b6,
-0x43c, 0x44a, 0x3b, 0x428, 0x43d, 0x431, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x4b6, 0x3b, 0x428, 0xb9e,
-0xbbe, 0xbaf, 0xbbf, 0xbb1, 0xbc1, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbb5, 0xbcd, 0xbb5, 0xbbe,
-0xbaf, 0xbcd, 0x3b, 0xbaa, 0xbc1, 0xba4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0xbb4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbc6, 0xbb3,
-0xbcd, 0xbb3, 0xbbf, 0x3b, 0xb9a, 0xba9, 0xbbf, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0x2e, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0x2e, 0x3b, 0xb9a,
-0xbc6, 0xbb5, 0xbcd, 0x2e, 0x3b, 0xbaa, 0xbc1, 0xba4, 0x2e, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0x2e, 0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd,
-0x2e, 0x3b, 0xb9a, 0xba9, 0xbbf, 0xb9e, 0xbbe, 0x3b, 0xba4, 0xbbf, 0x3b, 0xb9a, 0xbc6, 0x3b, 0xbaa, 0xbc1, 0x3b, 0xbb5, 0xbbf, 0x3b,
-0xbb5, 0xbc6, 0x3b, 0xb9a, 0x44f, 0x43a, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x434, 0x4af, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b,
-0x441, 0x438, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x43f, 0x4d9, 0x43d,
-0x497, 0x435, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x497, 0x43e, 0x43c, 0x433, 0x430, 0x3b, 0x448, 0x438, 0x43c, 0x431, 0x4d9, 0x44f,
-0x43a, 0x448, 0x2e, 0x3b, 0x434, 0x4af, 0x448, 0x2e, 0x3b, 0x441, 0x438, 0x448, 0x2e, 0x3b, 0x447, 0x4d9, 0x440, 0x2e, 0x3b, 0x43f,
-0x4d9, 0x43d, 0x497, 0x2e, 0x3b, 0x497, 0x43e, 0x43c, 0x2e, 0x3b, 0x448, 0x438, 0x43c, 0x2e, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b,
-0x427, 0x3b, 0x41f, 0x3b, 0x496, 0x3b, 0x428, 0xc06, 0xc26, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc38, 0xc4b, 0xc2e, 0xc35, 0xc3e,
-0xc30, 0xc02, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2c, 0xc41, 0xc27, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b,
-0xc17, 0xc41, 0xc30, 0xc41, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36,
-0xc28, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0xc06, 0xc26, 0xc3f, 0x3b, 0xc38, 0xc4b, 0xc2e, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0x3b, 0xc2c,
-0xc41, 0xc27, 0x3b, 0xc17, 0xc41, 0xc30, 0xc41, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc06, 0x3b, 0xc38,
-0xc4b, 0x3b, 0xc2e, 0x3b, 0xc2c, 0xc41, 0x3b, 0xc17, 0xc41, 0x3b, 0xc36, 0xc41, 0x3b, 0xc36, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe32, 0xe17,
-0xe34, 0xe15, 0xe22, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe08, 0xe31, 0xe19, 0xe17, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe31,
-0xe07, 0xe04, 0xe32, 0xe23, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe38, 0xe18, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe24, 0xe2b, 0xe31, 0xe2a,
-0xe1a, 0xe14, 0xe35, 0x3b, 0xe27, 0xe31, 0xe19, 0xe28, 0xe38, 0xe01, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe40, 0xe2a, 0xe32, 0xe23,
-0xe4c, 0xe2d, 0xe32, 0x2e, 0x3b, 0xe08, 0x2e, 0x3b, 0xe2d, 0x2e, 0x3b, 0xe1e, 0x2e, 0x3b, 0xe1e, 0xe24, 0x2e, 0x3b, 0xe28, 0x2e,
-0x3b, 0xe2a, 0x2e, 0xe2d, 0xe32, 0x3b, 0xe08, 0x3b, 0xe2d, 0x3b, 0xe1e, 0x3b, 0xe1e, 0xe24, 0x3b, 0xe28, 0x3b, 0xe2a, 0xf42, 0xf5f,
-0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f,
-0xf60, 0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54,
-0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b,
-0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58,
-0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42,
-0xf0b, 0xf54, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66,
-0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0xf49, 0xf72, 0x3b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72, 0xf42, 0x3b, 0xf63, 0xfb7, 0xf42, 0x3b,
-0xf55, 0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xf66, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x1230, 0x1295, 0x1260, 0x1275, 0x3b, 0x1230, 0x1291, 0x12ed,
-0x3b, 0x1220, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1283, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1262, 0x3b, 0x1240, 0x12f3, 0x121d,
-0x1230, 0x1295, 0x3b, 0x1230, 0x1291, 0x3b, 0x1230, 0x1209, 0x3b, 0x1228, 0x1261, 0x3b, 0x1213, 0x1219, 0x3b, 0x12d3, 0x122d, 0x3b, 0x1240, 0x12f3,
-0x1230, 0x3b, 0x1230, 0x3b, 0x1220, 0x3b, 0x1228, 0x3b, 0x1213, 0x3b, 0x12d3, 0x3b, 0x1240, 0x1230, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1228,
-0x3b, 0x1213, 0x3b, 0x12d3, 0x3b, 0x1240, 0x53, 0x101, 0x70, 0x61, 0x74, 0x65, 0x3b, 0x4d, 0x14d, 0x6e, 0x69, 0x74, 0x65, 0x3b,
-0x54, 0x16b, 0x73, 0x69, 0x74, 0x65, 0x3b, 0x50, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x54, 0x75, 0x2bb, 0x61,
-0x70, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x46, 0x61, 0x6c, 0x61, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x6f, 0x6b,
-0x6f, 0x6e, 0x61, 0x6b, 0x69, 0x53, 0x101, 0x70, 0x3b, 0x4d, 0x14d, 0x6e, 0x3b, 0x54, 0x16b, 0x73, 0x3b, 0x50, 0x75, 0x6c,
-0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x3b, 0x46, 0x61, 0x6c, 0x3b, 0x54, 0x6f, 0x6b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x50,
-0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x54, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x74, 0x65, 0x73,
-0x69, 0x3b, 0x53, 0x61, 0x6c, 0x131, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x72, 0x15f,
-0x65, 0x6d, 0x62, 0x65, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x50,
-0x61, 0x7a, 0x3b, 0x50, 0x7a, 0x74, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x72, 0x3b, 0x43,
-0x75, 0x6d, 0x3b, 0x43, 0x6d, 0x74, 0x50, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x43, 0xdd,
-0x65, 0x6b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x44, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x53, 0x69, 0x15f, 0x65,
-0x6e, 0x62, 0x65, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x50, 0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62,
-0x65, 0x3b, 0x41, 0x6e, 0x6e, 0x61, 0x3b, 0x15e, 0x65, 0x6e, 0x62, 0x65, 0xfd, 0x65, 0x6b, 0x15f, 0x65, 0x6e, 0x62, 0x65,
-0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x73, 0x69, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0xe7, 0x61, 0x72,
-0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x70, 0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x61, 0x6e, 0x6e, 0x61, 0x3b,
-0x15f, 0x65, 0x6e, 0x62, 0x65, 0xdd, 0x65, 0x6b, 0x3b, 0x44, 0x75, 0x15f, 0x3b, 0x53, 0x69, 0x15f, 0x3b, 0xc7, 0x61, 0x72,
-0x3b, 0x50, 0x65, 0x6e, 0x3b, 0x41, 0x6e, 0x6e, 0x3b, 0x15e, 0x65, 0x6e, 0xfd, 0x65, 0x6b, 0x3b, 0x64, 0x75, 0x15f, 0x3b,
-0x73, 0x69, 0x15f, 0x3b, 0xe7, 0x61, 0x72, 0x3b, 0x70, 0x65, 0x6e, 0x3b, 0x61, 0x6e, 0x6e, 0x3b, 0x15f, 0x65, 0x6e, 0xdd,
-0x3b, 0x44, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x15e, 0x64a, 0x6d5, 0x643, 0x634, 0x6d5, 0x646, 0x628, 0x6d5,
-0x3b, 0x62f, 0x6c8, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x633, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x686, 0x627,
-0x631, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x67e, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x62c, 0x6c8, 0x645, 0x6d5,
-0x3b, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x64a, 0x6d5, 0x3b, 0x62f, 0x6c8, 0x3b, 0x633, 0x6d5, 0x3b, 0x686, 0x627, 0x3b, 0x67e, 0x6d5,
-0x3b, 0x62c, 0x6c8, 0x3b, 0x634, 0x6d5, 0x64a, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634, 0x43d,
-0x435, 0x434, 0x456, 0x43b, 0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x43e, 0x43a, 0x3b, 0x432, 0x456, 0x432, 0x442,
-0x43e, 0x440, 0x43e, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x3b, 0x43f,
-0x2bc, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x44f, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x41d, 0x3b, 0x41f, 0x3b, 0x412, 0x3b,
-0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646, 0x6af,
-0x644, 0x3b, 0x628, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639, 0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641,
-0x62a, 0x6c1, 0x79, 0x61, 0x6b, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x64, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61,
-0x3b, 0x73, 0x65, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61,
-0x3b, 0x70, 0x61, 0x79, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x68, 0x61, 0x6e,
-0x62, 0x61, 0x59, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0x73, 0x68, 0x3b, 0x53, 0x65, 0x73, 0x68, 0x3b, 0x43, 0x68, 0x6f, 0x72,
-0x3b, 0x50, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x68, 0x61, 0x6e, 0x59, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x43,
-0x3b, 0x50, 0x3b, 0x4a, 0x3b, 0x53, 0x6cc, 0x2e, 0x3b, 0x62f, 0x2e, 0x3b, 0x633, 0x2e, 0x3b, 0x686, 0x2e, 0x3b, 0x67e, 0x2e,
-0x3b, 0x62c, 0x2e, 0x3b, 0x634, 0x2e, 0x44f, 0x43a, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x434, 0x443, 0x448, 0x430, 0x43d, 0x431,
-0x430, 0x3b, 0x441, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x447, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x43f,
-0x430, 0x439, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x44f, 0x43a,
-0x448, 0x3b, 0x434, 0x443, 0x448, 0x3b, 0x441, 0x435, 0x448, 0x3b, 0x447, 0x43e, 0x440, 0x3b, 0x43f, 0x430, 0x439, 0x3b, 0x436, 0x443,
-0x43c, 0x3b, 0x448, 0x430, 0x43d, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x416, 0x3b, 0x428, 0x43, 0x68,
-0x1ee7, 0x20, 0x4e, 0x68, 0x1ead, 0x74, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x48, 0x61, 0x69, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x42,
-0x61, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x54, 0x1b0, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x4e, 0x103, 0x6d, 0x3b, 0x54, 0x68, 0x1ee9,
-0x20, 0x53, 0xe1, 0x75, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x42, 0x1ea3, 0x79, 0x43, 0x4e, 0x3b, 0x54, 0x68, 0x20, 0x32, 0x3b,
-0x54, 0x68, 0x20, 0x33, 0x3b, 0x54, 0x68, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x20, 0x35, 0x3b, 0x54, 0x68, 0x20, 0x36, 0x3b,
-0x54, 0x68, 0x20, 0x37, 0x43, 0x4e, 0x3b, 0x54, 0x32, 0x3b, 0x54, 0x33, 0x3b, 0x54, 0x34, 0x3b, 0x54, 0x35, 0x3b, 0x54,
-0x36, 0x3b, 0x54, 0x37, 0x73, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x6d, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x74, 0x75, 0x64, 0x65,
-0x6c, 0x3b, 0x76, 0x65, 0x64, 0x65, 0x6c, 0x3b, 0x64, 0xf6, 0x64, 0x65, 0x6c, 0x3b, 0x66, 0x72, 0x69, 0x64, 0x65, 0x6c,
-0x3b, 0x7a, 0xe4, 0x64, 0x65, 0x6c, 0x53, 0x75, 0x3b, 0x4d, 0x75, 0x3b, 0x54, 0x75, 0x3b, 0x56, 0x65, 0x3b, 0x44, 0xf6,
-0x3b, 0x46, 0x72, 0x3b, 0x5a, 0xe4, 0x73, 0x75, 0x2e, 0x3b, 0x6d, 0x75, 0x2e, 0x3b, 0x74, 0x75, 0x2e, 0x3b, 0x76, 0x65,
-0x2e, 0x3b, 0x64, 0xf6, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x7a, 0xe4, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x56,
-0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x5a, 0x44, 0x79, 0x64, 0x64, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20,
-0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x61, 0x77, 0x72, 0x74, 0x68, 0x3b, 0x44, 0x79, 0x64,
-0x64, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x68, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x49, 0x61, 0x75, 0x3b, 0x44,
-0x79, 0x64, 0x64, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x53, 0x61, 0x64, 0x77,
-0x72, 0x6e, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49,
-0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d,
-0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x64, 0x53,
-0x3b, 0x4c, 0x6c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x47, 0x3b, 0x53, 0x44, 0x69, 0x62, 0xe9, 0x65, 0x72, 0x3b,
-0x41, 0x6c, 0x74, 0x69, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0xc0, 0x6c, 0x61, 0x72, 0x62,
-0x61, 0x3b, 0x41, 0x6c, 0x78, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0xc0, 0x6a, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x65,
-0x65, 0x72, 0x44, 0x69, 0x62, 0x3b, 0x41, 0x6c, 0x74, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0xc0, 0x6c, 0x61, 0x3b, 0x41, 0x6c,
-0x78, 0x3b, 0xc0, 0x6a, 0x6a, 0x3b, 0x41, 0x73, 0x65, 0x43, 0x61, 0x77, 0x65, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b,
-0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6e, 0x69, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68,
-0x75, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75,
-0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x43, 0x61, 0x77, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x42, 0x69, 0x6e,
-0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x5d6, 0x5d5, 0x5e0, 0x5d8,
-0x5d9, 0x5e7, 0x3b, 0x5de, 0x5d0, 0x5b8, 0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5d3, 0x5d9, 0x5e0, 0x5e1, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5de,
-0x5d9, 0x5d8, 0x5d5, 0x5d5, 0x5d0, 0x5da, 0x3b, 0x5d3, 0x5d0, 0x5e0, 0x5e2, 0x5e8, 0x5e9, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e4, 0x5bf, 0x5e8,
-0x5f2, 0x5b7, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73,
-0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b,
-0x1eb8, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0xec, 0x6b,
-0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xcc, 0x73, 0x1eb9, 0x301,
-0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b, 0x1ecc, 0x6a,
-0x1ecd, 0x301, 0x20, 0x1eb8, 0x74, 0xec, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61,
-0xc0, 0xec, 0x6b, 0x3b, 0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0x3b, 0x1ecc,
-0x6a, 0x1ecd, 0x301, 0x62, 0x3b, 0x1eb8, 0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b, 0x1ecc, 0x3b,
-0x1ecc, 0x3b, 0x1eb8, 0x3b, 0xc0, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75,
-0x6e, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254, 0x3b, 0x190, 0x74, 0xec, 0x3b,
-0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x186, 0x6a,
-0x254, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75, 0x6e, 0x3b,
-0x186, 0x6a, 0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0x190,
-0x74, 0xec, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0xc0, 0xec, 0x6b, 0x3b,
-0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x72, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62,
-0x3b, 0x190, 0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b, 0x186, 0x3b, 0x186, 0x3b, 0x190, 0x3b,
-0xc0, 0x49, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x55, 0x4d, 0x73, 0x6f, 0x6d, 0x62, 0x75, 0x6c, 0x75, 0x6b, 0x6f, 0x3b,
-0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61,
-0x74, 0x68, 0x75, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x68,
-0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x55, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x73,
-0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67,
-0x71, 0x53, 0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x48, 0x3b, 0x4d, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67,
-0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x79, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61,
-0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0x61, 0x75,
-0x72, 0x64, 0x61, 0x67, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e, 0x3b, 0x74, 0x79, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b,
-0x74, 0x6f, 0x72, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0x61, 0x75, 0x73, 0xf8, 0x2e, 0x3b, 0x6d, 0xe5, 0x2e, 0x3b, 0x74,
-0x79, 0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c, 0x61, 0x2e, 0x43d, 0x435,
-0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e,
-0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a,
-0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d,
-0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x438, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431,
-0x4a, 0x65, 0x64, 0x6f, 0x6f, 0x6e, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6c, 0x68, 0x65, 0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x6d,
-0x61, 0x79, 0x72, 0x74, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x65, 0x61, 0x6e, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x65, 0x69, 0x6e,
-0x3b, 0x4a, 0x65, 0x68, 0x65, 0x69, 0x6e, 0x65, 0x79, 0x3b, 0x4a, 0x65, 0x73, 0x61, 0x72, 0x6e, 0x4a, 0x65, 0x64, 0x3b,
-0x4a, 0x65, 0x6c, 0x3b, 0x4a, 0x65, 0x6d, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x3b, 0x4a, 0x65,
-0x68, 0x3b, 0x4a, 0x65, 0x73, 0x64, 0x79, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x64, 0x79, 0x20, 0x4c, 0x75, 0x6e, 0x3b, 0x64,
-0x79, 0x20, 0x4d, 0x65, 0x75, 0x72, 0x74, 0x68, 0x3b, 0x64, 0x79, 0x20, 0x4d, 0x65, 0x72, 0x68, 0x65, 0x72, 0x3b, 0x64,
-0x79, 0x20, 0x59, 0x6f, 0x77, 0x3b, 0x64, 0x79, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x79, 0x20, 0x53,
-0x61, 0x64, 0x6f, 0x72, 0x6e, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x74, 0x68, 0x3b, 0x4d, 0x68, 0x72,
-0x3b, 0x59, 0x6f, 0x77, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x4b, 0x77, 0x65, 0x73, 0x69, 0x64, 0x61, 0x3b,
-0x44, 0x77, 0x6f, 0x77, 0x64, 0x61, 0x3b, 0x42, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x3b, 0x57, 0x75, 0x6b, 0x75, 0x64, 0x61,
-0x3b, 0x59, 0x61, 0x77, 0x64, 0x61, 0x3b, 0x46, 0x69, 0x64, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x65, 0x6e, 0x65, 0x64, 0x61,
-0x4b, 0x77, 0x65, 0x3b, 0x44, 0x77, 0x6f, 0x3b, 0x42, 0x65, 0x6e, 0x3b, 0x57, 0x75, 0x6b, 0x3b, 0x59, 0x61, 0x77, 0x3b,
-0x46, 0x69, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x4b, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x57, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x4d,
-0x906, 0x92f, 0x924, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x93e, 0x930, 0x3b, 0x92c,
-0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x93e,
-0x930, 0x3b, 0x936, 0x947, 0x928, 0x935, 0x93e, 0x930, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x917,
-0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x947, 0x53, 0x1ecd, 0x6e, 0x64, 0x65, 0x65, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x64, 0x65, 0x3b,
-0x54, 0x69, 0x75, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x54, 0x1ecd, 0x1ecd,
-0x7a, 0x64, 0x65, 0x65, 0x3b, 0x46, 0x72, 0x61, 0x1ecb, 0x64, 0x65, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x1ecd, 0x64, 0x65, 0x65,
-0x1ee4, 0x6b, 0x61, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x3b, 0x54, 0x69, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x3b,
-0x46, 0x72, 0x61, 0x1ecb, 0x3b, 0x53, 0x61, 0x74, 0x57, 0x61, 0x20, 0x6b, 0x79, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x57, 0x61,
-0x20, 0x6b, 0x77, 0x61, 0x6d, 0x62, 0x129, 0x6c, 0x129, 0x6c, 0x79, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129,
-0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x57,
-0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x57, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74,
-0x169, 0x57, 0x6b, 0x79, 0x3b, 0x57, 0x6b, 0x77, 0x3b, 0x57, 0x6b, 0x6c, 0x3b, 0x57, 0x74, 0x169, 0x3b, 0x57, 0x6b, 0x6e,
-0x3b, 0x57, 0x74, 0x6e, 0x3b, 0x57, 0x74, 0x68, 0x59, 0x3b, 0x57, 0x3b, 0x45, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b,
-0x41, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x61,
-0x72, 0x73, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x75, 0x73, 0x3b, 0x6a, 0x6f, 0x69, 0x62, 0x65, 0x3b, 0x76, 0x69, 0x6e,
-0x61, 0x72, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x69, 0x64, 0x65, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61,
-0x72, 0x3b, 0x6d, 0x69, 0x65, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x6b, 0x254, 0x73,
-0x69, 0x256, 0x61, 0x3b, 0x64, 0x7a, 0x6f, 0x256, 0x61, 0x3b, 0x62, 0x6c, 0x61, 0x256, 0x61, 0x3b, 0x6b, 0x75, 0x256, 0x61,
-0x3b, 0x79, 0x61, 0x77, 0x6f, 0x256, 0x61, 0x3b, 0x66, 0x69, 0x256, 0x61, 0x3b, 0x6d, 0x65, 0x6d, 0x6c, 0x65, 0x256, 0x61,
-0x6b, 0x254, 0x73, 0x3b, 0x64, 0x7a, 0x6f, 0x3b, 0x62, 0x6c, 0x61, 0x3b, 0x6b, 0x75, 0x256, 0x3b, 0x79, 0x61, 0x77, 0x3b,
-0x66, 0x69, 0x256, 0x3b, 0x6d, 0x65, 0x6d, 0x6b, 0x3b, 0x64, 0x3b, 0x62, 0x3b, 0x6b, 0x3b, 0x79, 0x3b, 0x66, 0x3b, 0x6d,
-0x4c, 0x101, 0x70, 0x75, 0x6c, 0x65, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x61, 0x68, 0x69, 0x3b, 0x50, 0x6f, 0x2bb, 0x61,
-0x6c, 0x75, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x6f, 0x6c, 0x75, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x68, 0x101, 0x3b,
-0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x69, 0x6d, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6f, 0x6e, 0x6f, 0x4c, 0x50, 0x3b, 0x50,
-0x31, 0x3b, 0x50, 0x32, 0x3b, 0x50, 0x33, 0x3b, 0x50, 0x34, 0x3b, 0x50, 0x35, 0x3b, 0x50, 0x36, 0x4c, 0x69, 0x6e, 0x67,
-0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65,
-0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73, 0x3b, 0x42, 0x69, 0x79, 0x65, 0x72,
-0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x4c, 0x69, 0x6e, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61,
-0x72, 0x3b, 0x4d, 0x69, 0x79, 0x3b, 0x48, 0x75, 0x77, 0x3b, 0x42, 0x69, 0x79, 0x3b, 0x53, 0x61, 0x62, 0x53, 0x75, 0x6e,
-0x6e, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0xe4, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x5a, 0x69, 0x69, 0x73, 0x63, 0x68, 0x74,
-0x69, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x75, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x74, 0x69,
-0x67, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x74, 0x69, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x53,
-0x75, 0x2e, 0x3b, 0x4d, 0xe4, 0x2e, 0x3b, 0x5a, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46,
-0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0xa46d, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa282, 0xa2cd, 0x3b, 0xa18f, 0xa282, 0xa44d, 0x3b, 0xa18f, 0xa282,
-0xa315, 0x3b, 0xa18f, 0xa282, 0xa1d6, 0x3b, 0xa18f, 0xa282, 0xa26c, 0x3b, 0xa18f, 0xa282, 0xa0d8, 0xa46d, 0xa18f, 0x3b, 0xa18f, 0xa2cd, 0x3b, 0xa18f,
-0xa44d, 0x3b, 0xa18f, 0xa315, 0x3b, 0xa18f, 0xa1d6, 0x3b, 0xa18f, 0xa26c, 0x3b, 0xa18f, 0xa0d8, 0xa18f, 0x3b, 0xa2cd, 0x3b, 0xa44d, 0x3b, 0xa315,
-0x3b, 0xa1d6, 0x3b, 0xa26c, 0x3b, 0xa0d8, 0x53, 0xfc, 0x6e, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61,
-0x67, 0x3b, 0x44, 0x69, 0x6e, 0x67, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x64, 0x64, 0x65, 0x77, 0x65, 0x6b, 0x65,
-0x6e, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x65, 0x64, 0x61, 0x67,
-0x3b, 0x53, 0xfc, 0x6e, 0x6e, 0x61, 0x76, 0x65, 0x6e, 0x64, 0x53, 0xfc, 0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69,
-0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x73, 0x6f, 0x74,
-0x6e, 0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x6d,
-0x61, 0x14b, 0x14b, 0x65, 0x62, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b,
-0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x61, 0x73, 0x64, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61,
-0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76, 0x61, 0x72, 0x64, 0x61, 0x74, 0x73, 0x6f, 0x74, 0x6e, 0x3b, 0x76, 0x75, 0x6f, 0x73,
-0x3b, 0x6d, 0x61, 0x14b, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x3b,
-0x6c, 0xe1, 0x76, 0x53, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x73, 0x6f, 0x74, 0x6e,
-0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69, 0x3b, 0x6d, 0xe1, 0x6e, 0x6e, 0x6f, 0x64, 0x61, 0x74, 0x3b, 0x64, 0x69, 0x73,
-0x64, 0x61, 0x74, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72,
-0x61, 0x73, 0x74, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76,
-0x6f, 0x72, 0x64, 0x61, 0x74, 0x73, 0x6f, 0x3b, 0x6d, 0xe1, 0x3b, 0x64, 0x69, 0x3b, 0x67, 0x61, 0x3b, 0x64, 0x75, 0x3b,
-0x62, 0x65, 0x3b, 0x6c, 0xe1, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x43, 0x68,
-0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x6f, 0x3b, 0x43, 0x68,
-0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61,
-0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x63, 0x68, 0x75, 0x6d, 0x61, 0x3b, 0x45, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x43,
-0x70, 0x72, 0x3b, 0x43, 0x74, 0x74, 0x3b, 0x43, 0x6d, 0x6e, 0x3b, 0x43, 0x6d, 0x74, 0x3b, 0x41, 0x72, 0x73, 0x3b, 0x49,
-0x63, 0x6d, 0x3b, 0x45, 0x73, 0x74, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x45, 0x49,
-0x74, 0x75, 0x6b, 0x75, 0x20, 0x6a, 0x61, 0x20, 0x6a, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75,
-0x6b, 0x61, 0x20, 0x6a, 0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20,
-0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75,
-0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d,
-0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x69, 0x66, 0x75, 0x6c, 0x61, 0x20, 0x6e, 0x67,
-0x75, 0x77, 0x6f, 0x4a, 0x75, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b,
-0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4e, 0x67, 0x75, 0x4a, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
-0x4b, 0x3b, 0x4e, 0x64, 0x65, 0x77, 0x6f, 0x3b, 0x61, 0x61, 0x253, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x62, 0x61,
-0x61, 0x72, 0x65, 0x3b, 0x6e, 0x6a, 0x65, 0x73, 0x6c, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x73, 0x61, 0x61,
-0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x6e, 0x64, 0x65, 0x3b, 0x68, 0x6f, 0x6f, 0x72, 0x65, 0x2d, 0x62, 0x69, 0x69,
-0x72, 0x64, 0x65, 0x77, 0x3b, 0x61, 0x61, 0x253, 0x3b, 0x6d, 0x61, 0x77, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x6e, 0x61, 0x61,
-0x3b, 0x6d, 0x77, 0x64, 0x3b, 0x68, 0x62, 0x69, 0x64, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6e, 0x3b, 0x6e, 0x3b, 0x6d, 0x3b,
-0x68, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4e, 0x6a,
-0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x61,
-0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f,
-0x74, 0x68, 0x69, 0x4b, 0x4d, 0x41, 0x3b, 0x4e, 0x54, 0x54, 0x3b, 0x4e, 0x4d, 0x4e, 0x3b, 0x4e, 0x4d, 0x54, 0x3b, 0x41,
-0x52, 0x54, 0x3b, 0x4e, 0x4d, 0x41, 0x3b, 0x4e, 0x4d, 0x4d, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b,
-0x4e, 0x3b, 0x4e, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x61, 0x72, 0x65, 0x3b, 0x4d, 0x64, 0x65,
-0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65,
-0x65, 0x20, 0x6f, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20,
-0x69, 0x6e, 0x65, 0x74, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4d,
-0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74,
-0x20, 0x65, 0x65, 0x20, 0x6b, 0x77, 0x65, 0x41, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x6e, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49,
-0x6e, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70, 0x3b, 0x4b, 0x77, 0x65, 0x41, 0x3b, 0x4b, 0x3b, 0x4f, 0x3b,
-0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x4b, 0x44, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x6f,
-0x73, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43,
-0x68, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x53, 0x61, 0x62, 0x75, 0x64,
-0x75, 0x44, 0x69, 0x6d, 0x3b, 0x50, 0x6f, 0x73, 0x3b, 0x50, 0x69, 0x72, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x69,
-0x3b, 0x53, 0x68, 0x61, 0x3b, 0x53, 0x61, 0x62, 0x44, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x53, 0x3b,
-0x53, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x53, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b,
-0x53, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x53, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x68, 0x6c, 0x61, 0x6e,
-0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x53, 0x69,
-0x62, 0x3b, 0x53, 0x69, 0x74, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x53, 0x69, 0x68, 0x3b, 0x4d, 0x67, 0x71, 0x53, 0x3b, 0x4d,
-0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b,
-0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x49,
-0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a,
-0x75, 0x6d, 0x61, 0x61, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x49, 0x6a, 0x70, 0x3b, 0x49, 0x6a,
-0x74, 0x3b, 0x49, 0x6a, 0x6e, 0x3b, 0x49, 0x6a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x49,
-0x6a, 0x6d, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x31, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30,
-0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59,
-0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30,
-0x2d59, 0x2d30, 0x2d59, 0x2d30, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x3b, 0x2d30, 0x2d3d, 0x2d61,
-0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x61, 0x79, 0x6e,
-0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x1e5b, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x77, 0x61,
-0x73, 0x3b, 0x61, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x79, 0x61, 0x73, 0x61, 0x73, 0x61,
-0x3b, 0x61, 0x79, 0x6e, 0x3b, 0x61, 0x73, 0x69, 0x3b, 0x61, 0x6b, 0x1e5b, 0x3b, 0x61, 0x6b, 0x77, 0x3b, 0x61, 0x73, 0x69,
-0x6d, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x41, 0x63, 0x65, 0x72, 0x3b, 0x41, 0x72, 0x69, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6d,
-0x3b, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x41, 0x6d, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64, 0x59,
-0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x61, 0x73, 0x73,
-0x3b, 0x4b, 0x75, 0x1e93, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6d, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x1e0d, 0x69, 0x73, 0x61,
-0x73, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x61, 0x73, 0x73, 0x41, 0x63, 0x65, 0x3b, 0x41, 0x72, 0x69, 0x3b, 0x41, 0x72, 0x61,
-0x3b, 0x41, 0x68, 0x61, 0x3b, 0x41, 0x6d, 0x68, 0x3b, 0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64, 0x59, 0x61, 0x6e, 0x3b,
-0x53, 0x61, 0x6e, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x3b, 0x4b, 0x75, 0x1e93, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x1e0d, 0x69,
-0x73, 0x3b, 0x53, 0x61, 0x79, 0x59, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x43, 0x3b,
-0x52, 0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x44, 0x53, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x4f, 0x72, 0x77,
-0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b,
-0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61,
-0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6d, 0x75, 0x6b,
-0x61, 0x61, 0x67, 0x61, 0x53, 0x41, 0x4e, 0x3b, 0x4f, 0x52, 0x4b, 0x3b, 0x4f, 0x4b, 0x42, 0x3b, 0x4f, 0x4b, 0x53, 0x3b,
-0x4f, 0x4b, 0x4e, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4f, 0x4d, 0x4b, 0x53, 0x3b, 0x4b, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4e,
-0x3b, 0x54, 0x3b, 0x4d, 0x70, 0x61, 0x20, 0x6d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68,
-0x61, 0x68, 0x75, 0x76, 0x69, 0x6c, 0x75, 0x68, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b,
-0x70, 0x61, 0x20, 0x68, 0x69, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x74, 0x61, 0x79, 0x69, 0x3b,
-0x70, 0x61, 0x20, 0x68, 0x69, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75, 0x6c, 0x65,
-0x6d, 0x62, 0x65, 0x6c, 0x61, 0x4d, 0x75, 0x6c, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x48, 0x69, 0x76, 0x3b, 0x48, 0x69, 0x64,
-0x3b, 0x48, 0x69, 0x74, 0x3b, 0x48, 0x69, 0x68, 0x3b, 0x4c, 0x65, 0x6d, 0x4d, 0x3b, 0x4a, 0x3b, 0x48, 0x3b, 0x48, 0x3b,
-0x48, 0x3b, 0x57, 0x3b, 0x4a, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
-0x61, 0x74, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e,
-0x75, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74,
-0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a,
-0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x6b, 0x61, 0x72, 0x69, 0x3b, 0x6e, 0x74, 0x25b, 0x6e, 0x25b, 0x3b, 0x74, 0x61, 0x72,
-0x61, 0x74, 0x61, 0x3b, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x69, 0x73, 0x61, 0x3b, 0x6a, 0x75,
-0x6d, 0x61, 0x3b, 0x73, 0x69, 0x62, 0x69, 0x72, 0x69, 0x6b, 0x61, 0x72, 0x3b, 0x6e, 0x74, 0x25b, 0x3b, 0x74, 0x61, 0x72,
-0x3b, 0x61, 0x72, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x62, 0x4b, 0x3b, 0x4e, 0x3b,
-0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x53, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d,
-0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61,
-0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61,
-0x3b, 0x4e, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x69, 0x4b, 0x6d, 0x61, 0x3b, 0x54, 0x61, 0x74, 0x3b,
-0x49, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6e, 0x3b, 0x41, 0x72, 0x6d, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4e, 0x4d, 0x4d, 0x4b,
-0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4e, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c6, 0x13cd, 0x13ac, 0x3b,
-0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x13a2, 0x13a6, 0x3b,
-0x13c5, 0x13a9, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13e7, 0x13be, 0x13a9, 0x13b6, 0x13cd, 0x13d7, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c8, 0x13d5, 0x13be,
-0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x3b,
-0x13e7, 0x13be, 0x13a9, 0x3b, 0x13c8, 0x13d5, 0x13be, 0x13c6, 0x3b, 0x13c9, 0x3b, 0x13d4, 0x3b, 0x13e6, 0x3b, 0x13c5, 0x3b, 0x13e7, 0x3b, 0x13a4,
-0x64, 0x69, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d,
-0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x7a, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x64,
-0x69, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0x69, 0x64, 0x69, 0x6d, 0x3b, 0x6c, 0x69, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d,
-0x65, 0x72, 0x3b, 0x7a, 0x65, 0x3b, 0x76, 0x61, 0x6e, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d,
-0x3b, 0x7a, 0x3b, 0x76, 0x3b, 0x73, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x70, 0x69, 0x6c, 0x69,
-0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x69, 0x64, 0x75,
-0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61,
-0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79,
-0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x3b, 0x4c, 0x69, 0x64,
-0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x76,
-0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x4c, 0x6c,
-0x32, 0x3b, 0x4c, 0x6c, 0x33, 0x3b, 0x4c, 0x6c, 0x34, 0x3b, 0x4c, 0x6c, 0x35, 0x3b, 0x4c, 0x6c, 0x36, 0x3b, 0x4c, 0x6c,
-0x37, 0x3b, 0x4c, 0x6c, 0x31, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
-0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0xed, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x61, 0x6e,
-0x6f, 0x3b, 0x41, 0x6c, 0x61, 0x6d, 0xed, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x6d, 0xf3, 0x6f, 0x73, 0x69, 0x50, 0xed, 0x69, 0x6c, 0x69, 0x3b, 0x54, 0xe1, 0x61, 0x74, 0x75, 0x3b, 0xcd,
-0x6e, 0x65, 0x3b, 0x54, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4d, 0xf3, 0x6f,
-0x73, 0x69, 0x50, 0x3b, 0x54, 0x3b, 0x45, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4d, 0x53, 0x61, 0x62, 0x62, 0x69,
-0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x62, 0x69, 0x72, 0x69,
-0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4c,
-0x77, 0x61, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61,
-0x53, 0x61, 0x62, 0x3b, 0x42, 0x61, 0x6c, 0x3b, 0x4c, 0x77, 0x32, 0x3b, 0x4c, 0x77, 0x33, 0x3b, 0x4c, 0x77, 0x34, 0x3b,
-0x4c, 0x77, 0x35, 0x3b, 0x4c, 0x77, 0x36, 0x53, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c,
-0x50, 0x61, 0x20, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6d, 0x6f,
-0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x62, 0x75, 0x6c, 0x69, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69,
-0x74, 0x61, 0x74, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63,
-0x68, 0x69, 0x73, 0x61, 0x6e, 0x6f, 0x3b, 0x50, 0x61, 0x63, 0x68, 0x69, 0x62, 0x65, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x64,
-0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73, 0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b,
-0x74, 0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65,
-0x72, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x61, 0x2d,
-0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x75, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73,
-0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65,
-0x72, 0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61,
-0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x61, 0x62,
-0x61, 0x64, 0x75, 0x64, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x67, 0x3b, 0x74, 0x65, 0x72, 0x3b, 0x6b, 0x75, 0x61, 0x3b, 0x6b,
-0x69, 0x6e, 0x3b, 0x73, 0x65, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
-0x53, 0x3b, 0x53, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4d, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x6f, 0x3b, 0x57,
-0x61, 0x69, 0x72, 0x69, 0x3b, 0x57, 0x65, 0x74, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x61, 0x3b, 0x57, 0x65,
-0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4b, 0x49, 0x55, 0x3b, 0x4d, 0x52, 0x41,
-0x3b, 0x57, 0x41, 0x49, 0x3b, 0x57, 0x45, 0x54, 0x3b, 0x57, 0x45, 0x4e, 0x3b, 0x57, 0x54, 0x4e, 0x3b, 0x4a, 0x55, 0x4d,
-0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x4a, 0x4b, 0x6f, 0x74, 0x69, 0x73, 0x61, 0x70,
-0x3b, 0x4b, 0x6f, 0x74, 0x61, 0x61, 0x69, 0x3b, 0x4b, 0x6f, 0x61, 0x65, 0x6e, 0x67, 0x2019, 0x3b, 0x4b, 0x6f, 0x73, 0x6f,
-0x6d, 0x6f, 0x6b, 0x3b, 0x4b, 0x6f, 0x61, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4b, 0x6f, 0x6d, 0x75, 0x75, 0x74,
-0x3b, 0x4b, 0x6f, 0x6c, 0x6f, 0x4b, 0x74, 0x73, 0x3b, 0x4b, 0x6f, 0x74, 0x3b, 0x4b, 0x6f, 0x6f, 0x3b, 0x4b, 0x6f, 0x73,
-0x3b, 0x4b, 0x6f, 0x61, 0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x4b, 0x6f, 0x6c, 0x54, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x53, 0x3b,
-0x41, 0x3b, 0x4d, 0x3b, 0x4c, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x6e,
-0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65,
-0x73, 0x3b, 0x57, 0x75, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65,
-0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x46, 0x72, 0x61, 0x69, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65,
-0x65, 0x73, 0x3b, 0x53, 0x61, 0x74, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x53, 0x6f, 0x6e, 0x3b,
-0x4d, 0x61, 0x3b, 0x44, 0x65, 0x3b, 0x57, 0x75, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x74, 0x53, 0x3b,
-0x4d, 0x3b, 0x45, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x41, 0x53, 0x75, 0x6e, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68,
-0x3b, 0x4d, 0x6f, 0x68, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x6e, 0x6e, 0x73, 0x64, 0x61, 0x61, 0x63,
-0x68, 0x3b, 0x4d, 0x65, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x61,
-0x63, 0x68, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x64, 0x61, 0x61,
-0x63, 0x68, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x65, 0x2e, 0x3b, 0x44, 0x75,
-0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x6c, 0xed, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1,
-0x6e, 0x254, 0x3b, 0x41, 0x6c, 0x61, 0xe1, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x6d, 0xf3, 0x73, 0x69, 0x53, 0x61, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61,
-0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75,
-0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x75, 0x3b,
-0x4f, 0x6c, 0x6f, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x53, 0x61, 0x62, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x3b,
-0x4b, 0x75, 0x62, 0x69, 0x3b, 0x4b, 0x75, 0x73, 0x61, 0x3b, 0x4b, 0x75, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x74, 0x61, 0x3b,
-0x4d, 0x75, 0x6b, 0x61, 0x53, 0x3b, 0x42, 0x3b, 0x42, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x4a, 0x75, 0x6d,
-0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e,
-0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61,
-0x20, 0x4b, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x74, 0x61,
-0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34, 0x3b,
-0x4a, 0x35, 0x3b, 0x41, 0x6c, 0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a,
-0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4a, 0x6d, 0x6f, 0x4e, 0x61,
-0x6b, 0x61, 0x65, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x62, 0x61, 0x72, 0x61, 0x73, 0x61, 0x3b,
-0x4e, 0x61, 0x6b, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x61, 0x6b, 0x61,
-0x75, 0x6e, 0x67, 0x2019, 0x6f, 0x6e, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x79, 0x3b, 0x4e, 0x61, 0x6b, 0x61,
-0x73, 0x61, 0x62, 0x69, 0x74, 0x69, 0x4a, 0x75, 0x6d, 0x3b, 0x42, 0x61, 0x72, 0x3b, 0x41, 0x61, 0x72, 0x3b, 0x55, 0x6e,
-0x69, 0x3b, 0x55, 0x6e, 0x67, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x62, 0x4a, 0x3b, 0x42, 0x3b, 0x41, 0x3b, 0x55,
-0x3b, 0x55, 0x3b, 0x4b, 0x3b, 0x53, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x69, 0x3b, 0x41,
-0x74, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69,
-0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x73, 0x61, 0x62, 0x64, 0x75, 0x41, 0x6c,
-0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c,
-0x6a, 0x3b, 0x41, 0x73, 0x73, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x53, 0x4a, 0x75,
-0x6d, 0x61, 0x70, 0x69, 0x6c, 0x3b, 0x57, 0x75, 0x6f, 0x6b, 0x20, 0x54, 0x69, 0x63, 0x68, 0x3b, 0x54, 0x69, 0x63, 0x68,
-0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b, 0x54, 0x69, 0x63,
-0x68, 0x20, 0x41, 0x6e, 0x67, 0x2019, 0x77, 0x65, 0x6e, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x62, 0x69, 0x63, 0x68,
-0x3b, 0x4e, 0x67, 0x65, 0x73, 0x6f, 0x4a, 0x4d, 0x50, 0x3b, 0x57, 0x55, 0x54, 0x3b, 0x54, 0x41, 0x52, 0x3b, 0x54, 0x41,
-0x44, 0x3b, 0x54, 0x41, 0x4e, 0x3b, 0x54, 0x41, 0x42, 0x3b, 0x4e, 0x47, 0x53, 0x4a, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x54,
-0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4e, 0x41, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x41, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x41,
-0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x72, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73,
-0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x1e0d, 0x79, 0x61, 0x73, 0x41, 0x73, 0x61, 0x3b, 0x41, 0x79, 0x6e,
-0x3b, 0x41, 0x73, 0x6e, 0x3b, 0x41, 0x6b, 0x72, 0x3b, 0x41, 0x6b, 0x77, 0x3b, 0x41, 0x73, 0x6d, 0x3b, 0x41, 0x73, 0x1e0d,
-0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b,
-0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72,
-0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x7a, 0x75, 0x6d, 0x61, 0x3b,
-0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x41, 0x6c, 0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c,
-0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x7a, 0x3b, 0x41, 0x73, 0x69, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x70, 0x69,
-0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6e, 0x65, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49,
-0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x70, 0x69, 0x3b, 0x4a,
-0x74, 0x74, 0x3b, 0x4a, 0x6d, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a,
-0x6d, 0x6f, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x31, 0x930, 0x92c, 0x93f, 0x92c, 0x93e,
-0x930, 0x3b, 0x938, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x926, 0x92c,
-0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x938, 0x925, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x941, 0x916, 0x941, 0x930, 0x92c, 0x93e, 0x930,
-0x3b, 0x938, 0x941, 0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x930, 0x92c, 0x93f, 0x3b, 0x938, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b,
-0x92c, 0x941, 0x926, 0x3b, 0x92c, 0x93f, 0x938, 0x925, 0x93f, 0x3b, 0x938, 0x941, 0x916, 0x941, 0x930, 0x3b, 0x938, 0x941, 0x928, 0x93f,
-0x930, 0x3b, 0x938, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x938, 0x941, 0x3b, 0x938, 0x941, 0x43a, 0x4c0,
-0x438, 0x440, 0x430, 0x3b, 0x43e, 0x440, 0x448, 0x43e, 0x442, 0x3b, 0x448, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x43a, 0x445, 0x430,
-0x430, 0x440, 0x430, 0x3b, 0x435, 0x430, 0x440, 0x430, 0x3b, 0x43f, 0x4c0, 0x435, 0x440, 0x430, 0x441, 0x43a, 0x430, 0x3b, 0x448, 0x443,
-0x43e, 0x442, 0x43a, 0x4c0, 0x438, 0x3b, 0x43e, 0x440, 0x3b, 0x448, 0x438, 0x3b, 0x43a, 0x445, 0x430, 0x3b, 0x435, 0x430, 0x3b, 0x43f,
-0x4c0, 0x435, 0x3b, 0x448, 0x443, 0x43e, 0x43a, 0x4c0, 0x3b, 0x43e, 0x3b, 0x448, 0x3b, 0x43a, 0x445, 0x3b, 0x435, 0x3b, 0x43f, 0x4c0,
-0x3b, 0x448, 0x43d, 0x435, 0x434, 0x463, 0x301, 0x43b, 0x467, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x463, 0x301, 0x43b, 0x44c, 0x43d,
-0x438, 0x43a, 0x44a, 0x3b, 0x432, 0x442, 0x43e, 0x301, 0x440, 0x43d, 0x438, 0x43a, 0x44a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x300,
-0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x442, 0x43e, 0x301, 0x43a, 0x44a, 0x3b, 0x43f, 0x467, 0x442, 0x43e, 0x301, 0x43a, 0x44a,
-0x3b, 0x441, 0xa64b, 0x431, 0x431, 0x461, 0x301, 0x442, 0x430, 0x43d, 0x434, 0x2de7, 0x487, 0x467, 0x3b, 0x43f, 0x43d, 0x2de3, 0x435, 0x3b,
-0x432, 0x442, 0x43e, 0x2dec, 0x487, 0x3b, 0x441, 0x440, 0x2de3, 0x435, 0x3b, 0x447, 0x435, 0x2de6, 0x487, 0x3b, 0x43f, 0x467, 0x2de6, 0x487,
-0x3b, 0x441, 0xa64b, 0x2de0, 0x487, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x4e, 0x6b, 0x6f, 0x64, 0x79, 0x61, 0x3b,
-0x4e, 0x64, 0xe0, 0x61, 0x79, 0xe0, 0x3b, 0x4e, 0x64, 0x61, 0x6e, 0x67, 0xf9, 0x3b, 0x4e, 0x6a, 0xf2, 0x77, 0x61, 0x3b,
-0x4e, 0x67, 0xf2, 0x76, 0x79, 0x61, 0x3b, 0x4c, 0x75, 0x62, 0x69, 0x6e, 0x67, 0x75, 0x4c, 0x75, 0x6d, 0x3b, 0x4e, 0x6b,
-0x6f, 0x3b, 0x4e, 0x64, 0x79, 0x3b, 0x4e, 0x64, 0x67, 0x3b, 0x4e, 0x6a, 0x77, 0x3b, 0x4e, 0x67, 0x76, 0x3b, 0x4c, 0x75,
-0x62, 0x4c, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4c, 0x53, 0x6f, 0x6e, 0x6e, 0x64, 0x65,
-0x67, 0x3b, 0x4d, 0xe9, 0x69, 0x6e, 0x64, 0x65, 0x67, 0x3b, 0x44, 0xeb, 0x6e, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x3b,
-0x4d, 0xeb, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67,
-0x3b, 0x46, 0x72, 0x65, 0x69, 0x64, 0x65, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x53, 0x6f,
-0x6e, 0x3b, 0x4d, 0xe9, 0x69, 0x3b, 0x44, 0xeb, 0x6e, 0x3b, 0x4d, 0xeb, 0x74, 0x3b, 0x44, 0x6f, 0x6e, 0x3b, 0x46, 0x72,
-0x65, 0x3b, 0x53, 0x61, 0x6d, 0x53, 0x6f, 0x6e, 0x2e, 0x3b, 0x4d, 0xe9, 0x69, 0x2e, 0x3b, 0x44, 0xeb, 0x6e, 0x2e, 0x3b,
-0x4d, 0xeb, 0x74, 0x2e, 0x3b, 0x44, 0x6f, 0x6e, 0x2e, 0x3b, 0x46, 0x72, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x6d, 0x2e, 0x74,
-0x73, 0x75, 0x294, 0x6e, 0x74, 0x73, 0x268, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x6b, 0x70, 0xe0, 0x3b, 0x74, 0x73, 0x75,
-0x294, 0x75, 0x67, 0x68, 0x254, 0x65, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x74, 0x254, 0x300, 0x6d, 0x6c, 0xf2, 0x3b, 0x74,
-0x73, 0x75, 0x294, 0x75, 0x6d, 0xe8, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x67, 0x68, 0x268, 0x302, 0x6d, 0x3b, 0x74, 0x73,
-0x75, 0x294, 0x6e, 0x64, 0x7a, 0x268, 0x6b, 0x254, 0x294, 0x254, 0x6e, 0x74, 0x73, 0x3b, 0x6b, 0x70, 0x61, 0x3b, 0x67, 0x68,
-0x254, 0x3b, 0x74, 0x254, 0x6d, 0x3b, 0x75, 0x6d, 0x65, 0x3b, 0x67, 0x68, 0x268, 0x3b, 0x64, 0x7a, 0x6b, 0x6e, 0x3b, 0x6b,
-0x3b, 0x67, 0x3b, 0x74, 0x3b, 0x75, 0x3b, 0x67, 0x3b, 0x64, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e, 0x254, 0x302, 0x79, 0x3b,
-0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e, 0x6a, 0x61, 0x14b, 0x67, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20,
-0xfb, 0x6d, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x14b, 0x67, 0xea, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6d, 0x62, 0x254,
-0x6b, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6b, 0x254, 0x254, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6a, 0xf4, 0x6e, 0x6e,
-0x254, 0x79, 0x3b, 0x6e, 0x6a, 0x61, 0x3b, 0x75, 0x75, 0x6d, 0x3b, 0x14b, 0x67, 0x65, 0x3b, 0x6d, 0x62, 0x254, 0x3b, 0x6b,
-0x254, 0x254, 0x3b, 0x6a, 0x6f, 0x6e, 0x6e, 0x3b, 0x6e, 0x3b, 0x75, 0x3b, 0x14b, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6a, 0x41,
-0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x61, 0x74,
-0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x6c,
-0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4d,
-0x3b, 0x5a, 0x3b, 0x53, 0xe9, 0x74, 0x69, 0x3b, 0x6d, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x6b, 0x77, 0x61, 0x73, 0xfa, 0x3b,
-0x6d, 0x75, 0x6b, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x14b, 0x67, 0x69, 0x73, 0xfa, 0x3b, 0x257, 0xf3, 0x6e, 0x25b, 0x73, 0xfa,
-0x3b, 0x65, 0x73, 0x61, 0x253, 0x61, 0x73, 0xfa, 0xe9, 0x74, 0x3b, 0x6d, 0x254, 0x301, 0x73, 0x3b, 0x6b, 0x77, 0x61, 0x3b,
-0x6d, 0x75, 0x6b, 0x3b, 0x14b, 0x67, 0x69, 0x3b, 0x257, 0xf3, 0x6e, 0x3b, 0x65, 0x73, 0x61, 0x65, 0x3b, 0x6d, 0x3b, 0x6b,
-0x3b, 0x6d, 0x3b, 0x14b, 0x3b, 0x257, 0x3b, 0x65, 0x44, 0x69, 0x6d, 0x61, 0x73, 0x3b, 0x54, 0x65, 0x6e, 0x65, 0x14b, 0x3b,
-0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x79, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69,
-0x73, 0x61, 0x79, 0x3b, 0x41, 0x72, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x53, 0x69, 0x62, 0x69, 0x74, 0x69, 0x44, 0x69, 0x6d,
-0x3b, 0x54, 0x65, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x41, 0x72, 0x6a,
-0x3b, 0x53, 0x69, 0x62, 0x44, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x53, 0x73, 0x254, 0x301,
-0x6e, 0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259,
-0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x62, 0x25b, 0x30c, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c,
-0xfa, 0x20, 0x6d, 0x259, 0x301, 0x6c, 0x25b, 0x301, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa,
-0x20, 0x6d, 0x259, 0x301, 0x6e, 0x79, 0x69, 0x3b, 0x66, 0xfa, 0x6c, 0x61, 0x64, 0xe9, 0x3b, 0x73, 0xe9, 0x72, 0x61, 0x64,
-0xe9, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d, 0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73,
-0x6d, 0x6e, 0x3b, 0x66, 0xfa, 0x6c, 0x3b, 0x73, 0xe9, 0x72, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b,
-0x66, 0x3b, 0x73, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x1dd, 0x3b, 0x6c, 0x1dd, 0x6e, 0x64, 0xed, 0x3b, 0x6d, 0x61, 0x61, 0x64,
-0xed, 0x3b, 0x6d, 0x25b, 0x6b, 0x72, 0x25b, 0x64, 0xed, 0x3b, 0x6a, 0x1dd, 0x1dd, 0x64, 0xed, 0x3b, 0x6a, 0xfa, 0x6d, 0x62,
-0xe1, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0xed, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6c, 0x1dd, 0x6e, 0x3b, 0x6d, 0x61, 0x61, 0x3b,
-0x6d, 0x25b, 0x6b, 0x3b, 0x6a, 0x1dd, 0x1dd, 0x3b, 0x6a, 0xfa, 0x6d, 0x3b, 0x73, 0x61, 0x6d, 0x73, 0x3b, 0x6c, 0x3b, 0x6d,
-0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x73, 0x53, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
-0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f,
-0x3b, 0x41, 0x72, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x53, 0x61, 0x62, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74,
-0x6e, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x53, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a,
-0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x43, 0x6f, 0x6d, 0x2019, 0x79, 0x61, 0x6b, 0x6b, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x6c,
-0x61, 0x61, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x7a, 0x79, 0x69, 0x69, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d,
-0x6b, 0x6f, 0x6c, 0x6c, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x6b, 0x61, 0x6c, 0x64, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x43,
-0x6f, 0x6d, 0x67, 0x61, 0x69, 0x73, 0x75, 0x75, 0x3b, 0x43, 0x6f, 0x6d, 0x7a, 0x79, 0x65, 0x253, 0x73, 0x75, 0x75, 0x43,
-0x79, 0x61, 0x3b, 0x43, 0x6c, 0x61, 0x3b, 0x43, 0x7a, 0x69, 0x3b, 0x43, 0x6b, 0x6f, 0x3b, 0x43, 0x6b, 0x61, 0x3b, 0x43,
-0x67, 0x61, 0x3b, 0x43, 0x7a, 0x65, 0x59, 0x3b, 0x4c, 0x3b, 0x5a, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x45, 0x73,
-0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20,
-0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x62, 0x61, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66,
-0xfa, 0x20, 0x6d, 0xe1, 0x6c, 0x61, 0x6c, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20,
-0x6d, 0xe1, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x62, 0xe1, 0x67, 0xe1, 0x20, 0x6d, 0xe1, 0x20, 0x73, 0x75, 0x6b, 0x75, 0x6c,
-0x3b, 0x73, 0xe1, 0x73, 0x61, 0x64, 0x69, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d, 0x62,
-0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d, 0x6e, 0x3b, 0x6d, 0x62, 0x73, 0x3b, 0x73, 0x61, 0x73, 0x73, 0x3b, 0x6d, 0x3b,
-0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x43, 0xe4, 0x14b, 0x20, 0x6b, 0x75, 0x254, 0x74, 0x68, 0x3b, 0x4a,
-0x69, 0x65, 0x63, 0x20, 0x6c, 0x61, 0x331, 0x74, 0x3b, 0x52, 0x25b, 0x77, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x44,
-0x69, 0x254, 0x331, 0x6b, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e, 0x20, 0x6c, 0xe4, 0x74,
-0x6e, 0x69, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x42, 0xe4, 0x6b, 0x25b,
-0x6c, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x43, 0xe4, 0x14b, 0x3b, 0x4a, 0x69, 0x65, 0x63, 0x3b, 0x52, 0x25b, 0x77, 0x3b,
-0x44, 0x69, 0x254, 0x331, 0x6b, 0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x3b, 0x42,
-0xe4, 0x6b, 0x25b, 0x6c, 0x43, 0x3b, 0x4a, 0x3b, 0x52, 0x3b, 0x44, 0x3b, 0x14a, 0x3b, 0x44, 0x3b, 0x42, 0x431, 0x430, 0x441,
-0x43a, 0x44b, 0x4bb, 0x44b, 0x430, 0x43d, 0x43d, 0x44c, 0x430, 0x3b, 0x431, 0x44d, 0x43d, 0x438, 0x434, 0x438, 0x44d, 0x43d, 0x43d, 0x44c,
-0x438, 0x43a, 0x3b, 0x43e, 0x43f, 0x442, 0x443, 0x43e, 0x440, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x43a, 0x3b, 0x441, 0x44d, 0x440, 0x44d,
-0x434, 0x44d, 0x3b, 0x447, 0x44d, 0x43f, 0x43f, 0x438, 0x44d, 0x440, 0x3b, 0x411, 0x44d, 0x44d, 0x442, 0x438, 0x4a5, 0x441, 0x44d, 0x3b,
-0x441, 0x443, 0x431, 0x443, 0x43e, 0x442, 0x430, 0x431, 0x441, 0x3b, 0x431, 0x43d, 0x3b, 0x43e, 0x43f, 0x3b, 0x441, 0x44d, 0x3b, 0x447,
-0x43f, 0x3b, 0x431, 0x44d, 0x3b, 0x441, 0x431, 0x411, 0x3b, 0x411, 0x3b, 0x41e, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x411, 0x3b, 0x421,
-0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x61, 0x68, 0x61, 0x6d,
-0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4d,
-0x75, 0x6c, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49,
-0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0xa55e,
-0xa54c, 0xa535, 0x3b, 0xa5f3, 0xa5e1, 0xa609, 0x3b, 0xa55a, 0xa55e, 0xa55a, 0x3b, 0xa549, 0xa55e, 0xa552, 0x3b, 0xa549, 0xa524, 0xa546, 0xa562, 0x3b,
-0xa549, 0xa524, 0xa540, 0xa56e, 0x3b, 0xa53b, 0xa52c, 0xa533, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x74, 0x25b, 0x25b, 0x6e, 0x25b,
-0x25b, 0x3b, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x69, 0x6d, 0x69, 0x73,
-0x61, 0x3b, 0x61, 0x69, 0x6a, 0x69, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x253, 0x69, 0x74, 0x69, 0x53, 0x75, 0x6e, 0x6e, 0x74,
-0x61, 0x67, 0x3b, 0x4d, 0xe4, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x5a, 0x69, 0x161, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74,
-0x74, 0x77, 0x75, 0x10d, 0x3b, 0x46, 0x72, 0xf3, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x69, 0x74, 0x61, 0x67, 0x3b,
-0x53, 0x61, 0x6d, 0x161, 0x74, 0x61, 0x67, 0x53, 0x75, 0x6e, 0x3b, 0x4d, 0xe4, 0x6e, 0x3b, 0x5a, 0x69, 0x161, 0x3b, 0x4d,
-0x69, 0x74, 0x3b, 0x46, 0x72, 0xf3, 0x3b, 0x46, 0x72, 0x69, 0x3b, 0x53, 0x61, 0x6d, 0x53, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b,
-0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x53, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x25b, 0x3b, 0x6d, 0xf3, 0x6e, 0x64, 0x69,
-0x65, 0x3b, 0x6d, 0x75, 0xe1, 0x6e, 0x79, 0xe1, 0x14b, 0x6d, 0xf3, 0x6e, 0x64, 0x69, 0x65, 0x3b, 0x6d, 0x65, 0x74, 0xfa,
-0x6b, 0x70, 0xed, 0xe1, 0x70, 0x25b, 0x3b, 0x6b, 0xfa, 0x70, 0xe9, 0x6c, 0x69, 0x6d, 0x65, 0x74, 0xfa, 0x6b, 0x70, 0x69,
-0x61, 0x70, 0x25b, 0x3b, 0x66, 0x65, 0x6c, 0xe9, 0x74, 0x65, 0x3b, 0x73, 0xe9, 0x73, 0x65, 0x6c, 0xe9, 0x73, 0x64, 0x3b,
-0x6d, 0x64, 0x3b, 0x6d, 0x77, 0x3b, 0x65, 0x74, 0x3b, 0x6b, 0x6c, 0x3b, 0x66, 0x6c, 0x3b, 0x73, 0x73, 0x73, 0x3b, 0x6d,
-0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x6b, 0x3b, 0x66, 0x3b, 0x73, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x6c, 0x6c,
-0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65,
-0x73, 0x3b, 0x78, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62,
-0x61, 0x64, 0x75, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b, 0x78,
-0x75, 0x65, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62, 0x53, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x4d, 0x254, 0x301,
-0x6e, 0x64, 0x69, 0x3b, 0xc1, 0x70, 0x74, 0x61, 0x20, 0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x57, 0x25b, 0x301, 0x6e,
-0x25b, 0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x54, 0x254, 0x301, 0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x46, 0x25b, 0x6c, 0xe2, 0x79, 0x25b,
-0x64, 0x25b, 0x3b, 0x53, 0xe1, 0x73, 0x69, 0x64, 0x25b, 0x53, 0x254, 0x301, 0x3b, 0x4d, 0x254, 0x301, 0x3b, 0xc1, 0x4d, 0x3b,
-0x57, 0x25b, 0x301, 0x3b, 0x54, 0x254, 0x301, 0x3b, 0x46, 0x25b, 0x3b, 0x53, 0xe1, 0x73, 0x254, 0x6e, 0x64, 0x69, 0x3b, 0x6c,
-0x75, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x25b, 0x72, 0x6b, 0x25b, 0x72, 0x25b, 0x64, 0x69,
-0x3b, 0x79, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x14b, 0x64, 0x25b, 0x72, 0x25b, 0x64, 0x69, 0x3b, 0x6d, 0x254, 0x6e, 0x254,
-0x20, 0x73, 0x254, 0x6e, 0x64, 0x69, 0x73, 0x6f, 0x3b, 0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x25b, 0x3b, 0x79, 0x65,
-0x3b, 0x76, 0x61, 0x3b, 0x6d, 0x73, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x31, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x32, 0x3b,
-0x41, 0x6e, 0x65, 0x67, 0x20, 0x33, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x34, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x35,
-0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x36, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x37, 0x41, 0x31, 0x3b, 0x41, 0x32, 0x3b,
-0x41, 0x33, 0x3b, 0x41, 0x34, 0x3b, 0x41, 0x35, 0x3b, 0x41, 0x36, 0x3b, 0x41, 0x37, 0x6c, 0x79, 0x25b, 0x2bc, 0x25b, 0x301,
-0x20, 0x73, 0x1e85, 0xed, 0x14b, 0x74, 0xe8, 0x3b, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d,
-0x62, 0x254, 0x301, 0x254, 0x6e, 0x74, 0xe8, 0x20, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x74,
-0x73, 0xe8, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301, 0x254, 0x6e,
-0x74, 0xe8, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x76,
-0x66, 0xf2, 0x20, 0x6d, 0xe0, 0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0xe0, 0x67, 0x61, 0x20, 0x6c,
-0x79, 0x25b, 0x30c, 0x2bc, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804,
-0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd01,
-0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd23, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0xd804,
-0xdd16, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd25,
-0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd07, 0xd804,
-0xdd34, 0xd804, 0xdd07, 0xd804, 0xdd2e, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27,
-0xd804, 0xdd1a, 0xd804, 0xdd28, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0x3b, 0xd804,
-0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd01, 0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd23,
-0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0xd804, 0xdd16, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28,
-0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd07, 0xd804,
-0xdd2e, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0xd804, 0xdd22, 0xd804, 0xdd27, 0x3b, 0xd804,
-0xdd25, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22,
-0xd804, 0xdd28, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77, 0x61,
-0x6b, 0x21f, 0x61, 0x14b, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77, 0x61, 0x14b, 0x17e, 0x69, 0x3b, 0x41, 0x14b, 0x70,
-0xe9, 0x74, 0x75, 0x6e, 0x75, 0x14b, 0x70, 0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x79, 0x61, 0x6d, 0x6e, 0x69,
-0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x7a, 0x61,
-0x70, 0x74, 0x61, 0x14b, 0x3b, 0x4f, 0x77, 0xe1, 0x14b, 0x67, 0x79, 0x75, 0x17e, 0x61, 0x17e, 0x61, 0x70, 0x69, 0x41, 0x3b,
-0x57, 0x3b, 0x4e, 0x3b, 0x59, 0x3b, 0x54, 0x3b, 0x5a, 0x3b, 0x4f, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d62,
-0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d61,
-0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30, 0x2d59, 0x6cc, 0x6d5,
-0x6a9, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x62f, 0x648, 0x648, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x633, 0x6ce, 0x634, 0x6d5,
-0x645, 0x645, 0x6d5, 0x3b, 0x686, 0x648, 0x627, 0x631, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x67e, 0x6ce, 0x646, 0x62c, 0x634, 0x6d5,
-0x645, 0x645, 0x6d5, 0x3b, 0x6be, 0x6d5, 0x6cc, 0x646, 0x6cc, 0x3b, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633,
-0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x6be, 0x3b, 0x634, 0x6e, 0x6a, 0x65, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x6a,
-0x65, 0x17a, 0x65, 0x6c, 0x65, 0x3b, 0x77, 0x61, 0x142, 0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x6a, 0x6f, 0x64, 0x61,
-0x3b, 0x73, 0x74, 0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b, 0x70, 0x11b, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61,
-0x6e, 0x6a, 0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x61, 0x142, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x73, 0x74, 0x77, 0x3b,
-0x70, 0x11b, 0x74, 0x3b, 0x73, 0x6f, 0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x70, 0x3b, 0x73,
-0x6e, 0x6a, 0x65, 0x64, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x64, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x77, 0x75,
-0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74, 0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b,
-0x70, 0x6a, 0x61, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x6a, 0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b,
-0x77, 0x75, 0x74, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x161, 0x74, 0x77, 0x3b, 0x70, 0x6a, 0x61, 0x3b, 0x73, 0x6f, 0x62, 0x6e,
-0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b, 0x161, 0x3b, 0x70, 0x3b, 0x73, 0x6e, 0x61, 0x64, 0x12b, 0x6c, 0x69, 0x3b, 0x70,
-0x61, 0x6e, 0x61, 0x64, 0x12b, 0x6c, 0x69, 0x3b, 0x77, 0x69, 0x73, 0x61, 0x73, 0x12b, 0x64, 0x69, 0x73, 0x3b, 0x70, 0x75,
-0x73, 0x73, 0x69, 0x73, 0x61, 0x77, 0x61, 0x69, 0x74, 0x69, 0x3b, 0x6b, 0x65, 0x74, 0x77, 0x69, 0x72, 0x74, 0x69, 0x6b,
-0x73, 0x3b, 0x70, 0x113, 0x6e, 0x74, 0x6e, 0x69, 0x6b, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x74, 0x69, 0x6b, 0x61,
-0x6e, 0x61, 0x64, 0x3b, 0x70, 0x61, 0x6e, 0x3b, 0x77, 0x69, 0x73, 0x3b, 0x70, 0x75, 0x73, 0x3b, 0x6b, 0x65, 0x74, 0x3b,
-0x70, 0x113, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x53,
-0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x72, 0x67, 0xe2, 0x3b,
-0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6b, 0x6f, 0x73, 0x6b, 0x6f, 0x6b, 0x6b, 0x6f, 0x3b, 0x74,
-0x75, 0x6f, 0x72, 0xe2, 0x73, 0x74, 0xe2, 0x68, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70, 0x70, 0x65, 0x69, 0x76, 0x69,
-0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64, 0xe2, 0x68, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x65, 0x69, 0x76, 0x69, 0x3b,
-0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x61, 0x72, 0x67,
-0xe2, 0x3b, 0x6b, 0x6f, 0x73, 0x6b, 0x6f, 0x68, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72, 0xe2, 0x73, 0x74, 0x75, 0x76, 0x3b,
-0x76, 0xe1, 0x73, 0x74, 0x75, 0x70, 0x70, 0x65, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64, 0x75,
-0x76, 0x70, 0x61, 0x73, 0x3b, 0x76, 0x75, 0x6f, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6b, 0x6f, 0x73, 0x3b, 0x74, 0x75, 0x6f,
-0x3b, 0x76, 0xe1, 0x73, 0x3b, 0x6c, 0xe1, 0x76, 0x70, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x56, 0x3b,
-0x4c, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65,
-0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73,
-0x3b, 0x42, 0x69, 0x79, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x44, 0x6f, 0x6d, 0x3b,
-0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x6b, 0x73, 0x3b, 0x48, 0x75, 0x3b, 0x42, 0x69, 0x3b, 0x53, 0x61,
-0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x42, 0x3b, 0x53
+static constexpr char16_t days_data[] = {
+0x53, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x4d, 0x6f, 0x6e, 0x64, 0x61,
+0x79, 0x3b, 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x57, 0x65,
+0x64, 0x6e, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x54, 0x68, 0x75, 0x72,
+0x73, 0x64, 0x61, 0x79, 0x3b, 0x46, 0x72, 0x69, 0x64, 0x61, 0x79, 0x3b,
+0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79, 0x53, 0x75, 0x6e, 0x3b,
+0x4d, 0x6f, 0x6e, 0x3b, 0x54, 0x75, 0x65, 0x3b, 0x57, 0x65, 0x64, 0x3b,
+0x54, 0x68, 0x75, 0x3b, 0x46, 0x72, 0x69, 0x3b, 0x53, 0x61, 0x74, 0x53,
+0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x53,
+0x37, 0x3b, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b,
+0x36, 0x410, 0x43c, 0x4bd, 0x44b, 0x448, 0x430, 0x3b, 0x410, 0x448, 0x4d9, 0x430,
+0x445, 0x44c, 0x430, 0x3b, 0x410, 0x4a9, 0x430, 0x448, 0x430, 0x3b, 0x410, 0x445,
+0x430, 0x448, 0x430, 0x3b, 0x410, 0x525, 0x448, 0x44c, 0x430, 0x448, 0x430, 0x3b,
+0x410, 0x445, 0x4d9, 0x430, 0x448, 0x430, 0x3b, 0x410, 0x441, 0x430, 0x431, 0x448,
+0x430, 0x410, 0x43c, 0x3b, 0x410, 0x448, 0x4d9, 0x3b, 0x410, 0x4a9, 0x3b, 0x410,
+0x445, 0x3b, 0x410, 0x525, 0x3b, 0x410, 0x445, 0x4d9, 0x3b, 0x410, 0x441, 0x41c,
+0x3b, 0x428, 0x4d9, 0x3b, 0x4a8, 0x3b, 0x425, 0x3b, 0x524, 0x3b, 0x425, 0x4d9,
+0x3b, 0x421, 0x41, 0x63, 0x61, 0x61, 0x64, 0x61, 0x3b, 0x45, 0x74, 0x6c,
+0x65, 0x65, 0x6e, 0x69, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61,
+0x3b, 0x41, 0x72, 0x62, 0x61, 0x71, 0x61, 0x3b, 0x4b, 0x61, 0x6d, 0x69,
+0x69, 0x73, 0x69, 0x3b, 0x47, 0x75, 0x6d, 0x71, 0x61, 0x74, 0x61, 0x3b,
+0x53, 0x61, 0x62, 0x74, 0x69, 0x41, 0x63, 0x61, 0x3b, 0x45, 0x74, 0x6c,
+0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x72, 0x62, 0x3b, 0x4b, 0x61, 0x6d,
+0x3b, 0x47, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x41, 0x3b, 0x45, 0x3b,
+0x54, 0x3b, 0x41, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x53, 0x53, 0x6f, 0x6e,
+0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b,
+0x44, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x57, 0x6f, 0x65, 0x6e,
+0x73, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64,
+0x61, 0x67, 0x3b, 0x56, 0x72, 0x79, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x61,
+0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x61,
+0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x57, 0x6f, 0x2e, 0x3b, 0x44, 0x6f,
+0x2e, 0x3b, 0x56, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x3b, 0x4d,
+0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x53, 0x74, 0x73,
+0x75, 0x294, 0x6e, 0x74, 0x73, 0x268, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75,
+0x6b, 0x70, 0xe0, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x67, 0x68, 0x254,
+0x65, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x74, 0x254, 0x300, 0x6d, 0x6c,
+0xf2, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x6d, 0xe8, 0x3b, 0x74, 0x73,
+0x75, 0x294, 0x75, 0x67, 0x68, 0x268, 0x302, 0x6d, 0x3b, 0x74, 0x73, 0x75,
+0x294, 0x6e, 0x64, 0x7a, 0x268, 0x6b, 0x254, 0x294, 0x254, 0x6e, 0x74, 0x73,
+0x3b, 0x6b, 0x70, 0x61, 0x3b, 0x67, 0x68, 0x254, 0x3b, 0x74, 0x254, 0x6d,
+0x3b, 0x75, 0x6d, 0x65, 0x3b, 0x67, 0x68, 0x268, 0x3b, 0x64, 0x7a, 0x6b,
+0x6e, 0x3b, 0x6b, 0x3b, 0x67, 0x3b, 0x74, 0x3b, 0x75, 0x3b, 0x67, 0x3b,
+0x64, 0x4b, 0x77, 0x65, 0x73, 0x69, 0x64, 0x61, 0x3b, 0x44, 0x77, 0x6f,
+0x77, 0x64, 0x61, 0x3b, 0x42, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x3b, 0x57,
+0x75, 0x6b, 0x75, 0x64, 0x61, 0x3b, 0x59, 0x61, 0x77, 0x64, 0x61, 0x3b,
+0x46, 0x69, 0x64, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x65, 0x6e, 0x65, 0x64,
+0x61, 0x4b, 0x77, 0x65, 0x3b, 0x44, 0x77, 0x6f, 0x3b, 0x42, 0x65, 0x6e,
+0x3b, 0x57, 0x75, 0x6b, 0x3b, 0x59, 0x61, 0x77, 0x3b, 0x46, 0x69, 0x61,
+0x3b, 0x4d, 0x65, 0x6d, 0x4b, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x57, 0x3b,
+0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x65, 0x20, 0x64, 0x69, 0x65, 0x6c, 0x3b,
+0x65, 0x20, 0x68, 0xeb, 0x6e, 0xeb, 0x3b, 0x65, 0x20, 0x6d, 0x61, 0x72,
+0x74, 0xeb, 0x3b, 0x65, 0x20, 0x6d, 0xeb, 0x72, 0x6b, 0x75, 0x72, 0xeb,
+0x3b, 0x65, 0x20, 0x65, 0x6e, 0x6a, 0x74, 0x65, 0x3b, 0x65, 0x20, 0x70,
+0x72, 0x65, 0x6d, 0x74, 0x65, 0x3b, 0x65, 0x20, 0x73, 0x68, 0x74, 0x75,
+0x6e, 0xeb, 0x64, 0x69, 0x65, 0x3b, 0x68, 0xeb, 0x6e, 0x3b, 0x6d, 0x61,
+0x72, 0x3b, 0x6d, 0xeb, 0x72, 0x3b, 0x65, 0x6e, 0x6a, 0x3b, 0x70, 0x72,
+0x65, 0x3b, 0x73, 0x68, 0x74, 0x64, 0x3b, 0x68, 0x3b, 0x6d, 0x3b, 0x6d,
+0x3b, 0x65, 0x3b, 0x70, 0x3b, 0x73, 0x68, 0x12a5, 0x1211, 0x12f5, 0x3b, 0x1230,
+0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x129e, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1210,
+0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x12a5, 0x1211,
+0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x3b, 0x1228, 0x1261, 0x12d5,
+0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c,
+0x12a5, 0x3b, 0x1230, 0x3b, 0x121b, 0x3b, 0x1228, 0x3b, 0x1210, 0x3b, 0x12d3, 0x3b,
+0x1245, 0x627, 0x644, 0x623, 0x62d, 0x62f, 0x3b, 0x627, 0x644, 0x627, 0x62b, 0x646,
+0x64a, 0x646, 0x3b, 0x627, 0x644, 0x62b, 0x644, 0x627, 0x62b, 0x627, 0x621, 0x3b,
+0x627, 0x644, 0x623, 0x631, 0x628, 0x639, 0x627, 0x621, 0x3b, 0x627, 0x644, 0x62e,
+0x645, 0x64a, 0x633, 0x3b, 0x627, 0x644, 0x62c, 0x645, 0x639, 0x629, 0x3b, 0x627,
+0x644, 0x633, 0x628, 0x62a, 0x62d, 0x3b, 0x646, 0x3b, 0x62b, 0x3b, 0x631, 0x3b,
+0x62e, 0x3b, 0x62c, 0x3b, 0x633, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x63, 0x68,
+0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x7a,
+0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x63, 0x68,
+0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65,
+0x73, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x3b,
+0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0x65, 0x3b,
+0x63, 0x68, 0x75, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0x61, 0x62, 0x44,
+0x3b, 0x4c, 0x3b, 0x4d, 0x61, 0x3b, 0x4d, 0x69, 0x3b, 0x43, 0x68, 0x3b,
+0x56, 0x3b, 0x53, 0x56f, 0x56b, 0x580, 0x561, 0x56f, 0x56b, 0x3b, 0x565, 0x580,
+0x56f, 0x578, 0x582, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x565, 0x580, 0x565,
+0x584, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x579, 0x578, 0x580, 0x565, 0x584,
+0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x570, 0x56b, 0x576, 0x563, 0x577, 0x561,
+0x562, 0x569, 0x56b, 0x3b, 0x578, 0x582, 0x580, 0x562, 0x561, 0x569, 0x3b, 0x577,
+0x561, 0x562, 0x561, 0x569, 0x56f, 0x56b, 0x580, 0x3b, 0x565, 0x580, 0x56f, 0x3b,
+0x565, 0x580, 0x584, 0x3b, 0x579, 0x580, 0x584, 0x3b, 0x570, 0x576, 0x563, 0x3b,
+0x578, 0x582, 0x580, 0x3b, 0x577, 0x562, 0x569, 0x53f, 0x3b, 0x535, 0x3b, 0x535,
+0x3b, 0x549, 0x3b, 0x540, 0x3b, 0x548, 0x3b, 0x547, 0x9a6, 0x9c7, 0x993, 0x9ac,
+0x9be, 0x9f0, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ae, 0x999,
+0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be,
+0x9f0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be,
+0x9f0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b6,
+0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x9a6, 0x9c7, 0x993, 0x3b, 0x9b8, 0x9cb, 0x9ae,
+0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac,
+0x9c3, 0x9b9, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0, 0x3b, 0x9b6, 0x9a8, 0x9bf,
+0x9a6, 0x3b, 0x9b8, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x3b, 0x9ac, 0x3b, 0x9b6, 0x3b,
+0x9b6, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x6c, 0x6c, 0x75,
+0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d,
+0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x78, 0x75, 0x65,
+0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b,
+0x73, 0xe1, 0x62, 0x61, 0x64, 0x75, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x6c,
+0x75, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b, 0x78, 0x75,
+0x65, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62, 0x44, 0x3b, 0x4c,
+0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x56, 0x3b, 0x53, 0x4a, 0x75,
+0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
+0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68,
+0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x70, 0x69,
+0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e,
+0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4a, 0x6d, 0x6f,
+0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b,
+0x4a, 0x57, 0x61, 0x69, 0x20, 0x59, 0x6f, 0x6b, 0x61, 0x20, 0x42, 0x61,
+0x77, 0x61, 0x69, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x54, 0x75, 0x6e, 0x67,
+0x61, 0x3b, 0x54, 0x6f, 0x6b, 0x69, 0x20, 0x47, 0x69, 0x74, 0x75, 0x6e,
+0x67, 0x3b, 0x54, 0x73, 0x61, 0x6d, 0x20, 0x4b, 0x61, 0x73, 0x75, 0x77,
+0x61, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x20, 0x4e, 0x61, 0x73,
+0x3b, 0x57, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x20, 0x54, 0x69, 0x79, 0x6f,
+0x6e, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x20, 0x43, 0x68, 0x69,
+0x72, 0x69, 0x6d, 0x59, 0x6f, 0x6b, 0x3b, 0x54, 0x75, 0x6e, 0x67, 0x3b,
+0x47, 0x69, 0x74, 0x75, 0x6e, 0x67, 0x3b, 0x54, 0x73, 0x61, 0x6e, 0x3b,
+0x4e, 0x61, 0x73, 0x3b, 0x4e, 0x61, 0x74, 0x3b, 0x43, 0x68, 0x69, 0x72,
+0x62, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x62, 0x61, 0x7a, 0x61, 0x72, 0x20,
+0x65, 0x72, 0x74, 0x259, 0x73, 0x69, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259,
+0x6e, 0x62, 0x259, 0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0xe7,
+0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x3b, 0x63, 0xfc, 0x6d, 0x259,
+0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0x63, 0xfc, 0x6d, 0x259,
+0x3b, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x42, 0x2e, 0x3b, 0x42, 0x2e, 0x45,
+0x2e, 0x3b, 0xc7, 0x2e, 0x41, 0x2e, 0x3b, 0xc7, 0x2e, 0x3b, 0x43, 0x2e,
+0x41, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x42, 0x2e, 0x3b, 0x42,
+0x2e, 0x65, 0x2e, 0x3b, 0xc7, 0x2e, 0x61, 0x2e, 0x3b, 0xc7, 0x2e, 0x3b,
+0x43, 0x2e, 0x61, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x431, 0x430,
+0x437, 0x430, 0x440, 0x3b, 0x431, 0x430, 0x437, 0x430, 0x440, 0x20, 0x435, 0x440,
+0x442, 0x4d9, 0x441, 0x438, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d, 0x431,
+0x4d9, 0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x447, 0x4d9, 0x440,
+0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x20, 0x430,
+0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x3b, 0x448,
+0x4d9, 0x43d, 0x431, 0x4d9, 0x411, 0x2e, 0x3b, 0x411, 0x2e, 0x415, 0x2e, 0x3b,
+0x427, 0x2e, 0x410, 0x2e, 0x3b, 0x427, 0x2e, 0x3b, 0x4b8, 0x2e, 0x410, 0x2e,
+0x3b, 0x4b8, 0x2e, 0x3b, 0x428, 0x2e, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x1dd,
+0x3b, 0x6c, 0x1dd, 0x6e, 0x64, 0xed, 0x3b, 0x6d, 0x61, 0x61, 0x64, 0xed,
+0x3b, 0x6d, 0x25b, 0x6b, 0x72, 0x25b, 0x64, 0xed, 0x3b, 0x6a, 0x1dd, 0x1dd,
+0x64, 0xed, 0x3b, 0x6a, 0xfa, 0x6d, 0x62, 0xe1, 0x3b, 0x73, 0x61, 0x6d,
+0x64, 0xed, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6c, 0x1dd, 0x6e, 0x3b, 0x6d,
+0x61, 0x61, 0x3b, 0x6d, 0x25b, 0x6b, 0x3b, 0x6a, 0x1dd, 0x1dd, 0x3b, 0x6a,
+0xfa, 0x6d, 0x3b, 0x73, 0x61, 0x6d, 0x73, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b,
+0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x73, 0x6b, 0x61, 0x72, 0x69, 0x3b,
+0x6e, 0x74, 0x25b, 0x6e, 0x25b, 0x3b, 0x74, 0x61, 0x72, 0x61, 0x74, 0x61,
+0x3b, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x69,
+0x73, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x62, 0x69,
+0x72, 0x69, 0x6b, 0x61, 0x72, 0x3b, 0x6e, 0x74, 0x25b, 0x3b, 0x74, 0x61,
+0x72, 0x3b, 0x61, 0x72, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x3b, 0x6a, 0x75,
+0x6d, 0x3b, 0x73, 0x69, 0x62, 0x4b, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x41,
+0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x53, 0x9b0, 0x9ac, 0x9bf, 0x9ac, 0x9be, 0x9b0,
+0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997,
+0x9b2, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be, 0x9b0, 0x3b,
+0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b,
+0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf,
+0x9ac, 0x9be, 0x9b0, 0x9b0, 0x9ac, 0x9bf, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae,
+0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9,
+0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0, 0x3b,
+0x9b6, 0x9a8, 0x9bf, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x9c1,
+0x3b, 0x9ac, 0x9c3, 0x3b, 0x9b6, 0x9c1, 0x3b, 0x9b6, 0x14b, 0x67, 0x77, 0xe0,
+0x20, 0x6e, 0x254, 0x302, 0x79, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e,
+0x6a, 0x61, 0x14b, 0x67, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x14b, 0x67, 0x77,
+0xe0, 0x20, 0xfb, 0x6d, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x14b, 0x67,
+0xea, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6d, 0x62, 0x254, 0x6b, 0x3b,
+0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6b, 0x254, 0x254, 0x3b, 0x14b, 0x67, 0x77,
+0xe0, 0x20, 0x6a, 0xf4, 0x6e, 0x6e, 0x254, 0x79, 0x3b, 0x6e, 0x6a, 0x61,
+0x3b, 0x75, 0x75, 0x6d, 0x3b, 0x14b, 0x67, 0x65, 0x3b, 0x6d, 0x62, 0x254,
+0x3b, 0x6b, 0x254, 0x254, 0x3b, 0x6a, 0x6f, 0x6e, 0x6e, 0x3b, 0x6e, 0x3b,
+0x75, 0x3b, 0x14b, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6a, 0x69, 0x67, 0x61,
+0x6e, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x6c, 0x65, 0x68,
+0x65, 0x6e, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x72, 0x74, 0x65,
+0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x7a, 0x6b, 0x65, 0x6e, 0x61,
+0x3b, 0x6f, 0x73, 0x74, 0x65, 0x67, 0x75, 0x6e, 0x61, 0x3b, 0x6f, 0x73,
+0x74, 0x69, 0x72, 0x61, 0x6c, 0x61, 0x3b, 0x6c, 0x61, 0x72, 0x75, 0x6e,
+0x62, 0x61, 0x74, 0x61, 0x69, 0x67, 0x2e, 0x3b, 0x61, 0x6c, 0x2e, 0x3b,
+0x61, 0x72, 0x2e, 0x3b, 0x61, 0x7a, 0x2e, 0x3b, 0x6f, 0x67, 0x2e, 0x3b,
+0x6f, 0x72, 0x2e, 0x3b, 0x6c, 0x72, 0x2e, 0x49, 0x3b, 0x41, 0x3b, 0x41,
+0x3b, 0x41, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x4c, 0x43d, 0x44f, 0x434, 0x437,
+0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x430, 0x43d, 0x44f, 0x434, 0x437, 0x435, 0x43b,
+0x430, 0x43a, 0x3b, 0x430, 0x45e, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441,
+0x435, 0x440, 0x430, 0x434, 0x430, 0x3b, 0x447, 0x430, 0x446, 0x432, 0x435, 0x440,
+0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x456, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431,
+0x43e, 0x442, 0x430, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x430, 0x45e, 0x3b,
+0x441, 0x440, 0x3b, 0x447, 0x446, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x43d,
+0x3b, 0x43f, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441,
+0x50, 0x61, 0x20, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x50,
+0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6d, 0x6f, 0x3b, 0x50, 0x61, 0x6c,
+0x69, 0x63, 0x68, 0x69, 0x62, 0x75, 0x6c, 0x69, 0x3b, 0x50, 0x61, 0x6c,
+0x69, 0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x50, 0x61, 0x6c,
+0x69, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63,
+0x68, 0x69, 0x73, 0x61, 0x6e, 0x6f, 0x3b, 0x50, 0x61, 0x63, 0x68, 0x69,
+0x62, 0x65, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x70, 0x61, 0x20, 0x6d, 0x75,
+0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61,
+0x68, 0x75, 0x76, 0x69, 0x6c, 0x75, 0x68, 0x61, 0x3b, 0x70, 0x61, 0x20,
+0x68, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69,
+0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x74, 0x61,
+0x79, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x68, 0x61, 0x6e, 0x75,
+0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75, 0x6c, 0x65, 0x6d,
+0x62, 0x65, 0x6c, 0x61, 0x4d, 0x75, 0x6c, 0x3b, 0x56, 0x69, 0x6c, 0x3b,
+0x48, 0x69, 0x76, 0x3b, 0x48, 0x69, 0x64, 0x3b, 0x48, 0x69, 0x74, 0x3b,
+0x48, 0x69, 0x68, 0x3b, 0x4c, 0x65, 0x6d, 0x4d, 0x3b, 0x4a, 0x3b, 0x48,
+0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x57, 0x3b, 0x4a, 0x930, 0x92c, 0x940, 0x92c,
+0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902,
+0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930,
+0x3b, 0x92c, 0x943, 0x939, 0x938, 0x94d, 0x92a, 0x924, 0x93f, 0x92c, 0x93e, 0x930,
+0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x928,
+0x940, 0x91a, 0x930, 0x1230, 0x1295, 0x1260, 0x122d, 0x20, 0x1245, 0x12f3, 0x12c5, 0x3b,
+0x1230, 0x1291, 0x3b, 0x1230, 0x120a, 0x131d, 0x3b, 0x1208, 0x1313, 0x20, 0x12c8, 0x122a,
+0x20, 0x1208, 0x1265, 0x12cb, 0x3b, 0x12a3, 0x121d, 0x12f5, 0x3b, 0x12a3, 0x122d, 0x1265,
+0x3b, 0x1230, 0x1295, 0x1260, 0x122d, 0x20, 0x123d, 0x1313, 0x12c5, 0x1230, 0x2f, 0x1245,
+0x3b, 0x1230, 0x1291, 0x3b, 0x1230, 0x120a, 0x131d, 0x3b, 0x1208, 0x1313, 0x3b, 0x12a3,
+0x121d, 0x12f5, 0x3b, 0x12a3, 0x122d, 0x1265, 0x3b, 0x1230, 0x2f, 0x123d, 0x1230, 0x3b,
+0x1230, 0x3b, 0x1230, 0x3b, 0x1208, 0x3b, 0x12a3, 0x3b, 0x12a3, 0x3b, 0x1230, 0x930,
+0x92c, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x92e, 0x92c, 0x93e, 0x930, 0x3b,
+0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c,
+0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x938, 0x94d, 0x925, 0x93f, 0x92c, 0x93e, 0x930,
+0x3b, 0x938, 0x941, 0x941, 0x916, 0x941, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x938,
+0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x930, 0x92c, 0x93f, 0x92c, 0x93e, 0x930, 0x3b,
+0x938, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e,
+0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x938,
+0x94d, 0x925, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x941, 0x916, 0x941, 0x930,
+0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x930, 0x92c,
+0x93f, 0x3b, 0x938, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941,
+0x927, 0x3b, 0x92c, 0x93f, 0x938, 0x94d, 0x925, 0x93f, 0x3b, 0x938, 0x941, 0x916,
+0x941, 0x930, 0x3b, 0x938, 0x928, 0x93f, 0x930, 0x3b, 0x938, 0x3b, 0x92e, 0x902,
+0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x938, 0x941, 0x3b, 0x938, 0x6e,
+0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65,
+0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72,
+0x61, 0x6b, 0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d,
+0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61,
+0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x3b,
+0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x69, 0x3b,
+0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e,
+0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73,
+0x4e, 0x3b, 0x50, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b,
+0x53, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d,
+0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440,
+0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435, 0x434, 0x430, 0x3b, 0x447,
+0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430,
+0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b,
+0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x438, 0x3b,
+0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x43d,
+0x3b, 0x43f, 0x3b, 0x443, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441,
+0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x72,
+0x7a, 0x68, 0x3b, 0x4d, 0x65, 0x72, 0x63, 0x2bc, 0x68, 0x65, 0x72, 0x3b,
+0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b,
+0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75,
+0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x2e, 0x3b, 0x4d, 0x65, 0x72, 0x2e, 0x3b,
+0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x2e, 0x3b, 0x53, 0x61,
+0x64, 0x2e, 0x53, 0x75, 0x3b, 0x4c, 0x3b, 0x4d, 0x7a, 0x3b, 0x4d, 0x63,
+0x3b, 0x59, 0x3b, 0x47, 0x3b, 0x53, 0x61, 0x43d, 0x435, 0x434, 0x435, 0x43b,
+0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a,
+0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x44f,
+0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x44a, 0x440, 0x442, 0x44a, 0x43a,
+0x3b, 0x43f, 0x435, 0x442, 0x44a, 0x43a, 0x3b, 0x441, 0x44a, 0x431, 0x43e, 0x442,
+0x430, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440,
+0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x43d, 0x3b, 0x43f,
+0x3b, 0x432, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x1010, 0x1014,
+0x1004, 0x103a, 0x1039, 0x1002, 0x1014, 0x103d, 0x1031, 0x3b, 0x1010, 0x1014, 0x1004, 0x103a,
+0x1039, 0x101c, 0x102c, 0x3b, 0x1021, 0x1004, 0x103a, 0x1039, 0x1002, 0x102b, 0x3b, 0x1017,
+0x102f, 0x1012, 0x1039, 0x1013, 0x101f, 0x1030, 0x1038, 0x3b, 0x1000, 0x103c, 0x102c, 0x101e,
+0x1015, 0x1010, 0x1031, 0x1038, 0x3b, 0x101e, 0x1031, 0x102c, 0x1000, 0x103c, 0x102c, 0x3b,
+0x1005, 0x1014, 0x1031, 0x1010, 0x3b, 0x1010, 0x3b, 0x1021, 0x3b, 0x1017, 0x3b, 0x1000,
+0x3b, 0x101e, 0x3b, 0x1005, 0x661f, 0x671f, 0x65e5, 0x3b, 0x661f, 0x671f, 0x4e00, 0x3b,
+0x661f, 0x671f, 0x4e8c, 0x3b, 0x661f, 0x671f, 0x4e09, 0x3b, 0x661f, 0x671f, 0x56db, 0x3b,
+0x661f, 0x671f, 0x4e94, 0x3b, 0x661f, 0x671f, 0x516d, 0x65e5, 0x3b, 0x4e00, 0x3b, 0x4e8c,
+0x3b, 0x4e09, 0x3b, 0x56db, 0x3b, 0x4e94, 0x3b, 0x516d, 0x5468, 0x65e5, 0x3b, 0x5468,
+0x4e00, 0x3b, 0x5468, 0x4e8c, 0x3b, 0x5468, 0x4e09, 0x3b, 0x5468, 0x56db, 0x3b, 0x5468,
+0x4e94, 0x3b, 0x5468, 0x516d, 0x64, 0x69, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x65,
+0x3b, 0x64, 0x69, 0x6c, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d,
+0x61, 0x72, 0x74, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x65, 0x63, 0x72, 0x65,
+0x73, 0x3b, 0x64, 0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76,
+0x65, 0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61,
+0x62, 0x74, 0x65, 0x64, 0x67, 0x2e, 0x3b, 0x64, 0x6c, 0x2e, 0x3b, 0x64,
+0x74, 0x2e, 0x3b, 0x64, 0x63, 0x2e, 0x3b, 0x64, 0x6a, 0x2e, 0x3b, 0x64,
+0x76, 0x2e, 0x3b, 0x64, 0x73, 0x2e, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67,
+0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74,
+0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65,
+0x73, 0x3b, 0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73, 0x3b, 0x42, 0x69,
+0x79, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64,
+0x6f, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72,
+0x3b, 0x4d, 0x69, 0x79, 0x3b, 0x48, 0x75, 0x77, 0x3b, 0x42, 0x69, 0x79,
+0x3b, 0x53, 0x61, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b,
+0x48, 0x3b, 0x42, 0x3b, 0x53, 0x41, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b,
+0x41, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x6e, 0x61, 0x73,
+0x3b, 0x41, 0x6b, 0x72, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x77, 0x61, 0x73,
+0x3b, 0x41, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69,
+0x1e0d, 0x79, 0x61, 0x73, 0x41, 0x73, 0x61, 0x3b, 0x41, 0x79, 0x6e, 0x3b,
+0x41, 0x73, 0x6e, 0x3b, 0x41, 0x6b, 0x72, 0x3b, 0x41, 0x6b, 0x77, 0x3b,
+0x41, 0x73, 0x6d, 0x3b, 0x41, 0x73, 0x1e0d, 0x41, 0x3b, 0x41, 0x3b, 0x41,
+0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x6cc, 0x6d5, 0x6a9, 0x634,
+0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x62f, 0x648, 0x648, 0x634, 0x6d5, 0x645, 0x645,
+0x6d5, 0x3b, 0x633, 0x6ce, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x686, 0x648,
+0x627, 0x631, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x67e, 0x6ce, 0x646, 0x62c,
+0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x6be, 0x6d5, 0x6cc, 0x646, 0x6cc, 0x3b,
+0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686,
+0x3b, 0x67e, 0x3b, 0x6be, 0x3b, 0x634, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d,
+0xd804, 0xdd28, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804,
+0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd01, 0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd23,
+0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804,
+0xdd2a, 0xd804, 0xdd16, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2a,
+0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804,
+0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd07, 0xd804, 0xdd2e, 0xd804,
+0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25,
+0xd804, 0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34,
+0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd25, 0xd804,
+0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd01,
+0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804,
+0xdd2a, 0xd804, 0xdd16, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22,
+0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0x3b, 0xd804,
+0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd07, 0xd804, 0xdd2e, 0xd804,
+0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd28,
+0xd804, 0xdd22, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1f,
+0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33,
+0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd25,
+0xd804, 0xdd27, 0x43a, 0x4c0, 0x438, 0x440, 0x430, 0x3b, 0x43e, 0x440, 0x448, 0x43e,
+0x442, 0x3b, 0x448, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x43a, 0x445, 0x430,
+0x430, 0x440, 0x430, 0x3b, 0x435, 0x430, 0x440, 0x430, 0x3b, 0x43f, 0x4c0, 0x435,
+0x440, 0x430, 0x441, 0x43a, 0x430, 0x3b, 0x448, 0x443, 0x43e, 0x442, 0x43a, 0x4c0,
+0x438, 0x3b, 0x43e, 0x440, 0x3b, 0x448, 0x438, 0x3b, 0x43a, 0x445, 0x430, 0x3b,
+0x435, 0x430, 0x3b, 0x43f, 0x4c0, 0x435, 0x3b, 0x448, 0x443, 0x43e, 0x43a, 0x4c0,
+0x3b, 0x43e, 0x3b, 0x448, 0x3b, 0x43a, 0x445, 0x3b, 0x435, 0x3b, 0x43f, 0x4c0,
+0x3b, 0x448, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13a4, 0x13be,
+0x13d9, 0x13d3, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x13a2, 0x13a6, 0x3b,
+0x13e6, 0x13a2, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x13a2, 0x13a6, 0x3b,
+0x13e7, 0x13be, 0x13a9, 0x13b6, 0x13cd, 0x13d7, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c8,
+0x13d5, 0x13be, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5,
+0x13c1, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x3b, 0x13e7, 0x13be,
+0x13a9, 0x3b, 0x13c8, 0x13d5, 0x13be, 0x13c6, 0x3b, 0x13c9, 0x3b, 0x13d4, 0x3b, 0x13e6,
+0x3b, 0x13c5, 0x3b, 0x13e7, 0x3b, 0x13a4, 0x4e, 0x69, 0x74, 0x74, 0x61, 0x6b,
+0x20, 0x48, 0x6f, 0x6c, 0x6c, 0x6f, 0x2bc, 0x3b, 0x4d, 0x61, 0x6e, 0x74,
+0x69, 0x2bc, 0x3b, 0x43, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x2bc, 0x3b, 0x57,
+0x69, 0x6e, 0x73, 0x74, 0x69, 0x2bc, 0x3b, 0x53, 0x6f, 0x69, 0x73, 0x74,
+0x69, 0x2bc, 0x3b, 0x4e, 0x61, 0x6e, 0x6e, 0x61, 0x6c, 0x68, 0x63, 0x68,
+0x69, 0x66, 0x61, 0x2bc, 0x20, 0x4e, 0x69, 0x74, 0x74, 0x61, 0x6b, 0x3b,
+0x4e, 0x69, 0x74, 0x74, 0x61, 0x6b, 0x20, 0x48, 0x6f, 0x6c, 0x6c, 0x6f,
+0x2bc, 0x20, 0x4e, 0x61, 0x6b, 0x66, 0x69, 0x73, 0x68, 0x53, 0x61, 0x6e,
+0x64, 0x65, 0x3b, 0x4f, 0x72, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e,
+0x7a, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72,
+0x69, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74,
+0x75, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4f,
+0x72, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4f,
+0x72, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x53, 0x41,
+0x4e, 0x3b, 0x4f, 0x52, 0x4b, 0x3b, 0x4f, 0x4b, 0x42, 0x3b, 0x4f, 0x4b,
+0x53, 0x3b, 0x4f, 0x4b, 0x4e, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4f, 0x4d,
+0x4b, 0x53, 0x3b, 0x4b, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54,
+0x3b, 0x4d, 0x9031, 0x65e5, 0x3b, 0x9031, 0x4e00, 0x3b, 0x9031, 0x4e8c, 0x3b, 0x9031,
+0x4e09, 0x3b, 0x9031, 0x56db, 0x3b, 0x9031, 0x4e94, 0x3b, 0x9031, 0x516d, 0x43d, 0x435,
+0x434, 0x463, 0x301, 0x43b, 0x467, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x463,
+0x301, 0x43b, 0x44c, 0x43d, 0x438, 0x43a, 0x44a, 0x3b, 0x432, 0x442, 0x43e, 0x301,
+0x440, 0x43d, 0x438, 0x43a, 0x44a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x300,
+0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x442, 0x43e, 0x301, 0x43a, 0x44a,
+0x3b, 0x43f, 0x467, 0x442, 0x43e, 0x301, 0x43a, 0x44a, 0x3b, 0x441, 0xa64b, 0x431,
+0x431, 0x461, 0x301, 0x442, 0x430, 0x43d, 0x434, 0x2de7, 0x487, 0x467, 0x3b, 0x43f,
+0x43d, 0x2de3, 0x435, 0x3b, 0x432, 0x442, 0x43e, 0x2dec, 0x487, 0x3b, 0x441, 0x440,
+0x2de3, 0x435, 0x3b, 0x447, 0x435, 0x2de6, 0x487, 0x3b, 0x43f, 0x467, 0x2de6, 0x487,
+0x3b, 0x441, 0xa64b, 0x2de0, 0x487, 0x41d, 0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421,
+0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x432, 0x44b, 0x440, 0x441, 0x430, 0x440,
+0x43d, 0x438, 0x43a, 0x443, 0x43d, 0x3b, 0x442, 0x443, 0x43d, 0x442, 0x438, 0x43a,
+0x443, 0x43d, 0x3b, 0x44b, 0x442, 0x43b, 0x430, 0x440, 0x438, 0x43a, 0x443, 0x43d,
+0x3b, 0x44e, 0x43d, 0x43a, 0x443, 0x43d, 0x3b, 0x43a, 0x4d7, 0x4ab, 0x43d, 0x435,
+0x440, 0x43d, 0x438, 0x43a, 0x443, 0x43d, 0x3b, 0x44d, 0x440, 0x43d, 0x435, 0x43a,
+0x443, 0x43d, 0x3b, 0x448, 0x4d1, 0x43c, 0x430, 0x442, 0x43a, 0x443, 0x43d, 0x432,
+0x44b, 0x440, 0x2e, 0x3b, 0x442, 0x443, 0x43d, 0x2e, 0x3b, 0x44b, 0x442, 0x43b,
+0x2e, 0x3b, 0x44e, 0x43d, 0x2e, 0x3b, 0x43a, 0x4d7, 0x4ab, 0x2e, 0x3b, 0x44d,
+0x440, 0x2e, 0x3b, 0x448, 0x4d1, 0x43c, 0x2e, 0x412, 0x3b, 0x422, 0x3b, 0x42b,
+0x3b, 0x42e, 0x3b, 0x41a, 0x3b, 0x42d, 0x3b, 0x428, 0x53, 0x75, 0x6e, 0x6e,
+0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d, 0x6f, 0x68, 0x6e, 0x64, 0x61,
+0x61, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x6e, 0x6e, 0x73, 0x64, 0x61, 0x61,
+0x63, 0x68, 0x3b, 0x4d, 0x65, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44,
+0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b,
+0x46, 0x72, 0x69, 0x69, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x53, 0x61,
+0x6d, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x53, 0x75, 0x2e, 0x3b, 0x4d,
+0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x65, 0x2e, 0x3b, 0x44,
+0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x3b,
+0x4d, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x53, 0x64,
+0x79, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x64, 0x79, 0x20, 0x4c, 0x75, 0x6e,
+0x3b, 0x64, 0x79, 0x20, 0x4d, 0x65, 0x75, 0x72, 0x74, 0x68, 0x3b, 0x64,
+0x79, 0x20, 0x4d, 0x65, 0x72, 0x68, 0x65, 0x72, 0x3b, 0x64, 0x79, 0x20,
+0x59, 0x6f, 0x77, 0x3b, 0x64, 0x79, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65,
+0x72, 0x3b, 0x64, 0x79, 0x20, 0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e, 0x53,
+0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x74, 0x68, 0x3b, 0x4d,
+0x68, 0x72, 0x3b, 0x59, 0x6f, 0x77, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53,
+0x61, 0x64, 0x64, 0x75, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x6c,
+0x75, 0x6e, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x3b, 0x6d, 0x65,
+0x72, 0x63, 0x75, 0x72, 0x69, 0x3b, 0x67, 0x68, 0x6a, 0x6f, 0x76, 0x69,
+0x3b, 0x76, 0x65, 0x6e, 0x6e, 0x65, 0x72, 0x69, 0x3b, 0x73, 0x61, 0x62,
+0x62, 0x61, 0x74, 0x75, 0x64, 0x75, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e,
+0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e, 0x3b,
+0x67, 0x68, 0x6a, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0x61,
+0x62, 0x2e, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b,
+0x56, 0x3b, 0x53, 0x6e, 0x65, 0x64, 0x11b, 0x6c, 0x65, 0x3b, 0x70, 0x6f,
+0x6e, 0x64, 0x11b, 0x6c, 0xed, 0x3b, 0xfa, 0x74, 0x65, 0x72, 0xfd, 0x3b,
+0x73, 0x74, 0x159, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x74, 0x76, 0x72, 0x74,
+0x65, 0x6b, 0x3b, 0x70, 0xe1, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62,
+0x6f, 0x74, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0xfa, 0x74, 0x3b,
+0x73, 0x74, 0x3b, 0x10d, 0x74, 0x3b, 0x70, 0xe1, 0x3b, 0x73, 0x6f, 0x4e,
+0x3b, 0x50, 0x3b, 0xda, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53,
+0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x6e, 0x64, 0x61,
+0x67, 0x3b, 0x74, 0x69, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e,
+0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67,
+0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf8, 0x72, 0x64,
+0x61, 0x67, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x6e, 0x2e, 0x3b,
+0x74, 0x69, 0x72, 0x73, 0x2e, 0x3b, 0x6f, 0x6e, 0x73, 0x2e, 0x3b, 0x74,
+0x6f, 0x72, 0x73, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b, 0x6c, 0xf8,
+0x72, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x54, 0x3b,
+0x46, 0x3b, 0x4c, 0x910, 0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e,
+0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b,
+0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x940, 0x930, 0x92c, 0x93e,
+0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936,
+0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x910, 0x924, 0x3b, 0x938, 0x94b, 0x92e, 0x3b,
+0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x92c, 0x940, 0x930,
+0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x910, 0x3b,
+0x938, 0x94b, 0x3b, 0x92e, 0x2e, 0x3b, 0x92c, 0x941, 0x2e, 0x3b, 0x92c, 0x940,
+0x2e, 0x3b, 0x936, 0x941, 0x2e, 0x3b, 0x936, 0x2e, 0x910, 0x2e, 0x3b, 0x938,
+0x94b, 0x2e, 0x3b, 0x92e, 0x2e, 0x3b, 0x92c, 0x941, 0x2e, 0x3b, 0x92c, 0x940,
+0x2e, 0x3b, 0x936, 0x941, 0x2e, 0x3b, 0x936, 0x2e, 0xe9, 0x74, 0x69, 0x3b,
+0x6d, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x6b, 0x77, 0x61, 0x73, 0xfa, 0x3b,
+0x6d, 0x75, 0x6b, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x14b, 0x67, 0x69, 0x73,
+0xfa, 0x3b, 0x257, 0xf3, 0x6e, 0x25b, 0x73, 0xfa, 0x3b, 0x65, 0x73, 0x61,
+0x253, 0x61, 0x73, 0xfa, 0xe9, 0x74, 0x3b, 0x6d, 0x254, 0x301, 0x73, 0x3b,
+0x6b, 0x77, 0x61, 0x3b, 0x6d, 0x75, 0x6b, 0x3b, 0x14b, 0x67, 0x69, 0x3b,
+0x257, 0xf3, 0x6e, 0x3b, 0x65, 0x73, 0x61, 0x65, 0x3b, 0x6d, 0x3b, 0x6b,
+0x3b, 0x6d, 0x3b, 0x14b, 0x3b, 0x257, 0x3b, 0x65, 0x7a, 0x6f, 0x6e, 0x64,
+0x61, 0x67, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x64,
+0x69, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x77, 0x6f, 0x65, 0x6e, 0x73,
+0x64, 0x61, 0x67, 0x3b, 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61,
+0x67, 0x3b, 0x76, 0x72, 0x69, 0x6a, 0x64, 0x61, 0x67, 0x3b, 0x7a, 0x61,
+0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x7a, 0x6f, 0x3b, 0x6d, 0x61, 0x3b,
+0x64, 0x69, 0x3b, 0x77, 0x6f, 0x3b, 0x64, 0x6f, 0x3b, 0x76, 0x72, 0x3b,
+0x7a, 0x61, 0x5a, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b,
+0x56, 0x3b, 0x5a, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
+0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62,
+0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b,
+0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b,
+0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b,
+0xf42, 0xf5f, 0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0xf5f, 0xfb3, 0xf0b,
+0x3b, 0xf58, 0xf72, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0x3b, 0xf55,
+0xf74, 0xf62, 0xf0b, 0x3b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a,
+0xf53, 0xf0b, 0x3b, 0xf49, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72, 0xf62,
+0x3b, 0xf63, 0xfb7, 0xf42, 0x3b, 0xf55, 0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xfb6,
+0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x3b, 0xf49, 0xf72, 0x4b, 0x69, 0x75, 0x6d,
+0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75,
+0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a,
+0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d,
+0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b,
+0x4e, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x69, 0x4b,
+0x6d, 0x61, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x54,
+0x61, 0x6e, 0x3b, 0x41, 0x72, 0x6d, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4e,
+0x4d, 0x4d, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b,
+0x4d, 0x3b, 0x4e, 0xd801, 0xdc1d, 0xd801, 0xdc32, 0xd801, 0xdc4c, 0xd801, 0xdc3c, 0xd801,
+0xdc29, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc32, 0xd801, 0xdc4c, 0xd801, 0xdc3c, 0xd801, 0xdc29,
+0x3b, 0xd801, 0xdc13, 0xd801, 0xdc2d, 0xd801, 0xdc46, 0xd801, 0xdc3c, 0xd801, 0xdc29, 0x3b,
+0xd801, 0xdc0e, 0xd801, 0xdc2f, 0xd801, 0xdc4c, 0xd801, 0xdc46, 0xd801, 0xdc3c, 0xd801, 0xdc29,
+0x3b, 0xd801, 0xdc1b, 0xd801, 0xdc32, 0xd801, 0xdc49, 0xd801, 0xdc46, 0xd801, 0xdc3c, 0xd801,
+0xdc29, 0x3b, 0xd801, 0xdc19, 0xd801, 0xdc49, 0xd801, 0xdc34, 0xd801, 0xdc3c, 0xd801, 0xdc29,
+0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc30, 0xd801, 0xdc3b, 0xd801, 0xdc32, 0xd801, 0xdc49, 0xd801,
+0xdc3c, 0xd801, 0xdc29, 0xd801, 0xdc1d, 0xd801, 0xdc32, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc23,
+0xd801, 0xdc32, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc13, 0xd801, 0xdc2d, 0xd801, 0xdc46, 0x3b,
+0xd801, 0xdc0e, 0xd801, 0xdc2f, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc1b, 0xd801, 0xdc32, 0xd801,
+0xdc49, 0x3b, 0xd801, 0xdc19, 0xd801, 0xdc49, 0xd801, 0xdc34, 0x3b, 0xd801, 0xdc1d, 0xd801,
+0xdc30, 0xd801, 0xdc3b, 0xd801, 0xdc1d, 0x3b, 0xd801, 0xdc23, 0x3b, 0xd801, 0xdc13, 0x3b,
+0xd801, 0xdc0e, 0x3b, 0xd801, 0xdc1b, 0x3b, 0xd801, 0xdc19, 0x3b, 0xd801, 0xdc1d, 0x53,
+0x75, 0x2e, 0x3b, 0x4d, 0x2e, 0x3b, 0x54, 0x75, 0x2e, 0x3b, 0x57, 0x2e,
+0x3b, 0x54, 0x68, 0x2e, 0x3b, 0x46, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0xb7,
+0xd801, 0xdc55, 0xd801, 0xdc6d, 0xd801, 0xdc59, 0xd801, 0xdc5b, 0xd801, 0xdc71, 0x3b, 0xb7,
+0xd801, 0xdc65, 0xd801, 0xdc6d, 0xd801, 0xdc59, 0xd801, 0xdc5b, 0xd801, 0xdc71, 0x3b, 0xb7,
+0xd801, 0xdc51, 0xd801, 0xdc75, 0xd801, 0xdc5f, 0xd801, 0xdc5b, 0xd801, 0xdc71, 0x3b, 0xb7,
+0xd801, 0xdc62, 0xd801, 0xdc67, 0xd801, 0xdc59, 0xd801, 0xdc5f, 0xd801, 0xdc5b, 0xd801, 0xdc71,
+0x3b, 0xb7, 0xd801, 0xdc54, 0xd801, 0xdc7b, 0xd801, 0xdc5f, 0xd801, 0xdc5b, 0xd801, 0xdc71,
+0x3b, 0xb7, 0xd801, 0xdc53, 0xd801, 0xdc6e, 0xd801, 0xdc72, 0xd801, 0xdc5b, 0xd801, 0xdc71,
+0x3b, 0xb7, 0xd801, 0xdc55, 0xd801, 0xdc68, 0xd801, 0xdc5b, 0xd801, 0xdc7b, 0xd801, 0xdc5b,
+0xd801, 0xdc71, 0xb7, 0xd801, 0xdc55, 0xd801, 0xdc6d, 0x3b, 0xb7, 0xd801, 0xdc65, 0xd801,
+0xdc6d, 0x3b, 0xb7, 0xd801, 0xdc51, 0xd801, 0xdc75, 0x3b, 0xb7, 0xd801, 0xdc62, 0xd801,
+0xdc67, 0x3b, 0xb7, 0xd801, 0xdc54, 0xd801, 0xdc7b, 0x3b, 0xb7, 0xd801, 0xdc53, 0xd801,
+0xdc6e, 0x3b, 0xb7, 0xd801, 0xdc55, 0xd801, 0xdc68, 0xd801, 0xdc55, 0x3b, 0xd801, 0xdc65,
+0x3b, 0xd801, 0xdc51, 0x3b, 0xd801, 0xdc62, 0x3b, 0xd801, 0xdc54, 0x3b, 0xd801, 0xdc53,
+0x3b, 0xd801, 0xdc55, 0x442, 0x430, 0x440, 0x433, 0x43e, 0x447, 0x438, 0x3b, 0x430,
+0x442, 0x44f, 0x43d, 0x44c, 0x447, 0x438, 0x3b, 0x432, 0x430, 0x441, 0x442, 0x430,
+0x43d, 0x44c, 0x447, 0x438, 0x3b, 0x43a, 0x443, 0x43d, 0x448, 0x43a, 0x430, 0x447,
+0x438, 0x3b, 0x43a, 0x430, 0x43b, 0x43e, 0x43d, 0x44c, 0x447, 0x438, 0x3b, 0x441,
+0x44e, 0x43a, 0x43e, 0x43d, 0x44c, 0x447, 0x438, 0x3b, 0x448, 0x43b, 0x44f, 0x43c,
+0x43e, 0x447, 0x438, 0x442, 0x430, 0x440, 0x433, 0x43e, 0x447, 0x438, 0x441, 0x442,
+0x44d, 0x3b, 0x430, 0x442, 0x44f, 0x43d, 0x44c, 0x447, 0x438, 0x441, 0x442, 0x44d,
+0x3b, 0x432, 0x430, 0x441, 0x442, 0x430, 0x43d, 0x44c, 0x447, 0x438, 0x441, 0x442,
+0x44d, 0x3b, 0x43a, 0x443, 0x43d, 0x448, 0x43a, 0x430, 0x447, 0x438, 0x441, 0x442,
+0x44d, 0x3b, 0x43a, 0x430, 0x43b, 0x43e, 0x43d, 0x44c, 0x447, 0x438, 0x441, 0x442,
+0x44d, 0x3b, 0x441, 0x44e, 0x43a, 0x43e, 0x43d, 0x44c, 0x447, 0x438, 0x441, 0x442,
+0x44d, 0x3b, 0x448, 0x43b, 0x44f, 0x43c, 0x43e, 0x447, 0x438, 0x441, 0x442, 0x44d,
+0x442, 0x430, 0x440, 0x3b, 0x430, 0x442, 0x44f, 0x3b, 0x432, 0x430, 0x441, 0x3b,
+0x43a, 0x443, 0x43d, 0x3b, 0x43a, 0x430, 0x43b, 0x3b, 0x441, 0x44e, 0x43a, 0x3b,
+0x448, 0x43b, 0x44f, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x109, 0x6f, 0x3b, 0x6c,
+0x75, 0x6e, 0x64, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x6f, 0x3b, 0x6d,
+0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x135, 0x61, 0x16d, 0x64,
+0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x73,
+0x61, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x69, 0x3b, 0x6c, 0x75, 0x3b, 0x6d,
+0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x135, 0x61, 0x3b, 0x76, 0x65, 0x3b, 0x73,
+0x61, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x135, 0x3b, 0x76,
+0x3b, 0x73, 0x70, 0xfc, 0x68, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x65,
+0x73, 0x6d, 0x61, 0x73, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x74, 0x65, 0x69,
+0x73, 0x69, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6b, 0x6f, 0x6c, 0x6d, 0x61,
+0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6e, 0x65, 0x6c, 0x6a, 0x61, 0x70, 0xe4,
+0x65, 0x76, 0x3b, 0x72, 0x65, 0x65, 0x64, 0x65, 0x3b, 0x6c, 0x61, 0x75,
+0x70, 0xe4, 0x65, 0x76, 0x50, 0x3b, 0x45, 0x3b, 0x54, 0x3b, 0x4b, 0x3b,
+0x4e, 0x3b, 0x52, 0x3b, 0x4c, 0x6b, 0x254, 0x73, 0x69, 0x256, 0x61, 0x3b,
+0x64, 0x7a, 0x6f, 0x256, 0x61, 0x3b, 0x62, 0x6c, 0x61, 0x256, 0x61, 0x3b,
+0x6b, 0x75, 0x256, 0x61, 0x3b, 0x79, 0x61, 0x77, 0x6f, 0x256, 0x61, 0x3b,
+0x66, 0x69, 0x256, 0x61, 0x3b, 0x6d, 0x65, 0x6d, 0x6c, 0x65, 0x256, 0x61,
+0x6b, 0x254, 0x73, 0x3b, 0x64, 0x7a, 0x6f, 0x3b, 0x62, 0x6c, 0x61, 0x3b,
+0x6b, 0x75, 0x256, 0x3b, 0x79, 0x61, 0x77, 0x3b, 0x66, 0x69, 0x256, 0x3b,
+0x6d, 0x65, 0x6d, 0x6b, 0x3b, 0x64, 0x3b, 0x62, 0x3b, 0x6b, 0x3b, 0x79,
+0x3b, 0x66, 0x3b, 0x6d, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x6d,
+0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254,
+0x20, 0x6d, 0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x62, 0x25b, 0x30c,
+0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa,
+0x20, 0x6d, 0x259, 0x301, 0x6c, 0x25b, 0x301, 0x3b, 0x73, 0x254, 0x301, 0x6e,
+0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x6e,
+0x79, 0x69, 0x3b, 0x66, 0xfa, 0x6c, 0x61, 0x64, 0xe9, 0x3b, 0x73, 0xe9,
+0x72, 0x61, 0x64, 0xe9, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301,
+0x6e, 0x3b, 0x73, 0x6d, 0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d,
+0x6e, 0x3b, 0x66, 0xfa, 0x6c, 0x3b, 0x73, 0xe9, 0x72, 0x73, 0x3b, 0x6d,
+0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x66, 0x3b, 0x73, 0x73, 0x75,
+0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e,
+0x61, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x74, 0xfd, 0x73, 0x64, 0x61,
+0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75,
+0x72, 0x3b, 0x68, 0xf3, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66,
+0x72, 0xed, 0x67, 0x67, 0x6a, 0x61, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b,
+0x6c, 0x65, 0x79, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x73,
+0x75, 0x6e, 0x3b, 0x6d, 0xe1, 0x6e, 0x3b, 0x74, 0xfd, 0x73, 0x3b, 0x6d,
+0x69, 0x6b, 0x3b, 0x68, 0xf3, 0x73, 0x3b, 0x66, 0x72, 0xed, 0x3b, 0x6c,
+0x65, 0x79, 0x73, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b,
+0x74, 0xfd, 0x73, 0x2e, 0x3b, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x68, 0xf3,
+0x73, 0x2e, 0x3b, 0x66, 0x72, 0xed, 0x2e, 0x3b, 0x6c, 0x65, 0x79, 0x2e,
+0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x46, 0x3b,
+0x4c, 0x4c, 0x69, 0x6e, 0x67, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65,
+0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79,
+0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65,
+0x62, 0x65, 0x73, 0x3b, 0x42, 0x69, 0x79, 0x65, 0x72, 0x6e, 0x65, 0x73,
+0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x4c, 0x69, 0x6e, 0x3b, 0x4c,
+0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x79, 0x3b, 0x48,
+0x75, 0x77, 0x3b, 0x42, 0x69, 0x79, 0x3b, 0x53, 0x61, 0x62, 0x73, 0x75,
+0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6e,
+0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61,
+0x69, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b,
+0x6f, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x70, 0x65,
+0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6c, 0x61, 0x75, 0x61,
+0x6e, 0x74, 0x61, 0x69, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61,
+0x69, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61,
+0x69, 0x6e, 0x61, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x6e,
+0x61, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b,
+0x6f, 0x6e, 0x61, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x6e,
+0x61, 0x3b, 0x70, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+0x61, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61,
+0x73, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x74, 0x69, 0x3b, 0x6b, 0x65, 0x3b,
+0x74, 0x6f, 0x3b, 0x70, 0x65, 0x3b, 0x6c, 0x61, 0x53, 0x3b, 0x4d, 0x3b,
+0x54, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x4c, 0x64, 0x69, 0x6d,
+0x61, 0x6e, 0x63, 0x68, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x69, 0x3b,
+0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65,
+0x64, 0x69, 0x3b, 0x6a, 0x65, 0x75, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e,
+0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x65, 0x64, 0x69,
+0x64, 0x69, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61,
+0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e, 0x3b, 0x6a, 0x65, 0x75, 0x2e,
+0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x6d, 0x2e, 0x44, 0x3b,
+0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64,
+0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73,
+0x3b, 0x6d, 0x61, 0x72, 0x74, 0x61, 0x72, 0x73, 0x3b, 0x6d, 0x69, 0x65,
+0x72, 0x63, 0x75, 0x73, 0x3b, 0x6a, 0x6f, 0x69, 0x62, 0x65, 0x3b, 0x76,
+0x69, 0x6e, 0x61, 0x72, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x69, 0x64, 0x65,
+0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x6d, 0x69, 0x65, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x3b,
+0x73, 0x61, 0x62, 0x64, 0x65, 0x77, 0x6f, 0x3b, 0x61, 0x61, 0x253, 0x6e,
+0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x62, 0x61, 0x61, 0x72, 0x65, 0x3b,
+0x6e, 0x6a, 0x65, 0x73, 0x6c, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x61,
+0x61, 0x73, 0x61, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x6e,
+0x64, 0x65, 0x3b, 0x68, 0x6f, 0x6f, 0x72, 0x65, 0x2d, 0x62, 0x69, 0x69,
+0x72, 0x64, 0x65, 0x77, 0x3b, 0x61, 0x61, 0x253, 0x3b, 0x6d, 0x61, 0x77,
+0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x3b, 0x6d, 0x77, 0x64,
+0x3b, 0x68, 0x62, 0x69, 0x64, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6e, 0x3b,
+0x6e, 0x3b, 0x6d, 0x3b, 0x68, 0xd83a, 0xdd08, 0xd83a, 0xdd2b, 0xd83a, 0xdd2c, 0xd83a,
+0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a, 0xdd46, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd00,
+0xd83a, 0xdd44, 0xd83a, 0xdd29, 0xd83a, 0xdd35, 0xd83a, 0xdd32, 0xd83a, 0xdd4b, 0xd83a, 0xdd23,
+0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd22, 0xd83a, 0xdd31, 0xd83a, 0xdd26, 0xd83a,
+0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd2a, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd10, 0xd83a, 0xdd36,
+0xd83a, 0xdd2b, 0xd83a, 0xdd27, 0xd83a, 0xdd24, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd2a,
+0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd27, 0xd83a,
+0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd32, 0xd83a, 0xdd23, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd03,
+0xd83a, 0xdd22, 0xd83a, 0xdd31, 0xd83a, 0xdd32, 0xd83a, 0xdd23, 0xd83a, 0xdd2b, 0x3b, 0xd83a,
+0xdd16, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a,
+0xdd46, 0xd83a, 0xdd2b, 0xd83a, 0xdd08, 0xd83a, 0xdd2b, 0xd83a, 0xdd2c, 0x3b, 0xd83a, 0xdd00,
+0xd83a, 0xdd44, 0xd83a, 0xdd29, 0xd83a, 0xdd35, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd22, 0xd83a,
+0xdd26, 0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd2b, 0xd83a, 0xdd27, 0x3b, 0xd83a, 0xdd10, 0xd83a,
+0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd27, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd22, 0xd83a, 0xdd23,
+0x3b, 0xd83a, 0xdd16, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd08, 0x3b, 0xd83a, 0xdd00,
+0xd83a, 0xdd44, 0x3b, 0xd83a, 0xdd03, 0x3b, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd10, 0x3b,
+0xd83a, 0xdd03, 0x3b, 0xd83a, 0xdd16, 0x44, 0x69, 0x44, 0xf2, 0x6d, 0x68, 0x6e,
+0x61, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x4c, 0x75, 0x61, 0x69, 0x6e,
+0x3b, 0x44, 0x69, 0x4d, 0xe0, 0x69, 0x72, 0x74, 0x3b, 0x44, 0x69, 0x43,
+0x69, 0x61, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x61, 0x72, 0x44,
+0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x68, 0x41, 0x6f, 0x69, 0x6e,
+0x65, 0x3b, 0x44, 0x69, 0x53, 0x61, 0x74, 0x68, 0x61, 0x69, 0x72, 0x6e,
+0x65, 0x44, 0x69, 0x44, 0x3b, 0x44, 0x69, 0x4c, 0x3b, 0x44, 0x69, 0x4d,
+0x3b, 0x44, 0x69, 0x43, 0x3b, 0x44, 0x69, 0x61, 0x3b, 0x44, 0x69, 0x68,
+0x3b, 0x44, 0x69, 0x53, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b,
+0x41, 0x3b, 0x48, 0x3b, 0x53, 0x48, 0x254, 0x67, 0x62, 0x61, 0x61, 0x3b,
+0x4a, 0x75, 0x3b, 0x4a, 0x75, 0x66, 0x254, 0x3b, 0x53, 0x68, 0x254, 0x3b,
+0x53, 0x6f, 0x6f, 0x3b, 0x53, 0x6f, 0x68, 0x61, 0x61, 0x3b, 0x48, 0x254,
+0x254, 0x48, 0x254, 0x67, 0x3b, 0x4a, 0x75, 0x3b, 0x4a, 0x75, 0x66, 0x3b,
+0x53, 0x68, 0x254, 0x3b, 0x53, 0x6f, 0x6f, 0x3b, 0x53, 0x6f, 0x68, 0x3b,
+0x48, 0x254, 0x254, 0x48, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x53,
+0x3b, 0x53, 0x3b, 0x48, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b,
+0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b,
+0x6d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x78, 0x6f, 0x76,
+0x65, 0x73, 0x3b, 0x76, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x73, 0xe1,
+0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e,
+0x73, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0xe9, 0x72, 0x2e, 0x3b,
+0x78, 0x6f, 0x76, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0xe1,
+0x62, 0x2e, 0x64, 0x2e, 0x3b, 0x6c, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x6d,
+0x2e, 0x3b, 0x78, 0x2e, 0x3b, 0x76, 0x2e, 0x3b, 0x73, 0x2e, 0x53, 0x61,
+0x62, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a,
+0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x62, 0x69, 0x72, 0x69, 0x3b,
+0x4c, 0x77, 0x61, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x77,
+0x61, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x74,
+0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61,
+0x61, 0x67, 0x61, 0x53, 0x61, 0x62, 0x3b, 0x42, 0x61, 0x6c, 0x3b, 0x4c,
+0x77, 0x32, 0x3b, 0x4c, 0x77, 0x33, 0x3b, 0x4c, 0x77, 0x34, 0x3b, 0x4c,
+0x77, 0x35, 0x3b, 0x4c, 0x77, 0x36, 0x53, 0x3b, 0x42, 0x3b, 0x4c, 0x3b,
+0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x12a5, 0x1281, 0x12f5, 0x3b, 0x1230,
+0x1291, 0x12ed, 0x3b, 0x1220, 0x1209, 0x1235, 0x3b, 0x122b, 0x1265, 0x12d5, 0x3b, 0x1210,
+0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1260, 0x3b, 0x1240, 0x12f3, 0x121a, 0x1275, 0x12a5,
+0x3b, 0x1230, 0x3b, 0x1220, 0x3b, 0x122b, 0x3b, 0x1210, 0x3b, 0x12d3, 0x3b, 0x1240,
+0x10d9, 0x10d5, 0x10d8, 0x10e0, 0x10d0, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x10d0, 0x10d1, 0x10d0,
+0x10d7, 0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8,
+0x3b, 0x10dd, 0x10d7, 0x10ee, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10ee,
+0x10e3, 0x10d7, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10de, 0x10d0, 0x10e0,
+0x10d0, 0x10e1, 0x10d9, 0x10d4, 0x10d5, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7,
+0x10d8, 0x10d9, 0x10d5, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x3b, 0x10e1, 0x10d0, 0x10db,
+0x3b, 0x10dd, 0x10d7, 0x10ee, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x3b, 0x10de, 0x10d0, 0x10e0,
+0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d9, 0x3b, 0x10dd, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b,
+0x10ee, 0x3b, 0x10de, 0x3b, 0x10e8, 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67,
+0x3b, 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x44, 0x69, 0x65, 0x6e,
+0x73, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x6f, 0x63,
+0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74, 0x61, 0x67,
+0x3b, 0x46, 0x72, 0x65, 0x69, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d,
+0x73, 0x74, 0x61, 0x67, 0x53, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x44, 0x69,
+0x3b, 0x4d, 0x69, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61,
+0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b,
+0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x6f, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b,
+0x53, 0x61, 0x2e, 0x39a, 0x3c5, 0x3c1, 0x3b9, 0x3b1, 0x3ba, 0x3ae, 0x3b, 0x394,
+0x3b5, 0x3c5, 0x3c4, 0x3ad, 0x3c1, 0x3b1, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3c4, 0x3b7,
+0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3ac, 0x3c1, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3ad, 0x3bc,
+0x3c0, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b1, 0x3c3, 0x3ba, 0x3b5, 0x3c5,
+0x3ae, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b2, 0x3b1, 0x3c4, 0x3bf, 0x39a, 0x3c5, 0x3c1,
+0x3b, 0x394, 0x3b5, 0x3c5, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3b, 0x3a4, 0x3b5, 0x3c4,
+0x3b, 0x3a0, 0x3ad, 0x3bc, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b, 0x3a3, 0x3ac, 0x3b2,
+0x39a, 0x3b, 0x394, 0x3b, 0x3a4, 0x3b, 0x3a4, 0x3b, 0x3a0, 0x3b, 0x3a0, 0x3b,
+0x3a3, 0x41, 0x72, 0x61, 0x74, 0x65, 0x129, 0x3b, 0x41, 0x72, 0x61, 0x6b,
+0xf5, 0x69, 0x3b, 0x41, 0x72, 0x61, 0x61, 0x70, 0x79, 0x3b, 0x41, 0x72,
+0x61, 0x72, 0x75, 0x6e, 0x64, 0x79, 0x3b, 0x41, 0x72, 0x61, 0x70, 0x6f,
+0x3b, 0x41, 0x72, 0x61, 0x70, 0x6f, 0x74, 0x65, 0x129, 0x3b, 0x41, 0x72,
+0x61, 0x70, 0x6f, 0x6b, 0xf5, 0x69, 0xab0, 0xab5, 0xabf, 0xab5, 0xabe, 0xab0,
+0x3b, 0xab8, 0xacb, 0xaae, 0xab5, 0xabe, 0xab0, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3,
+0xab5, 0xabe, 0xab0, 0x3b, 0xaac, 0xac1, 0xaa7, 0xab5, 0xabe, 0xab0, 0x3b, 0xa97,
+0xac1, 0xab0, 0xac1, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd, 0xab0,
+0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab5, 0xabe, 0xab0, 0xab0, 0xab5,
+0xabf, 0x3b, 0xab8, 0xacb, 0xaae, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0x3b, 0xaac,
+0xac1, 0xaa7, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd,
+0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab0, 0x3b, 0xab8, 0xacb, 0x3b, 0xaae, 0xa82,
+0x3b, 0xaac, 0xac1, 0x3b, 0xa97, 0xac1, 0x3b, 0xab6, 0xac1, 0x3b, 0xab6, 0x43,
+0x68, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x75,
+0x6d, 0x61, 0x74, 0x61, 0x74, 0x6f, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61,
+0x69, 0x6e, 0x65, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e,
+0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x63,
+0x68, 0x75, 0x6d, 0x61, 0x3b, 0x45, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f,
+0x43, 0x70, 0x72, 0x3b, 0x43, 0x74, 0x74, 0x3b, 0x43, 0x6d, 0x6e, 0x3b,
+0x43, 0x6d, 0x74, 0x3b, 0x41, 0x72, 0x73, 0x3b, 0x49, 0x63, 0x6d, 0x3b,
+0x45, 0x73, 0x74, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x41,
+0x3b, 0x49, 0x3b, 0x45, 0x4c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x4c,
+0x69, 0x74, 0x69, 0x6e, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74,
+0x61, 0x3b, 0x4c, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68,
+0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x6d, 0x61, 0x2bc, 0x61,
+0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x4c, 0x61, 0x68, 0x3b, 0x4c,
+0x69, 0x74, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x41,
+0x6c, 0x68, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x4c, 0x3b,
+0x4c, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x41, 0x644,
+0x64e, 0x62d, 0x64e, 0x62f, 0x650, 0x3b, 0x644, 0x650, 0x62a, 0x650, 0x646, 0x650,
+0x646, 0x652, 0x3b, 0x62a, 0x64e, 0x644, 0x64e, 0x62a, 0x64e, 0x3b, 0x644, 0x64e,
+0x631, 0x64e, 0x628, 0x64e, 0x3b, 0x623, 0x64e, 0x644, 0x652, 0x62d, 0x64e, 0x645,
+0x650, 0x633, 0x652, 0x3b, 0x62c, 0x64f, 0x645, 0x64e, 0x639, 0x64e, 0x3b, 0x623,
+0x64e, 0x633, 0x64e, 0x628, 0x64e, 0x631, 0x652, 0x644, 0x64e, 0x62d, 0x3b, 0x644,
+0x650, 0x62a, 0x3b, 0x62a, 0x64e, 0x644, 0x3b, 0x644, 0x64e, 0x631, 0x3b, 0x623,
+0x64e, 0x644, 0x652, 0x62d, 0x3b, 0x62c, 0x64f, 0x645, 0x3b, 0x623, 0x64e, 0x633,
+0x64e, 0x4c, 0x101, 0x70, 0x75, 0x6c, 0x65, 0x3b, 0x50, 0x6f, 0x2bb, 0x61,
+0x6b, 0x61, 0x68, 0x69, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x75, 0x61,
+0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x6f, 0x6c, 0x75, 0x3b, 0x50, 0x6f,
+0x2bb, 0x61, 0x68, 0x101, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x69, 0x6d,
+0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6f, 0x6e, 0x6f, 0x4c, 0x50, 0x3b,
+0x50, 0x31, 0x3b, 0x50, 0x32, 0x3b, 0x50, 0x33, 0x3b, 0x50, 0x34, 0x3b,
+0x50, 0x35, 0x3b, 0x50, 0x36, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d0, 0x5e9,
+0x5d5, 0x5df, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5e0, 0x5d9, 0x3b, 0x5d9,
+0x5d5, 0x5dd, 0x20, 0x5e9, 0x5dc, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd,
+0x20, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d7,
+0x5de, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d9, 0x5e9,
+0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d1, 0x5ea, 0x5d9, 0x5d5, 0x5dd,
+0x20, 0x5d0, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d9,
+0x5d5, 0x5dd, 0x20, 0x5d2, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d3, 0x5f3,
+0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d4, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20,
+0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0x5d0, 0x5f3, 0x3b, 0x5d1, 0x5f3, 0x3b,
+0x5d2, 0x5f3, 0x3b, 0x5d3, 0x5f3, 0x3b, 0x5d4, 0x5f3, 0x3b, 0x5d5, 0x5f3, 0x3b,
+0x5e9, 0x5f3, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e,
+0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b,
+0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935,
+0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b,
+0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b,
+0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917,
+0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928,
+0x93f, 0x930, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b,
+0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x52, 0x61, 0x76, 0x69, 0x77,
+0x61, 0x61, 0x72, 0x3b, 0x53, 0x6f, 0x6d, 0x77, 0x61, 0x61, 0x72, 0x3b,
+0x4d, 0x61, 0x6e, 0x67, 0x61, 0x6c, 0x77, 0x61, 0x61, 0x72, 0x3b, 0x42,
+0x75, 0x64, 0x68, 0x77, 0x61, 0x61, 0x72, 0x3b, 0x47, 0x75, 0x72, 0x75,
+0x77, 0x61, 0x61, 0x72, 0x3b, 0x53, 0x68, 0x75, 0x6b, 0x72, 0x61, 0x77,
+0x61, 0x61, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x6e, 0x69, 0x77, 0x61, 0x61,
+0x72, 0x52, 0x61, 0x76, 0x69, 0x3b, 0x53, 0x6f, 0x6d, 0x3b, 0x4d, 0x61,
+0x6e, 0x67, 0x61, 0x6c, 0x3b, 0x42, 0x75, 0x64, 0x68, 0x3b, 0x47, 0x75,
+0x72, 0x75, 0x3b, 0x53, 0x68, 0x75, 0x6b, 0x72, 0x61, 0x3b, 0x53, 0x68,
+0x61, 0x6e, 0x69, 0x52, 0x61, 0x3b, 0x53, 0x6f, 0x3b, 0x4d, 0x61, 0x3b,
+0x42, 0x75, 0x3b, 0x47, 0x75, 0x3b, 0x53, 0x68, 0x3b, 0x53, 0x68, 0x61,
+0x76, 0x61, 0x73, 0xe1, 0x72, 0x6e, 0x61, 0x70, 0x3b, 0x68, 0xe9, 0x74,
+0x66, 0x151, 0x3b, 0x6b, 0x65, 0x64, 0x64, 0x3b, 0x73, 0x7a, 0x65, 0x72,
+0x64, 0x61, 0x3b, 0x63, 0x73, 0xfc, 0x74, 0xf6, 0x72, 0x74, 0xf6, 0x6b,
+0x3b, 0x70, 0xe9, 0x6e, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x7a, 0x6f, 0x6d,
+0x62, 0x61, 0x74, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x65,
+0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x6f, 0x56, 0x3b, 0x48,
+0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53,
+0x7a, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b,
+0x6d, 0xe1, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0xfe, 0x72,
+0x69, 0xf0, 0x6a, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69,
+0xf0, 0x76, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66,
+0x69, 0x6d, 0x6d, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66,
+0xf6, 0x73, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x61,
+0x75, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x73, 0x75, 0x6e,
+0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0xfe, 0x72, 0x69, 0x2e, 0x3b,
+0x6d, 0x69, 0xf0, 0x2e, 0x3b, 0x66, 0x69, 0x6d, 0x2e, 0x3b, 0x66, 0xf6,
+0x73, 0x2e, 0x3b, 0x6c, 0x61, 0x75, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0xde,
+0x3b, 0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x4c, 0x53, 0x1ecd, 0x6e, 0x64,
+0x65, 0x65, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x64, 0x65, 0x3b, 0x54, 0x69, 0x75,
+0x7a, 0x64, 0x65, 0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65, 0x7a, 0x64, 0x65,
+0x65, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x46, 0x72,
+0x61, 0x1ecb, 0x64, 0x65, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x1ecd, 0x64, 0x65,
+0x65, 0x53, 0x1ecd, 0x6e, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x3b, 0x54, 0x69, 0x75,
+0x3b, 0x57, 0x65, 0x6e, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x3b, 0x46, 0x72, 0x61,
+0x1ecb, 0x3b, 0x53, 0x61, 0x74, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x69,
+0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x72, 0x67, 0xe2,
+0x3b, 0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6b,
+0x6f, 0x73, 0x6b, 0x6f, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72,
+0xe2, 0x73, 0x74, 0xe2, 0x68, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70,
+0x70, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64,
+0xe2, 0x68, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x65, 0x69, 0x76, 0x69,
+0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x61, 0x72, 0x67, 0xe2, 0x3b,
+0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6b,
+0x6f, 0x73, 0x6b, 0x6f, 0x68, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72, 0xe2,
+0x73, 0x74, 0x75, 0x76, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70, 0x70,
+0x65, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64,
+0x75, 0x76, 0x70, 0x61, 0x73, 0x3b, 0x76, 0x75, 0x6f, 0x3b, 0x6d, 0x61,
+0x6a, 0x3b, 0x6b, 0x6f, 0x73, 0x3b, 0x74, 0x75, 0x6f, 0x3b, 0x76, 0xe1,
+0x73, 0x3b, 0x6c, 0xe1, 0x76, 0x70, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x4b,
+0x3b, 0x54, 0x3b, 0x56, 0x3b, 0x4c, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75,
+0x3b, 0x53, 0x65, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73,
+0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75,
+0x4d, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b,
+0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b,
+0x53, 0x61, 0x62, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b,
+0x3b, 0x4a, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61,
+0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74,
+0x65, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x64,
+0x69, 0x3b, 0x6a, 0x6f, 0x76, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e,
+0x65, 0x72, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x62, 0x62, 0x61, 0x74, 0x6f,
+0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x6d, 0x65, 0x72, 0x3b, 0x6a, 0x6f, 0x76, 0x3b, 0x76, 0x65, 0x6e, 0x3b,
+0x73, 0x61, 0x62, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6a,
+0x3b, 0x76, 0x3b, 0x73, 0x73, 0x6f, 0x6c, 0x65, 0x64, 0xed, 0x3b, 0x6c,
+0x75, 0x6e, 0x65, 0x64, 0xed, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0xed, 0x3b,
+0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x64, 0xed, 0x3b, 0x6a, 0x6f, 0x76,
+0x65, 0x64, 0xed, 0x3b, 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64, 0xed, 0x3b,
+0x73, 0x61, 0x74, 0x75, 0x72, 0x64, 0xed, 0x73, 0x6f, 0x6c, 0x2e, 0x3b,
+0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65,
+0x72, 0x2e, 0x3b, 0x6a, 0x6f, 0x76, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e,
+0x3b, 0x73, 0x61, 0x74, 0x2e, 0x53, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d,
+0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x14c8, 0x1466, 0x144f, 0x1591, 0x152d, 0x1585,
+0x3b, 0x14c7, 0x14a1, 0x1490, 0x153e, 0x152d, 0x1405, 0x3b, 0x14c7, 0x14a1, 0x1490, 0x153e,
+0x152d, 0x1405, 0x14d5, 0x1585, 0x146d, 0x3b, 0x1431, 0x1593, 0x1466, 0x14ef, 0x1585, 0x3b,
+0x14ef, 0x1455, 0x14bb, 0x14a5, 0x1585, 0x3b, 0x1455, 0x14ea, 0x14d5, 0x14bb, 0x14a5, 0x1405,
+0x1466, 0x3b, 0x14c8, 0x1466, 0x14f0, 0x1591, 0x152d, 0x14db, 0x1550, 0x14c2, 0x140a, 0x1585,
+0x44, 0xe9, 0x20, 0x44, 0x6f, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x67, 0x68,
+0x3b, 0x44, 0xe9, 0x20, 0x4c, 0x75, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0xe9,
+0x20, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x44, 0xe9, 0x20, 0x43, 0xe9,
+0x61, 0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x64,
+0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x68, 0x41, 0x6f, 0x69,
+0x6e, 0x65, 0x3b, 0x44, 0xe9, 0x20, 0x53, 0x61, 0x74, 0x68, 0x61, 0x69,
+0x72, 0x6e, 0x44, 0x6f, 0x6d, 0x68, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x3b,
+0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x43, 0xe9, 0x61, 0x64, 0x3b, 0x44,
+0xe9, 0x61, 0x72, 0x3b, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x61,
+0x74, 0x68, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x44, 0x3b,
+0x41, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61, 0x3b,
+0x6c, 0x75, 0x6e, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65,
+0x64, 0xec, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x64, 0xec,
+0x3b, 0x67, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec, 0x3b, 0x76, 0x65, 0x6e,
+0x65, 0x72, 0x64, 0xec, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x64,
+0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d,
+0x65, 0x72, 0x3b, 0x67, 0x69, 0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73,
+0x61, 0x62, 0x65e5, 0x66dc, 0x65e5, 0x3b, 0x6708, 0x66dc, 0x65e5, 0x3b, 0x706b, 0x66dc,
+0x65e5, 0x3b, 0x6c34, 0x66dc, 0x65e5, 0x3b, 0x6728, 0x66dc, 0x65e5, 0x3b, 0x91d1, 0x66dc,
+0x65e5, 0x3b, 0x571f, 0x66dc, 0x65e5, 0x65e5, 0x3b, 0x6708, 0x3b, 0x706b, 0x3b, 0x6c34,
+0x3b, 0x6728, 0x3b, 0x91d1, 0x3b, 0x571f, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x53,
+0x65, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b,
+0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a,
+0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x41, 0x68,
+0x61, 0x64, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52,
+0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53,
+0x61, 0x62, 0x41, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b,
+0x4a, 0x3b, 0x53, 0x4c, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69, 0x6e, 0x74,
+0x61, 0x6e, 0x69, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x4c,
+0x61, 0x72, 0x62, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x69, 0x74, 0x3b, 0x4a,
+0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x4c, 0x61,
+0x64, 0x3b, 0x4c, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x4c, 0x61,
+0x72, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41, 0x73,
+0x61, 0x44, 0x69, 0x6d, 0x61, 0x73, 0x3b, 0x54, 0x65, 0x6e, 0x65, 0x14b,
+0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72,
+0x62, 0x61, 0x79, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x61, 0x79,
+0x3b, 0x41, 0x72, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x53, 0x69, 0x62, 0x69,
+0x74, 0x69, 0x44, 0x69, 0x6d, 0x3b, 0x54, 0x65, 0x6e, 0x3b, 0x54, 0x61,
+0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x41, 0x72,
+0x6a, 0x3b, 0x53, 0x69, 0x62, 0x44, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x41,
+0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x53, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x67,
+0x75, 0x3b, 0x73, 0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65,
+0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65, 0x72,
+0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72,
+0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61,
+0x3b, 0x73, 0x65, 0x73, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b,
+0x73, 0xe1, 0x62, 0x61, 0x64, 0x75, 0x64, 0x75, 0x6d, 0x3b, 0x73, 0x69,
+0x67, 0x3b, 0x74, 0x65, 0x72, 0x3b, 0x6b, 0x75, 0x61, 0x3b, 0x6b, 0x69,
+0x6e, 0x3b, 0x73, 0x65, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x44, 0x3b, 0x53,
+0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x53, 0x41, 0x63,
+0x65, 0x72, 0x3b, 0x41, 0x72, 0x69, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6d,
+0x3b, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x41, 0x6d, 0x68, 0x61, 0x64, 0x3b,
+0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64, 0x59, 0x61, 0x6e, 0x61, 0x73,
+0x73, 0x3b, 0x53, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x72, 0x61,
+0x1e0d, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x75, 0x1e93, 0x61, 0x73, 0x73, 0x3b,
+0x53, 0x61, 0x6d, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x1e0d, 0x69, 0x73, 0x61,
+0x73, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x61, 0x73, 0x73, 0x41, 0x63, 0x65,
+0x3b, 0x41, 0x72, 0x69, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x41, 0x68, 0x61,
+0x3b, 0x41, 0x6d, 0x68, 0x3b, 0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64,
+0x59, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d,
+0x3b, 0x4b, 0x75, 0x1e93, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x1e0d, 0x69,
+0x73, 0x3b, 0x53, 0x61, 0x79, 0x59, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b,
+0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x43, 0x3b, 0x52, 0x3b, 0x52, 0x3b,
+0x48, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x73, 0x254, 0x6e, 0x64, 0x69,
+0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69,
+0x3b, 0x6d, 0x25b, 0x72, 0x6b, 0x25b, 0x72, 0x25b, 0x64, 0x69, 0x3b, 0x79,
+0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x14b, 0x64, 0x25b, 0x72, 0x25b, 0x64,
+0x69, 0x3b, 0x6d, 0x254, 0x6e, 0x254, 0x20, 0x73, 0x254, 0x6e, 0x64, 0x69,
+0x73, 0x6f, 0x3b, 0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x25b, 0x3b,
+0x79, 0x65, 0x3b, 0x76, 0x61, 0x3b, 0x6d, 0x73, 0x73, 0x61, 0x70, 0x61,
+0x61, 0x74, 0x3b, 0x61, 0x74, 0x61, 0x61, 0x73, 0x69, 0x6e, 0x6e, 0x67,
+0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x6d, 0x61, 0x72, 0x6c, 0x75, 0x6e,
+0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x70, 0x69, 0x6e, 0x67,
+0x61, 0x73, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b,
+0x73, 0x69, 0x73, 0x61, 0x6d, 0x61, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e,
+0x65, 0x71, 0x3b, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x61, 0x6e, 0x6e,
+0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x61, 0x72, 0x66, 0x69, 0x6e,
+0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x73, 0x61, 0x70,
+0x3b, 0x61, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x69, 0x6e,
+0x3b, 0x73, 0x69, 0x73, 0x3b, 0x74, 0x61, 0x6c, 0x3b, 0x61, 0x72, 0x66,
+0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b,
+0x41, 0x4b, 0x6f, 0x74, 0x69, 0x73, 0x61, 0x70, 0x3b, 0x4b, 0x6f, 0x74,
+0x61, 0x61, 0x69, 0x3b, 0x4b, 0x6f, 0x61, 0x65, 0x6e, 0x67, 0x2019, 0x3b,
+0x4b, 0x6f, 0x73, 0x6f, 0x6d, 0x6f, 0x6b, 0x3b, 0x4b, 0x6f, 0x61, 0x6e,
+0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4b, 0x6f, 0x6d, 0x75, 0x75, 0x74,
+0x3b, 0x4b, 0x6f, 0x6c, 0x6f, 0x4b, 0x74, 0x73, 0x3b, 0x4b, 0x6f, 0x74,
+0x3b, 0x4b, 0x6f, 0x6f, 0x3b, 0x4b, 0x6f, 0x73, 0x3b, 0x4b, 0x6f, 0x61,
+0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x4b, 0x6f, 0x6c, 0x54, 0x3b, 0x54, 0x3b,
+0x4f, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4c, 0x57, 0x61, 0x20,
+0x6b, 0x79, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x77,
+0x61, 0x6d, 0x62, 0x129, 0x6c, 0x129, 0x6c, 0x79, 0x61, 0x3b, 0x57, 0x61,
+0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74,
+0x61, 0x74, 0x169, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b,
+0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x57, 0x61,
+0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x57, 0x6b,
+0x79, 0x3b, 0x57, 0x6b, 0x77, 0x3b, 0x57, 0x6b, 0x6c, 0x3b, 0x57, 0x74,
+0x169, 0x3b, 0x57, 0x6b, 0x6e, 0x3b, 0x57, 0x74, 0x6e, 0x3b, 0x57, 0x74,
+0x68, 0x59, 0x3b, 0x57, 0x3b, 0x45, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41,
+0x3b, 0x41, 0xcad, 0xcbe, 0xca8, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb8, 0xccb,
+0xcae, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0xcb5, 0xcbe, 0xcb0,
+0x3b, 0xcac, 0xcc1, 0xca7, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xc97, 0xcc1, 0xcb0, 0xcc1,
+0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0xcb5, 0xcbe, 0xcb0,
+0x3b, 0xcb6, 0xca8, 0xcbf, 0xcb5, 0xcbe, 0xcb0, 0xcad, 0xcbe, 0xca8, 0xcc1, 0x3b,
+0xcb8, 0xccb, 0xcae, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0x3b, 0xcac, 0xcc1, 0xca7,
+0x3b, 0xc97, 0xcc1, 0xcb0, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0x3b,
+0xcb6, 0xca8, 0xcbf, 0xcad, 0xcbe, 0x3b, 0xcb8, 0xccb, 0x3b, 0xcae, 0xc82, 0x3b,
+0xcac, 0xcc1, 0x3b, 0xc97, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0x3b, 0xcb6, 0x627, 0x64e,
+0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654, 0x646, 0x62f, 0x631, 0x655,
+0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631, 0x3b,
+0x628, 0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648,
+0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648, 0x627,
+0x631, 0x622, 0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654, 0x646, 0x62f,
+0x655, 0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631,
+0x3b, 0x628, 0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633,
+0x648, 0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648,
+0x627, 0x631, 0x627, 0x3b, 0x698, 0x3b, 0x628, 0x3b, 0x628, 0x3b, 0x628, 0x3b,
+0x62c, 0x3b, 0x628, 0x906, 0x925, 0x935, 0x93e, 0x930, 0x3b, 0x91a, 0x902, 0x926,
+0x93f, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x935, 0x93e, 0x930, 0x3b,
+0x92c, 0x94b, 0x926, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x94d, 0x930, 0x947, 0x938,
+0x935, 0x93e, 0x930, 0x3b, 0x91c, 0x941, 0x92e, 0x94d, 0x92e, 0x93e, 0x3b, 0x92c,
+0x91f, 0x935, 0x93e, 0x930, 0x906, 0x925, 0x935, 0x93e, 0x930, 0x3b, 0x91a, 0x93c,
+0x902, 0x926, 0x93f, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x94b, 0x92e, 0x935,
+0x93e, 0x930, 0x3b, 0x92c, 0x94b, 0x926, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x94d,
+0x930, 0x947, 0x938, 0x935, 0x93e, 0x930, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x3b,
+0x92c, 0x91f, 0x935, 0x93e, 0x930, 0x906, 0x925, 0x935, 0x93e, 0x930, 0x3b, 0x91a,
+0x902, 0x926, 0x93f, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x935, 0x93e,
+0x930, 0x3b, 0x92c, 0x94b, 0x926, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x94d, 0x930,
+0x947, 0x938, 0x935, 0x93e, 0x930, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x3b, 0x92c,
+0x91f, 0x935, 0x93e, 0x930, 0x905, 0x3b, 0x91a, 0x3b, 0x92c, 0x3b, 0x92c, 0x3b,
+0x92c, 0x3b, 0x91c, 0x3b, 0x92c, 0x436, 0x435, 0x43a, 0x441, 0x435, 0x43d, 0x431,
+0x456, 0x3b, 0x434, 0x4af, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441,
+0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441, 0x4d9, 0x440, 0x441,
+0x435, 0x43d, 0x431, 0x456, 0x3b, 0x431, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431,
+0x456, 0x3b, 0x436, 0x4b1, 0x43c, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x431, 0x456,
+0x436, 0x441, 0x3b, 0x434, 0x441, 0x3b, 0x441, 0x441, 0x3b, 0x441, 0x440, 0x3b,
+0x431, 0x441, 0x3b, 0x436, 0x43c, 0x3b, 0x441, 0x431, 0x416, 0x3b, 0x414, 0x3b,
+0x421, 0x3b, 0x421, 0x3b, 0x411, 0x3b, 0x416, 0x3b, 0x421, 0x17a2, 0x17b6, 0x1791,
+0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784,
+0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a,
+0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2,
+0x179a, 0x3b, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2,
+0x1799, 0x3b, 0x1785, 0x17d0, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782,
+0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f,
+0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b,
+0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b,
+0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b,
+0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x3b, 0x179f, 0x17bb, 0x1780,
+0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x3b, 0x1785, 0x3b, 0x17a2,
+0x3b, 0x1796, 0x3b, 0x1796, 0x3b, 0x179f, 0x3b, 0x179f, 0x4b, 0x69, 0x75, 0x6d,
+0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x169,
+0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a,
+0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x61, 0x6d,
+0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b,
+0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x4b, 0x4d,
+0x41, 0x3b, 0x4e, 0x54, 0x54, 0x3b, 0x4e, 0x4d, 0x4e, 0x3b, 0x4e, 0x4d,
+0x54, 0x3b, 0x41, 0x52, 0x54, 0x3b, 0x4e, 0x4d, 0x41, 0x3b, 0x4e, 0x4d,
+0x4d, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4e,
+0x3b, 0x4e, 0x4b, 0x75, 0x20, 0x63, 0x79, 0x75, 0x6d, 0x77, 0x65, 0x72,
+0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65,
+0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69,
+0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75,
+0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b,
+0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4b,
+0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74,
+0x75, 0x63, 0x79, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b,
+0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e,
+0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0x906,
+0x92f, 0x924, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x93e, 0x930, 0x3b, 0x92e,
+0x902, 0x917, 0x933, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930,
+0x3b, 0x92c, 0x93f, 0x930, 0x947, 0x938, 0x94d, 0x924, 0x93e, 0x930, 0x3b, 0x936,
+0x941, 0x915, 0x94d, 0x930, 0x93e, 0x930, 0x3b, 0x936, 0x947, 0x928, 0x935, 0x93e,
+0x930, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b,
+0x92c, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x947, 0x906, 0x3b, 0x938, 0x94b, 0x3b,
+0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x936, 0x941, 0x3b,
+0x936, 0x947, 0xc77c, 0xc694, 0xc77c, 0x3b, 0xc6d4, 0xc694, 0xc77c, 0x3b, 0xd654, 0xc694,
+0xc77c, 0x3b, 0xc218, 0xc694, 0xc77c, 0x3b, 0xbaa9, 0xc694, 0xc77c, 0x3b, 0xae08, 0xc694,
+0xc77c, 0x3b, 0xd1a0, 0xc694, 0xc77c, 0xc77c, 0x3b, 0xc6d4, 0x3b, 0xd654, 0x3b, 0xc218,
+0x3b, 0xbaa9, 0x3b, 0xae08, 0x3b, 0xd1a0, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69,
+0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c,
+0x61, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b,
+0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c,
+0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x41,
+0x6c, 0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41,
+0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x7a, 0x3b, 0x41,
+0x73, 0x69, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b,
+0x4c, 0x3b, 0x53, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74,
+0x69, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b,
+0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d,
+0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x6a, 0x75, 0x6d, 0x61, 0x3b,
+0x41, 0x73, 0x73, 0x61, 0x62, 0x64, 0x75, 0x41, 0x6c, 0x68, 0x3b, 0x41,
+0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41,
+0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x6a, 0x3b, 0x41, 0x73, 0x73, 0x79, 0x65,
+0x6b, 0x15f, 0x65, 0x6d, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6d, 0x3b, 0x73,
+0xea, 0x15f, 0x65, 0x6d, 0x3b, 0xe7, 0x61, 0x72, 0x15f, 0x65, 0x6d, 0x3b,
+0x70, 0xea, 0x6e, 0x63, 0x15f, 0x65, 0x6d, 0x3b, 0xee, 0x6e, 0xee, 0x3b,
+0x15f, 0x65, 0x6d, 0xee, 0x79, 0x15f, 0x6d, 0x3b, 0x64, 0x15f, 0x6d, 0x3b,
+0x73, 0x15f, 0x6d, 0x3b, 0xe7, 0x15f, 0x6d, 0x3b, 0x70, 0x15f, 0x6d, 0x3b,
+0xee, 0x6e, 0xee, 0x3b, 0x15f, 0x65, 0x6d, 0x59, 0x3b, 0x44, 0x3b, 0x53,
+0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0xce, 0x3b, 0x15e, 0x73, 0x254, 0x301, 0x6e,
+0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x73, 0x254,
+0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1,
+0x62, 0x61, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61,
+0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x6c, 0x61, 0x6c, 0x3b, 0x73, 0x254, 0x301,
+0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x6e,
+0x61, 0x3b, 0x6d, 0x61, 0x62, 0xe1, 0x67, 0xe1, 0x20, 0x6d, 0xe1, 0x20,
+0x73, 0x75, 0x6b, 0x75, 0x6c, 0x3b, 0x73, 0xe1, 0x73, 0x61, 0x64, 0x69,
+0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d,
+0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d, 0x6e, 0x3b, 0x6d, 0x62,
+0x73, 0x3b, 0x73, 0x61, 0x73, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x73,
+0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x436, 0x435, 0x43a, 0x448, 0x435, 0x43c,
+0x431, 0x438, 0x3b, 0x434, 0x4af, 0x439, 0x448, 0x4e9, 0x43c, 0x431, 0x4af, 0x3b,
+0x448, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x448, 0x430, 0x440,
+0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x431, 0x435, 0x439, 0x448, 0x435, 0x43c,
+0x431, 0x438, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x438, 0x448, 0x435, 0x43c,
+0x431, 0x438, 0x436, 0x435, 0x43a, 0x2e, 0x3b, 0x434, 0x4af, 0x439, 0x2e, 0x3b,
+0x448, 0x435, 0x439, 0x448, 0x2e, 0x3b, 0x448, 0x430, 0x440, 0x448, 0x2e, 0x3b,
+0x431, 0x435, 0x439, 0x448, 0x2e, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x438,
+0x448, 0x43c, 0x2e, 0x416, 0x3b, 0x414, 0x3b, 0x428, 0x3b, 0x428, 0x3b, 0x411,
+0x3b, 0x416, 0x3b, 0x418, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77, 0x61,
+0x6b, 0x21f, 0x61, 0x14b, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77,
+0x61, 0x14b, 0x17e, 0x69, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x6e,
+0x75, 0x14b, 0x70, 0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x79,
+0x61, 0x6d, 0x6e, 0x69, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x74,
+0x6f, 0x70, 0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x7a, 0x61,
+0x70, 0x74, 0x61, 0x14b, 0x3b, 0x4f, 0x77, 0xe1, 0x14b, 0x67, 0x79, 0x75,
+0x17e, 0x61, 0x17e, 0x61, 0x70, 0x69, 0x41, 0x3b, 0x57, 0x3b, 0x4e, 0x3b,
+0x59, 0x3b, 0x54, 0x3b, 0x5a, 0x3b, 0x4f, 0x4a, 0x75, 0x6d, 0x61, 0x70,
+0xed, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74,
+0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0xed, 0x6e, 0x65, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x74, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x61, 0x6d,
+0xed, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0xe1, 0x61, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3, 0x6f, 0x73, 0x69, 0x50, 0xed, 0x69,
+0x6c, 0x69, 0x3b, 0x54, 0xe1, 0x61, 0x74, 0x75, 0x3b, 0xcd, 0x6e, 0x65,
+0x3b, 0x54, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49,
+0x6a, 0x6d, 0x3b, 0x4d, 0xf3, 0x6f, 0x73, 0x69, 0x50, 0x3b, 0x54, 0x3b,
+0x45, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4d, 0xea7, 0xeb1, 0xe99,
+0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe88, 0xeb1, 0xe99,
+0x3b, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xea7,
+0xeb1, 0xe99, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe9e, 0xeb0, 0xeab,
+0xeb1, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xeaa, 0xeb8, 0xe81, 0x3b, 0xea7, 0xeb1,
+0xe99, 0xec0, 0xeaa, 0xebb, 0xeb2, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xe88,
+0xeb1, 0xe99, 0x3b, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xe9e, 0xeb8,
+0xe94, 0x3b, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xeaa, 0xeb8, 0xe81, 0x3b,
+0xec0, 0xeaa, 0xebb, 0xeb2, 0xead, 0xeb2, 0x3b, 0xe88, 0x3b, 0xead, 0x3b, 0xe9e,
+0x3b, 0xe9e, 0xeab, 0x3b, 0xeaa, 0xeb8, 0x3b, 0xeaa, 0x64, 0x69, 0x65, 0x73,
+0x20, 0x53, 0x6f, 0x6c, 0x69, 0x73, 0x3b, 0x64, 0x69, 0x65, 0x73, 0x20,
+0x4c, 0x75, 0x6e, 0x61, 0x65, 0x3b, 0x64, 0x69, 0x65, 0x73, 0x20, 0x4d,
+0x61, 0x72, 0x74, 0x69, 0x73, 0x3b, 0x64, 0x69, 0x65, 0x73, 0x20, 0x4d,
+0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x69, 0x3b, 0x64, 0x69, 0x65, 0x73,
+0x20, 0x49, 0x6f, 0x76, 0x69, 0x73, 0x3b, 0x64, 0x69, 0x65, 0x73, 0x20,
+0x56, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x73, 0x3b, 0x64, 0x69, 0x65, 0x73,
+0x20, 0x53, 0x61, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x53, 0x6f, 0x6c, 0x3b,
+0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x72, 0x3b,
+0x49, 0x6f, 0x76, 0x3b, 0x56, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x74, 0x53,
+0x76, 0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x72,
+0x6d, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x4f, 0x74, 0x72, 0x64, 0x69,
+0x65, 0x6e, 0x61, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e,
+0x61, 0x3b, 0x43, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e,
+0x61, 0x3b, 0x50, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61,
+0x3b, 0x53, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x73, 0x76,
+0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70, 0x69, 0x72, 0x6d,
+0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x69, 0x65,
+0x6e, 0x61, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61,
+0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61,
+0x3b, 0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b,
+0x73, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x53, 0x76, 0x113,
+0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x2e, 0x3b, 0x4f,
+0x74, 0x72, 0x64, 0x2e, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b,
+0x43, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x65,
+0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x53, 0x65, 0x73, 0x74, 0x64, 0x2e, 0x73,
+0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x64, 0x2e,
+0x3b, 0x6f, 0x74, 0x72, 0x64, 0x2e, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64,
+0x2e, 0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x70,
+0x69, 0x65, 0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64,
+0x2e, 0x53, 0x3b, 0x50, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x43, 0x3b, 0x50,
+0x3b, 0x53, 0x65, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b, 0x6d, 0x6f, 0x6b,
+0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62,
+0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61,
+0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x6d, 0x6f, 0x6b, 0x254,
+0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74,
+0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20,
+0x6d, 0xed, 0x6e, 0xe9, 0x69, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254,
+0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x6d,
+0x70, 0x254, 0x301, 0x73, 0x254, 0x65, 0x79, 0x65, 0x3b, 0x79, 0x62, 0x6f,
+0x3b, 0x6d, 0x62, 0x6c, 0x3b, 0x6d, 0x73, 0x74, 0x3b, 0x6d, 0x69, 0x6e,
+0x3b, 0x6d, 0x74, 0x6e, 0x3b, 0x6d, 0x70, 0x73, 0x65, 0x3b, 0x79, 0x3b,
+0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x70, 0x73, 0x65, 0x6b,
+0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x70, 0x69, 0x72,
+0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x61, 0x6e, 0x74,
+0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x74, 0x72, 0x65,
+0x10d, 0x69, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x6b, 0x65,
+0x74, 0x76, 0x69, 0x72, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
+0x3b, 0x70, 0x65, 0x6e, 0x6b, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69,
+0x73, 0x3b, 0x161, 0x65, 0x161, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69,
+0x73, 0x73, 0x6b, 0x3b, 0x70, 0x72, 0x3b, 0x61, 0x6e, 0x3b, 0x74, 0x72,
+0x3b, 0x6b, 0x74, 0x3b, 0x70, 0x6e, 0x3b, 0x161, 0x74, 0x53, 0x3b, 0x50,
+0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x160, 0x6e, 0x6a,
+0x65, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x6a, 0x65, 0x17a,
+0x65, 0x6c, 0x65, 0x3b, 0x77, 0x61, 0x142, 0x74, 0x6f, 0x72, 0x61, 0x3b,
+0x73, 0x72, 0x6a, 0x6f, 0x64, 0x61, 0x3b, 0x73, 0x74, 0x77, 0xf3, 0x72,
+0x74, 0x6b, 0x3b, 0x70, 0x11b, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f,
+0x74, 0x61, 0x6e, 0x6a, 0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x61,
+0x142, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x73, 0x74, 0x77, 0x3b, 0x70, 0x11b,
+0x74, 0x3b, 0x73, 0x6f, 0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73,
+0x3b, 0x73, 0x3b, 0x70, 0x3b, 0x73, 0x53, 0xfc, 0x6e, 0x6e, 0x64, 0x61,
+0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x69,
+0x6e, 0x67, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x64, 0x64, 0x65,
+0x77, 0x65, 0x6b, 0x65, 0x6e, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72,
+0x73, 0x64, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x65, 0x64, 0x61, 0x67,
+0x3b, 0x53, 0xfc, 0x6e, 0x6e, 0x61, 0x76, 0x65, 0x6e, 0x64, 0x53, 0xfc,
+0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x69,
+0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61,
+0x2e, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x4e, 0x6b, 0x6f,
+0x64, 0x79, 0x61, 0x3b, 0x4e, 0x64, 0xe0, 0x61, 0x79, 0xe0, 0x3b, 0x4e,
+0x64, 0x61, 0x6e, 0x67, 0xf9, 0x3b, 0x4e, 0x6a, 0xf2, 0x77, 0x61, 0x3b,
+0x4e, 0x67, 0xf2, 0x76, 0x79, 0x61, 0x3b, 0x4c, 0x75, 0x62, 0x69, 0x6e,
+0x67, 0x75, 0x4c, 0x75, 0x6d, 0x3b, 0x4e, 0x6b, 0x6f, 0x3b, 0x4e, 0x64,
+0x79, 0x3b, 0x4e, 0x64, 0x67, 0x3b, 0x4e, 0x6a, 0x77, 0x3b, 0x4e, 0x67,
+0x76, 0x3b, 0x4c, 0x75, 0x62, 0x4c, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e,
+0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4c, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69,
+0x6c, 0x3b, 0x57, 0x75, 0x6f, 0x6b, 0x20, 0x54, 0x69, 0x63, 0x68, 0x3b,
+0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x54,
+0x69, 0x63, 0x68, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b, 0x54, 0x69, 0x63,
+0x68, 0x20, 0x41, 0x6e, 0x67, 0x2019, 0x77, 0x65, 0x6e, 0x3b, 0x54, 0x69,
+0x63, 0x68, 0x20, 0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x4e, 0x67, 0x65,
+0x73, 0x6f, 0x4a, 0x4d, 0x50, 0x3b, 0x57, 0x55, 0x54, 0x3b, 0x54, 0x41,
+0x52, 0x3b, 0x54, 0x41, 0x44, 0x3b, 0x54, 0x41, 0x4e, 0x3b, 0x54, 0x41,
+0x42, 0x3b, 0x4e, 0x47, 0x53, 0x4a, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x54,
+0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4e, 0x53, 0x6f, 0x6e, 0x6e, 0x64, 0x65,
+0x67, 0x3b, 0x4d, 0xe9, 0x69, 0x6e, 0x64, 0x65, 0x67, 0x3b, 0x44, 0xeb,
+0x6e, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x3b, 0x4d, 0xeb, 0x74, 0x74,
+0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x73, 0x63,
+0x68, 0x64, 0x65, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x64, 0x65, 0x67,
+0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x53, 0x6f,
+0x6e, 0x3b, 0x4d, 0xe9, 0x69, 0x3b, 0x44, 0xeb, 0x6e, 0x3b, 0x4d, 0xeb,
+0x74, 0x3b, 0x44, 0x6f, 0x6e, 0x3b, 0x46, 0x72, 0x65, 0x3b, 0x53, 0x61,
+0x6d, 0x53, 0x6f, 0x6e, 0x2e, 0x3b, 0x4d, 0xe9, 0x69, 0x2e, 0x3b, 0x44,
+0xeb, 0x6e, 0x2e, 0x3b, 0x4d, 0xeb, 0x74, 0x2e, 0x3b, 0x44, 0x6f, 0x6e,
+0x2e, 0x3b, 0x46, 0x72, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x6d, 0x2e, 0x4a,
+0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x75,
+0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x6e, 0x6e, 0x65,
+0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61,
+0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73,
+0x69, 0x4a, 0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34, 0x3b, 0x4a, 0x35,
+0x3b, 0x41, 0x6c, 0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31, 0x43d, 0x435, 0x434,
+0x435, 0x43b, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d,
+0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441,
+0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x43e,
+0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x43e, 0x43a, 0x3b, 0x441, 0x430, 0x431, 0x43e,
+0x442, 0x430, 0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b,
+0x432, 0x442, 0x43e, 0x2e, 0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447, 0x435,
+0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441, 0x430, 0x431, 0x2e,
+0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x75,
+0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a,
+0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73,
+0x69, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e,
+0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75,
+0x3b, 0x4a, 0x6d, 0x6f, 0x930, 0x935, 0x93f, 0x20, 0x926, 0x93f, 0x928, 0x3b,
+0x938, 0x94b, 0x92e, 0x20, 0x926, 0x93f, 0x928, 0x3b, 0x92e, 0x902, 0x917, 0x932,
+0x20, 0x926, 0x93f, 0x928, 0x3b, 0x92c, 0x941, 0x927, 0x20, 0x926, 0x93f, 0x928,
+0x3b, 0x92c, 0x943, 0x939, 0x938, 0x94d, 0x92a, 0x924, 0x93f, 0x20, 0x926, 0x93f,
+0x928, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x20, 0x926, 0x93f, 0x928, 0x3b,
+0x936, 0x928, 0x93f, 0x20, 0x926, 0x93f, 0x928, 0x53, 0x61, 0x62, 0x61, 0x74,
+0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a,
+0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
+0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x73,
+0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d,
+0x61, 0x6d, 0x6f, 0x73, 0x69, 0x53, 0x61, 0x62, 0x3b, 0x4a, 0x74, 0x74,
+0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x72, 0x61,
+0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x53, 0x3b, 0x4a, 0x3b,
+0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x4c, 0x69, 0x64,
+0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b,
+0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x74, 0x61,
+0x74, 0x75, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79,
+0x61, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4c, 0x69, 0x64,
+0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e,
+0x6f, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61,
+0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6c, 0x69,
+0x6e, 0x6a, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c,
+0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20,
+0x6d, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76,
+0x61, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x4c, 0x6c, 0x32,
+0x3b, 0x4c, 0x6c, 0x33, 0x3b, 0x4c, 0x6c, 0x34, 0x3b, 0x4c, 0x6c, 0x35,
+0x3b, 0x4c, 0x6c, 0x36, 0x3b, 0x4c, 0x6c, 0x37, 0x3b, 0x4c, 0x6c, 0x31,
+0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b,
+0x31, 0x41, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x79, 0x3b, 0x41, 0x6c, 0x61,
+0x74, 0x73, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x79, 0x3b, 0x54, 0x61, 0x6c,
+0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x6f, 0x62, 0x69, 0x61,
+0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x61, 0x6d, 0x69, 0x73, 0x79, 0x3b, 0x5a,
+0x6f, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x6f, 0x74, 0x73, 0x79,
+0x41, 0x6c, 0x61, 0x68, 0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x3b, 0x54,
+0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x3b, 0x41, 0x6c, 0x61, 0x6b,
+0x3b, 0x5a, 0x6f, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x41, 0x3b, 0x41,
+0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x5a, 0x3b, 0x41, 0xd1e, 0xd3e,
+0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d,
+0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d,
+0xd35, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e,
+0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34,
+0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0xd2f, 0xd3e,
+0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d,
+0x200c, 0xd1a, 0xd1e, 0xd3e, 0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b,
+0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b,
+0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd2c, 0xd41,
+0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e,
+0xd34, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33,
+0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f,
+0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0xd1e, 0xd3e, 0xd2f, 0xd7c, 0x3b, 0xd24, 0xd3f,
+0xd19, 0xd4d, 0xd15, 0xd7e, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0x3b, 0xd2c,
+0xd41, 0xd27, 0xd7b, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd02, 0x3b, 0xd35,
+0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd1e, 0xd3e, 0x3b,
+0xd24, 0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f,
+0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0xd1e, 0x3b, 0xd24, 0xd3f, 0x3b, 0xd1a,
+0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46,
+0x3b, 0xd36, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x6e,
+0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75,
+0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x41, 0x68, 0x64, 0x3b,
+0x49, 0x73, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b,
+0x4b, 0x68, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x41,
+0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53,
+0x627, 0x62d, 0x62f, 0x3b, 0x627, 0x62b, 0x646, 0x64a, 0x646, 0x3b, 0x62b, 0x644,
+0x627, 0x62b, 0x3b, 0x631, 0x627, 0x628, 0x648, 0x3b, 0x62e, 0x645, 0x64a, 0x633,
+0x3b, 0x62c, 0x645, 0x639, 0x629, 0x3b, 0x633, 0x628, 0x62a, 0x648, 0x49, 0x6c,
+0x2d, 0x126, 0x61, 0x64, 0x64, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6e, 0x65,
+0x6a, 0x6e, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6c, 0x69, 0x65, 0x74, 0x61,
+0x3b, 0x4c, 0x2d, 0x45, 0x72, 0x62, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x6c,
+0x2d, 0x126, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x49, 0x6c, 0x2d, 0x120, 0x69,
+0x6d, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x73, 0x2d, 0x53, 0x69, 0x62, 0x74,
+0x126, 0x61, 0x64, 0x3b, 0x54, 0x6e, 0x65, 0x3b, 0x54, 0x6c, 0x69, 0x3b,
+0x45, 0x72, 0x62, 0x3b, 0x126, 0x61, 0x6d, 0x3b, 0x120, 0x69, 0x6d, 0x3b,
+0x53, 0x69, 0x62, 0x126, 0x64, 0x3b, 0x54, 0x6e, 0x3b, 0x54, 0x6c, 0x3b,
+0x45, 0x72, 0x3b, 0x126, 0x6d, 0x3b, 0x120, 0x6d, 0x3b, 0x53, 0x62, 0x126,
+0x64, 0x3b, 0x54, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126, 0x6d,
+0x3b, 0x120, 0x6d, 0x3b, 0x53, 0x62, 0x9a8, 0x9cb, 0x982, 0x9ae, 0x9be, 0x987,
+0x99c, 0x9bf, 0x982, 0x3b, 0x9a8, 0x9bf, 0x982, 0x9a5, 0x9cc, 0x995, 0x9be, 0x9ac,
+0x9be, 0x3b, 0x9b2, 0x9c8, 0x9ac, 0x9be, 0x995, 0x9aa, 0x9cb, 0x995, 0x9aa, 0x9be,
+0x3b, 0x9af, 0x9bc, 0x9c1, 0x9ae, 0x9b6, 0x995, 0x9c8, 0x9b6, 0x9be, 0x3b, 0x9b6,
+0x997, 0x9cb, 0x9b2, 0x9b6, 0x9c7, 0x9a8, 0x3b, 0x987, 0x9b0, 0x9be, 0x987, 0x3b,
+0x9a5, 0x9be, 0x982, 0x99c, 0x9a8, 0x9cb, 0x3b, 0x9a8, 0x9bf, 0x982, 0x3b, 0x9b2,
+0x9c8, 0x3b, 0x9af, 0x9bc, 0x9c1, 0x9ae, 0x3b, 0x9b6, 0x997, 0x3b, 0x987, 0x9b0,
+0x9be, 0x3b, 0x9a5, 0x9be, 0x982, 0x9a8, 0x9cb, 0x982, 0x3b, 0x9a8, 0x9bf, 0x982,
+0x3b, 0x9b2, 0x9c8, 0x9ac, 0x9be, 0x3b, 0x9af, 0x9bc, 0x9c1, 0x9ae, 0x3b, 0x9b6,
+0x997, 0x9cb, 0x3b, 0x987, 0x9b0, 0x9be, 0x3b, 0x9a5, 0x9be, 0x982, 0x4a, 0x65,
+0x64, 0x6f, 0x6f, 0x6e, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6c, 0x68, 0x65,
+0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x6d, 0x61, 0x79, 0x72, 0x74, 0x3b, 0x4a,
+0x65, 0x72, 0x63, 0x65, 0x61, 0x6e, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x65,
+0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x68, 0x65, 0x69, 0x6e, 0x65, 0x79, 0x3b,
+0x4a, 0x65, 0x73, 0x61, 0x72, 0x6e, 0x4a, 0x65, 0x64, 0x3b, 0x4a, 0x65,
+0x6c, 0x3b, 0x4a, 0x65, 0x6d, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x3b, 0x4a,
+0x65, 0x72, 0x64, 0x3b, 0x4a, 0x65, 0x68, 0x3b, 0x4a, 0x65, 0x73, 0x52,
+0x101, 0x74, 0x61, 0x70, 0x75, 0x3b, 0x4d, 0x61, 0x6e, 0x65, 0x3b, 0x54,
+0x16b, 0x72, 0x65, 0x69, 0x3b, 0x57, 0x65, 0x6e, 0x65, 0x72, 0x65, 0x69,
+0x3b, 0x54, 0x101, 0x69, 0x74, 0x65, 0x3b, 0x50, 0x61, 0x72, 0x61, 0x69,
+0x72, 0x65, 0x3b, 0x52, 0x101, 0x68, 0x6f, 0x72, 0x6f, 0x69, 0x52, 0x101,
+0x74, 0x3b, 0x4d, 0x61, 0x6e, 0x3b, 0x54, 0x16b, 0x72, 0x3b, 0x57, 0x65,
+0x6e, 0x3b, 0x54, 0x101, 0x69, 0x3b, 0x50, 0x61, 0x72, 0x3b, 0x52, 0x101,
+0x68, 0x52, 0x74, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x57, 0x3b, 0x54, 0x3b,
+0x50, 0x3b, 0x52, 0x68, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938,
+0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x935, 0x93e,
+0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930,
+0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e,
+0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x930, 0x935, 0x93f, 0x3b,
+0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x3b, 0x92c, 0x941, 0x927,
+0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b,
+0x936, 0x928, 0x93f, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x6c, 0xed, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d,
+0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x6e, 0x254,
+0x3b, 0x41, 0x6c, 0x61, 0xe1, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x4a, 0x75,
+0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3, 0x73, 0x69,
+0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4d, 0x75, 0x72, 0x61, 0x6d,
+0x75, 0x6b, 0x6f, 0x3b, 0x57, 0x61, 0x69, 0x72, 0x69, 0x3b, 0x57, 0x65,
+0x74, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x61, 0x3b, 0x57,
+0x65, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f,
+0x73, 0x69, 0x4b, 0x49, 0x55, 0x3b, 0x4d, 0x52, 0x41, 0x3b, 0x57, 0x41,
+0x49, 0x3b, 0x57, 0x45, 0x54, 0x3b, 0x57, 0x45, 0x4e, 0x3b, 0x57, 0x54,
+0x4e, 0x3b, 0x4a, 0x55, 0x4d, 0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x57,
+0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x4a, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x31,
+0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x32, 0x3b, 0x41, 0x6e, 0x65, 0x67,
+0x20, 0x33, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x34, 0x3b, 0x41, 0x6e,
+0x65, 0x67, 0x20, 0x35, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x36, 0x3b,
+0x41, 0x6e, 0x65, 0x67, 0x20, 0x37, 0x41, 0x31, 0x3b, 0x41, 0x32, 0x3b,
+0x41, 0x33, 0x3b, 0x41, 0x34, 0x3b, 0x41, 0x35, 0x3b, 0x41, 0x36, 0x3b,
+0x41, 0x37, 0x41d, 0x44f, 0x43c, 0x3b, 0x414, 0x430, 0x432, 0x430, 0x430, 0x3b,
+0x41c, 0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x41b, 0x445, 0x430, 0x433, 0x432,
+0x430, 0x3b, 0x41f, 0x4af, 0x440, 0x44d, 0x432, 0x3b, 0x411, 0x430, 0x430, 0x441,
+0x430, 0x43d, 0x3b, 0x411, 0x44f, 0x43c, 0x431, 0x430, 0x43d, 0x44f, 0x43c, 0x3b,
+0x434, 0x430, 0x432, 0x430, 0x430, 0x3b, 0x43c, 0x44f, 0x433, 0x43c, 0x430, 0x440,
+0x3b, 0x43b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x43f, 0x4af, 0x440, 0x44d,
+0x432, 0x3b, 0x431, 0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x431, 0x44f, 0x43c,
+0x431, 0x430, 0x41d, 0x44f, 0x3b, 0x414, 0x430, 0x3b, 0x41c, 0x44f, 0x3b, 0x41b,
+0x445, 0x3b, 0x41f, 0x4af, 0x3b, 0x411, 0x430, 0x3b, 0x411, 0x44f, 0x1828, 0x1822,
+0x182e, 0x180e, 0x1820, 0x3b, 0x1833, 0x1820, 0x1838, 0x1820, 0x3b, 0x182e, 0x1822, 0x1820,
+0x1820, 0x182e, 0x1820, 0x1837, 0x3b, 0x1840, 0x1820, 0x182d, 0x182a, 0x1820, 0x3b, 0x182b,
+0x1826, 0x1837, 0x182a, 0x1826, 0x3b, 0x182a, 0x1820, 0x1830, 0x1820, 0x1829, 0x3b, 0x182a,
+0x1822, 0x182e, 0x182a, 0x1820, 0x1828, 0x1822, 0x3b, 0x1833, 0x1820, 0x3b, 0x182e, 0x1822,
+0x182d, 0x3b, 0x1840, 0x1820, 0x3b, 0x182b, 0x1826, 0x1837, 0x3b, 0x182a, 0x1820, 0x3b,
+0x182a, 0x1822, 0x182e, 0x1828, 0x1822, 0x3b, 0x1832, 0x1820, 0x3b, 0x182e, 0x1822, 0x182d,
+0x3b, 0x1840, 0x1820, 0x3b, 0x182b, 0x1825, 0x1837, 0x3b, 0x182a, 0x1820, 0x3b, 0x182a,
+0x1822, 0x182e, 0x1828, 0x1822, 0x3b, 0x1833, 0x1820, 0x3b, 0x182e, 0x1822, 0x182d, 0x3b,
+0x1840, 0x1820, 0x3b, 0x182b, 0x1825, 0x1837, 0x3b, 0x182a, 0x1820, 0x3b, 0x182a, 0x1822,
+0x182e, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x6c, 0x69, 0x6e, 0x64,
+0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x6b,
+0x72, 0x65, 0x64, 0x69, 0x3b, 0x7a, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61,
+0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0x69,
+0x64, 0x69, 0x6d, 0x3b, 0x6c, 0x69, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x6d, 0x65, 0x72, 0x3b, 0x7a, 0x65, 0x3b, 0x76, 0x61, 0x6e, 0x3b, 0x73,
+0x61, 0x6d, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b,
+0x76, 0x3b, 0x73, 0x43, 0x6f, 0x6d, 0x2019, 0x79, 0x61, 0x6b, 0x6b, 0x65,
+0x3b, 0x43, 0x6f, 0x6d, 0x6c, 0x61, 0x61, 0x257, 0x69, 0x69, 0x3b, 0x43,
+0x6f, 0x6d, 0x7a, 0x79, 0x69, 0x69, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f,
+0x6d, 0x6b, 0x6f, 0x6c, 0x6c, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x6b, 0x61,
+0x6c, 0x64, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x67,
+0x61, 0x69, 0x73, 0x75, 0x75, 0x3b, 0x43, 0x6f, 0x6d, 0x7a, 0x79, 0x65,
+0x253, 0x73, 0x75, 0x75, 0x43, 0x79, 0x61, 0x3b, 0x43, 0x6c, 0x61, 0x3b,
+0x43, 0x7a, 0x69, 0x3b, 0x43, 0x6b, 0x6f, 0x3b, 0x43, 0x6b, 0x61, 0x3b,
+0x43, 0x67, 0x61, 0x3b, 0x43, 0x7a, 0x65, 0x59, 0x3b, 0x4c, 0x3b, 0x5a,
+0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x45, 0x4e, 0x65, 0x74, 0x74,
+0x76, 0x20, 0x43, 0x61, 0x6b, 0x6f, 0x3b, 0x45, 0x6e, 0x68, 0x76, 0x74,
+0x65, 0x63, 0x65, 0x73, 0x6b, 0x76, 0x3b, 0x45, 0x6e, 0x68, 0x76, 0x74,
+0x65, 0x63, 0x65, 0x73, 0x6b, 0x76, 0x20, 0x45, 0x6e, 0x68, 0x76, 0x79,
+0x76, 0x74, 0x6b, 0x65, 0x3b, 0x45, 0x6e, 0x6e, 0x76, 0x72, 0x6b, 0x76,
+0x70, 0x76, 0x3b, 0x45, 0x6e, 0x6e, 0x76, 0x72, 0x6b, 0x76, 0x70, 0x76,
+0x20, 0x45, 0x6e, 0x68, 0x76, 0x79, 0x76, 0x74, 0x6b, 0x65, 0x3b, 0x4e,
+0x61, 0x6b, 0x20, 0x4f, 0x6b, 0x6b, 0x6f, 0x73, 0x6b, 0x76, 0x20, 0x4e,
+0x65, 0x74, 0x74, 0x76, 0x3b, 0x4e, 0x65, 0x74, 0x74, 0x76, 0x20, 0x43,
+0x61, 0x6b, 0x63, 0x75, 0x73, 0x65, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x78,
+0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x6e, 0x74, 0x61, 0x78,
+0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x65, 0x6e, 0x73, 0x74, 0x61,
+0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x57, 0x75, 0x6e, 0x73, 0x74,
+0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x6f, 0x6e, 0x64,
+0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x46,
+0x72, 0x61, 0x69, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b,
+0x53, 0x61, 0x74, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65,
+0x73, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x61, 0x3b, 0x44, 0x65, 0x3b, 0x57,
+0x75, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x74, 0x53,
+0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x41,
+0x906, 0x907, 0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x92c, 0x93e,
+0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c,
+0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x92c, 0x93e,
+0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936,
+0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x906, 0x907, 0x924, 0x3b, 0x938, 0x94b, 0x92e,
+0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x92c,
+0x93f, 0x939, 0x93f, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928,
+0x93f, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x3b, 0x92c, 0x941, 0x3b, 0x92c,
+0x93f, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x6c, 0x79, 0x25b, 0x2bc, 0x25b, 0x301,
+0x20, 0x73, 0x1e85, 0xed, 0x14b, 0x74, 0xe8, 0x3b, 0x6d, 0x76, 0x66, 0xf2,
+0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301, 0x254,
+0x6e, 0x74, 0xe8, 0x20, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b,
+0x30c, 0x2bc, 0x3b, 0x74, 0x73, 0xe8, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20,
+0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301, 0x254, 0x6e,
+0x74, 0xe8, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20,
+0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6d,
+0xe0, 0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0xe0,
+0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x53, 0x254, 0x301, 0x6e,
+0x64, 0x69, 0x3b, 0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0xc1, 0x70,
+0x74, 0x61, 0x20, 0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x57, 0x25b,
+0x301, 0x6e, 0x25b, 0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x54, 0x254, 0x301, 0x73,
+0x25b, 0x64, 0x25b, 0x3b, 0x46, 0x25b, 0x6c, 0xe2, 0x79, 0x25b, 0x64, 0x25b,
+0x3b, 0x53, 0xe1, 0x73, 0x69, 0x64, 0x25b, 0x53, 0x254, 0x301, 0x3b, 0x4d,
+0x254, 0x301, 0x3b, 0xc1, 0x4d, 0x3b, 0x57, 0x25b, 0x301, 0x3b, 0x54, 0x254,
+0x301, 0x3b, 0x46, 0x25b, 0x3b, 0x53, 0xe1, 0x53, 0x1ecd, 0x301, 0x6e, 0x64,
+0xe8, 0x3b, 0x4d, 0x1ecd, 0x301, 0x6e, 0x64, 0xe8, 0x3b, 0x54, 0x69, 0xfa,
+0x7a, 0x64, 0xe8, 0x3b, 0x57, 0x1eb9, 0x301, 0x6e, 0x1eb9, 0x301, 0x7a, 0x64,
+0xe8, 0x3b, 0x54, 0x1ecd, 0x301, 0x7a, 0x64, 0xe8, 0x3b, 0x46, 0x72, 0x61,
+0xed, 0x64, 0xe8, 0x3b, 0x53, 0xe1, 0x74, 0x1ecd, 0x64, 0xe8, 0x53, 0x1ecd,
+0x301, 0x6e, 0x3b, 0x4d, 0x1ecd, 0x301, 0x6e, 0x3b, 0x54, 0x69, 0xfa, 0x3b,
+0x57, 0x1eb9, 0x301, 0x6e, 0x3b, 0x54, 0x1ecd, 0x301, 0x7a, 0x3b, 0x46, 0x72,
+0x61, 0xed, 0x3b, 0x53, 0xe1, 0x74, 0x7de, 0x7ca, 0x7ef, 0x7d9, 0x7cc, 0x7df,
+0x7cf, 0x7f2, 0x3b, 0x7de, 0x7d0, 0x7ec, 0x7d3, 0x7ca, 0x7ec, 0x7df, 0x7cf, 0x7f2,
+0x3b, 0x7de, 0x7d0, 0x7ec, 0x7df, 0x7cf, 0x7f2, 0x3b, 0x7de, 0x7ce, 0x7e3, 0x7ce,
+0x7f2, 0x7df, 0x7cf, 0x7f2, 0x3b, 0x7d3, 0x7cc, 0x7df, 0x7cf, 0x7f2, 0x3b, 0x7db,
+0x7cc, 0x7ec, 0x7e3, 0x7cc, 0x7f2, 0x7ec, 0x7df, 0x7cf, 0x7f2, 0x3b, 0x7de, 0x7cd,
+0x7f2, 0x7d8, 0x7cd, 0x7df, 0x7cf, 0x7f2, 0x7de, 0x7ca, 0x7ef, 0x7d9, 0x3b, 0x7de,
+0x7d0, 0x7ec, 0x7d3, 0x3b, 0x7de, 0x7d0, 0x7ec, 0x7df, 0x3b, 0x7de, 0x7ce, 0x7e3,
+0x3b, 0x7d3, 0x7cc, 0x7df, 0x3b, 0x7db, 0x7cc, 0x7ec, 0x7e3, 0x3b, 0x7de, 0x7cd,
+0x7f2, 0x7d8, 0x7de, 0x7ca, 0x7ef, 0x7d9, 0x3b, 0x7de, 0x7d0, 0x7ec, 0x7d3, 0x3b,
+0x7de, 0x7d0, 0x7ec, 0x7df, 0x7cf, 0x7f2, 0x3b, 0x7de, 0x7ce, 0x7e3, 0x3b, 0x7d3,
+0x7cc, 0x7df, 0x3b, 0x7db, 0x7cc, 0x7ec, 0x7e3, 0x3b, 0x7de, 0x7cd, 0x7f2, 0x7d8,
+0x7de, 0x3b, 0x7de, 0x3b, 0x7de, 0x3b, 0x7de, 0x3b, 0x7d3, 0x3b, 0x7db, 0x3b,
+0x7de, 0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69,
+0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x6d,
+0x61, 0x14b, 0x14b, 0x65, 0x62, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x67, 0x61,
+0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75,
+0x6f, 0x72, 0x61, 0x73, 0x64, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72,
+0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76, 0x61, 0x72,
+0x64, 0x61, 0x74, 0x73, 0x6f, 0x74, 0x6e, 0x3b, 0x76, 0x75, 0x6f, 0x73,
+0x3b, 0x6d, 0x61, 0x14b, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x3b, 0x64, 0x75,
+0x6f, 0x72, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x3b, 0x6c, 0xe1, 0x76, 0x53,
+0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c,
+0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69, 0x3b,
+0x6d, 0xe1, 0x6e, 0x6e, 0x6f, 0x64, 0x61, 0x74, 0x3b, 0x64, 0x69, 0x73,
+0x64, 0x61, 0x74, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68,
+0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x61, 0x73, 0x74, 0x61,
+0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b,
+0x6c, 0xe1, 0x76, 0x76, 0x6f, 0x72, 0x64, 0x61, 0x74, 0x73, 0x6f, 0x3b,
+0x6d, 0xe1, 0x3b, 0x64, 0x69, 0x3b, 0x67, 0x61, 0x3b, 0x64, 0x75, 0x3b,
+0x62, 0x65, 0x3b, 0x6c, 0xe1, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x47,
+0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x4c, 0x61, 0x6d, 0x6f, 0x72, 0x65,
+0x6e, 0x61, 0x3b, 0x4d, 0x75, 0x73, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67,
+0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x62, 0x65, 0x64, 0x69, 0x3b, 0x4c,
+0x61, 0x62, 0x6f, 0x72, 0x61, 0x72, 0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f,
+0x6e, 0x65, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x68, 0x6c, 0x61, 0x6e, 0x6f,
+0x3b, 0x4d, 0x6f, 0x6b, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x4c, 0x61, 0x6d,
+0x3b, 0x4d, 0x6f, 0x73, 0x3b, 0x42, 0x65, 0x64, 0x3b, 0x52, 0x61, 0x72,
+0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x6f, 0x6b, 0x4c,
+0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x52, 0x3b, 0x4e, 0x3b, 0x48, 0x3b, 0x4d,
+0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b,
+0x53, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x53, 0x69, 0x74, 0x68, 0x61,
+0x74, 0x68, 0x75, 0x3b, 0x53, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x68,
+0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c,
+0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x53, 0x69, 0x62,
+0x3b, 0x53, 0x69, 0x74, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x53, 0x69, 0x68,
+0x3b, 0x4d, 0x67, 0x71, 0x53, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b,
+0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d, 0x61,
+0x6e, 0x2e, 0x3b, 0x74, 0x69, 0x72, 0x2e, 0x3b, 0x6f, 0x6e, 0x73, 0x2e,
+0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b, 0x6c,
+0xf8, 0x72, 0x2e, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5,
+0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x79, 0x73, 0x64, 0x61, 0x67, 0x3b,
+0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64,
+0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0x61,
+0x75, 0x72, 0x64, 0x61, 0x67, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e,
+0x3b, 0x74, 0x79, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72,
+0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0x61, 0x75, 0x73, 0xf8, 0x2e, 0x3b,
+0x6d, 0xe5, 0x2e, 0x3b, 0x74, 0x79, 0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b,
+0x74, 0x6f, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c, 0x61, 0x2e, 0x43,
+0xe4, 0x14b, 0x20, 0x6b, 0x75, 0x254, 0x74, 0x68, 0x3b, 0x4a, 0x69, 0x65,
+0x63, 0x20, 0x6c, 0x61, 0x331, 0x74, 0x3b, 0x52, 0x25b, 0x77, 0x20, 0x6c,
+0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x44, 0x69, 0x254, 0x331, 0x6b, 0x20, 0x6c,
+0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e, 0x20, 0x6c,
+0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x20,
+0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x42, 0xe4, 0x6b, 0x25b, 0x6c, 0x20,
+0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x43, 0xe4, 0x14b, 0x3b, 0x4a, 0x69, 0x65,
+0x63, 0x3b, 0x52, 0x25b, 0x77, 0x3b, 0x44, 0x69, 0x254, 0x331, 0x6b, 0x3b,
+0x14a, 0x75, 0x61, 0x61, 0x6e, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63,
+0x3b, 0x42, 0xe4, 0x6b, 0x25b, 0x6c, 0x43, 0x3b, 0x4a, 0x3b, 0x52, 0x3b,
+0x44, 0x3b, 0x14a, 0x3b, 0x44, 0x3b, 0x42, 0x4c, 0x61, 0x6d, 0x75, 0x6c,
+0x75, 0x6e, 0x67, 0x75, 0x3b, 0x4c, 0x6f, 0x6c, 0x65, 0x6d, 0x62, 0x61,
+0x3b, 0x4c, 0x61, 0x63, 0x68, 0x69, 0x77, 0x69, 0x72, 0x69, 0x3b, 0x4c,
+0x61, 0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x61, 0x63,
+0x68, 0x69, 0x6e, 0x61, 0x79, 0x69, 0x3b, 0x4c, 0x61, 0x63, 0x68, 0x69,
+0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x75, 0x6b,
+0x61, 0x4d, 0x75, 0x6c, 0x3b, 0x4c, 0x65, 0x6d, 0x3b, 0x57, 0x69, 0x72,
+0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x69, 0x3b, 0x53, 0x61, 0x6e,
+0x3b, 0x57, 0x65, 0x72, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x67, 0x65, 0x3b,
+0x64, 0x69, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72,
+0x73, 0x3b, 0x64, 0x69, 0x6d, 0xe8, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x64,
+0x69, 0x6a, 0xf2, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76, 0x65, 0x6e, 0x64,
+0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65,
+0x44, 0x67, 0x3b, 0x44, 0x6c, 0x3b, 0x44, 0x6d, 0x3b, 0x44, 0x63, 0x3b,
+0x44, 0x6a, 0x3b, 0x44, 0x76, 0x3b, 0x44, 0x73, 0x64, 0x69, 0x6d, 0x65,
+0x6e, 0x67, 0x65, 0x3b, 0x64, 0x65, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64,
+0x69, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0xe8, 0x72, 0x63,
+0x6c, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6a, 0x61, 0x75, 0x73, 0x3b, 0x64,
+0x69, 0x75, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73,
+0x73, 0x61, 0x62, 0x74, 0x65, 0x64, 0x69, 0x6d, 0x3b, 0x64, 0x65, 0x6c,
+0x3b, 0x64, 0x6d, 0x61, 0x3b, 0x64, 0x6d, 0xe8, 0x3b, 0x64, 0x69, 0x6a,
+0x3b, 0x64, 0x69, 0x75, 0x3b, 0x64, 0x69, 0x73, 0x44, 0x3b, 0x4c, 0x3b,
+0x4d, 0x3b, 0x58, 0x3b, 0x4a, 0x3b, 0x55, 0x3b, 0x53, 0xb30, 0xb2c, 0xb3f,
+0xb2c, 0xb3e, 0xb30, 0x3b, 0xb38, 0xb4b, 0xb2e, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2e,
+0xb19, 0xb4d, 0xb17, 0xb33, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2c, 0xb41, 0xb27, 0xb2c,
+0xb3e, 0xb30, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36,
+0xb41, 0xb15, 0xb4d, 0xb30, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb2c,
+0xb3e, 0xb30, 0xb30, 0xb2c, 0xb3f, 0x3b, 0xb38, 0xb4b, 0xb2e, 0x3b, 0xb2e, 0xb19,
+0xb4d, 0xb17, 0xb33, 0x3b, 0xb2c, 0xb41, 0xb27, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41,
+0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb30, 0x3b,
+0xb38, 0xb4b, 0x3b, 0xb2e, 0x3b, 0xb2c, 0xb41, 0x3b, 0xb17, 0xb41, 0x3b, 0xb36,
+0xb41, 0x3b, 0xb36, 0x44, 0x69, 0x6c, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x57,
+0x69, 0x69, 0x78, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x69, 0x62, 0x78, 0x61,
+0x74, 0x61, 0x3b, 0x52, 0x6f, 0x6f, 0x62, 0x69, 0x69, 0x3b, 0x4b, 0x61,
+0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x4a, 0x69, 0x6d, 0x61, 0x61, 0x74,
+0x61, 0x3b, 0x53, 0x61, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x44, 0x69, 0x6c,
+0x3b, 0x57, 0x69, 0x78, 0x3b, 0x51, 0x69, 0x62, 0x3b, 0x52, 0x6f, 0x62,
+0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x53, 0x61, 0x6e,
+0x44, 0x3b, 0x57, 0x3b, 0x51, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b,
+0x53, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801,
+0xdccf, 0xd801, 0xdcd8, 0xd801, 0xdce4, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcf0, 0xd801, 0xdcd8,
+0xd801, 0xdce4, 0xd801, 0xdce3, 0x3b, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x20, 0xd801, 0xdcc4, 0xd801, 0xdcd8, 0xd801, 0xdce1, 0xd801, 0xdcdb, 0x358,
+0xd801, 0xdce7, 0xd801, 0xdce3, 0x3b, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x20, 0xd801, 0xdccf, 0xd801, 0xdcdf, 0xd801, 0xdcf5, 0xd801, 0xdcea, 0x358,
+0xd801, 0xdcec, 0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x20, 0xd801, 0xdccf, 0xd801, 0xdcdf, 0xd801, 0xdcf5, 0xd801, 0xdcd8, 0xd801,
+0xdcdc, 0xd801, 0xdce3, 0x3b, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec, 0xd801,
+0xdcd8, 0x20, 0xd801, 0xdccf, 0xd801, 0xdcdf, 0xd801, 0xdcf0, 0xd801, 0xdcea, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8,
+0x20, 0xd801, 0xdcc8, 0xd801, 0xdcd8, 0x20, 0xd801, 0xdcf5, 0xd801, 0xdcd8, 0xd801, 0xdcf2,
+0xd801, 0xdcd8, 0x20, 0xd801, 0xdcfb, 0xd801, 0xdce3, 0x358, 0x3b, 0xd801, 0xdcb9, 0xd801,
+0xdcd8, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801, 0xdcc2, 0xd801, 0xdce4, 0xd801,
+0xdcd8, 0xd801, 0xdcf8, 0xd801, 0xdcdf, 0x20, 0xd801, 0xdce3, 0x358, 0xd801, 0xdce4, 0xd801,
+0xdcdf, 0xd801, 0xdccf, 0x3b, 0xd801, 0xdcc4, 0x3b, 0xd801, 0xdccd, 0x3b, 0xd801, 0xdcb4,
+0x3b, 0xd801, 0xdcc8, 0x3b, 0xd801, 0xdcca, 0x3b, 0xd801, 0xdcf8, 0x425, 0x443, 0x44b,
+0x446, 0x430, 0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x41a, 0x44a, 0x443, 0x44b, 0x440,
+0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x414, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b,
+0x4d4, 0x440, 0x442, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x426, 0x44b, 0x43f,
+0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x41c, 0x430, 0x439, 0x440, 0x4d5, 0x43c,
+0x431, 0x43e, 0x43d, 0x3b, 0x421, 0x430, 0x431, 0x430, 0x442, 0x445, 0x443, 0x44b,
+0x446, 0x430, 0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x43a, 0x44a, 0x443, 0x44b, 0x440,
+0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x434, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b,
+0x4d5, 0x440, 0x442, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x446, 0x44b, 0x43f,
+0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x43c, 0x430, 0x439, 0x440, 0x4d5, 0x43c,
+0x431, 0x43e, 0x43d, 0x3b, 0x441, 0x430, 0x431, 0x430, 0x442, 0x425, 0x446, 0x431,
+0x3b, 0x41a, 0x440, 0x441, 0x3b, 0x414, 0x446, 0x433, 0x3b, 0x4d4, 0x440, 0x442,
+0x3b, 0x426, 0x43f, 0x440, 0x3b, 0x41c, 0x440, 0x431, 0x3b, 0x421, 0x431, 0x442,
+0x445, 0x446, 0x431, 0x3b, 0x43a, 0x440, 0x441, 0x3b, 0x434, 0x446, 0x433, 0x3b,
+0x4d5, 0x440, 0x442, 0x3b, 0x446, 0x43f, 0x440, 0x3b, 0x43c, 0x440, 0x431, 0x3b,
+0x441, 0x431, 0x442, 0x425, 0x3b, 0x41a, 0x3b, 0x414, 0x3b, 0x4d4, 0x3b, 0x426,
+0x3b, 0x41c, 0x3b, 0x421, 0x64, 0x6a, 0x61, 0x64, 0x75, 0x6d, 0x69, 0x6e,
+0x67, 0x75, 0x3b, 0x64, 0x6a, 0x61, 0x6c, 0x75, 0x6e, 0x61, 0x3b, 0x64,
+0x6a, 0x61, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x64, 0x6a, 0x61, 0x72, 0x61,
+0x73, 0x6f, 0x6e, 0x3b, 0x64, 0x6a, 0x61, 0x77, 0x65, 0x70, 0x73, 0x3b,
+0x64, 0x6a, 0x61, 0x62, 0x69, 0xe8, 0x72, 0x6e, 0xe8, 0x3b, 0x64, 0x6a,
+0x61, 0x73, 0x61, 0x62, 0x72, 0x61, 0x64, 0x64, 0x3b, 0x64, 0x6c, 0x3b,
+0x64, 0x6d, 0x3b, 0x64, 0x72, 0x3b, 0x64, 0x77, 0x3b, 0x64, 0x62, 0x3b,
+0x64, 0x73, 0x64a, 0x648, 0x646, 0x6cd, 0x3b, 0x62f, 0x648, 0x646, 0x6cd, 0x3b,
+0x62f, 0x631, 0x6d0, 0x646, 0x6cd, 0x3b, 0x685, 0x644, 0x631, 0x646, 0x6cd, 0x3b,
+0x67e, 0x64a, 0x646, 0x681, 0x646, 0x6cd, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b,
+0x627, 0x648, 0x646, 0x6cd, 0x6cc, 0x6a9, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62f,
+0x648, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x633, 0x647, 0x200c, 0x634, 0x646, 0x628,
+0x647, 0x3b, 0x686, 0x647, 0x627, 0x631, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x67e,
+0x646, 0x62c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b,
+0x634, 0x646, 0x628, 0x647, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b,
+0x67e, 0x3b, 0x62c, 0x3b, 0x634, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x65,
+0x6c, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x61,
+0x142, 0x65, 0x6b, 0x3b, 0x77, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x15b,
+0x72, 0x6f, 0x64, 0x61, 0x3b, 0x63, 0x7a, 0x77, 0x61, 0x72, 0x74, 0x65,
+0x6b, 0x3b, 0x70, 0x69, 0x105, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62,
+0x6f, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x2e, 0x3b, 0x70, 0x6f,
+0x6e, 0x2e, 0x3b, 0x77, 0x74, 0x2e, 0x3b, 0x15b, 0x72, 0x2e, 0x3b, 0x63,
+0x7a, 0x77, 0x2e, 0x3b, 0x70, 0x74, 0x2e, 0x3b, 0x73, 0x6f, 0x62, 0x2e,
+0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x15a, 0x3b, 0x43, 0x3b, 0x50, 0x3b,
+0x53, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x15b, 0x3b, 0x63, 0x3b, 0x70,
+0x3b, 0x73, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x73, 0x65,
+0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b,
+0x74, 0x65, 0x72, 0xe7, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b,
+0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61,
+0x3b, 0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72,
+0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72,
+0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x2e,
+0x3b, 0x73, 0x65, 0x67, 0x2e, 0x3b, 0x74, 0x65, 0x72, 0x2e, 0x3b, 0x71,
+0x75, 0x61, 0x2e, 0x3b, 0x71, 0x75, 0x69, 0x2e, 0x3b, 0x73, 0x65, 0x78,
+0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b,
+0x51, 0x3b, 0x51, 0x3b, 0x53, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x69, 0x6e,
+0x67, 0x6f, 0x3b, 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x3b, 0x74,
+0x65, 0x72, 0xe7, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x3b,
+0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61,
+0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x6e, 0x61, 0x64, 0x12b, 0x6c,
+0x69, 0x3b, 0x70, 0x61, 0x6e, 0x61, 0x64, 0x12b, 0x6c, 0x69, 0x3b, 0x77,
+0x69, 0x73, 0x61, 0x73, 0x12b, 0x64, 0x69, 0x73, 0x3b, 0x70, 0x75, 0x73,
+0x73, 0x69, 0x73, 0x61, 0x77, 0x61, 0x69, 0x74, 0x69, 0x3b, 0x6b, 0x65,
+0x74, 0x77, 0x69, 0x72, 0x74, 0x69, 0x6b, 0x73, 0x3b, 0x70, 0x113, 0x6e,
+0x74, 0x6e, 0x69, 0x6b, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x74,
+0x69, 0x6b, 0x61, 0x6e, 0x61, 0x64, 0x3b, 0x70, 0x61, 0x6e, 0x3b, 0x77,
+0x69, 0x73, 0x3b, 0x70, 0x75, 0x73, 0x3b, 0x6b, 0x65, 0x74, 0x3b, 0x70,
+0x113, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b,
+0x50, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x53, 0xa10, 0xa24, 0xa35, 0xa3e, 0xa30,
+0x3b, 0xa38, 0xa4b, 0xa2e, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2e, 0xa70, 0xa17, 0xa32,
+0xa35, 0xa3e, 0xa30, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0xa35, 0xa3e, 0xa30, 0x3b,
+0xa35, 0xa40, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15,
+0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a, 0xa30,
+0xa35, 0xa3e, 0xa30, 0xa10, 0xa24, 0x3b, 0xa38, 0xa4b, 0xa2e, 0x3b, 0xa2e, 0xa70,
+0xa17, 0xa32, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0x3b, 0xa35, 0xa40, 0xa30, 0x3b,
+0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71,
+0xa1a, 0xa30, 0xa10, 0x3b, 0xa38, 0xa4b, 0x3b, 0xa2e, 0xa70, 0x3b, 0xa2c, 0xa41,
+0xa71, 0x3b, 0xa35, 0xa40, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0x3b, 0xa38, 0xa3c,
+0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646,
+0x6af, 0x644, 0x3b, 0x628, 0x64f, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639, 0x631,
+0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1,
+0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65,
+0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0xe9,
+0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x4a, 0x75, 0x65, 0x76, 0x65,
+0x73, 0x3b, 0x56, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0xe1,
+0x62, 0x61, 0x64, 0x6f, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0xe9, 0x3b, 0x4a, 0x75, 0x65, 0x3b,
+0x56, 0x69, 0x65, 0x3b, 0x53, 0x61, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
+0x3b, 0x58, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x75, 0x6d, 0x69,
+0x6e, 0x69, 0x63, 0x103, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x3b, 0x6d, 0x61,
+0x72, 0x21b, 0x69, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69,
+0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x65, 0x72, 0x69, 0x3b,
+0x73, 0xe2, 0x6d, 0x62, 0x103, 0x74, 0x103, 0x64, 0x75, 0x6d, 0x2e, 0x3b,
+0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x69,
+0x65, 0x2e, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x2e, 0x3b,
+0x73, 0xe2, 0x6d, 0x2e, 0x44, 0x75, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x65, 0x3b, 0x4a, 0x6f, 0x69, 0x3b,
+0x56, 0x69, 0x6e, 0x3b, 0x53, 0xe2, 0x6d, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
+0x61, 0x3b, 0x4d, 0x69, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x75,
+0x6d, 0x65, 0x6e, 0x67, 0x69, 0x61, 0x3b, 0x67, 0x6c, 0x69, 0x6e, 0x64,
+0x65, 0x73, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d,
+0x65, 0x73, 0x65, 0x6d, 0x6e, 0x61, 0x3b, 0x67, 0x69, 0x65, 0x76, 0x67,
+0x69, 0x61, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x69, 0x3b,
+0x73, 0x6f, 0x6e, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x67, 0x6c, 0x69, 0x3b,
+0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x67, 0x69, 0x65, 0x3b, 0x76, 0x65,
+0x3b, 0x73, 0x6f, 0x44, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47,
+0x3b, 0x56, 0x3b, 0x53, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c,
+0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b,
+0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x49, 0x6a, 0x75,
+0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d,
+0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x49,
+0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x49, 0x6a, 0x70, 0x3b,
+0x49, 0x6a, 0x74, 0x3b, 0x49, 0x6a, 0x6e, 0x3b, 0x49, 0x6a, 0x74, 0x6e,
+0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x49, 0x6a, 0x6d,
+0x4b, 0x75, 0x20, 0x77, 0x2019, 0x69, 0x6e, 0x64, 0x77, 0x69, 0x3b, 0x4b,
+0x75, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b,
+0x75, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b,
+0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75,
+0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b,
+0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x75,
+0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x74, 0x75, 0x63, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e,
+0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b,
+0x61, 0x6e, 0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64,
+0x2e, 0x432, 0x43e, 0x441, 0x43a, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x435,
+0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44c, 0x43d, 0x438, 0x43a,
+0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x435,
+0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x433, 0x3b, 0x43f,
+0x44f, 0x442, 0x43d, 0x438, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x431, 0x43e,
+0x442, 0x430, 0x432, 0x441, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441,
+0x440, 0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x412, 0x3b,
+0x41f, 0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x4e,
+0x61, 0x62, 0x61, 0x20, 0x53, 0x61, 0x6d, 0x62, 0x61, 0x74, 0x3b, 0x53,
+0x61, 0x6e, 0x69, 0x3b, 0x53, 0x61, 0x6c, 0x75, 0x73, 0x3b, 0x52, 0x61,
+0x62, 0x75, 0x71, 0x3b, 0x43, 0x61, 0x6d, 0x75, 0x73, 0x3b, 0x4a, 0x75,
+0x6d, 0x71, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x75, 0x6e, 0x78, 0x61, 0x20,
+0x53, 0x61, 0x6d, 0x62, 0x61, 0x74, 0x4e, 0x61, 0x62, 0x3b, 0x53, 0x61,
+0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x43, 0x61,
+0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x51, 0x75, 0x6e, 0x4e, 0x3b, 0x53,
+0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x43, 0x3b, 0x4a, 0x3b, 0x51, 0x431, 0x430,
+0x441, 0x43a, 0x44b, 0x4bb, 0x44b, 0x430, 0x43d, 0x43d, 0x44c, 0x430, 0x3b, 0x431,
+0x44d, 0x43d, 0x438, 0x434, 0x438, 0x44d, 0x43d, 0x43d, 0x44c, 0x438, 0x43a, 0x3b,
+0x43e, 0x43f, 0x442, 0x443, 0x43e, 0x440, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x43a,
+0x3b, 0x441, 0x44d, 0x440, 0x44d, 0x434, 0x44d, 0x3b, 0x447, 0x44d, 0x43f, 0x43f,
+0x438, 0x44d, 0x440, 0x3b, 0x411, 0x44d, 0x44d, 0x442, 0x438, 0x4a5, 0x441, 0x44d,
+0x3b, 0x441, 0x443, 0x431, 0x443, 0x43e, 0x442, 0x430, 0x431, 0x441, 0x3b, 0x431,
+0x43d, 0x3b, 0x43e, 0x43f, 0x3b, 0x441, 0x44d, 0x3b, 0x447, 0x43f, 0x3b, 0x431,
+0x44d, 0x3b, 0x441, 0x431, 0x411, 0x3b, 0x411, 0x3b, 0x41e, 0x3b, 0x421, 0x3b,
+0x427, 0x3b, 0x411, 0x3b, 0x421, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20,
+0x65, 0x65, 0x20, 0x61, 0x72, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f,
+0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4d, 0x64,
+0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x2019,
+0x77, 0x61, 0x6e, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65,
+0x65, 0x20, 0x69, 0x6e, 0x65, 0x74, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f,
+0x74, 0x20, 0x65, 0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4d, 0x64, 0x65,
+0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b,
+0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x77,
+0x65, 0x41, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x6e, 0x3b, 0x4f, 0x6e, 0x67,
+0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70,
+0x3b, 0x4b, 0x77, 0x65, 0x41, 0x3b, 0x4b, 0x3b, 0x4f, 0x3b, 0x49, 0x3b,
+0x49, 0x3b, 0x53, 0x3b, 0x4b, 0x42, 0x69, 0x6b, 0x75, 0x61, 0x2d, 0xf4,
+0x6b, 0x6f, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0xfb, 0x73, 0x65,
+0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x70, 0x74, 0xe2, 0x3b, 0x42,
+0xef, 0x6b, 0x75, 0x61, 0x2d, 0x75, 0x73, 0xef, 0xf6, 0x3b, 0x42, 0xef,
+0x6b, 0x75, 0x61, 0x2d, 0x6f, 0x6b, 0xfc, 0x3b, 0x4c, 0xe2, 0x70, 0xf4,
+0x73, 0xf6, 0x3b, 0x4c, 0xe2, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x42, 0x6b,
+0x31, 0x3b, 0x42, 0x6b, 0x32, 0x3b, 0x42, 0x6b, 0x33, 0x3b, 0x42, 0x6b,
+0x34, 0x3b, 0x42, 0x6b, 0x35, 0x3b, 0x4c, 0xe2, 0x70, 0x3b, 0x4c, 0xe2,
+0x79, 0x4b, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x50,
+0x3b, 0x59, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e,
+0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b,
+0x41, 0x6c, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a,
+0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73,
+0x69, 0x4d, 0x75, 0x6c, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e,
+0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75,
+0x3b, 0x4a, 0x6d, 0x6f, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b,
+0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x938, 0x930,
+0x903, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x92e,
+0x902, 0x917, 0x932, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x92c, 0x941, 0x927,
+0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e,
+0x938, 0x930, 0x3a, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x938,
+0x930, 0x903, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x1c65,
+0x1c64, 0x1c78, 0x1c5c, 0x1c6e, 0x3b, 0x1c5a, 0x1c5b, 0x1c6e, 0x3b, 0x1c75, 0x1c5f, 0x1c5e,
+0x1c6e, 0x3b, 0x1c65, 0x1c5f, 0x1c79, 0x1c5c, 0x1c69, 0x1c71, 0x3b, 0x1c65, 0x1c5f, 0x1c79,
+0x1c68, 0x1c6b, 0x1c64, 0x3b, 0x1c61, 0x1c5f, 0x1c79, 0x1c68, 0x1c69, 0x1c62, 0x3b, 0x1c67,
+0x1c69, 0x1c66, 0x1c69, 0x1c62, 0x1c65, 0x1c64, 0x1c78, 0x3b, 0x1c5a, 0x1c5b, 0x3b, 0x1c75,
+0x1c5f, 0x3b, 0x1c65, 0x1c5f, 0x1c79, 0x3b, 0x1c65, 0x1c5f, 0x1c79, 0x1c68, 0x3b, 0x1c61,
+0x1c5f, 0x1c79, 0x3b, 0x1c67, 0x1c69, 0x1c65, 0x3b, 0x1c5a, 0x3b, 0x1c75, 0x3b, 0x1c65,
+0x3b, 0x1c65, 0x3b, 0x1c61, 0x3b, 0x1c67, 0x64, 0x6f, 0x6d, 0xec, 0x6e, 0x69,
+0x67, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72,
+0x74, 0x69, 0x73, 0x3b, 0x6d, 0xe8, 0x72, 0x63, 0x75, 0x72, 0x69, 0x73,
+0x3b, 0x67, 0x69, 0xf2, 0x62, 0x69, 0x61, 0x3b, 0x63, 0x68, 0x65, 0x6e,
+0xe0, 0x62, 0x75, 0x72, 0x61, 0x3b, 0x73, 0xe0, 0x62, 0x61, 0x64, 0x75,
+0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x6d, 0xe8, 0x72, 0x3b, 0x67, 0x69, 0xf2, 0x3b, 0x63, 0x68, 0x65, 0x3b,
+0x73, 0xe0, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47,
+0x3b, 0x43, 0x3b, 0x53, 0x44, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b,
+0x43, 0x68, 0x69, 0x70, 0x6f, 0x73, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x70,
+0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b,
+0x43, 0x68, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68,
+0x61, 0x6e, 0x75, 0x3b, 0x53, 0x61, 0x62, 0x75, 0x64, 0x75, 0x44, 0x69,
+0x6d, 0x3b, 0x50, 0x6f, 0x73, 0x3b, 0x50, 0x69, 0x72, 0x3b, 0x54, 0x61,
+0x74, 0x3b, 0x4e, 0x61, 0x69, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x53, 0x61,
+0x62, 0x44, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x53,
+0x3b, 0x53, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d,
+0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430,
+0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432,
+0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441,
+0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d,
+0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x435, 0x3b, 0x447, 0x435, 0x442,
+0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x43d, 0x435, 0x434, 0x458,
+0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430,
+0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438,
+0x458, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430,
+0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e,
+0x442, 0x430, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f,
+0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f,
+0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65,
+0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b,
+0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x3b, 0x70,
+0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x65, 0x3b, 0x10d,
+0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e, 0x65,
+0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64,
+0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b,
+0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74,
+0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b,
+0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x70,
+0x69, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x74, 0x75,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d,
+0x61, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d,
+0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a,
+0x75, 0x6d, 0x61, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x70, 0x69, 0x3b,
+0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6d, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b,
+0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x32,
+0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x31,
+0x53, 0x76, 0x6f, 0x6e, 0x64, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x68, 0x75,
+0x72, 0x6f, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43,
+0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61,
+0x3b, 0x43, 0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75,
+0x67, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x53, 0x76, 0x6f, 0x3b, 0x4d, 0x75,
+0x76, 0x3b, 0x43, 0x68, 0x70, 0x3b, 0x43, 0x68, 0x74, 0x3b, 0x43, 0x68,
+0x6e, 0x3b, 0x43, 0x68, 0x73, 0x3b, 0x4d, 0x75, 0x67, 0x53, 0x3b, 0x4d,
+0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4d, 0xa46d, 0xa18f,
+0xa44d, 0x3b, 0xa18f, 0xa282, 0xa2cd, 0x3b, 0xa18f, 0xa282, 0xa44d, 0x3b, 0xa18f, 0xa282,
+0xa315, 0x3b, 0xa18f, 0xa282, 0xa1d6, 0x3b, 0xa18f, 0xa282, 0xa26c, 0x3b, 0xa18f, 0xa282,
+0xa0d8, 0xa46d, 0xa18f, 0x3b, 0xa18f, 0xa2cd, 0x3b, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa315,
+0x3b, 0xa18f, 0xa1d6, 0x3b, 0xa18f, 0xa26c, 0x3b, 0xa18f, 0xa0d8, 0xa18f, 0x3b, 0xa2cd,
+0x3b, 0xa44d, 0x3b, 0xa315, 0x3b, 0xa1d6, 0x3b, 0xa26c, 0x3b, 0xa0d8, 0x64, 0x75,
+0x6d, 0xec, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x6e, 0x69,
+0x64, 0xec, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x64, 0xec, 0x61,
+0x3b, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x64, 0xec, 0x61, 0x3b,
+0x6a, 0x6f, 0x76, 0x69, 0x64, 0xec, 0x61, 0x3b, 0x76, 0x65, 0x6e, 0x6e,
+0x69, 0x64, 0xec, 0x61, 0x3b, 0x73, 0xe0, 0x62, 0x62, 0x61, 0x74, 0x75,
+0x53, 0x61, 0x6d, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x6e, 0x79,
+0x6f, 0x3b, 0x4d, 0x61, 0x61, 0x6b, 0x69, 0x73, 0x61, 0x6e, 0x79, 0x6f,
+0x3b, 0x52, 0x6f, 0x6f, 0x77, 0x65, 0x3b, 0x48, 0x61, 0x6d, 0x75, 0x73,
+0x65, 0x3b, 0x41, 0x72, 0x62, 0x65, 0x3b, 0x51, 0x69, 0x64, 0x61, 0x61,
+0x6d, 0x65, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x4d, 0x61,
+0x6b, 0x3b, 0x52, 0x6f, 0x77, 0x3b, 0x48, 0x61, 0x6d, 0x3b, 0x41, 0x72,
+0x62, 0x3b, 0x51, 0x69, 0x64, 0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x52,
+0x3b, 0x48, 0x3b, 0x41, 0x3b, 0x51, 0x6e, 0x69, 0x79, 0x64, 0x7a, 0x69,
+0x65, 0x6c, 0x61, 0x3b, 0x70, 0x79, 0x144, 0x64, 0x7a, 0x69, 0x61, 0x142,
+0x65, 0x6b, 0x3b, 0x77, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x73, 0x74,
+0x72, 0x7a, 0x6f, 0x64, 0x61, 0x3b, 0x73, 0x7a, 0x74, 0x77, 0x6f, 0x72,
+0x74, 0x65, 0x6b, 0x3b, 0x70, 0x69, 0x14d, 0x6e, 0x74, 0x65, 0x6b, 0x3b,
+0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x69, 0x79, 0x3b, 0x70, 0x79,
+0x144, 0x3b, 0x77, 0x74, 0x6f, 0x3b, 0x73, 0x74, 0x72, 0x3b, 0x73, 0x7a,
+0x74, 0x3b, 0x70, 0x69, 0x14d, 0x3b, 0x73, 0x6f, 0x62, 0x622, 0x686, 0x631,
+0x3b, 0x633, 0x648, 0x645, 0x631, 0x3b, 0x627, 0x6b1, 0x627, 0x631, 0x648, 0x3b,
+0x627, 0x631, 0x628, 0x639, 0x3b, 0x62e, 0x645, 0x64a, 0x633, 0x3b, 0x62c, 0x645,
+0x639, 0x648, 0x3b, 0x687, 0x646, 0x687, 0x631, 0x622, 0x686, 0x631, 0x3b, 0x633,
+0x648, 0x3b, 0x627, 0x6b1, 0x627, 0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639,
+0x3b, 0x62e, 0x645, 0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687, 0x646, 0x687,
+0x631, 0x906, 0x930, 0x94d, 0x924, 0x3b, 0x938, 0x942, 0x3b, 0x92e, 0x902, 0x3b,
+0x92c, 0x941, 0x952, 0x927, 0x3b, 0x935, 0x93f, 0x938, 0x3b, 0x91c, 0x941, 0x92e,
+0x3b, 0x91b, 0x902, 0x91b, 0x906, 0x930, 0x94d, 0x924, 0x935, 0x93e, 0x930, 0x3b,
+0x938, 0x942, 0x92e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x941, 0x3b, 0x92c,
+0x941, 0x952, 0x927, 0x930, 0x3b, 0x935, 0x93f, 0x938, 0x94d, 0x92a, 0x924, 0x3b,
+0x91c, 0x941, 0x92e, 0x94b, 0x3b, 0x91b, 0x902, 0x91b, 0x930, 0x906, 0x3b, 0x938,
+0x942, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x935, 0x93f, 0x938,
+0x3b, 0x91c, 0x941, 0x3b, 0x91b, 0x902, 0x91b, 0x906, 0x930, 0x94d, 0x924, 0x3b,
+0x938, 0x942, 0x3b, 0x92e, 0x902, 0x917, 0x3b, 0x92c, 0x941, 0x952, 0x927, 0x3b,
+0x935, 0x93f, 0x938, 0x3b, 0x91c, 0x941, 0x92e, 0x3b, 0x91b, 0x902, 0x91b, 0x906,
+0x3b, 0x938, 0x942, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x952, 0x3b, 0x935,
+0x93f, 0x3b, 0x91c, 0x941, 0x3b, 0x91b, 0x902, 0xd89, 0xdbb, 0xdd2, 0xdaf, 0xdcf,
+0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0xdbb, 0xdd4,
+0xdc0, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6,
+0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0xdb4, 0xdad, 0xdd2, 0xdb1, 0xdca, 0xdaf,
+0xdcf, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdc3,
+0xdd9, 0xdb1, 0xdc3, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0xd89, 0xdbb, 0xdd2, 0xdaf,
+0xdcf, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0x3b,
+0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3,
+0xdca, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xd89, 0x3b,
+0xdc3, 0x3b, 0xd85, 0x3b, 0xdb6, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0x3b, 0xdc3,
+0xdd2, 0x3b, 0xdc3, 0xdd9, 0x6e, 0x65, 0x64, 0x65, 0x13e, 0x61, 0x3b, 0x70,
+0x6f, 0x6e, 0x64, 0x65, 0x6c, 0x6f, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72,
+0x6f, 0x6b, 0x3b, 0x73, 0x74, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74,
+0x76, 0x72, 0x74, 0x6f, 0x6b, 0x3b, 0x70, 0x69, 0x61, 0x74, 0x6f, 0x6b,
+0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x6f,
+0x3b, 0x75, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x161, 0x74, 0x3b, 0x70, 0x69,
+0x3b, 0x73, 0x6f, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x161,
+0x3b, 0x70, 0x3b, 0x73, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b,
+0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x65, 0x6b, 0x3b, 0x74,
+0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d,
+0x65, 0x74, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x65, 0x6b,
+0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x2e, 0x3b,
+0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x73, 0x72,
+0x65, 0x2e, 0x3b, 0x10d, 0x65, 0x74, 0x2e, 0x3b, 0x70, 0x65, 0x74, 0x2e,
+0x3b, 0x73, 0x6f, 0x62, 0x2e, 0x6e, 0x3b, 0x70, 0x3b, 0x74, 0x3b, 0x73,
+0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x53, 0x61, 0x62, 0x69, 0x69, 0x74,
+0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4f, 0x77, 0x6f,
+0x6b, 0x75, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75,
+0x73, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x6e, 0x61,
+0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x75, 0x3b,
+0x4f, 0x6c, 0x6f, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x53, 0x61,
+0x62, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x3b, 0x4b, 0x75, 0x62, 0x69,
+0x3b, 0x4b, 0x75, 0x73, 0x61, 0x3b, 0x4b, 0x75, 0x6e, 0x61, 0x3b, 0x4b,
+0x75, 0x74, 0x61, 0x3b, 0x4d, 0x75, 0x6b, 0x61, 0x53, 0x3b, 0x42, 0x3b,
+0x42, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x41, 0x78, 0x61,
+0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c,
+0x61, 0x61, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x61, 0x63, 0x6f, 0x3b,
+0x4b, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x3b, 0x4a, 0x69, 0x6d, 0x63,
+0x6f, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x69, 0x41, 0x78, 0x64, 0x3b, 0x49,
+0x73, 0x6e, 0x3b, 0x54, 0x6c, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x63,
+0x3b, 0x4b, 0x68, 0x6d, 0x73, 0x3b, 0x4a, 0x6d, 0x63, 0x3b, 0x53, 0x62,
+0x74, 0x69, 0x41, 0x3b, 0x49, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x4b, 0x68,
+0x3b, 0x4a, 0x3b, 0x53, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x68, 0x61, 0x3b,
+0x4d, 0x6d, 0x61, 0x6e, 0x74, 0x61, 0x68, 0x61, 0x3b, 0x4c, 0x61, 0x62,
+0x6f, 0x62, 0x65, 0x64, 0x69, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x72, 0x61,
+0x72, 0x75, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x6e, 0x65, 0x3b, 0x4c, 0x61,
+0x62, 0x6f, 0x68, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x6f, 0x71, 0x65,
+0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x6d, 0x61, 0x3b,
+0x42, 0x65, 0x64, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x4e, 0x65, 0x3b, 0x48,
+0x6c, 0x61, 0x3b, 0x4d, 0x6f, 0x71, 0x75, 0x53, 0x6f, 0x6e, 0x74, 0x6f,
+0x3b, 0x75, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x75, 0x4c, 0x65, 0x73,
+0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x74, 0x68,
+0x61, 0x74, 0x68, 0x75, 0x3b, 0x75, 0x4c, 0x65, 0x73, 0x69, 0x6e, 0x65,
+0x3b, 0x6e, 0x67, 0x6f, 0x4c, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e,
+0x75, 0x3b, 0x75, 0x6d, 0x47, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53,
+0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54,
+0x68, 0x61, 0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x47, 0x71,
+0x69, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e,
+0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69,
+0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x6a, 0x75, 0x65, 0x76,
+0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x73,
+0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e,
+0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b, 0x6a, 0x75, 0x65,
+0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62, 0x44, 0x3b, 0x4c, 0x3b,
+0x4d, 0x3b, 0x6d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x2d30, 0x2d59, 0x2d30,
+0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59,
+0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30,
+0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59,
+0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30, 0x2d59, 0x2d30, 0x2d59, 0x2d30, 0x3b,
+0x2d30, 0x2d62, 0x2d4f, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x3b,
+0x2d30, 0x2d3d, 0x2d61, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x3b, 0x2d30, 0x2d59, 0x2d49,
+0x2d39, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x6e, 0xe9,
+0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x65, 0x62,
+0x6f, 0x3b, 0x4b, 0x65, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x61, 0x68, 0x3b, 0x53, 0x61, 0x70, 0x74, 0x75, 0x4d, 0x6e, 0x67, 0x3b,
+0x53, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0x52, 0x65, 0x62, 0x3b,
+0x4b, 0x65, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x70, 0x4c,
+0x69, 0x73, 0x6f, 0x6e, 0x74, 0x66, 0x6f, 0x3b, 0x75, 0x4d, 0x73, 0x6f,
+0x6d, 0x62, 0x75, 0x6c, 0x75, 0x6b, 0x6f, 0x3b, 0x4c, 0x65, 0x73, 0x69,
+0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x74, 0x73, 0x61,
+0x74, 0x66, 0x75, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c,
+0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x75, 0x4d, 0x67,
+0x63, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x73,
+0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x73, 0x61, 0x3b, 0x4e, 0x65,
+0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x63, 0x73, 0xf6, 0x6e, 0x64,
+0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69,
+0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b,
+0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64,
+0x61, 0x67, 0x3b, 0x6c, 0xf6, 0x72, 0x64, 0x61, 0x67, 0x73, 0xf6, 0x6e,
+0x3b, 0x6d, 0xe5, 0x6e, 0x3b, 0x74, 0x69, 0x73, 0x3b, 0x6f, 0x6e, 0x73,
+0x3b, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf6,
+0x72, 0x53, 0x75, 0x6e, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0xe4,
+0x6e, 0x74, 0x69, 0x67, 0x3b, 0x5a, 0x69, 0x69, 0x73, 0x63, 0x68, 0x74,
+0x69, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x75, 0x63, 0x68, 0x3b,
+0x44, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x3b, 0x46, 0x72,
+0x69, 0x69, 0x74, 0x69, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68,
+0x74, 0x69, 0x67, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0xe4, 0x2e, 0x3b, 0x5a,
+0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46,
+0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x71a, 0x715, 0x712, 0x72b, 0x712, 0x710,
+0x3b, 0x72c, 0x72a, 0x71d, 0x722, 0x712, 0x72b, 0x712, 0x710, 0x3b, 0x72c, 0x720,
+0x72c, 0x712, 0x72b, 0x712, 0x710, 0x3b, 0x710, 0x72a, 0x712, 0x725, 0x712, 0x72b,
+0x712, 0x710, 0x3b, 0x71a, 0x721, 0x72b, 0x712, 0x72b, 0x712, 0x710, 0x3b, 0x725,
+0x72a, 0x718, 0x712, 0x72c, 0x710, 0x3b, 0x72b, 0x712, 0x72c, 0x710, 0x71a, 0x715,
+0x3b, 0x72c, 0x72a, 0x71d, 0x722, 0x3b, 0x72c, 0x720, 0x72c, 0x3b, 0x710, 0x72a,
+0x712, 0x725, 0x3b, 0x71a, 0x721, 0x72b, 0x3b, 0x725, 0x72a, 0x718, 0x3b, 0x72b,
+0x712, 0x72c, 0x710, 0x71a, 0x3b, 0x72c, 0x3b, 0x72c, 0x3b, 0x710, 0x3b, 0x71a,
+0x3b, 0x725, 0x3b, 0x72b, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30,
+0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b,
+0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b,
+0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62,
+0x2d30, 0x2d59, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x61, 0x79, 0x6e,
+0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x6b,
+0x1e5b, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73,
+0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x79, 0x61,
+0x73, 0x61, 0x73, 0x61, 0x3b, 0x61, 0x79, 0x6e, 0x3b, 0x61, 0x73, 0x69,
+0x3b, 0x61, 0x6b, 0x1e5b, 0x3b, 0x61, 0x6b, 0x77, 0x3b, 0x61, 0x73, 0x69,
+0x6d, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x49, 0x74, 0x75, 0x6b, 0x75, 0x20,
+0x6a, 0x61, 0x20, 0x6a, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x4b, 0x75, 0x72,
+0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6a, 0x69, 0x6d, 0x77, 0x65, 0x72,
+0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b,
+0x61, 0x77, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61,
+0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4b, 0x75, 0x72, 0x61,
+0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4b, 0x75,
+0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e,
+0x75, 0x3b, 0x4b, 0x69, 0x66, 0x75, 0x6c, 0x61, 0x20, 0x6e, 0x67, 0x75,
+0x77, 0x6f, 0x4a, 0x75, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x4b, 0x61,
+0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61,
+0x73, 0x3b, 0x4e, 0x67, 0x75, 0x4a, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x4b,
+0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4e, 0x42f, 0x43a, 0x448, 0x430, 0x43d, 0x431,
+0x435, 0x3b, 0x414, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x421, 0x435,
+0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x427, 0x43e, 0x440, 0x448, 0x430, 0x43d,
+0x431, 0x435, 0x3b, 0x41f, 0x430, 0x43d, 0x4b7, 0x448, 0x430, 0x43d, 0x431, 0x435,
+0x3b, 0x4b6, 0x443, 0x43c, 0x44a, 0x430, 0x3b, 0x428, 0x430, 0x43d, 0x431, 0x435,
+0x42f, 0x448, 0x431, 0x3b, 0x414, 0x448, 0x431, 0x3b, 0x421, 0x448, 0x431, 0x3b,
+0x427, 0x448, 0x431, 0x3b, 0x41f, 0x448, 0x431, 0x3b, 0x4b6, 0x43c, 0x44a, 0x3b,
+0x428, 0x43d, 0x431, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f,
+0x3b, 0x4b6, 0x3b, 0x428, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0xbb1, 0xbc1, 0x3b, 0xba4,
+0xbbf, 0xb99, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbb5, 0xbcd, 0xbb5,
+0xbbe, 0xbaf, 0xbcd, 0x3b, 0xbaa, 0xbc1, 0xba4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbbf,
+0xbaf, 0xbbe, 0xbb4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd, 0xbb3, 0xbbf,
+0x3b, 0xb9a, 0xba9, 0xbbf, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0x2e, 0x3b, 0xba4, 0xbbf,
+0xb99, 0xbcd, 0x2e, 0x3b, 0xb9a, 0xbc6, 0xbb5, 0xbcd, 0x2e, 0x3b, 0xbaa, 0xbc1,
+0xba4, 0x2e, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0x2e, 0x3b, 0xbb5, 0xbc6, 0xbb3,
+0xbcd, 0x2e, 0x3b, 0xb9a, 0xba9, 0xbbf, 0xb9e, 0xbbe, 0x3b, 0xba4, 0xbbf, 0x3b,
+0xb9a, 0xbc6, 0x3b, 0xbaa, 0xbc1, 0x3b, 0xbb5, 0xbbf, 0x3b, 0xbb5, 0xbc6, 0x3b,
+0xb9a, 0x4a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79,
+0x61, 0x6e, 0x3b, 0x74, 0x67, 0x4b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20,
+0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73,
+0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x44, 0x68, 0x61,
+0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20,
+0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x54, 0x72,
+0x75, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78,
+0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x53,
+0x70, 0x61, 0x63, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79,
+0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74,
+0x67, 0x52, 0x69, 0x6d, 0x61, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20,
+0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e,
+0x3b, 0x74, 0x67, 0x4d, 0x61, 0x74, 0x61, 0x72, 0x75, 0x20, 0x6a, 0x69,
+0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67,
+0x61, 0x79, 0x61, 0x6e, 0x45, 0x6d, 0x70, 0x3b, 0x4b, 0x69, 0x6e, 0x3b,
+0x44, 0x68, 0x61, 0x3b, 0x54, 0x72, 0x75, 0x3b, 0x53, 0x70, 0x61, 0x3b,
+0x52, 0x69, 0x6d, 0x3b, 0x4d, 0x61, 0x74, 0x45, 0x3b, 0x4b, 0x3b, 0x44,
+0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4d, 0x44f, 0x43a, 0x448, 0x4d9,
+0x43c, 0x431, 0x435, 0x3b, 0x434, 0x4af, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b,
+0x441, 0x438, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x447, 0x4d9, 0x440, 0x448,
+0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x43f, 0x4d9, 0x43d, 0x497, 0x435, 0x448, 0x4d9,
+0x43c, 0x431, 0x435, 0x3b, 0x497, 0x43e, 0x43c, 0x433, 0x430, 0x3b, 0x448, 0x438,
+0x43c, 0x431, 0x4d9, 0x44f, 0x43a, 0x448, 0x2e, 0x3b, 0x434, 0x4af, 0x448, 0x2e,
+0x3b, 0x441, 0x438, 0x448, 0x2e, 0x3b, 0x447, 0x4d9, 0x440, 0x2e, 0x3b, 0x43f,
+0x4d9, 0x43d, 0x497, 0x2e, 0x3b, 0x497, 0x43e, 0x43c, 0x2e, 0x3b, 0x448, 0x438,
+0x43c, 0x2e, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b,
+0x496, 0x3b, 0x428, 0xc06, 0xc26, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc38,
+0xc4b, 0xc2e, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0xc35,
+0xc3e, 0xc30, 0xc02, 0x3b, 0xc2c, 0xc41, 0xc27, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b,
+0xc17, 0xc41, 0xc30, 0xc41, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc41, 0xc15,
+0xc4d, 0xc30, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc35, 0xc3e,
+0xc30, 0xc02, 0xc06, 0xc26, 0xc3f, 0x3b, 0xc38, 0xc4b, 0xc2e, 0x3b, 0xc2e, 0xc02,
+0xc17, 0xc33, 0x3b, 0xc2c, 0xc41, 0xc27, 0x3b, 0xc17, 0xc41, 0xc30, 0xc41, 0x3b,
+0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc06, 0x3b, 0xc38,
+0xc4b, 0x3b, 0xc2e, 0x3b, 0xc2c, 0xc41, 0x3b, 0xc17, 0xc41, 0x3b, 0xc36, 0xc41,
+0x3b, 0xc36, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x6a, 0x75, 0x6d, 0x61, 0x3b,
+0x4e, 0x61, 0x6b, 0x61, 0x65, 0x62, 0x61, 0x72, 0x61, 0x73, 0x61, 0x3b,
+0x4e, 0x61, 0x6b, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x6b, 0x61,
+0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x67, 0x2019,
+0x6f, 0x6e, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x79, 0x3b,
+0x4e, 0x61, 0x6b, 0x61, 0x73, 0x61, 0x62, 0x69, 0x74, 0x69, 0x4a, 0x75,
+0x6d, 0x3b, 0x42, 0x61, 0x72, 0x3b, 0x41, 0x61, 0x72, 0x3b, 0x55, 0x6e,
+0x69, 0x3b, 0x55, 0x6e, 0x67, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x53, 0x61,
+0x62, 0x4a, 0x3b, 0x42, 0x3b, 0x41, 0x3b, 0x55, 0x3b, 0x55, 0x3b, 0x4b,
+0x3b, 0x53, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe32, 0xe17, 0xe34, 0xe15, 0xe22, 0xe4c,
+0x3b, 0xe27, 0xe31, 0xe19, 0xe08, 0xe31, 0xe19, 0xe17, 0xe23, 0xe4c, 0x3b, 0xe27,
+0xe31, 0xe19, 0xe2d, 0xe31, 0xe07, 0xe04, 0xe32, 0xe23, 0x3b, 0xe27, 0xe31, 0xe19,
+0xe1e, 0xe38, 0xe18, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe24, 0xe2b, 0xe31, 0xe2a,
+0xe1a, 0xe14, 0xe35, 0x3b, 0xe27, 0xe31, 0xe19, 0xe28, 0xe38, 0xe01, 0xe23, 0xe4c,
+0x3b, 0xe27, 0xe31, 0xe19, 0xe40, 0xe2a, 0xe32, 0xe23, 0xe4c, 0xe2d, 0xe32, 0x2e,
+0x3b, 0xe08, 0x2e, 0x3b, 0xe2d, 0x2e, 0x3b, 0xe1e, 0x2e, 0x3b, 0xe1e, 0xe24,
+0x2e, 0x3b, 0xe28, 0x2e, 0x3b, 0xe2a, 0x2e, 0xe2d, 0xe32, 0x3b, 0xe08, 0x3b,
+0xe2d, 0x3b, 0xe1e, 0x3b, 0xe1e, 0xe24, 0x3b, 0xe28, 0x3b, 0xe2a, 0xf42, 0xf5f,
+0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b,
+0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72,
+0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63,
+0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74,
+0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b,
+0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a,
+0xf53, 0xf0b, 0xf54, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0xf56, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b,
+0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b,
+0xf56, 0xf74, 0xf0b, 0x3b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66,
+0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0xf49, 0xf72, 0x3b, 0xf5f, 0xfb3, 0x3b,
+0xf58, 0xf72, 0xf42, 0x3b, 0xf63, 0xfb7, 0xf42, 0x3b, 0xf55, 0xf74, 0xf62, 0x3b,
+0xf66, 0xf44, 0xf66, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x1230, 0x1295, 0x1260, 0x1275,
+0x20, 0x12d3, 0x1263, 0x12ed, 0x3b, 0x1230, 0x1296, 0x3b, 0x1273, 0x120b, 0x1238, 0x1296,
+0x3b, 0x12a3, 0x1228, 0x122d, 0x1263, 0x12d3, 0x3b, 0x12a8, 0x121a, 0x123d, 0x3b, 0x1305,
+0x121d, 0x12d3, 0x1275, 0x3b, 0x1230, 0x1295, 0x1260, 0x1275, 0x20, 0x1295, 0x12a2, 0x123d,
+0x1230, 0x2f, 0x12d3, 0x3b, 0x1230, 0x1296, 0x3b, 0x1273, 0x120b, 0x1238, 0x3b, 0x12a3,
+0x1228, 0x122d, 0x3b, 0x12a8, 0x121a, 0x123d, 0x3b, 0x1305, 0x121d, 0x12d3, 0x3b, 0x1230,
+0x2f, 0x1295, 0x1230, 0x3b, 0x1230, 0x3b, 0x1273, 0x3b, 0x12a3, 0x3b, 0x12a8, 0x3b,
+0x1305, 0x3b, 0x1230, 0x1230, 0x1295, 0x1260, 0x1275, 0x3b, 0x1230, 0x1291, 0x12ed, 0x3b,
+0x1230, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1213, 0x1219, 0x1235, 0x3b,
+0x12d3, 0x122d, 0x1262, 0x3b, 0x1240, 0x12f3, 0x121d, 0x1230, 0x1295, 0x3b, 0x1230, 0x1291,
+0x3b, 0x1230, 0x1209, 0x3b, 0x1228, 0x1261, 0x3b, 0x1213, 0x1219, 0x3b, 0x12d3, 0x122d,
+0x3b, 0x1240, 0x12f3, 0x1230, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1228, 0x3b, 0x1213,
+0x3b, 0x12d3, 0x3b, 0x1240, 0x53, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x4d, 0x61,
+0x6e, 0x64, 0x65, 0x3b, 0x54, 0x75, 0x6e, 0x64, 0x65, 0x3b, 0x54, 0x72,
+0x69, 0x6e, 0x64, 0x65, 0x3b, 0x46, 0x6f, 0x6e, 0x64, 0x65, 0x3b, 0x46,
+0x72, 0x61, 0x69, 0x64, 0x65, 0x3b, 0x53, 0x61, 0x72, 0x65, 0x72, 0x65,
+0x53, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x6e, 0x3b, 0x54, 0x75, 0x6e, 0x3b,
+0x54, 0x72, 0x69, 0x3b, 0x46, 0x6f, 0x6e, 0x3b, 0x46, 0x72, 0x61, 0x3b,
+0x53, 0x61, 0x72, 0x53, 0x101, 0x70, 0x61, 0x74, 0x65, 0x3b, 0x4d, 0x14d,
+0x6e, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x16b, 0x73, 0x69, 0x74, 0x65, 0x3b,
+0x50, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x54, 0x75, 0x2bb,
+0x61, 0x70, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x46, 0x61,
+0x6c, 0x61, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x6f, 0x6b, 0x6f, 0x6e, 0x61,
+0x6b, 0x69, 0x53, 0x101, 0x70, 0x3b, 0x4d, 0x14d, 0x6e, 0x3b, 0x54, 0x16b,
+0x73, 0x3b, 0x50, 0x75, 0x6c, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x3b, 0x46,
+0x61, 0x6c, 0x3b, 0x54, 0x6f, 0x6b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b,
+0x50, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x54, 0x53, 0x6f, 0x6e, 0x74, 0x61,
+0x3b, 0x4d, 0x75, 0x73, 0x75, 0x6d, 0x62, 0x68, 0x75, 0x6e, 0x75, 0x6b,
+0x75, 0x3b, 0x52, 0x61, 0x76, 0x75, 0x6d, 0x62, 0x69, 0x72, 0x68, 0x69,
+0x3b, 0x52, 0x61, 0x76, 0x75, 0x6e, 0x68, 0x61, 0x72, 0x68, 0x75, 0x3b,
+0x52, 0x61, 0x76, 0x75, 0x6d, 0x75, 0x6e, 0x65, 0x3b, 0x52, 0x61, 0x76,
+0x75, 0x6e, 0x74, 0x6c, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75, 0x67,
+0x71, 0x69, 0x76, 0x65, 0x6c, 0x61, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x75,
+0x73, 0x3b, 0x42, 0x69, 0x72, 0x3b, 0x48, 0x61, 0x72, 0x3b, 0x4e, 0x65,
+0x3b, 0x54, 0x6c, 0x68, 0x3b, 0x4d, 0x75, 0x67, 0x54, 0x73, 0x68, 0x69,
+0x70, 0x69, 0x3b, 0x4d, 0x6f, 0x73, 0x6f, 0x70, 0x75, 0x6c, 0x6f, 0x67,
+0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x62, 0x65, 0x64, 0x69, 0x3b, 0x4c,
+0x61, 0x62, 0x6f, 0x72, 0x61, 0x72, 0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f,
+0x6e, 0x65, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x74, 0x6c, 0x68, 0x61, 0x6e,
+0x6f, 0x3b, 0x4d, 0x61, 0x74, 0x6c, 0x68, 0x61, 0x74, 0x73, 0x6f, 0x54,
+0x73, 0x68, 0x3b, 0x4d, 0x6f, 0x73, 0x3b, 0x4c, 0x61, 0x62, 0x62, 0x3b,
+0x4c, 0x61, 0x62, 0x72, 0x3b, 0x4c, 0x61, 0x62, 0x6e, 0x3b, 0x4c, 0x61,
+0x62, 0x74, 0x3b, 0x4d, 0x61, 0x74, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x3b,
+0x50, 0x61, 0x7a, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x3b, 0x53, 0x61,
+0x6c, 0x131, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x61, 0x6d, 0x62, 0x61, 0x3b,
+0x50, 0x65, 0x72, 0x15f, 0x65, 0x6d, 0x62, 0x65, 0x3b, 0x43, 0x75, 0x6d,
+0x61, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x50,
+0x61, 0x7a, 0x3b, 0x50, 0x7a, 0x74, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0xc7,
+0x61, 0x72, 0x3b, 0x50, 0x65, 0x72, 0x3b, 0x43, 0x75, 0x6d, 0x3b, 0x43,
+0x6d, 0x74, 0x50, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b,
+0x43, 0x3b, 0x43, 0xdd, 0x65, 0x6b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b,
+0x44, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x53, 0x69, 0x15f, 0x65,
+0x6e, 0x62, 0x65, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x65, 0x6e, 0x62, 0x65,
+0x3b, 0x50, 0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x41, 0x6e,
+0x6e, 0x61, 0x3b, 0x15e, 0x65, 0x6e, 0x62, 0x65, 0xfd, 0x65, 0x6b, 0x15f,
+0x65, 0x6e, 0x62, 0x65, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65,
+0x3b, 0x73, 0x69, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0xe7, 0x61, 0x72,
+0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x70, 0x65, 0x6e, 0x15f, 0x65, 0x6e,
+0x62, 0x65, 0x3b, 0x61, 0x6e, 0x6e, 0x61, 0x3b, 0x15f, 0x65, 0x6e, 0x62,
+0x65, 0xdd, 0x65, 0x6b, 0x3b, 0x44, 0x75, 0x15f, 0x3b, 0x53, 0x69, 0x15f,
+0x3b, 0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x6e, 0x3b, 0x41, 0x6e, 0x6e,
+0x3b, 0x15e, 0x65, 0x6e, 0xfd, 0x65, 0x6b, 0x3b, 0x64, 0x75, 0x15f, 0x3b,
+0x73, 0x69, 0x15f, 0x3b, 0xe7, 0x61, 0x72, 0x3b, 0x70, 0x65, 0x6e, 0x3b,
+0x61, 0x6e, 0x6e, 0x3b, 0x15f, 0x65, 0x6e, 0xdd, 0x3b, 0x44, 0x3b, 0x53,
+0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x15e, 0x4c, 0x61, 0x64, 0x69,
+0x3b, 0x54, 0x61, 0x6e, 0x69, 0x69, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74,
+0x61, 0x3b, 0x4c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x69,
+0x74, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61,
+0x74, 0x4c, 0x61, 0x64, 0x3b, 0x54, 0x61, 0x6e, 0x3b, 0x54, 0x61, 0x6c,
+0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d,
+0x3b, 0x41, 0x73, 0x61, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x44f, 0x3b, 0x43f,
+0x43e, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x43e, 0x43a, 0x3b, 0x432, 0x456, 0x432,
+0x442, 0x43e, 0x440, 0x43e, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x435, 0x434, 0x430,
+0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x3b, 0x43f, 0x2bc, 0x44f, 0x442,
+0x43d, 0x438, 0x446, 0x44f, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d,
+0x435, 0x434, 0x456, 0x43b, 0x44e, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x456,
+0x43b, 0x43e, 0x43a, 0x3b, 0x432, 0x456, 0x432, 0x442, 0x43e, 0x440, 0x43e, 0x43a,
+0x3b, 0x441, 0x435, 0x440, 0x435, 0x434, 0x443, 0x3b, 0x447, 0x435, 0x442, 0x432,
+0x435, 0x440, 0x3b, 0x43f, 0x2bc, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x44e, 0x3b,
+0x441, 0x443, 0x431, 0x43e, 0x442, 0x443, 0x6e, 0x6a, 0x65, 0x64, 0x17a, 0x65,
+0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x64, 0x17a, 0x65, 0x6c, 0x61, 0x3b,
+0x77, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x6a, 0x65, 0x64,
+0x61, 0x3b, 0x161, 0x74, 0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b, 0x70, 0x6a,
+0x61, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x6a,
+0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x75, 0x74, 0x3b, 0x73, 0x72,
+0x6a, 0x3b, 0x161, 0x74, 0x77, 0x3b, 0x70, 0x6a, 0x61, 0x3b, 0x73, 0x6f,
+0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b, 0x161, 0x3b, 0x70,
+0x3b, 0x73, 0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b,
+0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639,
+0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a,
+0x6c1, 0x64a, 0x6d5, 0x643, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x62f, 0x6c8,
+0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x633, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646,
+0x628, 0x6d5, 0x3b, 0x686, 0x627, 0x631, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b,
+0x67e, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x62c, 0x6c8, 0x645,
+0x6d5, 0x3b, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x64a, 0x6d5, 0x3b, 0x62f, 0x6c8,
+0x3b, 0x633, 0x6d5, 0x3b, 0x686, 0x627, 0x3b, 0x67e, 0x6d5, 0x3b, 0x62c, 0x6c8,
+0x3b, 0x634, 0x6d5, 0x64a, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e,
+0x3b, 0x62c, 0x3b, 0x634, 0x79, 0x61, 0x6b, 0x73, 0x68, 0x61, 0x6e, 0x62,
+0x61, 0x3b, 0x64, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x73,
+0x65, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x63, 0x68, 0x6f, 0x72,
+0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x70, 0x61, 0x79, 0x73, 0x68,
+0x61, 0x6e, 0x62, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x68,
+0x61, 0x6e, 0x62, 0x61, 0x59, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0x73, 0x68,
+0x3b, 0x53, 0x65, 0x73, 0x68, 0x3b, 0x43, 0x68, 0x6f, 0x72, 0x3b, 0x50,
+0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x68, 0x61, 0x6e, 0x59,
+0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x4a, 0x3b, 0x53,
+0x6cc, 0x2e, 0x3b, 0x62f, 0x2e, 0x3b, 0x633, 0x2e, 0x3b, 0x686, 0x2e, 0x3b,
+0x67e, 0x2e, 0x3b, 0x62c, 0x2e, 0x3b, 0x634, 0x2e, 0x44f, 0x43a, 0x448, 0x430,
+0x43d, 0x431, 0x430, 0x3b, 0x434, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b,
+0x441, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x447, 0x43e, 0x440, 0x448,
+0x430, 0x43d, 0x431, 0x430, 0x3b, 0x43f, 0x430, 0x439, 0x448, 0x430, 0x43d, 0x431,
+0x430, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x448, 0x430, 0x43d, 0x431, 0x430,
+0x44f, 0x43a, 0x448, 0x3b, 0x434, 0x443, 0x448, 0x3b, 0x441, 0x435, 0x448, 0x3b,
+0x447, 0x43e, 0x440, 0x3b, 0x43f, 0x430, 0x439, 0x3b, 0x436, 0x443, 0x43c, 0x3b,
+0x448, 0x430, 0x43d, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f,
+0x3b, 0x416, 0x3b, 0x428, 0xa55e, 0xa54c, 0xa535, 0x3b, 0xa5f3, 0xa5e1, 0xa609, 0x3b,
+0xa55a, 0xa55e, 0xa55a, 0x3b, 0xa549, 0xa55e, 0xa552, 0x3b, 0xa549, 0xa524, 0xa546, 0xa562,
+0x3b, 0xa549, 0xa524, 0xa540, 0xa56e, 0x3b, 0xa53b, 0xa52c, 0xa533, 0x6c, 0x61, 0x68,
+0x61, 0x64, 0x69, 0x3b, 0x74, 0x25b, 0x25b, 0x6e, 0x25b, 0x25b, 0x3b, 0x74,
+0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x62, 0x61, 0x3b,
+0x61, 0x69, 0x6d, 0x69, 0x73, 0x61, 0x3b, 0x61, 0x69, 0x6a, 0x69, 0x6d,
+0x61, 0x3b, 0x73, 0x69, 0x253, 0x69, 0x74, 0x69, 0x53, 0x77, 0x6f, 0x6e,
+0x64, 0x61, 0x68, 0x61, 0x3b, 0x4d, 0x75, 0x73, 0x75, 0x6d, 0x62, 0x75,
+0x6c, 0x75, 0x77, 0x6f, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x76, 0x68,
+0x69, 0x6c, 0x69, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x72, 0x61, 0x72,
+0x75, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x1e4b, 0x61, 0x3b, 0x1e3c, 0x61,
+0x76, 0x68, 0x75, 0x1e71, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75, 0x67, 0x69,
+0x76, 0x68, 0x65, 0x6c, 0x61, 0x53, 0x77, 0x6f, 0x3b, 0x4d, 0x75, 0x73,
+0x3b, 0x56, 0x68, 0x69, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x1e4a, 0x61, 0x3b,
+0x1e70, 0x61, 0x6e, 0x3b, 0x4d, 0x75, 0x67, 0x43, 0x68, 0x1ee7, 0x20, 0x4e,
+0x68, 0x1ead, 0x74, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x48, 0x61, 0x69, 0x3b,
+0x54, 0x68, 0x1ee9, 0x20, 0x42, 0x61, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x54,
+0x1b0, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x4e, 0x103, 0x6d, 0x3b, 0x54, 0x68,
+0x1ee9, 0x20, 0x53, 0xe1, 0x75, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x42, 0x1ea3,
+0x79, 0x43, 0x4e, 0x3b, 0x54, 0x68, 0x20, 0x32, 0x3b, 0x54, 0x68, 0x20,
+0x33, 0x3b, 0x54, 0x68, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x20, 0x35, 0x3b,
+0x54, 0x68, 0x20, 0x36, 0x3b, 0x54, 0x68, 0x20, 0x37, 0x43, 0x4e, 0x3b,
+0x54, 0x32, 0x3b, 0x54, 0x33, 0x3b, 0x54, 0x34, 0x3b, 0x54, 0x35, 0x3b,
+0x54, 0x36, 0x3b, 0x54, 0x37, 0x73, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x6d,
+0x75, 0x64, 0x65, 0x6c, 0x3b, 0x74, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x76,
+0x65, 0x64, 0x65, 0x6c, 0x3b, 0x64, 0xf6, 0x64, 0x65, 0x6c, 0x3b, 0x66,
+0x72, 0x69, 0x64, 0x65, 0x6c, 0x3b, 0x7a, 0xe4, 0x64, 0x65, 0x6c, 0x53,
+0x75, 0x3b, 0x4d, 0x75, 0x3b, 0x54, 0x75, 0x3b, 0x56, 0x65, 0x3b, 0x44,
+0xf6, 0x3b, 0x46, 0x72, 0x3b, 0x5a, 0xe4, 0x73, 0x75, 0x2e, 0x3b, 0x6d,
+0x75, 0x2e, 0x3b, 0x74, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x2e, 0x3b, 0x64,
+0xf6, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x7a, 0xe4, 0x2e, 0x53, 0x3b,
+0x4d, 0x3b, 0x54, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x5a, 0x53,
+0x75, 0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0xe4, 0x6e, 0x74, 0x61,
+0x67, 0x3b, 0x5a, 0x69, 0x161, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74,
+0x74, 0x77, 0x75, 0x10d, 0x3b, 0x46, 0x72, 0xf3, 0x6e, 0x74, 0x61, 0x67,
+0x3b, 0x46, 0x72, 0x69, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x161,
+0x74, 0x61, 0x67, 0x53, 0x75, 0x6e, 0x3b, 0x4d, 0xe4, 0x6e, 0x3b, 0x5a,
+0x69, 0x161, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x46, 0x72, 0xf3, 0x3b, 0x46,
+0x72, 0x69, 0x3b, 0x53, 0x61, 0x6d, 0x53, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b,
+0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x53, 0x44, 0x79, 0x64, 0x64, 0x20,
+0x53, 0x75, 0x6c, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4c, 0x6c, 0x75,
+0x6e, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x61, 0x77, 0x72, 0x74,
+0x68, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x68,
+0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x49, 0x61, 0x75, 0x3b,
+0x44, 0x79, 0x64, 0x64, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b,
+0x44, 0x79, 0x64, 0x64, 0x20, 0x53, 0x61, 0x64, 0x77, 0x72, 0x6e, 0x53,
+0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b,
+0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x3b,
+0x53, 0x61, 0x64, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b,
+0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b,
+0x47, 0x77, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x64, 0x53, 0x3b, 0x4c, 0x6c,
+0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x47, 0x3b, 0x53, 0x73, 0x6e,
+0x65, 0x69, 0x6e, 0x3b, 0x6d, 0x6f, 0x61, 0x6e, 0x64, 0x65, 0x69, 0x3b,
+0x74, 0x69, 0x69, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x77, 0x6f, 0x61, 0x6e,
+0x73, 0x64, 0x65, 0x69, 0x3b, 0x74, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x73,
+0x64, 0x65, 0x69, 0x3b, 0x66, 0x72, 0x65, 0x65, 0x64, 0x3b, 0x73, 0x6e,
+0x65, 0x6f, 0x6e, 0x73, 0x69, 0x3b, 0x6d, 0x6f, 0x3b, 0x74, 0x69, 0x3b,
+0x77, 0x6f, 0x3b, 0x74, 0x6f, 0x3b, 0x66, 0x72, 0x3b, 0x73, 0x6f, 0x12c8,
+0x130b, 0x3b, 0x1233, 0x12ed, 0x1296, 0x3b, 0x121b, 0x1246, 0x1233, 0x129b, 0x3b, 0x12a0,
+0x1229, 0x12cb, 0x3b, 0x1203, 0x1219, 0x1233, 0x3b, 0x12a0, 0x122d, 0x1263, 0x3b, 0x1244,
+0x122b, 0x12c8, 0x3b, 0x1233, 0x3b, 0x121b, 0x3b, 0x12a0, 0x3b, 0x1203, 0x3b, 0x12a0,
+0x3b, 0x1244, 0x44, 0x69, 0x62, 0xe9, 0x65, 0x72, 0x3b, 0x41, 0x6c, 0x74,
+0x69, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b,
+0xc0, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x78, 0x61, 0x6d,
+0x69, 0x73, 0x3b, 0xc0, 0x6a, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73,
+0x65, 0x65, 0x72, 0x44, 0x69, 0x62, 0x3b, 0x41, 0x6c, 0x74, 0x3b, 0x54,
+0x61, 0x6c, 0x3b, 0xc0, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x78, 0x3b, 0xc0,
+0x6a, 0x6a, 0x3b, 0x41, 0x73, 0x65, 0x43, 0x61, 0x77, 0x65, 0x3b, 0x4d,
+0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69,
+0x6e, 0x69, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74,
+0x68, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c,
+0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67,
+0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x43, 0x61, 0x77, 0x3b, 0x4d, 0x76,
+0x75, 0x3b, 0x42, 0x69, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69,
+0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x43, 0x61, 0x77,
+0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x62, 0x3b, 0x54,
+0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d,
+0x67, 0x71, 0x43, 0x3b, 0x4d, 0x3b, 0x53, 0x62, 0x3b, 0x53, 0x74, 0x3b,
+0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x3b, 0x4d, 0x67, 0x71, 0x43, 0x3b,
+0x4d, 0x3b, 0x53, 0x62, 0x3b, 0x54, 0x68, 0x74, 0x3b, 0x53, 0x69, 0x6e,
+0x3b, 0x48, 0x6c, 0x3b, 0x4d, 0x67, 0x71, 0x73, 0x254, 0x301, 0x6e, 0x64,
+0x69, 0x25b, 0x3b, 0x6d, 0xf3, 0x6e, 0x64, 0x69, 0x65, 0x3b, 0x6d, 0x75,
+0xe1, 0x6e, 0x79, 0xe1, 0x14b, 0x6d, 0xf3, 0x6e, 0x64, 0x69, 0x65, 0x3b,
+0x6d, 0x65, 0x74, 0xfa, 0x6b, 0x70, 0xed, 0xe1, 0x70, 0x25b, 0x3b, 0x6b,
+0xfa, 0x70, 0xe9, 0x6c, 0x69, 0x6d, 0x65, 0x74, 0xfa, 0x6b, 0x70, 0x69,
+0x61, 0x70, 0x25b, 0x3b, 0x66, 0x65, 0x6c, 0xe9, 0x74, 0x65, 0x3b, 0x73,
+0xe9, 0x73, 0x65, 0x6c, 0xe9, 0x73, 0x64, 0x3b, 0x6d, 0x64, 0x3b, 0x6d,
+0x77, 0x3b, 0x65, 0x74, 0x3b, 0x6b, 0x6c, 0x3b, 0x66, 0x6c, 0x3b, 0x73,
+0x73, 0x73, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x6b, 0x3b, 0x66,
+0x3b, 0x73, 0x5d6, 0x5d5, 0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5de, 0x5d0, 0x5b8,
+0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5d3, 0x5d9, 0x5e0, 0x5e1, 0x5d8, 0x5d9, 0x5e7,
+0x3b, 0x5de, 0x5d9, 0x5d8, 0x5d5, 0x5d5, 0x5d0, 0x5da, 0x3b, 0x5d3, 0x5d0, 0x5e0,
+0x5e2, 0x5e8, 0x5e9, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e4, 0x5bf, 0x5e8, 0x5f2, 0x5b7,
+0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0xc0, 0xec, 0x6b, 0xfa, 0x3b,
+0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b,
+0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62,
+0x1ecd, 0x3b, 0x1eb8, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301,
+0x74, 0x61, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b,
+0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x1ecc, 0x6a, 0x1ecd,
+0x301, 0x20, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a,
+0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b,
+0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x1eb8, 0x74, 0xec, 0x3b, 0x1ecc, 0x6a, 0x1ecd,
+0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0xc0, 0xec,
+0x6b, 0x3b, 0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x3b, 0x1ecc,
+0x6a, 0x1ecd, 0x301, 0x72, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x3b, 0x1eb8,
+0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b,
+0x1ecc, 0x3b, 0x1ecc, 0x3b, 0x1eb8, 0x3b, 0xc0, 0xc0, 0xec, 0x6b, 0xfa, 0x3b,
+0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75, 0x6e, 0x3b,
+0x186, 0x6a, 0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62,
+0x254, 0x3b, 0x190, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301,
+0x74, 0x61, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b,
+0x186, 0x6a, 0x254, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x186, 0x6a, 0x254,
+0x301, 0x20, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x186, 0x6a,
+0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254, 0x3b,
+0x186, 0x6a, 0x254, 0x301, 0x20, 0x190, 0x74, 0xec, 0x3b, 0x186, 0x6a, 0x254,
+0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0xc0, 0xec,
+0x6b, 0x3b, 0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x3b, 0x186,
+0x6a, 0x254, 0x301, 0x72, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x3b, 0x190,
+0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b,
+0x186, 0x3b, 0x186, 0x3b, 0x190, 0x3b, 0xc0, 0x41, 0x6c, 0x68, 0x61, 0x64,
+0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61,
+0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61,
+0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x6c,
+0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x48,
+0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x53,
+0x6e, 0x67, 0x6f, 0x65, 0x6e, 0x7a, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67,
+0x69, 0x7a, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69, 0x7a, 0x69,
+0x74, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69, 0x7a, 0x6e, 0x67,
+0x65, 0x69, 0x68, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69, 0x7a,
+0x73, 0x61, 0x6d, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69, 0x7a,
+0x73, 0x65, 0x69, 0x71, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69,
+0x7a, 0x68, 0x61, 0x6a, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69,
+0x7a, 0x72, 0x6f, 0x65, 0x6b, 0x49, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b,
+0x55, 0x4d, 0x73, 0x6f, 0x6d, 0x62, 0x75, 0x6c, 0x75, 0x6b, 0x6f, 0x3b,
+0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x55,
+0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b,
+0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x55, 0x4c, 0x77,
+0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x55, 0x4d, 0x67,
+0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x73,
+0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69,
+0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x53, 0x3b, 0x4d,
+0x3b, 0x42, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x48, 0x3b, 0x4d, 0x6e, 0x75,
+0x6d, 0x129, 0x67, 0x67, 0x75, 0x3b, 0x70, 0x69, 0x72, 0x2d, 0x6b, 0x75,
+0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x72, 0xe9, 0x67, 0x72, 0x65, 0x2d,
+0x6b, 0x75, 0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x74, 0x1ebd, 0x67, 0x74,
+0x169, 0x2d, 0x6b, 0x75, 0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x76, 0x1ebd,
+0x6e, 0x68, 0x6b, 0xe3, 0x67, 0x72, 0x61, 0x2d, 0x6b, 0x75, 0x72, 0xe3,
+0x2d, 0x68, 0xe1, 0x3b, 0x70, 0xe9, 0x6e, 0x6b, 0x61, 0x72, 0x2d, 0x6b,
+0x75, 0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x73, 0x61, 0x76, 0x6e, 0x75,
+0x6e, 0x75, 0x6d, 0x2e, 0x3b, 0x70, 0x69, 0x72, 0x2e, 0x3b, 0x72, 0xe9,
+0x67, 0x2e, 0x3b, 0x74, 0x1ebd, 0x67, 0x2e, 0x3b, 0x76, 0x1ebd, 0x6e, 0x2e,
+0x3b, 0x70, 0xe9, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x76, 0x2e, 0x4e, 0x2e,
+0x3b, 0x50, 0x2e, 0x3b, 0x52, 0x2e, 0x3b, 0x54, 0x2e, 0x3b, 0x56, 0x2e,
+0x3b, 0x50, 0x2e, 0x3b, 0x53, 0x2e, 0x6d, 0x69, 0x74, 0x75, 0xfa, 0x3b,
+0x6d, 0x75, 0x72, 0x61, 0x6b, 0x69, 0x70, 0xed, 0x3b, 0x6d, 0x75, 0x72,
+0x61, 0x6b, 0xed, 0x2d, 0x6d, 0x75, 0x6b, 0x169, 0x69, 0x3b, 0x6d, 0x75,
+0x72, 0x61, 0x6b, 0xed, 0x2d, 0x6d, 0x75, 0x73, 0x61, 0x70, 0xed, 0x72,
+0x69, 0x3b, 0x73, 0x75, 0x70, 0x61, 0x70, 0xe1, 0x3b, 0x79, 0x75, 0x6b,
+0x75, 0x61, 0x6b, 0xfa, 0x3b, 0x73, 0x61, 0x75, 0x72, 0xfa, 0x6d, 0x69,
+0x74, 0x3b, 0x6d, 0x75, 0x72, 0x3b, 0x6d, 0x6d, 0x6b, 0x3b, 0x6d, 0x6d,
+0x73, 0x3b, 0x73, 0x75, 0x70, 0x3b, 0x79, 0x75, 0x6b, 0x3b, 0x73, 0x61,
+0x75, 0x4d, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x59,
+0x3b, 0x53, 0x910, 0x924, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935,
+0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b, 0x92c,
+0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x943, 0x939, 0x938, 0x94d, 0x92a,
+0x924, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e,
+0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x53, 0xf6, 0x6e, 0x64,
+0x61, 0x69, 0x3b, 0x4d, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x3b, 0x54, 0x65,
+0x69, 0x73, 0x64, 0x61, 0x69, 0x3b, 0x57, 0x65, 0x65, 0x64, 0x65, 0x6e,
+0x73, 0x64, 0x61, 0x69, 0x3b, 0x54, 0xfc, 0xfc, 0x72, 0x73, 0x64, 0x61,
+0x69, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x64, 0x61, 0x69, 0x3b, 0x53, 0x61,
+0x6e, 0x69, 0x6e, 0x6a, 0x53, 0xf6, 0x6e, 0x3b, 0x4d, 0x75, 0x6e, 0x3b,
+0x54, 0x65, 0x69, 0x3b, 0x57, 0x65, 0x64, 0x3b, 0x54, 0xfc, 0x72, 0x3b,
+0x46, 0x72, 0x65, 0x3b, 0x53, 0x61, 0x6e, 0x73, 0x75, 0x6e, 0x6f, 0x20,
+0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x37, 0x3b, 0x73, 0x75, 0x6e, 0x6f,
+0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x31, 0x3b, 0x73, 0x75, 0x6e,
+0x6f, 0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x32, 0x3b, 0x73, 0x75,
+0x6e, 0x6f, 0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x33, 0x3b, 0x73,
+0x75, 0x6e, 0x6f, 0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x34, 0x3b,
+0x73, 0x75, 0x6e, 0x6f, 0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x35,
+0x3b, 0x73, 0x75, 0x6e, 0x6f, 0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23,
+0x36, 0x53, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x4d, 0x61, 0x6e, 0x64, 0x65,
+0x3b, 0x54, 0x69, 0x75, 0x73, 0x64, 0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65,
+0x73, 0x64, 0x65, 0x3b, 0x54, 0x6f, 0x73, 0x64, 0x65, 0x3b, 0x46, 0x72,
+0x61, 0x65, 0x64, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x61, 0x64, 0x65, 0x6cc,
+0x6a9, 0x634, 0x645, 0x628, 0x647, 0x3b, 0x62f, 0x648, 0x634, 0x645, 0x628, 0x647,
+0x3b, 0x633, 0x626, 0x6cc, 0x634, 0x645, 0x628, 0x647, 0x3b, 0x686, 0x627, 0x631,
+0x634, 0x645, 0x628, 0x647, 0x3b, 0x67e, 0x646, 0x686, 0x634, 0x645, 0x628, 0x647,
+0x3b, 0x62c, 0x645, 0x647, 0x3b, 0x634, 0x645, 0x628, 0x647, 0x6cc, 0x6a9, 0x3b,
+0x62f, 0x648, 0x3b, 0x633, 0x626, 0x6d2, 0x3b, 0x686, 0x627, 0x631, 0x3b, 0x67e,
+0x646, 0x686, 0x3b, 0x62c, 0x645, 0x647, 0x3b, 0x634, 0x645, 0x59, 0x61, 0x6b,
+0x73, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x68, 0x3b, 0x44, 0x6f, 0x73, 0x68,
+0x61, 0x6d, 0x62, 0x65, 0x68, 0x3b, 0x53, 0x61, 0x79, 0x73, 0x68, 0x61,
+0x6d, 0x62, 0x65, 0x68, 0x3b, 0x43, 0x68, 0xe1, 0x72, 0x73, 0x68, 0x61,
+0x6d, 0x62, 0x65, 0x68, 0x3b, 0x50, 0x61, 0x6e, 0x63, 0x68, 0x73, 0x68,
+0x61, 0x6d, 0x62, 0x65, 0x68, 0x3b, 0x4a, 0x6f, 0x6d, 0x61, 0x68, 0x3b,
+0x53, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x68, 0x59, 0x61, 0x6b, 0x3b, 0x44,
+0x6f, 0x3b, 0x53, 0x61, 0x79, 0x3b, 0x43, 0x68, 0xe1, 0x3b, 0x50, 0x61,
+0x6e, 0x3b, 0x4a, 0x6f, 0x6d, 0x3b, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x6d,
+0x65, 0x6e, 0x65, 0x67, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x73, 0x64,
+0xec, 0x3b, 0x6d, 0xe4, 0x74, 0x65, 0x73, 0x64, 0xec, 0x3b, 0x6d, 0xe4,
+0x63, 0x6f, 0x72, 0x64, 0xec, 0x3b, 0x7a, 0x65, 0x75, 0x67, 0x67, 0x69,
+0x61, 0x3b, 0x76, 0x65, 0x6e, 0x61, 0x72, 0x64, 0xec, 0x3b, 0x73, 0x61,
+0x62, 0x62, 0x6f, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e,
+0x3b, 0x6d, 0xe4, 0x74, 0x2e, 0x3b, 0x6d, 0xe4, 0x63, 0x2e, 0x3b, 0x7a,
+0x65, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x62,
+0x2e, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x56,
+0x3b, 0x53, 0x627, 0x6cc, 0x6a9, 0x634, 0x6cc, 0x645, 0x6d2, 0x3b, 0x62f, 0x64f,
+0x648, 0x634, 0x6cc, 0x645, 0x6d2, 0x3b, 0x6af, 0x6be, 0x646, 0x20, 0x622, 0x646,
+0x6af, 0x627, 0x3b, 0x686, 0x627, 0x631, 0x634, 0x6cc, 0x645, 0x6d2, 0x3b, 0x67e,
+0x64e, 0x626, 0x20, 0x634, 0x6cc, 0x645, 0x6d2, 0x3b, 0x634, 0x64f, 0x648, 0x6af,
+0x627, 0x631, 0x3b, 0x644, 0x64e, 0x648, 0x20, 0x622, 0x646, 0x6af, 0x627, 0x627,
+0x3b, 0x62f, 0x3b, 0x6af, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x634, 0x3b, 0x644,
+0x61, 0x6c, 0x61, 0x68, 0x61, 0x256, 0x269, 0x3b, 0x61, 0x256, 0x269, 0x74,
+0x25b, 0x6e, 0x25b, 0x25b, 0x3b, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x61, 0x74,
+0x61, 0x3b, 0x61, 0x6c, 0x61, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x61, 0x6c,
+0x61, 0x61, 0x6d, 0x269, 0x73, 0x68, 0x269, 0x3b, 0x61, 0x72, 0x269, 0x73,
+0x1dd, 0x6d, 0x61, 0x3b, 0x61, 0x73, 0x69, 0x69, 0x62, 0x69, 0x61, 0x6c,
+0x61, 0x68, 0x3b, 0x61, 0x256, 0x269, 0x74, 0x3b, 0x61, 0x74, 0x61, 0x6c,
+0x3b, 0x61, 0x6c, 0x61, 0x72, 0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x3b, 0x61,
+0x72, 0x269, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x62, 0x6c, 0x68, 0x3b, 0x256,
+0x74, 0x3b, 0x74, 0x6c, 0x3b, 0x6c, 0x72, 0x3b, 0x6c, 0x6d, 0x3b, 0x72,
+0x73, 0x3b, 0x73, 0x62, 0x924, 0x94b, 0x906, 0x930, 0x3b, 0x938, 0x94b, 0x906,
+0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941,
+0x927, 0x935, 0x93e, 0x930, 0x3b, 0x935, 0x940, 0x930, 0x935, 0x93e, 0x930, 0x3b,
+0x936, 0x941, 0x915, 0x94d, 0x915, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928,
+0x93f, 0x91a, 0x94d, 0x91a, 0x930, 0x935, 0x93e, 0x930, 0x924, 0x94b, 0x906, 0x930,
+0x3b, 0x938, 0x94b, 0x906, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c,
+0x941, 0x927, 0x3b, 0x935, 0x940, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x915,
+0x930, 0x3b, 0x936, 0x928, 0x93f, 0x924, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902,
+0x3b, 0x92c, 0x941, 0x3b, 0x935, 0x940, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x64,
+0x6f, 0x6d, 0xe9, 0x6e, 0x65, 0x67, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x69,
+0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x3b, 0x6d, 0xe8, 0x72, 0x63, 0x6f,
+0x72, 0x65, 0x3b, 0x7a, 0x6f, 0x62, 0x61, 0x3b, 0x76, 0xe8, 0x6e, 0x61,
+0x72, 0x65, 0x3b, 0x73, 0x61, 0x62, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c,
+0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x7a,
+0x6f, 0x62, 0x3b, 0x76, 0xe8, 0x6e, 0x3b, 0x73, 0x61, 0x62
};
-static const char16_t byte_unit_data[] = {
-0x62, 0x79, 0x74, 0x65, 0x73, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b,
-0x45, 0x42, 0x4b, 0x69, 0x42, 0x3b, 0x4d, 0x69, 0x42, 0x3b, 0x47, 0x69, 0x42, 0x3b, 0x54, 0x69, 0x42, 0x3b, 0x50, 0x69,
-0x42, 0x3b, 0x45, 0x69, 0x42, 0x67, 0x72, 0x65, 0x65, 0x70, 0x62, 0x61, 0x6a, 0x74, 0x1263, 0x12ed, 0x1275, 0x12aa, 0x1263, 0x3b,
-0x121c, 0x130b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x130a, 0x1263, 0x3b, 0x1274, 0x122b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x1354, 0x1263, 0x3b, 0x45, 0x42,
-0x628, 0x627, 0x64a, 0x62a, 0x643, 0x64a, 0x644, 0x648, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x645, 0x64a, 0x63a, 0x627, 0x628, 0x627, 0x64a,
-0x62a, 0x3b, 0x63a, 0x64a, 0x63a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x62a, 0x64a, 0x631, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b,
-0x628, 0x64a, 0x62a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x45, 0x42, 0x562, 0x561, 0x575, 0x569, 0x565, 0x580, 0x56f, 0x532, 0x3b,
-0x544, 0x532, 0x3b, 0x533, 0x532, 0x3b, 0x54f, 0x532, 0x3b, 0x54a, 0x532, 0x3b, 0x45, 0x42, 0x9ac, 0x9be, 0x987, 0x99f, 0x995, 0x9bf,
-0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x9ae, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x997, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be,
-0x983, 0x3b, 0x99f, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x61, 0x79, 0x74, 0x62,
-0x79, 0x74, 0x65, 0x2d, 0x61, 0x6b, 0x6f, 0x6b, 0x74, 0x65, 0x64, 0x6f, 0xf9, 0x6b, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x47,
-0x6f, 0x3b, 0x54, 0x6f, 0x3b, 0x50, 0x6f, 0x3b, 0x45, 0x6f, 0x4b, 0x69, 0x6f, 0x3b, 0x4d, 0x69, 0x6f, 0x3b, 0x47, 0x69,
-0x6f, 0x3b, 0x54, 0x69, 0x6f, 0x3b, 0x50, 0x69, 0x6f, 0x3b, 0x45, 0x69, 0x6f, 0x431, 0x430, 0x439, 0x442, 0x43e, 0x432, 0x435,
-0x1018, 0x102d, 0x102f, 0x1000, 0x103a, 0x431, 0x430, 0x439, 0x442, 0x44b, 0x41a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422,
-0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x1794, 0x17c3, 0x5b57, 0x8282, 0x5343, 0x5b57, 0x8282, 0x3b, 0x5146, 0x5b57, 0x8282, 0x3b, 0x5409,
-0x5b57, 0x8282, 0x3b, 0x592a, 0x5b57, 0x8282, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x4f4d, 0x5143, 0x7d44, 0x62, 0x61, 0x6a, 0x74, 0x6f,
-0x76, 0x69, 0x62, 0x61, 0x6a, 0x74, 0x79, 0x62, 0x61, 0x6a, 0x74, 0x6f, 0x6a, 0x62, 0x61, 0x69, 0x64, 0x69, 0x64, 0x62,
-0xfd, 0x74, 0x74, 0x61, 0x76, 0x75, 0x74, 0x6b, 0x74, 0x3b, 0x4d, 0x74, 0x3b, 0x47, 0x74, 0x3b, 0x54, 0x74, 0x3b, 0x50,
-0x74, 0x3b, 0x45, 0x74, 0x4b, 0x69, 0x74, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x47, 0x69, 0x74, 0x3b, 0x54, 0x69, 0x74, 0x3b,
-0x50, 0x69, 0x74, 0x3b, 0x45, 0x69, 0x74, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x62, 0x61, 0x69, 0x64, 0x68, 0x74, 0x10d1,
-0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x10d9, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10db, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10d2, 0x10d1,
-0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10e2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10de, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x45,
-0x42, 0x42, 0x79, 0x74, 0x65, 0x73, 0xaac, 0xabe, 0xa87, 0xa9f, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54,
-0x42, 0x3b, 0xaaa, 0xac0, 0xaac, 0xac0, 0x3b, 0x45, 0x42, 0x5d1, 0x5d9, 0x5d9, 0x5d8, 0x92c, 0x93e, 0x907, 0x91f, 0x62, 0xe1, 0x6a,
-0x74, 0x62, 0xe6, 0x74, 0x69, 0x62, 0x65, 0x61, 0x72, 0x74, 0x61, 0x30d0, 0x30a4, 0x30c8, 0x4b, 0x42, 0x3b, 0x4d, 0x42, 0x3b,
-0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x69, 0x74, 0x65, 0xcac, 0xcc8, 0xc9f, 0xccd, 0x200c,
-0xc97, 0xcb3, 0xcc1, 0xc95, 0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcae, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xc97, 0xcbf, 0x2e,
-0xcac, 0xcc8, 0x2e, 0x3b, 0xc9f, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcaa, 0xcc6, 0xcac, 0xcc8, 0x3b, 0x45, 0x42, 0x43a, 0x411,
-0x3b, 0x4d, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x54, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x411, 0x4b, 0x69, 0x411, 0x3b, 0x4d,
-0x69, 0x411, 0x3b, 0x47, 0x69, 0x411, 0x3b, 0x54, 0x69, 0x411, 0x3b, 0x50, 0x69, 0x411, 0x3b, 0x45, 0x69, 0x411, 0x43a, 0x411,
-0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x442, 0x431, 0x3b, 0x45, 0x42, 0xbc14, 0xc774, 0xd2b8, 0x62,
-0x61, 0x69, 0x74, 0x69, 0x62, 0x61, 0x69, 0x74, 0x61, 0x69, 0x431, 0x430, 0x458, 0x442, 0x438, 0xd2c, 0xd48, 0xd31, 0xd4d, 0xd31,
-0xd4d, 0xd15, 0xd46, 0xd2c, 0xd3f, 0x3b, 0xd0e, 0xd02, 0xd2c, 0xd3f, 0x3b, 0xd1c, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd1f, 0xd3f, 0xd2c, 0xd3f,
-0x3b, 0xd2a, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0x45, 0x42, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b,
-0x41f, 0x411, 0x3b, 0x45, 0x42, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x92a, 0x93f, 0x91f,
-0x93e, 0x3b, 0x45, 0x42, 0xb2c, 0xb3e, 0xb07, 0xb1f, 0xb4d, 0x628, 0x627, 0x64a, 0x67c, 0x633, 0x628, 0x627, 0x6cc, 0x62a, 0x6a9, 0x6cc,
-0x644, 0x648, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x645, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628,
-0x627, 0x6cc, 0x62a, 0x3b, 0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x67e, 0x62a, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b,
-0x45, 0x42, 0xa2c, 0xa3e, 0xa07, 0xa1f, 0x62, 0x79, 0x21b, 0x69, 0x431, 0x430, 0x458, 0x442, 0x43e, 0x432, 0x438, 0x628, 0x627, 0x626,
-0x64a, 0x67d, 0x632, 0x6aa, 0x644, 0x648, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x645, 0x64a, 0x6af, 0x627, 0x20, 0x628,
-0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x6af, 0x64a, 0x6af, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x67d, 0x64a,
-0x631, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x67e, 0x64a, 0x631, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d,
-0x633, 0x3b, 0x45, 0x42, 0xdb6, 0xdba, 0xdd2, 0xda7, 0xdca, 0xd9a, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xdb8, 0xdd9, 0xdb6,
-0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xd9c, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xda7, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d,
-0x3b, 0xdb4, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x79, 0x74, 0x69, 0x73, 0x6b, 0x42, 0x3b,
-0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x42, 0x42, 0x3b, 0x45, 0x42, 0x6b, 0x69, 0x6c, 0x6f, 0x62, 0x61,
-0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x7b, 0x30,
-0x7d, 0x3b, 0x74, 0x65, 0x72, 0x61, 0x62, 0x61, 0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b,
-0x30, 0x7d, 0x3b, 0x45, 0x42, 0xbaa, 0xbc8, 0xb9f, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0xc2c, 0xc48, 0xc1f, 0xc4d, 0x200c, 0xc32, 0xc41, 0xc15,
-0xc47, 0xc2c, 0xc40, 0x3b, 0xc0e, 0xc2e, 0xc4d, 0x200c, 0xc2c, 0xc3f, 0x3b, 0xc1c, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc1f, 0xc40, 0xc2c, 0xc40,
-0x3b, 0xc2a, 0xc40, 0xc2c, 0xc40, 0x3b, 0x45, 0x42, 0xe44, 0xe1a, 0xe15, 0xe4c, 0x70, 0x61, 0x69, 0x74, 0x69, 0x6b, 0x42, 0x20,
-0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20,
-0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20,
-0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, 0x42, 0x20,
-0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x69,
-0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b,
-0x50, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30,
-0x7d, 0x62, 0x61, 0xfd, 0x74, 0x431, 0x430, 0x439, 0x442, 0x438, 0x628, 0x627, 0x626, 0x679, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b,
-0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x67e, 0x6cc, 0x20, 0x628, 0x6cc, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x69, 0x74, 0x69, 0x61,
-0x75, 0x92c, 0x93e, 0x92f, 0x91f, 0x61, 0x1e6d, 0x61, 0x6d, 0x1e0d, 0x61, 0x6e, 0x6b, 0x41, 0x1e6c, 0x3b, 0x4d, 0x41, 0x1e6c, 0x3b,
-0x47, 0x41, 0x1e6c, 0x3b, 0x54, 0x41, 0x1e6c, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x13d7, 0x13d3, 0x13cd, 0x13a6, 0x13b5, 0x13a9, 0x431,
-0x430, 0x430, 0x439, 0x442, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45,
-0x42, 0xd804, 0xdd1d, 0xd804, 0xdd2d, 0xd804, 0xdd16, 0xd804, 0xdd34, 0x62, 0x79, 0x74, 0x65, 0x79, 0x6a9, 0x6cc, 0x644, 0x648, 0x628, 0x627,
-0x6cc, 0x62a, 0x3b, 0x645, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b,
-0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x6d, 0x67, 0x61, 0x20, 0x62, 0x79, 0x74,
-0x65
+static constexpr char16_t byte_unit_data[] = {
+0x62, 0x79, 0x74, 0x65, 0x73, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47,
+0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x4b, 0x69,
+0x42, 0x3b, 0x4d, 0x69, 0x42, 0x3b, 0x47, 0x69, 0x42, 0x3b, 0x54, 0x69,
+0x42, 0x3b, 0x50, 0x69, 0x42, 0x3b, 0x45, 0x69, 0x42, 0x67, 0x72, 0x65,
+0x65, 0x70, 0x62, 0x61, 0x6a, 0x74, 0x1263, 0x12ed, 0x1275, 0x12aa, 0x1263, 0x3b,
+0x121c, 0x130b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x130a, 0x1263, 0x3b, 0x1274, 0x122b, 0x1263,
+0x12ed, 0x1275, 0x3b, 0x1354, 0x1263, 0x3b, 0x45, 0x42, 0x628, 0x627, 0x64a, 0x62a,
+0x643, 0x64a, 0x644, 0x648, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x645, 0x2e, 0x628,
+0x3b, 0x63a, 0x2e, 0x628, 0x3b, 0x62a, 0x64a, 0x631, 0x627, 0x628, 0x627, 0x64a,
+0x62a, 0x3b, 0x628, 0x64a, 0x62a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x45,
+0x42, 0x562, 0x561, 0x575, 0x569, 0x565, 0x580, 0x56f, 0x532, 0x3b, 0x544, 0x532,
+0x3b, 0x533, 0x532, 0x3b, 0x54f, 0x532, 0x3b, 0x54a, 0x532, 0x3b, 0x45, 0x42,
+0x9ac, 0x9be, 0x987, 0x99f, 0x995, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b,
+0x9ae, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x997, 0x9bf, 0x983, 0x20,
+0x9ac, 0x9be, 0x983, 0x3b, 0x99f, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b,
+0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x61, 0x79, 0x74, 0x62, 0x79, 0x74,
+0x65, 0x2d, 0x61, 0x6b, 0x431, 0x430, 0x439, 0x442, 0x44b, 0x41a, 0x411, 0x3b,
+0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b,
+0x45, 0x42, 0x62, 0x61, 0x6a, 0x74, 0x6f, 0x76, 0x69, 0x6f, 0x6b, 0x74,
+0x65, 0x64, 0x6f, 0xf9, 0x6b, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x47, 0x6f,
+0x3b, 0x54, 0x6f, 0x3b, 0x50, 0x6f, 0x3b, 0x45, 0x6f, 0x4b, 0x69, 0x6f,
+0x3b, 0x4d, 0x69, 0x6f, 0x3b, 0x47, 0x69, 0x6f, 0x3b, 0x54, 0x69, 0x6f,
+0x3b, 0x50, 0x69, 0x6f, 0x3b, 0x45, 0x69, 0x6f, 0x431, 0x430, 0x439, 0x442,
+0x43e, 0x432, 0x435, 0x1018, 0x102d, 0x102f, 0x1000, 0x103a, 0x6d, 0x67, 0x61, 0x20,
+0x62, 0x79, 0x74, 0x65, 0xd804, 0xdd1d, 0xd804, 0xdd2d, 0xd804, 0xdd16, 0xd804, 0xdd34,
+0x13d7, 0x13d3, 0x13cd, 0x13a6, 0x13b5, 0x13a9, 0x5b57, 0x8282, 0x4f4d, 0x5143, 0x7d44, 0x62,
+0x61, 0x6a, 0x74, 0x79, 0x62, 0x61, 0x6a, 0x74, 0x6f, 0x6a, 0x62, 0x61,
+0x69, 0x64, 0x69, 0x64, 0x62, 0xfd, 0x74, 0x74, 0x61, 0x76, 0x75, 0x74,
+0x6b, 0x74, 0x3b, 0x4d, 0x74, 0x3b, 0x47, 0x74, 0x3b, 0x54, 0x74, 0x3b,
+0x50, 0x74, 0x3b, 0x45, 0x74, 0x4b, 0x69, 0x74, 0x3b, 0x4d, 0x69, 0x74,
+0x3b, 0x47, 0x69, 0x74, 0x3b, 0x54, 0x69, 0x74, 0x3b, 0x50, 0x69, 0x74,
+0x3b, 0x45, 0x69, 0x74, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0xd83a, 0xdd36,
+0xd83a, 0xdd2b, 0xd83a, 0xdd45, 0xd83a, 0xdd3c, 0xd83a, 0xdd46, 0xd83a, 0xdd2d, 0xd83a, 0xdd33,
+0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd18, 0xd83a, 0xdd14,
+0x3b, 0xd83a, 0xdd1a, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd06, 0xd83a, 0xdd14, 0x3b, 0x45,
+0x42, 0x62, 0x61, 0x69, 0x64, 0x68, 0x74, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8,
+0x10d9, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42,
+0x3b, 0x10e2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10de, 0x10d1, 0x10d0, 0x10d8,
+0x10e2, 0x10d8, 0x3b, 0x45, 0x42, 0x42, 0x79, 0x74, 0x65, 0x73, 0xaac, 0xabe,
+0xa87, 0xa9f, 0x6b, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20,
+0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54,
+0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b, 0x30, 0x7d,
+0x3b, 0x45, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, 0x42, 0x20, 0x7b,
+0x30, 0x7d, 0x3b, 0x4d, 0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47,
+0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x69, 0x42, 0x20, 0x7b,
+0x30, 0x7d, 0x3b, 0x50, 0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45,
+0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x5d1, 0x5d9, 0x5d9, 0x5d8, 0x92c, 0x93e,
+0x907, 0x91f, 0x62, 0xe1, 0x6a, 0x74, 0x62, 0xe6, 0x74, 0x69, 0x6f, 0x63,
+0x74, 0x65, 0x74, 0x65, 0x73, 0x62, 0x65, 0x61, 0x72, 0x74, 0x61, 0x30d0,
+0x30a4, 0x30c8, 0x4b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54,
+0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x69, 0x74, 0x65, 0x61,
+0x1e6d, 0x61, 0x6d, 0x1e0d, 0x61, 0x6e, 0x6b, 0x41, 0x1e6c, 0x3b, 0x4d, 0x41,
+0x1e6c, 0x3b, 0x47, 0x41, 0x1e6c, 0x3b, 0x54, 0x41, 0x1e6c, 0x3b, 0x50, 0x42,
+0x3b, 0x45, 0x42, 0xcac, 0xcc8, 0xc9f, 0xccd, 0x200c, 0xc97, 0xcb3, 0xcc1, 0xc95,
+0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcae, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e,
+0x3b, 0xc97, 0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xc9f, 0xcc6, 0x2e, 0xcac,
+0xcc8, 0x2e, 0x3b, 0xcaa, 0xcc6, 0xcac, 0xcc8, 0x3b, 0x45, 0x42, 0x43a, 0x411,
+0x3b, 0x4d, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x54, 0x411, 0x3b, 0x41f, 0x411,
+0x3b, 0x45, 0x411, 0x4b, 0x69, 0x411, 0x3b, 0x4d, 0x69, 0x411, 0x3b, 0x47,
+0x69, 0x411, 0x3b, 0x54, 0x69, 0x411, 0x3b, 0x50, 0x69, 0x411, 0x3b, 0x45,
+0x69, 0x411, 0x1794, 0x17c3, 0x92c, 0x93e, 0x92f, 0x91f, 0xbc14, 0xc774, 0xd2b8, 0x43a,
+0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f,
+0x442, 0x431, 0x3b, 0x45, 0x42, 0x62, 0x61, 0x69, 0x74, 0x69, 0x62, 0x61,
+0x69, 0x74, 0x61, 0x69, 0x431, 0x430, 0x458, 0x442, 0x438, 0xd2c, 0xd48, 0xd31,
+0xd4d, 0xd31, 0xd4d, 0xd15, 0xd46, 0xd2c, 0xd3f, 0x3b, 0xd0e, 0xd02, 0xd2c, 0xd3f,
+0x3b, 0xd1c, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd1f, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd2a,
+0xd3f, 0xd2c, 0xd3f, 0x3b, 0x45, 0x42, 0x628, 0x627, 0x6cc, 0x62a, 0x6a9, 0x6cc,
+0x644, 0x648, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x645, 0x6af, 0x627, 0x628, 0x627,
+0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b,
+0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x50, 0x42, 0x3b, 0x45,
+0x42, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411,
+0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b,
+0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x92a, 0x93f, 0x91f, 0x93e, 0x3b, 0x45,
+0x42, 0x42, 0x61, 0x69, 0x74, 0x2d, 0x64, 0x1eb9, 0x6d, 0xb2c, 0xb3e, 0xb07,
+0xb1f, 0xb4d, 0x628, 0x627, 0x64a, 0x67c, 0x633, 0xa2c, 0xa3e, 0xa07, 0xa1f, 0x62,
+0x79, 0x21b, 0x69, 0x431, 0x430, 0x430, 0x439, 0x442, 0x43a, 0x411, 0x3b, 0x41c,
+0x411, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45,
+0x42, 0x431, 0x430, 0x458, 0x442, 0x43e, 0x432, 0x438, 0x628, 0x627, 0x626, 0x64a,
+0x67d, 0x632, 0x6aa, 0x644, 0x648, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632,
+0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42,
+0x3b, 0x45, 0x42, 0xdb6, 0xdba, 0xdd2, 0xda7, 0xdca, 0xd9a, 0xdd2, 0xdb6, 0x20,
+0x7b, 0x30, 0x7d, 0x3b, 0xdb8, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b,
+0xd9c, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xda7, 0xdd9, 0xdb6, 0x20,
+0x7b, 0x30, 0x7d, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b,
+0x45, 0x42, 0x62, 0x65, 0x79, 0x74, 0x69, 0x73, 0x6b, 0x42, 0x3b, 0x4d,
+0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x42, 0x42, 0x3b, 0x45,
+0x42, 0x6b, 0x69, 0x6c, 0x6f, 0x62, 0x61, 0x69, 0x74, 0x69, 0x20, 0x7b,
+0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42,
+0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x74, 0x65, 0x72, 0x61, 0x62, 0x61, 0x69,
+0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b, 0x30,
+0x7d, 0x3b, 0x45, 0x42, 0x712, 0x710, 0x71d, 0x72c, 0xbaa, 0xbc8, 0xb9f, 0xbcd,
+0xb95, 0xbb3, 0xbcd, 0xc2c, 0xc48, 0xc1f, 0xc4d, 0x200c, 0xc32, 0xc41, 0xc15, 0xc47,
+0xc2c, 0xc40, 0x3b, 0xc0e, 0xc2e, 0xc4d, 0x200c, 0xc2c, 0xc3f, 0x3b, 0xc1c, 0xc40,
+0xc2c, 0xc40, 0x3b, 0xc1f, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc2a, 0xc40, 0xc2c, 0xc40,
+0x3b, 0x45, 0x42, 0xe44, 0xe1a, 0xe15, 0xe4c, 0x70, 0x61, 0x69, 0x74, 0x69,
+0x6b, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42,
+0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x2bb,
+0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x42, 0x20, 0x2bb, 0x65, 0x20,
+0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30,
+0x7d, 0x3b, 0x45, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x4b,
+0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x69,
+0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x69, 0x42,
+0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x69, 0x42, 0x20,
+0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x69, 0x42, 0x20, 0x2bb,
+0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x69, 0x42, 0x20, 0x2bb, 0x65,
+0x20, 0x7b, 0x30, 0x7d, 0x62, 0x61, 0xfd, 0x74, 0x431, 0x430, 0x439, 0x442,
+0x438, 0x62, 0x79, 0x74, 0x65, 0x79, 0x628, 0x627, 0x626, 0x679, 0x6b, 0x42,
+0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x67e, 0x6cc,
+0x20, 0x628, 0x6cc, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x69, 0x74, 0x69, 0x61,
+0x75, 0xe0, 0x77, 0x1ecd, 0x301, 0x6e, 0x20, 0x62, 0xe1, 0xec, 0x74, 0xec,
+0x6b, 0xe9, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x4d, 0x42, 0x3b, 0x6a,
+0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x54, 0xed, 0x62, 0xe1, 0xec,
+0x74, 0xec, 0x3b, 0x50, 0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x45,
+0x42, 0xe0, 0x77, 0x254, 0x301, 0x6e, 0x20, 0x62, 0xe1, 0xec, 0x74, 0xec,
+0x62, 0x79, 0x74, 0x65, 0x20, 0x61, 0x67, 0x62, 0x79, 0x74, 0x65, 0x2d,
+0x69, 0x74, 0x61
};
-static const char16_t am_data[] = {
-0x41, 0x4d, 0x57, 0x44, 0x76, 0x6d, 0x2e, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x64, 0x69, 0x74, 0x65, 0x73, 0x1325, 0x12cb,
-0x1275, 0x635, 0x9aa, 0x9c2, 0x9f0, 0x9cd, 0x9ac, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x410, 0x41c, 0xf66, 0xf94, 0xf0b, 0xf46, 0xf0b, 0x41, 0x2e,
-0x4d, 0x2e, 0x43f, 0x440, 0x2e, 0x43e, 0x431, 0x2e, 0x1014, 0x1036, 0x1014, 0x1000, 0x103a, 0x61, 0x2e, 0xa0, 0x6d, 0x2e, 0x4e0a, 0x5348,
-0x64, 0x6f, 0x70, 0x2e, 0x61, 0x2e, 0x6d, 0x2e, 0x61, 0x6d, 0x61, 0x74, 0x6d, 0x61, 0x70, 0x2e, 0x6d, 0x61, 0x74, 0x69,
-0x6e, 0x3c0, 0x2e, 0x3bc, 0x2e, 0x53, 0x61, 0x66, 0x69, 0x79, 0x61, 0x5dc, 0x5e4, 0x5e0, 0x5d4, 0x5f4, 0x5e6, 0x64, 0x65, 0x2e,
-0x66, 0x2e, 0x68, 0x2e, 0x72, 0x2e, 0x6e, 0x2e, 0x5348, 0x524d, 0x49, 0x73, 0x75, 0x6b, 0xcaa, 0xcc2, 0xcb0, 0xccd, 0xcb5, 0xcbe,
-0xcb9, 0xccd, 0xca8, 0x442, 0x430, 0x4a3, 0x43a, 0x44b, 0xc624, 0xc804, 0x42, 0x4e, 0x5a, 0x2e, 0x4d, 0x55, 0x2e, 0xe81, 0xec8, 0xead,
-0xe99, 0xe97, 0xec8, 0xebd, 0xe87, 0x70, 0x72, 0x69, 0x65, 0x6b, 0x161, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x6e,
-0x74, 0x254, 0x301, 0x6e, 0x67, 0x254, 0x301, 0x70, 0x72, 0x69, 0x65, 0x161, 0x70, 0x69, 0x65, 0x74, 0x43f, 0x440, 0x435, 0x442,
-0x43f, 0x43b, 0x430, 0x434, 0x43d, 0x435, 0x50, 0x47, 0x92e, 0x2e, 0x92a, 0x942, 0x2e, 0x4af, 0x2e, 0x4e9, 0x2e, 0x92a, 0x942, 0x930,
-0x94d, 0x935, 0x93e, 0x939, 0x94d, 0x928, 0x63a, 0x2e, 0x645, 0x2e, 0x642, 0x628, 0x644, 0x200c, 0x627, 0x632, 0x638, 0x647, 0x631, 0x64,
-0x61, 0x20, 0x6d, 0x61, 0x6e, 0x68, 0xe3, 0xa2a, 0xa42, 0x2e, 0xa26, 0xa41, 0x2e, 0x4e, 0x44, 0x43f, 0x440, 0x435, 0x20, 0x43f,
-0x43e, 0x434, 0x43d, 0x435, 0x70, 0x72, 0x69, 0x6a, 0x65, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x70, 0x72, 0x65, 0x20, 0x70,
-0x6f, 0x64, 0x6e, 0x65, 0x43f, 0x440, 0x438, 0x458, 0x435, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x4d5, 0x43c, 0x431, 0x438, 0x441,
-0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x440, 0x430, 0x437, 0x43c, 0x4d5, 0x635, 0x628, 0x62d, 0x60c, 0x20, 0x645, 0x646, 0x62c, 0x647, 0x646,
-0x62f, 0xdb4, 0xdd9, 0x2e, 0xdc0, 0x2e, 0x47, 0x48, 0x66, 0x6d, 0xbae, 0xbc1, 0xbb1, 0xbcd, 0xbaa, 0xb95, 0xbb2, 0xbcd, 0xe01, 0xe48,
-0xe2d, 0xe19, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf66, 0xf94, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x1295, 0x1309, 0x1206, 0x20, 0x1230,
-0x12d3, 0x1270, 0x68, 0x65, 0x6e, 0x67, 0x69, 0x68, 0x65, 0x6e, 0x67, 0x69, 0xd6, 0xd6, 0x67, 0xfc, 0x6e, 0x6f, 0x72, 0x74,
-0x61, 0x64, 0x61, 0x6e, 0x20, 0xf6, 0x148, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646, 0x20, 0x628, 0x6c7, 0x631, 0x6c7, 0x646, 0x434,
-0x43f, 0x54, 0x4f, 0x422, 0x41e, 0x53, 0x41, 0x79, 0x62, 0x53, 0x75, 0x62, 0x5e4, 0x5bf, 0x5d0, 0x5b7, 0x5e8, 0x5de, 0x5d9, 0x5d8,
-0x5d0, 0x5b8, 0x5d2, 0xc0, 0xe1, 0x72, 0x1ecd, 0x300, 0xc0, 0xe1, 0x72, 0x254, 0x300, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x64, 0x64,
-0x61, 0x67, 0x70, 0x72, 0x69, 0x6a, 0x65, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x41, 0x4e, 0x4e, 0x2019, 0x1ee5, 0x74, 0x1ee5, 0x74,
-0x1ee5, 0x128, 0x79, 0x61, 0x6b, 0x77, 0x61, 0x6b, 0x79, 0x61, 0x14b, 0x64, 0x69, 0x61, 0x6d, 0x20, 0x56, 0x6f, 0x72, 0x6d,
-0x69, 0x74, 0x74, 0x61, 0x67, 0xa3b8, 0xa111, 0x69, 0x111, 0x69, 0x74, 0x62, 0x65, 0x61, 0x69, 0x76, 0x65, 0x74, 0x69, 0x62,
-0x4d, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x4b, 0x73, 0x75, 0x62, 0x61,
-0x6b, 0x61, 0x4b, 0x69, 0x72, 0x6f, 0x6b, 0x6f, 0x54, 0x65, 0x73, 0x69, 0x72, 0x61, 0x6e, 0x6b, 0x61, 0x6e, 0x67, 0x2019,
-0x61, 0x6d, 0x61, 0x2d5c, 0x2d49, 0x2d3c, 0x2d30, 0x2d61, 0x2d5c, 0x74, 0x69, 0x66, 0x61, 0x77, 0x74, 0x6e, 0x20, 0x74, 0x75, 0x66,
-0x61, 0x74, 0x70, 0x61, 0x6d, 0x69, 0x6c, 0x61, 0x75, 0x75, 0x74, 0x75, 0x6b, 0x6f, 0x4b, 0x49, 0x13cc, 0x13be, 0x13b4, 0x4d,
-0x75, 0x68, 0x69, 0x54, 0x4f, 0x4f, 0x75, 0x6c, 0x75, 0x63, 0x68, 0x65, 0x6c, 0x6f, 0x52, 0x168, 0x6b, 0x61, 0x72, 0x6f,
-0x6f, 0x6e, 0x1c1, 0x67, 0x6f, 0x61, 0x67, 0x61, 0x73, 0x55, 0x68, 0x72, 0x20, 0x76, 0xf6, 0x72, 0x6d, 0x69, 0x64, 0x64,
-0x61, 0x61, 0x63, 0x68, 0x73, 0x190, 0x6e, 0x6b, 0x61, 0x6b, 0x25b, 0x6e, 0x79, 0xe1, 0x4d, 0x75, 0x6e, 0x6b, 0x79, 0x6f,
-0x69, 0x63, 0x68, 0x65, 0x68, 0x65, 0x61, 0x76, 0x6f, 0x54, 0x61, 0x70, 0x61, 0x72, 0x61, 0x63, 0x68, 0x75, 0x41, 0x64,
-0x64, 0x75, 0x68, 0x61, 0x4f, 0x44, 0x5a, 0x64, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x61, 0x6c, 0x6d, 0x61, 0x6b, 0x65, 0x6f,
-0x92b, 0x941, 0x902, 0x44, 0x69, 0x6e, 0x64, 0x61, 0x6d, 0x6f, 0x69, 0x65, 0x73, 0x61, 0x2e, 0x67, 0x49, 0x20, 0x62, 0x69,
-0x6b, 0x25b, 0x302, 0x67, 0x6c, 0xe0, 0x53, 0x75, 0x62, 0x62, 0x61, 0x61, 0x68, 0x69, 0x69, 0x64, 0x69, 0x253, 0x61, 0x6b,
-0xed, 0x6b, 0xed, 0x72, 0xed, 0x67, 0x73, 0xe1, 0x72, 0xfa, 0x77, 0xe1, 0x77, 0x69, 0x63, 0x68, 0x69, 0x73, 0x68, 0x75,
-0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6d, 0x61, 0x6e, 0xe1, 0x52, 0x57, 0x42d, 0x418, 0x4c, 0x77, 0x61, 0x6d, 0x69, 0x6c, 0x61,
-0x77, 0x75, 0x6b, 0x69, 0x25b, 0x6d, 0x25b, 0x301, 0x25b, 0x6d, 0x64, 0x65, 0x20, 0x6c, 0x61, 0x20, 0x6d, 0x61, 0xf1, 0x61,
-0x6e, 0x61, 0x6d, 0x62, 0x61, 0xa78c, 0x6d, 0x62, 0x61, 0xa78c, 0x6d, 0x62, 0x61, 0x2bc, 0xe1, 0x6d, 0x62, 0x61, 0x2bc, 0x628,
-0x2e, 0x646, 0x64, 0x6f, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x61, 0x69, 0x70, 0x2e
+static constexpr char16_t am_data[] = {
+0x41, 0x4d, 0x76, 0x6d, 0x2e, 0x61, 0x2e, 0x67, 0x41, 0x4e, 0x65, 0x20,
+0x70, 0x61, 0x72, 0x61, 0x64, 0x69, 0x74, 0x65, 0x73, 0x1325, 0x12cb, 0x1275,
+0x635, 0x9aa, 0x9c2, 0x9f0, 0x9cd, 0x9ac, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x64, 0x65,
+0x20, 0x6c, 0x61, 0x20, 0x6d, 0x61, 0xf1, 0x61, 0x6e, 0x61, 0x69, 0x63,
+0x68, 0x65, 0x68, 0x65, 0x61, 0x76, 0x6f, 0x410, 0x41c, 0x73, 0xe1, 0x72,
+0xfa, 0x77, 0xe1, 0x49, 0x20, 0x62, 0x69, 0x6b, 0x25b, 0x302, 0x67, 0x6c,
+0xe0, 0x75, 0x6c, 0x75, 0x63, 0x68, 0x65, 0x6c, 0x6f, 0x70, 0x61, 0x6d,
+0x69, 0x6c, 0x61, 0x75, 0x92d, 0x94b, 0x930, 0x92b, 0x941, 0x902, 0x70, 0x72,
+0x69, 0x6a, 0x65, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x43f, 0x440, 0x438, 0x458,
+0x435, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x41, 0x2e, 0x4d, 0x2e, 0x43f,
+0x440, 0x2e, 0x43e, 0x431, 0x2e, 0x1014, 0x1036, 0x1014, 0x1000, 0x103a, 0x4e0a, 0x5348,
+0x61, 0x2e, 0xa0, 0x6d, 0x2e, 0x5a, 0x64, 0x61, 0x74, 0x20, 0x61, 0x7a,
+0x61, 0x6c, 0x628, 0x2e, 0x646, 0x13cc, 0x13be, 0x13b4, 0x55, 0x68, 0x72, 0x20,
+0x76, 0xf6, 0x72, 0x6d, 0x69, 0x64, 0x64, 0x61, 0x61, 0x63, 0x68, 0x73,
+0x61, 0x2e, 0x6d, 0x2e, 0x64, 0x6f, 0x70, 0x2e, 0x938, 0x935, 0x947, 0x930,
+0x69, 0x64, 0x69, 0x253, 0x61, 0xf66, 0xf94, 0xf0b, 0xf46, 0xf0b, 0x4b, 0x49,
+0xd801, 0xdc08, 0xd801, 0xdc23, 0xd801, 0xdc68, 0xd801, 0xdc65, 0x61, 0x74, 0x6d, 0x14b,
+0x64, 0x69, 0x6b, 0xed, 0x6b, 0xed, 0x72, 0xed, 0x67, 0x61, 0x70, 0x2e,
+0x6d, 0x61, 0x74, 0x69, 0x6e, 0x73, 0x75, 0x62, 0x61, 0x6b, 0x61, 0xd83a,
+0xdd00, 0xd83a, 0xdd0e, 0x3c0, 0x2e, 0x3bc, 0x2e, 0x4d, 0x61, 0x6d, 0x62, 0x69,
+0x61, 0x53, 0x61, 0x66, 0x69, 0x79, 0x61, 0x5dc, 0x5e4, 0x5e0, 0x5d4, 0x5f4,
+0x5e6, 0x64, 0x65, 0x2e, 0x66, 0x2e, 0x68, 0x2e, 0x4e, 0x2019, 0x1ee5, 0x74,
+0x1ee5, 0x74, 0x1ee5, 0x69, 0x70, 0x2e, 0x61, 0x6e, 0x74, 0x65, 0x20, 0x6d,
+0x69, 0x64, 0xed, 0x72, 0x2e, 0x6e, 0x2e, 0x5348, 0x524d, 0x49, 0x73, 0x75,
+0x6b, 0x6e, 0x20, 0x74, 0x75, 0x66, 0x61, 0x74, 0x6b, 0x61, 0x72, 0x6f,
+0x6f, 0x6e, 0x128, 0x79, 0x61, 0x6b, 0x77, 0x61, 0x6b, 0x79, 0x61, 0xcaa,
+0xcc2, 0xcb0, 0xccd, 0xcb5, 0xcbe, 0xcb9, 0xccd, 0xca8, 0x627, 0x6d2, 0x20, 0x627,
+0x6cc, 0x645, 0x92f, 0x947, 0x20, 0x90f, 0x92e, 0x4b, 0x69, 0x72, 0x6f, 0x6b,
+0x6f, 0x938, 0x915, 0x93e, 0x933, 0xc624, 0xc804, 0x41, 0x64, 0x64, 0x75, 0x68,
+0x61, 0x42, 0x4e, 0x6d, 0x61, 0x6e, 0xe1, 0x442, 0x430, 0x4a3, 0x43a, 0x44b,
+0x54, 0x4f, 0x4f, 0xe81, 0xec8, 0xead, 0xe99, 0xe97, 0xec8, 0xebd, 0xe87, 0x70,
+0x72, 0x69, 0x65, 0x6b, 0x161, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e,
+0x101, 0x6e, 0x74, 0x254, 0x301, 0x6e, 0x67, 0x254, 0x301, 0x70, 0x72, 0x69,
+0x65, 0x161, 0x70, 0x69, 0x65, 0x74, 0x64, 0x6f, 0x70, 0x6f, 0x142, 0x64,
+0x6e, 0x6a, 0x61, 0x44, 0x69, 0x6e, 0x64, 0x61, 0x4f, 0x44, 0x6d, 0x6f,
+0x69, 0x65, 0x73, 0x43f, 0x440, 0x435, 0x442, 0x43f, 0x43b, 0x2e, 0x75, 0x74,
+0x75, 0x6b, 0x6f, 0x77, 0x69, 0x63, 0x68, 0x69, 0x73, 0x68, 0x75, 0x4d,
+0x75, 0x68, 0x69, 0x50, 0x47, 0x98f, 0x20, 0x98f, 0x9ae, 0x190, 0x6e, 0x6b,
+0x61, 0x6b, 0x25b, 0x6e, 0x79, 0xe1, 0x52, 0x168, 0x4af, 0x2e, 0x4e9, 0x2e,
+0x1826, 0x1802, 0x20, 0x1825, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x1c1, 0x67, 0x6f,
+0x61, 0x67, 0x61, 0x73, 0x92a, 0x942, 0x930, 0x94d, 0x935, 0x93e, 0x939, 0x94d,
+0x928, 0x6d, 0x62, 0x61, 0x2bc, 0xe1, 0x6d, 0x62, 0x61, 0x2bc, 0x6d, 0x62,
+0x61, 0xa78c, 0x6d, 0x62, 0x61, 0xa78c, 0x46, 0x1ecd, 0x20, 0x6d, 0x1ecd, 0x301,
+0x6e, 0x69, 0x6e, 0x7db, 0x69, 0x111, 0x69, 0x74, 0x62, 0x65, 0x61, 0x69,
+0x76, 0x65, 0x74, 0x69, 0x62, 0x66, 0x2e, 0x6d, 0x2e, 0x52, 0x57, 0x57,
+0x44, 0x4d5, 0x43c, 0x431, 0x438, 0x441, 0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x440,
+0x430, 0x437, 0x43c, 0x4d5, 0x63a, 0x2e, 0x645, 0x2e, 0x642, 0x628, 0x644, 0x200c,
+0x627, 0x632, 0x638, 0x647, 0x631, 0x64, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x68,
+0xe3, 0x61, 0x6e, 0x6b, 0x73, 0x74, 0x101, 0x69, 0x6e, 0x61, 0x6e, 0xa2a,
+0xa42, 0x2e, 0xa26, 0xa41, 0x2e, 0x6b, 0x61, 0x6e, 0x67, 0x2019, 0x61, 0x6d,
+0x61, 0x5a, 0x2e, 0x4d, 0x55, 0x2e, 0x42d, 0x418, 0x54, 0x65, 0x73, 0x69,
+0x72, 0x61, 0x6e, 0x4e, 0x44, 0x4c, 0x77, 0x61, 0x6d, 0x69, 0x6c, 0x61,
+0x77, 0x75, 0x1c65, 0x1c6e, 0x1c5b, 0x1c5f, 0x1c5c, 0x70, 0x72, 0x69, 0x6a, 0x65,
+0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x6d, 0x61, 0x6b, 0x65, 0x6f, 0xa3b8,
+0xa111, 0x64, 0x6f, 0x20, 0x70, 0x6f, 0x142, 0x65, 0x64, 0x6e, 0x69, 0x14f,
+0x635, 0x628, 0x62d, 0x60c, 0x20, 0x645, 0x646, 0x62c, 0x647, 0x646, 0x62f, 0x938,
+0x941, 0x92c, 0x941, 0x939, 0x20, 0x91c, 0x93e, 0xdb4, 0xdd9, 0x2e, 0xdc0, 0x2e,
+0x4d, 0x75, 0x6e, 0x6b, 0x79, 0x6f, 0x47, 0x48, 0x2d5c, 0x2d49, 0x2d3c, 0x2d30,
+0x2d61, 0x2d5c, 0x66, 0x6d, 0x61, 0x6d, 0x20, 0x56, 0x6f, 0x72, 0x6d, 0x69,
+0x74, 0x74, 0x61, 0x67, 0x70f, 0x729, 0x71b, 0x200c, 0x74, 0x69, 0x66, 0x61,
+0x77, 0x74, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x4b,
+0x53, 0x75, 0x62, 0x62, 0x61, 0x61, 0x68, 0x69, 0x54, 0x61, 0x70, 0x61,
+0x72, 0x61, 0x63, 0x68, 0x75, 0xe01, 0xe48, 0xe2d, 0xe19, 0xe40, 0xe17, 0xe35,
+0xe48, 0xe22, 0xe07, 0xf66, 0xf94, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x1245, 0x2e,
+0x1240, 0x2e, 0x68, 0x65, 0x6e, 0x67, 0x69, 0x68, 0x65, 0x6e, 0x67, 0x69,
+0xd6, 0xd6, 0x67, 0xfc, 0x6e, 0x6f, 0x72, 0x74, 0x61, 0x64, 0x61, 0x6e,
+0x20, 0xf6, 0x148, 0x434, 0x43f, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646, 0x20,
+0x628, 0x6c7, 0x631, 0x6c7, 0x646, 0x422, 0x41e, 0x53, 0x41, 0x79, 0x62, 0x6b,
+0x69, 0x25b, 0x6d, 0x25b, 0x301, 0x25b, 0x6d, 0x5e4, 0x5bf, 0x5d0, 0x5b7, 0x5e8,
+0x5de, 0x5d9, 0x5d8, 0x5d0, 0x5b8, 0x5d2, 0xc0, 0xe1, 0x72, 0x1ecd, 0x300, 0xc0,
+0xe1, 0x72, 0x254, 0x300, 0x62, 0x61, 0x6e, 0x68, 0x61, 0x65, 0x74, 0x924,
+0x921, 0x915, 0x947, 0x938, 0x92c, 0x947, 0x930, 0x947, 0x70, 0x69, 0x20, 0x6f,
+0x70, 0x65, 0x6e, 0x20, 0x73, 0x75, 0x6e, 0x6f, 0x28a, 0x73, 0x68, 0x69,
+0x6c, 0xe8, 0x20, 0x6b, 0x28a, 0x62, 0x6f, 0x256, 0x75, 0x92d, 0x94d, 0x92f,
+0x93e, 0x917, 0x93e
};
-static const char16_t pm_data[] = {
-0x50, 0x4d, 0x57, 0x42, 0x6e, 0x6d, 0x2e, 0x65, 0x20, 0x70, 0x61, 0x73, 0x64, 0x69, 0x74, 0x65, 0x73, 0x12a8, 0x1230, 0x12d3,
-0x1275, 0x645, 0x985, 0x9aa, 0x9f0, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x41f, 0x41c, 0xf55, 0xfb1, 0xf72, 0xf0b, 0xf46, 0xf0b, 0x47, 0x2e, 0x4d,
-0x2e, 0x441, 0x43b, 0x2e, 0x43e, 0x431, 0x2e, 0x100a, 0x1014, 0x1031, 0x70, 0x2e, 0xa0, 0x6d, 0x2e, 0x4e0b, 0x5348, 0x6f, 0x64, 0x70,
-0x2e, 0x70, 0x2e, 0x6d, 0x2e, 0x70, 0x6d, 0x70, 0x74, 0x6d, 0x69, 0x70, 0x2e, 0x73, 0x6f, 0x69, 0x72, 0x66, 0x3bc, 0x2e,
-0x3bc, 0x2e, 0x59, 0x61, 0x6d, 0x6d, 0x61, 0x5d0, 0x5d7, 0x5d4, 0x5f4, 0x5e6, 0x64, 0x75, 0x2e, 0x65, 0x2e, 0x68, 0x2e, 0x69,
-0x2e, 0x6e, 0x2e, 0x5348, 0x5f8c, 0x57, 0x65, 0x6e, 0x67, 0x69, 0xc85, 0xcaa, 0xcb0, 0xcbe, 0xcb9, 0xccd, 0xca8, 0x442, 0x4af, 0x448,
-0x442, 0x4e9, 0x43d, 0x20, 0x43a, 0x438, 0x439, 0x438, 0x43d, 0x43a, 0x438, 0xc624, 0xd6c4, 0x50, 0x4e, 0x5a, 0x2e, 0x4d, 0x57, 0x2e,
-0xeab, 0xebc, 0xeb1, 0xe87, 0xe97, 0xec8, 0xebd, 0xe87, 0x70, 0x113, 0x63, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x6d,
-0x70, 0xf3, 0x6b, 0x77, 0x61, 0x70, 0x6f, 0x70, 0x69, 0x65, 0x74, 0x43f, 0x43e, 0x43f, 0x43b, 0x430, 0x434, 0x43d, 0x435, 0x50,
-0x54, 0x47, 0x92e, 0x2e, 0x909, 0x2e, 0x4af, 0x2e, 0x445, 0x2e, 0x905, 0x92a, 0x930, 0x93e, 0x939, 0x94d, 0x928, 0x63a, 0x2e, 0x648,
-0x2e, 0x628, 0x639, 0x62f, 0x627, 0x632, 0x638, 0x647, 0x631, 0x64, 0x61, 0x20, 0x74, 0x61, 0x72, 0x64, 0x65, 0xa2c, 0xa3e, 0x2e,
-0xa26, 0xa41, 0x2e, 0x4c, 0x4b, 0x43f, 0x43e, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x70, 0x6f, 0x20, 0x70, 0x6f, 0x64, 0x6e,
-0x65, 0x4d5, 0x43c, 0x431, 0x438, 0x441, 0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x444, 0x4d5, 0x441, 0x442, 0x4d5, 0x645, 0x646, 0x62c, 0x647,
-0x646, 0x62f, 0x60c, 0x20, 0x634, 0x627, 0x645, 0xdb4, 0x2e, 0xdc0, 0x2e, 0x70, 0x6f, 0x70, 0x2e, 0x47, 0x44, 0x65, 0x6d, 0xbaa,
-0xbbf, 0xbb1, 0xbcd, 0xbaa, 0xb95, 0xbb2, 0xbcd, 0xe2b, 0xe25, 0xe31, 0xe07, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf55, 0xfb1, 0xf72,
-0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x12f5, 0x1215, 0x122d, 0x20, 0x1230, 0x12d3, 0x1275, 0x65, 0x66, 0x69, 0x61, 0x66, 0x69, 0xd6, 0x53,
-0x67, 0xfc, 0x6e, 0x6f, 0x72, 0x74, 0x61, 0x64, 0x61, 0x6e, 0x20, 0x73, 0x6f, 0x148, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646,
-0x20, 0x643, 0x6d0, 0x64a, 0x649, 0x646, 0x43f, 0x43f, 0x54, 0x4b, 0x422, 0x41a, 0x43, 0x48, 0x79, 0x68, 0x4e, 0x67, 0x6f, 0x5e0,
-0x5d0, 0x5b8, 0x5db, 0x5de, 0x5d9, 0x5d8, 0x5d0, 0x5b8, 0x5d2, 0x1ecc, 0x300, 0x73, 0xe1, 0x6e, 0x186, 0x300, 0x73, 0xe1, 0x6e, 0x65,
-0x74, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x64, 0x64, 0x61, 0x67, 0x70, 0x6f, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x43f, 0x43e, 0x441,
-0x43b, 0x438, 0x458, 0x435, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x45, 0x57, 0x4e, 0x2019, 0x61, 0x62, 0x61, 0x6c, 0x69, 0x128,
-0x79, 0x61, 0x77, 0x129, 0x6f, 0x6f, 0x263, 0x65, 0x74, 0x72, 0x254, 0x61, 0x6d, 0x20, 0x4e, 0x61, 0x6d, 0x69, 0x74, 0x74,
-0x61, 0x67, 0xa06f, 0xa2d2, 0x65, 0x61, 0x68, 0x6b, 0x65, 0x74, 0x62, 0x65, 0x61, 0x69, 0x76, 0x65, 0x74, 0x65, 0x62, 0x4d,
-0x6f, 0x67, 0x6c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x70, 0x6b, 0x69, 0x6b, 0x69, 0x69, 0x257, 0x65, 0x48,
-0x77, 0x61, 0x129, 0x2d, 0x69, 0x6e, 0x129, 0x54, 0x65, 0x69, 0x70, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x6f, 0x74, 0x6f, 0x2d5c,
-0x2d30, 0x2d37, 0x2d33, 0x2d33, 0x2d6f, 0x2d30, 0x2d5c, 0x74, 0x61, 0x64, 0x67, 0x67, 0x2b7, 0x61, 0x74, 0x6e, 0x20, 0x74, 0x6d, 0x65,
-0x64, 0x64, 0x69, 0x74, 0x70, 0x61, 0x6d, 0x75, 0x6e, 0x79, 0x69, 0x6b, 0x79, 0x69, 0x75, 0x6b, 0x6f, 0x6e, 0x79, 0x69,
-0x55, 0x54, 0x13d2, 0x13af, 0x13f1, 0x13a2, 0x13d7, 0x13e2, 0x43, 0x68, 0x69, 0x6c, 0x6f, 0x4d, 0x55, 0x55, 0x61, 0x6b, 0x61, 0x73,
-0x75, 0x62, 0x61, 0x168, 0x47, 0x6b, 0x6f, 0x6f, 0x73, 0x6b, 0x6f, 0x6c, 0x69, 0x6e, 0x79, 0x1c3, 0x75, 0x69, 0x61, 0x73,
-0x55, 0x68, 0x72, 0x20, 0x6e, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x73, 0x190, 0x6e, 0x64, 0xe1,
-0x6d, 0xe2, 0x45, 0x69, 0x67, 0x75, 0x6c, 0x6f, 0x69, 0x63, 0x68, 0x61, 0x6d, 0x74, 0x68, 0x69, 0x45, 0x62, 0x6f, 0x6e,
-0x67, 0x69, 0x41, 0x6c, 0x75, 0x75, 0x6c, 0x61, 0x4f, 0x54, 0x1e0c, 0x65, 0x66, 0x66, 0x69, 0x72, 0x20, 0x61, 0x7a, 0x61,
-0x6e, 0x79, 0x69, 0x61, 0x67, 0x68, 0x75, 0x6f, 0x92c, 0x947, 0x932, 0x93e, 0x938, 0x947, 0x44, 0x69, 0x6c, 0x6f, 0x6c, 0x6f,
-0x6e, 0x6f, 0x6d, 0xeb, 0x74, 0x74, 0x65, 0x73, 0x61, 0x2e, 0x6b, 0x49, 0x20, 0x253, 0x75, 0x67, 0x61, 0x6a, 0x254, 0x70,
-0x5a, 0x61, 0x61, 0x72, 0x69, 0x6b, 0x61, 0x79, 0x20, 0x62, 0x65, 0x62, 0x79, 0xe1, 0x6d, 0x75, 0x6e, 0x67, 0x259, 0x67,
-0xf3, 0x67, 0x259, 0x6c, 0x65, 0x63, 0x25b, 0x25b, 0x301, 0x6e, 0x6b, 0x6f, 0x6d, 0x63, 0x68, 0x6f, 0x63, 0x68, 0x69, 0x6c,
-0x2019, 0x6c, 0x6c, 0x69, 0x6c, 0x6c, 0x69, 0x6b, 0x75, 0x67, 0xfa, 0x54, 0x14a, 0x42d, 0x41a, 0x50, 0x61, 0x73, 0x68, 0x61,
-0x6d, 0x69, 0x68, 0x65, 0x6b, 0x69, 0x73, 0x25b, 0x301, 0x6e, 0x64, 0x25b, 0x64, 0x65, 0x20, 0x6c, 0x61, 0x20, 0x74, 0x61,
-0x72, 0x64, 0x65, 0x14b, 0x6b, 0x61, 0x20, 0x6d, 0x62, 0x254, 0x301, 0x74, 0x20, 0x6e, 0x6a, 0x69, 0x6e, 0x63, 0x77, 0xf2,
-0x6e, 0x7a, 0xe9, 0x6d, 0x62f, 0x2e, 0x646, 0x77, 0xf3, 0x74, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x61, 0x70, 0x6f, 0x70,
-0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x75, 0x65, 0x70, 0x2e
+static constexpr char16_t pm_data[] = {
+0x50, 0x4d, 0x6e, 0x6d, 0x2e, 0x61, 0x2e, 0x6b, 0x45, 0x57, 0x65, 0x20,
+0x70, 0x61, 0x73, 0x64, 0x69, 0x74, 0x65, 0x73, 0x12a8, 0x1230, 0x12d3, 0x1275,
+0x645, 0x985, 0x9aa, 0x9f0, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x64, 0x65, 0x20, 0x6c,
+0x61, 0x20, 0x74, 0x61, 0x72, 0x64, 0x65, 0x69, 0x63, 0x68, 0x61, 0x6d,
+0x74, 0x68, 0x69, 0x41f, 0x41c, 0x63, 0x25b, 0x25b, 0x301, 0x6e, 0x6b, 0x6f,
+0x49, 0x20, 0x253, 0x75, 0x67, 0x61, 0x6a, 0x254, 0x70, 0x61, 0x6b, 0x61,
+0x73, 0x75, 0x62, 0x61, 0x70, 0x61, 0x6d, 0x75, 0x6e, 0x79, 0x69, 0x938,
+0x93e, 0x902, 0x91d, 0x92c, 0x947, 0x932, 0x93e, 0x938, 0x947, 0x70, 0x6f, 0x70,
+0x6f, 0x64, 0x6e, 0x65, 0x43f, 0x43e, 0x441, 0x43b, 0x438, 0x458, 0x435, 0x20,
+0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x47, 0x2e, 0x4d, 0x2e, 0x441, 0x43b, 0x2e,
+0x43e, 0x431, 0x2e, 0x100a, 0x1014, 0x1031, 0x4e0b, 0x5348, 0x70, 0x2e, 0xa0, 0x6d,
+0x2e, 0x1e0c, 0x65, 0x66, 0x66, 0x69, 0x72, 0x20, 0x61, 0x7a, 0x61, 0x62f,
+0x2e, 0x646, 0x13d2, 0x13af, 0x13f1, 0x13a2, 0x13d7, 0x13e2, 0x55, 0x68, 0x72, 0x20,
+0x6e, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x73,
+0x70, 0x2e, 0x6d, 0x2e, 0x6f, 0x64, 0x70, 0x2e, 0x926, 0x92a, 0x948, 0x939,
+0x930, 0x20, 0x92c, 0x93e, 0x926, 0x65, 0x62, 0x79, 0xe1, 0x6d, 0x75, 0xf55,
+0xfb1, 0xf72, 0xf0b, 0xf46, 0xf0b, 0x55, 0x54, 0xd801, 0xdc11, 0xd801, 0xdc23, 0x70,
+0x6d, 0xd801, 0xdc50, 0xd801, 0xdc65, 0x70, 0x74, 0x6d, 0x263, 0x65, 0x74, 0x72,
+0x254, 0x6e, 0x67, 0x259, 0x67, 0xf3, 0x67, 0x259, 0x6c, 0x65, 0x69, 0x70,
+0x2e, 0x73, 0x6f, 0x69, 0x72, 0x6b, 0x69, 0x6b, 0x69, 0x69, 0x257, 0x65,
+0xd83a, 0xdd07, 0xd83a, 0xdd0e, 0x3bc, 0x2e, 0x3bc, 0x2e, 0x4d, 0x6f, 0x67, 0x59,
+0x61, 0x6d, 0x6d, 0x61, 0x5d0, 0x5d7, 0x5d4, 0x5f4, 0x5e6, 0x64, 0x75, 0x2e,
+0x65, 0x2e, 0x68, 0x2e, 0x4e, 0x2019, 0x61, 0x62, 0x61, 0x6c, 0x69, 0x65,
+0x70, 0x2e, 0x70, 0x6f, 0x73, 0x20, 0x6d, 0x69, 0x64, 0xed, 0x69, 0x2e,
+0x6e, 0x2e, 0x5348, 0x5f8c, 0x57, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x20, 0x74,
+0x6d, 0x65, 0x64, 0x64, 0x69, 0x74, 0x6b, 0x6f, 0x6f, 0x73, 0x6b, 0x6f,
+0x6c, 0x69, 0x6e, 0x79, 0x128, 0x79, 0x61, 0x77, 0x129, 0x6f, 0x6f, 0xc85,
+0xcaa, 0xcb0, 0xcbe, 0xcb9, 0xccd, 0xca8, 0x67e, 0x6cc, 0x20, 0x627, 0x6cc, 0x645,
+0x92a, 0x940, 0x20, 0x90f, 0x92e, 0x48, 0x77, 0x61, 0x129, 0x2d, 0x69, 0x6e,
+0x129, 0x938, 0x93e, 0x902, 0x91c, 0xc624, 0xd6c4, 0x41, 0x6c, 0x75, 0x75, 0x6c,
+0x61, 0x50, 0x4e, 0x6b, 0x75, 0x67, 0xfa, 0x442, 0x4af, 0x448, 0x442, 0x4e9,
+0x43d, 0x20, 0x43a, 0x438, 0x439, 0x438, 0x43d, 0x43a, 0x438, 0x4d, 0x55, 0x55,
+0xeab, 0xebc, 0xeb1, 0xe87, 0xe97, 0xec8, 0xebd, 0xe87, 0x70, 0x113, 0x63, 0x70,
+0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x6d, 0x70, 0xf3, 0x6b, 0x77,
+0x61, 0x70, 0x6f, 0x70, 0x69, 0x65, 0x74, 0x77, 0xf3, 0x74, 0x70, 0x6f,
+0x142, 0x64, 0x6e, 0x6a, 0x61, 0x44, 0x69, 0x6c, 0x6f, 0x6c, 0x6f, 0x4f,
+0x54, 0x6e, 0x6f, 0x6d, 0xeb, 0x74, 0x74, 0x65, 0x73, 0x43f, 0x43e, 0x43f,
+0x43b, 0x2e, 0x6b, 0x79, 0x69, 0x75, 0x6b, 0x6f, 0x6e, 0x79, 0x69, 0x6d,
+0x63, 0x68, 0x6f, 0x63, 0x68, 0x69, 0x6c, 0x2019, 0x6c, 0x43, 0x68, 0x69,
+0x6c, 0x6f, 0x50, 0x54, 0x47, 0x9aa, 0x9bf, 0x20, 0x98f, 0x9ae, 0x190, 0x6e,
+0x64, 0xe1, 0x6d, 0xe2, 0x168, 0x47, 0x4af, 0x2e, 0x445, 0x2e, 0x1826, 0x1802,
+0x20, 0x182c, 0x1823, 0x6c, 0x69, 0x6c, 0x6c, 0x69, 0x1c3, 0x75, 0x69, 0x61,
+0x73, 0x905, 0x92a, 0x930, 0x93e, 0x939, 0x94d, 0x928, 0x6e, 0x63, 0x77, 0xf2,
+0x6e, 0x7a, 0xe9, 0x6d, 0x14b, 0x6b, 0x61, 0x20, 0x6d, 0x62, 0x254, 0x301,
+0x74, 0x20, 0x6e, 0x6a, 0x69, 0x46, 0x1ecd, 0x20, 0xed, 0x76, 0x6e, 0x69,
+0x6e, 0x7e5, 0x65, 0x61, 0x68, 0x6b, 0x65, 0x74, 0x62, 0x65, 0x61, 0x69,
+0x76, 0x65, 0x74, 0x65, 0x2e, 0x6d, 0x2e, 0x54, 0x14a, 0x57, 0x42, 0x4d5,
+0x43c, 0x431, 0x438, 0x441, 0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x444, 0x4d5, 0x441,
+0x442, 0x4d5, 0x63a, 0x2e, 0x648, 0x2e, 0x628, 0x639, 0x62f, 0x627, 0x632, 0x638,
+0x647, 0x631, 0x64, 0x61, 0x20, 0x74, 0x61, 0x72, 0x64, 0x65, 0x70, 0x61,
+0x20, 0x70, 0x75, 0x73, 0x73, 0x69, 0x64, 0x65, 0x69, 0x6e, 0x61, 0x6e,
+0xa2c, 0xa3e, 0x2e, 0xa26, 0xa41, 0x2e, 0x6b, 0x69, 0x6e, 0x67, 0x6f, 0x74,
+0x6f, 0x5a, 0x2e, 0x4d, 0x57, 0x2e, 0x42d, 0x41a, 0x54, 0x65, 0x69, 0x70,
+0x61, 0x4c, 0x4b, 0x50, 0x61, 0x73, 0x68, 0x61, 0x6d, 0x69, 0x68, 0x65,
+0x1c67, 0x1c64, 0x1c6b, 0x1c5f, 0x1c79, 0x43f, 0x43e, 0x20, 0x43f, 0x43e, 0x434, 0x43d,
+0x435, 0x70, 0x6f, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x6e, 0x79, 0x69,
+0x61, 0x67, 0x68, 0x75, 0x6f, 0xa06f, 0xa2d2, 0x70, 0x6f, 0x20, 0x70, 0x6f,
+0x142, 0x65, 0x64, 0x6e, 0x69, 0x75, 0x645, 0x646, 0x62c, 0x647, 0x646, 0x62f,
+0x60c, 0x20, 0x634, 0x627, 0x645, 0x936, 0x93e, 0x92e, 0x20, 0x91c, 0x93e, 0xdb4,
+0x2e, 0xdc0, 0x2e, 0x70, 0x6f, 0x70, 0x2e, 0x45, 0x69, 0x67, 0x75, 0x6c,
+0x6f, 0x47, 0x44, 0x2d5c, 0x2d30, 0x2d37, 0x2d33, 0x2d33, 0x2d6f, 0x2d30, 0x2d5c, 0x65,
+0x6d, 0x61, 0x6d, 0x20, 0x4e, 0x61, 0x6d, 0x69, 0x74, 0x74, 0x61, 0x67,
+0x70f, 0x712, 0x71b, 0x200c, 0x74, 0x61, 0x64, 0x67, 0x67, 0x2b7, 0x61, 0x74,
+0x6c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x70, 0xbaa, 0xbbf,
+0xbb1, 0xbcd, 0xbaa, 0xb95, 0xbb2, 0xbcd, 0x5a, 0x61, 0x61, 0x72, 0x69, 0x6b,
+0x61, 0x79, 0x20, 0x62, 0x45, 0x62, 0x6f, 0x6e, 0x67, 0x69, 0xe2b, 0xe25,
+0xe31, 0xe07, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf55, 0xfb1, 0xf72, 0xf0b,
+0xf51, 0xfb2, 0xf7c, 0xf0b, 0x12f5, 0x2e, 0x1240, 0x2e, 0x65, 0x66, 0x69, 0x61,
+0x66, 0x69, 0xd6, 0x53, 0x67, 0xfc, 0x6e, 0x6f, 0x72, 0x74, 0x61, 0x64,
+0x61, 0x6e, 0x20, 0x73, 0x6f, 0x148, 0x43f, 0x43f, 0x70, 0x6f, 0x70, 0x6f,
+0x142, 0x64, 0x6e, 0x6a, 0x75, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646, 0x20,
+0x643, 0x6d0, 0x64a, 0x649, 0x646, 0x54, 0x4b, 0x422, 0x41a, 0x43, 0x48, 0x79,
+0x68, 0x4e, 0x67, 0x6f, 0x6b, 0x69, 0x73, 0x25b, 0x301, 0x6e, 0x64, 0x25b,
+0x5e0, 0x5d0, 0x5b8, 0x5db, 0x5de, 0x5d9, 0x5d8, 0x5d0, 0x5b8, 0x5d2, 0x1ecc, 0x300,
+0x73, 0xe1, 0x6e, 0x186, 0x300, 0x73, 0xe1, 0x6e, 0x62, 0x61, 0x6e, 0x72,
+0x69, 0x6e, 0x67, 0x7a, 0x67, 0x76, 0x61, 0x71, 0x938, 0x93e, 0x902, 0x92e,
+0x70, 0x69, 0x20, 0x70, 0x69, 0x6e, 0x69, 0x20, 0x73, 0x75, 0x6e, 0x6f,
+0x28a, 0x73, 0x68, 0x69, 0x6c, 0xe8, 0x20, 0x6b, 0x28a, 0x73, 0x61, 0x73,
+0x28a, 0x926, 0x92a, 0x947, 0x939, 0x930, 0x93e, 0x2f, 0x938, 0x902, 0x91c, 0x93e
};
-static const char16_t currency_symbol_data[] = {
-0x42, 0x72, 0x4b, 0x73, 0x68, 0x52, 0x24, 0x4c, 0x65, 0x6b, 0xeb, 0x64, 0x65, 0x6e, 0x20ac, 0x1265, 0x122d, 0x62c, 0x2e, 0x645,
-0x2e, 0x200f, 0x62f, 0x2e, 0x62c, 0x2e, 0x200f, 0x62f, 0x2e, 0x628, 0x2e, 0x200f, 0x46, 0x43, 0x46, 0x41, 0x46, 0x64, 0x6a, 0x4e,
-0x66, 0x6b, 0x62f, 0x2e, 0x639, 0x2e, 0x200f, 0x20aa, 0x62f, 0x2e, 0x623, 0x2e, 0x200f, 0x62f, 0x2e, 0x643, 0x2e, 0x200f, 0x644, 0x2e,
-0x644, 0x2e, 0x200f, 0x62f, 0x2e, 0x644, 0x2e, 0x200f, 0x623, 0x2e, 0x645, 0x2e, 0x62f, 0x2e, 0x645, 0x2e, 0x200f, 0x631, 0x2e, 0x639,
-0x2e, 0x200f, 0x631, 0x2e, 0x642, 0x2e, 0x200f, 0x631, 0x2e, 0x633, 0x2e, 0x200f, 0x53, 0x62c, 0x2e, 0x633, 0x2e, 0x644, 0x2e, 0x633,
-0x2e, 0x200f, 0x62f, 0x2e, 0x62a, 0x2e, 0x200f, 0x62f, 0x2e, 0x625, 0x2e, 0x200f, 0x631, 0x2e, 0x64a, 0x2e, 0x200f, 0xa3, 0x58f, 0x20b9,
-0x20bc, 0x20bd, 0x9f3, 0x4e, 0x75, 0x2e, 0x43b, 0x432, 0x2e, 0x17db, 0xa5, 0x48, 0x4b, 0x24, 0x4d, 0x4f, 0x50, 0x24, 0x48, 0x52,
-0x4b, 0x4b, 0x4d, 0x4b, 0x10d, 0x6b, 0x72, 0x2e, 0x41, 0x66, 0x6c, 0x2e, 0x4e, 0x41, 0x66, 0x2e, 0x55, 0x53, 0x24, 0x46,
-0x42, 0x75, 0x44, 0x47, 0x48, 0x20b5, 0x41, 0x72, 0x52, 0x4d, 0x52, 0x73, 0x20a6, 0x20b1, 0x52, 0x46, 0x57, 0x53, 0x24, 0x53,
-0x52, 0x45, 0x54, 0x53, 0x68, 0x54, 0x24, 0x55, 0x53, 0x68, 0x41, 0x45, 0x44, 0x56, 0x54, 0x44, 0x41, 0x46, 0x43, 0x46,
-0x50, 0x46, 0x47, 0x55, 0x4d, 0x4d, 0x41, 0x44, 0x43, 0x48, 0x46, 0x4c, 0x53, 0x44, 0x54, 0x20be, 0x20b2, 0x46, 0x74, 0x49,
-0x53, 0x4b, 0x52, 0x70, 0x43, 0x41, 0x24, 0xffe5, 0x20b8, 0x441, 0x43e, 0x43c, 0x20a9, 0x4b, 0x50, 0x57, 0x20ba, 0x20ad, 0x4b, 0x7a,
-0x434, 0x435, 0x43d, 0x2e, 0x20ae, 0x43, 0x4e, 0xa5, 0x928, 0x947, 0x930, 0x942, 0x60b, 0x631, 0x6cc, 0x627, 0x644, 0x7a, 0x142, 0x200b,
-0x4d, 0x54, 0x6e, 0x44, 0x62, 0x53, 0x2f, 0x42, 0x73, 0x52, 0x4f, 0x4e, 0x20b4, 0x52, 0x53, 0x44, 0x41a, 0x41c, 0xdbb, 0xdd4,
-0x2e, 0x20a1, 0x52, 0x44, 0x24, 0x51, 0x43, 0x24, 0x42, 0x2f, 0x2e, 0x47, 0x73, 0x2e, 0x42, 0x73, 0x2e, 0x53, 0x441, 0x43e,
-0x43c, 0x2e, 0x52, 0x73, 0x2e, 0xe3f, 0x54, 0x4d, 0x54, 0x73, 0x6f, 0x2bb, 0x6d, 0x441, 0x45e, 0x43c, 0x20ab, 0x4e, 0x54, 0x24,
-0x49, 0x52, 0x52
+static constexpr char16_t currency_symbol_data[] = {
+0x20be, 0x42, 0x72, 0x46, 0x64, 0x6a, 0x4e, 0x66, 0x6b, 0x52, 0x24, 0x46,
+0x43, 0x46, 0x41, 0x47, 0x48, 0x20b5, 0x4c, 0x65, 0x6b, 0xeb, 0x20ac, 0x64,
+0x65, 0x6e, 0x1265, 0x122d, 0x62c, 0x2e, 0x645, 0x2e, 0x200f, 0x62f, 0x2e, 0x62c,
+0x2e, 0x200f, 0x62f, 0x2e, 0x628, 0x2e, 0x200f, 0x62f, 0x2e, 0x639, 0x2e, 0x200f,
+0x20aa, 0x62f, 0x2e, 0x623, 0x2e, 0x200f, 0x62f, 0x2e, 0x643, 0x2e, 0x200f, 0x644,
+0x2e, 0x644, 0x2e, 0x200f, 0x62f, 0x2e, 0x644, 0x2e, 0x200f, 0x623, 0x2e, 0x645,
+0x2e, 0x62f, 0x2e, 0x645, 0x2e, 0x200f, 0x631, 0x2e, 0x639, 0x2e, 0x200f, 0x631,
+0x2e, 0x642, 0x2e, 0x200f, 0x631, 0x2e, 0x633, 0x2e, 0x200f, 0x53, 0xa3, 0x62c,
+0x2e, 0x633, 0x2e, 0x644, 0x2e, 0x633, 0x2e, 0x200f, 0x62f, 0x2e, 0x62a, 0x2e,
+0x200f, 0x62f, 0x2e, 0x625, 0x2e, 0x200f, 0x631, 0x2e, 0x64a, 0x2e, 0x200f, 0x58f,
+0x20b9, 0x54, 0x53, 0x68, 0x20a6, 0x20bc, 0x20ba, 0x46, 0x202f, 0x43, 0x46, 0x41,
+0x9f3, 0x20bd, 0x4b, 0x4b, 0x4d, 0x41a, 0x41c, 0x43b, 0x432, 0x2e, 0x48, 0x4b,
+0x24, 0xffe5, 0x20b1, 0x55, 0x53, 0x68, 0xa5, 0x4d, 0x4f, 0x50, 0x24, 0x45,
+0x55, 0x52, 0x4b, 0x10d, 0x6b, 0x72, 0x2e, 0x783, 0x2e, 0x41, 0x66, 0x6c,
+0x2e, 0x4e, 0x41, 0x66, 0x2e, 0x4e, 0x75, 0x2e, 0x4b, 0x73, 0x68, 0x55,
+0x53, 0x24, 0x46, 0x42, 0x75, 0x44, 0x52, 0x70, 0x41, 0x72, 0x4d, 0x4b,
+0x52, 0x4d, 0x52, 0x66, 0x52, 0x73, 0x52, 0x46, 0x57, 0x53, 0x24, 0x53,
+0x52, 0x54, 0x24, 0x56, 0x54, 0x44, 0x41, 0x46, 0x43, 0x46, 0x50, 0x46,
+0x47, 0x55, 0x4d, 0x4c, 0x53, 0x44, 0x54, 0xd83a, 0xdd05, 0xd83a, 0xdd0a, 0xd83a,
+0xdd00, 0xd83a, 0xdd0a, 0xd83a, 0xdd05, 0xd83a, 0xdd0a, 0xd83a, 0xdd00, 0x20b2, 0x46, 0x74,
+0x43, 0x41, 0x24, 0x200b, 0x20b8, 0x17db, 0x51, 0x20a9, 0x43, 0x4e, 0xa5, 0x441,
+0x43e, 0x43c, 0x20ad, 0x4b, 0x7a, 0x434, 0x435, 0x43d, 0x2e, 0x4d, 0x54, 0x6e,
+0x20ae, 0x928, 0x947, 0x930, 0x942, 0x7ff, 0x60b, 0x631, 0x6cc, 0x627, 0x644, 0x7a,
+0x142, 0x44, 0x62, 0x53, 0x2f, 0x42, 0x73, 0x6c, 0x65, 0x69, 0x20b4, 0xdbb,
+0xdd4, 0x2e, 0x20a1, 0x52, 0x44, 0x24, 0x43, 0x24, 0x42, 0x2f, 0x2e, 0x47,
+0x73, 0x2e, 0x42, 0x73, 0x2e, 0x53, 0x20ab, 0x441, 0x43e, 0x43c, 0x2e, 0x52,
+0x73, 0x2e, 0x4e, 0x54, 0x24, 0xe3f, 0x73, 0x6f, 0x2bb, 0x6d, 0x441, 0x45e,
+0x43c
};
-static const char16_t currency_display_name_data[] = {
-0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x20, 0x42, 0x69, 0x72, 0x72, 0x69, 0x69, 0x53, 0x75, 0x69,
-0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53,
-0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b,
-0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72,
-0x61, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
-0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
-0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x4c, 0x65, 0x6b,
-0x75, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61, 0x72, 0x3b, 0x3b, 0x6c, 0x65, 0x6b, 0x20, 0x73, 0x68, 0x71, 0x69,
-0x70, 0x74, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x6b, 0xeb, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61,
-0x72, 0x44, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x3b, 0x3b, 0x64,
-0x65, 0x6e, 0x61, 0x72, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x65,
-0x6e, 0x61, 0x72, 0xeb, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x45, 0x75, 0x72, 0x6f, 0x6a, 0x61,
-0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb,
-0x20, 0x1265, 0x122d, 0x3b, 0x3b, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x3b, 0x3b, 0x3b, 0x3b, 0x12e8, 0x12a2,
-0x1275, 0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a,
-0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a,
-0x647, 0x627, 0x646, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x62a, 0x20, 0x645, 0x635,
-0x631, 0x64a, 0x629, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x64b, 0x627, 0x3b, 0x62c, 0x646,
-0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b,
-0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c,
-0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x646, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a,
-0x627, 0x646, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x629, 0x3b, 0x62f,
-0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x64b, 0x627, 0x3b, 0x62f, 0x64a, 0x646, 0x627,
-0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a,
-0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
-0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b,
-0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628,
-0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x641, 0x631,
-0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648,
-0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623,
-0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642,
-0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631,
-0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648,
-0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644,
-0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641,
-0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c,
-0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644,
-0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641,
-0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a,
-0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646,
-0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a,
-0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a,
-0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x646, 0x627, 0x643, 0x641,
-0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631,
-0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627,
-0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a,
-0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20,
-0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a,
-0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
-0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a,
-0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a,
-0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644,
-0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a,
-0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20,
-0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c,
-0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f,
-0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a,
-0x62f, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623,
-0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646,
-0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a,
-0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623,
-0x631, 0x62f, 0x646, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627,
-0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b,
-0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648,
-0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627,
-0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c,
-0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627,
-0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20,
-0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c,
-0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a,
-0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a,
-0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x646, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x64a,
-0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x629, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20,
-0x644, 0x64a, 0x628, 0x64a, 0x64b, 0x627, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x623, 0x648, 0x642,
-0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645,
-0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a,
-0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629,
-0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642,
-0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645,
-0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f,
-0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a,
-0x3b, 0x62f, 0x631, 0x647, 0x645, 0x627, 0x646, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x631, 0x627, 0x647,
-0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x629, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x64b, 0x627, 0x20, 0x645, 0x63a, 0x631, 0x628,
-0x64a, 0x64b, 0x627, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639,
-0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
-0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a,
-0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b,
-0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b,
-0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b,
-0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b,
-0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x631,
-0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a,
-0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648,
-0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633,
-0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x634, 0x644, 0x646, 0x20, 0x635,
-0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646,
-0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634,
-0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a,
-0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627,
-0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20,
-0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c,
-0x646, 0x64a, 0x647, 0x627, 0x62a, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627,
-0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x64b, 0x627, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646,
-0x64a, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631,
-0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633,
-0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629,
-0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x62f, 0x64a, 0x646,
-0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a,
-0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x646,
-0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x62a, 0x648, 0x646,
-0x633, 0x64a, 0x629, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x64b, 0x627, 0x3b,
-0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631,
-0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647,
-0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627,
-0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645,
-0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a,
-0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a,
-0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a,
-0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a,
-0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20,
-0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644,
-0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648,
-0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x646, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648,
-0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x62a, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648,
-0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648,
-0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627,
-0x646, 0x570, 0x561, 0x575, 0x56f, 0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x3b, 0x3b, 0x570, 0x561, 0x575, 0x56f,
-0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x3b, 0x3b, 0x3b, 0x3b, 0x570, 0x561, 0x575, 0x56f, 0x561, 0x56f, 0x561,
-0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x3b, 0x3b,
-0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x3b, 0x3b, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9f0, 0x9a4,
-0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x4d,
-0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x6d, 0x61,
-0x6e, 0x61, 0x74, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x6d,
-0x61, 0x6e, 0x61, 0x74, 0x131, 0x43c, 0x430, 0x43d, 0x430, 0x442, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x3b, 0x3b, 0x65, 0x75, 0x72,
-0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f,
-0x9be, 0x995, 0x9be, 0x3b, 0x3b, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x3b,
-0x3b, 0x3b, 0x3b, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x9ad, 0x9be, 0x9b0,
-0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0,
-0x9c1, 0x9aa, 0x9bf, 0x3b, 0x3b, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0xf51,
-0xf44, 0xf74, 0xf63, 0xf0b, 0xf40, 0xfb2, 0xf58, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75,
-0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x61, 0x20, 0x65, 0x75, 0x72, 0x6f, 0x69, 0x6f, 0xf9, 0x3b, 0x65, 0x75,
-0x72, 0x6f, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x431, 0x44a, 0x43b,
-0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x3b, 0x3b, 0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440,
-0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x430, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x20, 0x1000, 0x103b, 0x1015, 0x103a, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x20, 0x1000, 0x103b, 0x1015, 0x103a, 0x431, 0x435, 0x43b, 0x430,
-0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443,
-0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a,
-0x456, 0x44f, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x456, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x445, 0x20,
-0x440, 0x443, 0x431, 0x43b, 0x451, 0x45e, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x430, 0x433, 0x430, 0x20, 0x440,
-0x443, 0x431, 0x43b, 0x44f, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787, 0x17b6, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787, 0x17b6, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75,
-0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x73, 0x4eba, 0x6c11, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x4eba, 0x6c11, 0x5e01, 0x6e2f, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e2f, 0x5143, 0x6fb3, 0x95e8, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x6fb3, 0x95e8, 0x5143, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x6fb3,
-0x9580, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6fb3, 0x9580, 0x5143, 0x65b0, 0x53f0, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x65b0, 0x53f0, 0x5e63, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x68, 0x72,
-0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b,
-0x65, 0x20, 0x6b, 0x75, 0x6e, 0x65, 0x3b, 0x3b, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x75,
-0x6e, 0x61, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b,
-0x61, 0x3b, 0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72,
-0x6b, 0x61, 0x3b, 0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61,
-0x72, 0x6b, 0x65, 0x3b, 0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20,
-0x6d, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x61, 0x3b, 0x3b,
-0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x10d, 0x65, 0x73, 0x6b, 0xe9, 0x20,
-0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x79, 0x3b, 0x10d, 0x65, 0x73, 0x6b, 0xe9, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x79, 0x3b,
-0x10d, 0x65, 0x73, 0x6b, 0xfd, 0x63, 0x68, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b,
-0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73,
-0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20,
-0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20,
-0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74,
-0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x4e, 0x65,
-0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73,
-0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e,
-0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64,
-0x65, 0x6e, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
-0x3b, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
-0x3b, 0x3b, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
-0x3b, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x55,
-0x53, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
-0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x45, 0x61, 0x73, 0x74, 0x20, 0x43, 0x61,
-0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x45, 0x61, 0x73, 0x74,
-0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
-0x3b, 0x45, 0x61, 0x73, 0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x73, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
-0x3b, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x73, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x73,
-0x42, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x61, 0x68,
-0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x61, 0x68, 0x61,
-0x6d, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61,
-0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20,
-0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20,
-0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42,
-0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61,
-0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x64,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x73, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x50, 0x75, 0x6c, 0x61, 0x3b,
-0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x42,
-0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x73, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64,
-0x69, 0x61, 0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e,
-0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20,
-0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
-0x6e, 0x20, 0x43, 0x46, 0x41, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c,
-0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b,
-0x3b, 0x3b, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46,
-0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c,
-0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73,
-0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x3b, 0x3b, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e,
-0x64, 0x73, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e,
-0x64, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e,
-0x64, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c,
-0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72,
-0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65,
-0x61, 0x6e, 0x20, 0x4e, 0x61, 0x6b, 0x66, 0x61, 0x3b, 0x3b, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x6e,
-0x61, 0x6b, 0x66, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x6e, 0x61, 0x6b,
-0x66, 0x61, 0x73, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20,
-0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61,
-0x6e, 0x64, 0x73, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e,
-0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x46, 0x69, 0x6a, 0x69,
-0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x73, 0x55, 0x4b, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x55, 0x4b, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64,
-0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x4b, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e,
-0x20, 0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x3b, 0x3b, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x61, 0x6c,
-0x61, 0x73, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x61, 0x6c, 0x61, 0x73,
-0x69, 0x73, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69, 0x61, 0x6e, 0x20, 0x43, 0x65, 0x64, 0x69, 0x3b, 0x3b, 0x47, 0x68, 0x61,
-0x6e, 0x61, 0x69, 0x61, 0x6e, 0x20, 0x63, 0x65, 0x64, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69,
-0x61, 0x6e, 0x20, 0x63, 0x65, 0x64, 0x69, 0x73, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x20, 0x50, 0x6f,
-0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64,
-0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73,
-0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x47, 0x75,
-0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x75,
-0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x48, 0x6f, 0x6e, 0x67, 0x20,
-0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f,
-0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f,
-0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70,
-0x65, 0x65, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b,
-0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x69,
-0x20, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x68, 0x65, 0x6b, 0x65, 0x6c, 0x3b, 0x3b, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x69,
-0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x68, 0x65, 0x6b, 0x65, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x73, 0x72, 0x61, 0x65,
-0x6c, 0x69, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x68, 0x65, 0x6b, 0x65, 0x6c, 0x73, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63,
-0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20,
-0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e,
-0x67, 0x3b, 0x3b, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b,
-0x3b, 0x3b, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x53, 0x6f,
-0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f,
-0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b,
-0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x4c, 0x69,
-0x62, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4c, 0x69, 0x62, 0x65, 0x72,
-0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69,
-0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50,
-0x61, 0x74, 0x61, 0x63, 0x61, 0x3b, 0x3b, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x61, 0x74, 0x61,
-0x63, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x61, 0x74, 0x61, 0x63,
-0x61, 0x73, 0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x20, 0x41, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x4d,
-0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x20, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61,
-0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x20, 0x61, 0x72, 0x69, 0x61, 0x72, 0x69, 0x65, 0x73, 0x4d, 0x61, 0x6c, 0x61, 0x77,
-0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e,
-0x20, 0x6b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e, 0x20,
-0x6b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x73, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x69, 0x6e,
-0x67, 0x67, 0x69, 0x74, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x6e, 0x67,
-0x67, 0x69, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x6e,
-0x67, 0x67, 0x69, 0x74, 0x73, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65,
-0x3b, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x4e, 0x61, 0x6d,
-0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69,
-0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61,
-0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x4e, 0x61,
-0x69, 0x72, 0x61, 0x3b, 0x3b, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x61, 0x69, 0x72, 0x61, 0x3b,
-0x3b, 0x3b, 0x3b, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x61, 0x69, 0x72, 0x61, 0x73, 0x50, 0x61,
-0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73,
-0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74,
-0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20,
-0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x4b, 0x69, 0x6e, 0x61, 0x3b, 0x3b, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20,
-0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6b, 0x69, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b,
-0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6b, 0x69,
-0x6e, 0x61, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x69, 0x73, 0x6f, 0x3b, 0x3b, 0x50,
-0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x68,
-0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x73, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61,
-0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73,
-0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x54, 0x61, 0x6c, 0x61, 0x3b, 0x3b, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20,
-0x74, 0x61, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x74, 0x61, 0x6c, 0x61, 0x53,
-0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x53, 0x65,
-0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x53,
-0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x53, 0x69, 0x65,
-0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x53,
-0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x3b,
-0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6c, 0x65,
-0x6f, 0x6e, 0x65, 0x73, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x3b, 0x3b, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
-0x3b, 0x3b, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x53,
-0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x3b, 0x3b, 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x64,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c,
-0x61, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e,
-0x61, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x70,
-0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x70, 0x6f,
-0x75, 0x6e, 0x64, 0x73, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b,
-0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75,
-0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x4c,
-0x69, 0x6c, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x69, 0x3b, 0x3b, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x6c, 0x69, 0x6c, 0x61,
-0x6e, 0x67, 0x65, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x65, 0x6d, 0x61, 0x6c, 0x61,
-0x6e, 0x67, 0x65, 0x6e, 0x69, 0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b,
-0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x77, 0x65,
-0x64, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x46, 0x72, 0x61,
-0x6e, 0x63, 0x3b, 0x3b, 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x53,
-0x77, 0x69, 0x73, 0x73, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x6e,
-0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x6e,
-0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69,
-0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x50,
-0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x3b, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x70, 0x61, 0x2bb, 0x61, 0x6e,
-0x67, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x70, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61,
-0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x44, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62,
-0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64,
-0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x55,
-0x67, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x55, 0x67, 0x61,
-0x6e, 0x64, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x67, 0x61,
-0x6e, 0x64, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64,
-0x20, 0x41, 0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x44, 0x69, 0x72, 0x68, 0x61,
-0x6d, 0x3b, 0x3b, 0x55, 0x41, 0x45, 0x20, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x41, 0x45,
-0x20, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x73, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x50, 0x6f, 0x75, 0x6e,
-0x64, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b,
-0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74,
-0x75, 0x20, 0x56, 0x61, 0x74, 0x75, 0x3b, 0x3b, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x74, 0x75,
-0x3b, 0x3b, 0x3b, 0x3b, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x74, 0x75, 0x73, 0x5a, 0x61, 0x6d,
-0x62, 0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e,
-0x20, 0x6b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x6b,
-0x77, 0x61, 0x63, 0x68, 0x61, 0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65,
-0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65,
-0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75,
-0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c,
-0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x47, 0x75, 0x69, 0x6c, 0x64,
-0x65, 0x72, 0x3b, 0x3b, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69,
-0x6c, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x74,
-0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x67,
-0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b,
-0x3b, 0x65, 0x75, 0x72, 0x6f, 0x74, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x64,
-0x6f, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x61,
-0x72, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b,
-0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65,
-0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b,
-0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x73, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e,
-0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x20, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x62, 0x75,
-0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x62, 0x75,
-0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45,
-0x41, 0x43, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43,
-0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41,
-0x43, 0x29, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x20, 0x63, 0x6f, 0x6d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6d,
-0x6f, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6f,
-0x72, 0x69, 0x65, 0x6e, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73,
-0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x3b,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x73, 0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43,
-0x46, 0x50, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x50, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x50, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e,
-0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x66,
-0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x73, 0x67, 0x6f, 0x75, 0x72, 0x64, 0x65,
-0x20, 0x68, 0x61, 0xef, 0x74, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x67, 0x6f, 0x75, 0x72, 0x64, 0x65, 0x20, 0x68,
-0x61, 0xef, 0x74, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x6f, 0x75, 0x72, 0x64, 0x65, 0x73, 0x20,
-0x68, 0x61, 0xef, 0x74, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x61, 0x6c,
-0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63,
-0x68, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x73, 0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63,
-0x68, 0x65, 0x73, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69,
-0x65, 0x6e, 0x3b, 0x3b, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e,
-0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x75, 0x72,
-0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x6e, 0x73, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69,
-0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69,
-0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6d, 0x61,
-0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x20, 0x6d, 0x61, 0x72,
-0x6f, 0x63, 0x61, 0x69, 0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61,
-0x69, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x73, 0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61,
-0x69, 0x6e, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x66,
-0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x73, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x64,
-0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69,
-0x65, 0x20, 0x64, 0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x3b, 0x3b, 0x3b, 0x3b,
-0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x73, 0x20, 0x64, 0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c,
-0x65, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e,
-0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x73,
-0x75, 0x69, 0x73, 0x73, 0x65, 0x73, 0x6c, 0x69, 0x76, 0x72, 0x65, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65,
-0x3b, 0x3b, 0x6c, 0x69, 0x76, 0x72, 0x65, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b,
-0x6c, 0x69, 0x76, 0x72, 0x65, 0x73, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x64, 0x69, 0x6e, 0x61,
-0x72, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x74, 0x75,
-0x6e, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x20, 0x74, 0x75, 0x6e,
-0x69, 0x73, 0x69, 0x65, 0x6e, 0x73, 0x76, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e,
-0x3b, 0x3b, 0x76, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b,
-0x76, 0x61, 0x74, 0x75, 0x73, 0x20, 0x76, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e, 0x73, 0x50, 0x75, 0x6e, 0x6e,
-0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x6e, 0x64, 0x20,
-0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73,
-0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x70, 0x75, 0x69, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x68, 0x61, 0x73, 0x61, 0x6e,
-0x6e, 0x61, 0x63, 0x68, 0x3b, 0x3b, 0x70, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63,
-0x68, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3,
-0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x3b, 0x3b, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x20, 0x10da,
-0x10d0, 0x10e0, 0x10d8, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72,
-0x6f, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b,
-0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b, 0x3b,
-0x3b, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x395, 0x3c5,
-0x3c1, 0x3ce, 0x3b, 0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x64, 0x61, 0x6e, 0x6d,
-0x61, 0x72, 0x6b, 0x69, 0x6d, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x64, 0x61, 0x6e,
-0x73, 0x6b, 0x69, 0x6e, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x61,
-0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6d, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0xaad, 0xabe, 0xab0,
-0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf, 0xaaf, 0xabe, 0x3b, 0x3b, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0,
-0xac2, 0xaaa, 0xabf, 0xaaf, 0xabe, 0x3b, 0x3b, 0x3b, 0x3b, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf,
-0xaaf, 0xabe, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x72, 0x20, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x4e,
-0x61, 0x69, 0x72, 0x61, 0x72, 0x20, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61,
-0x69, 0x72, 0x6f, 0x72, 0x69, 0x6e, 0x20, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x4b, 0x75, 0x257, 0x69, 0x6e,
-0x20, 0x53, 0x65, 0x66, 0x61, 0x20, 0x6e, 0x61, 0x20, 0x41, 0x66, 0x69, 0x72, 0x6b, 0x61, 0x20, 0x54, 0x61, 0x20, 0x59,
-0x61, 0x6d, 0x6d, 0x61, 0x5e9, 0x5e7, 0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x3b, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9,
-0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20,
-0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x92d, 0x93e, 0x930,
-0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941,
-0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x90f, 0x6d, 0x61,
-0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b, 0x3b, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20,
-0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72,
-0x69, 0x6e, 0x74, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0xed, 0x73,
-0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e,
-0x73, 0x6b, 0x61, 0x72, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x20, 0x49, 0x6e,
-0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x20,
-0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x50,
-0x75, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x74,
-0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65,
-0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69,
-0x6e, 0x67, 0x3b, 0x62, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x70,
-0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20,
-0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x76, 0x69,
-0x7a, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x69, 0x20, 0x73, 0x76, 0x69,
-0x7a, 0x7a, 0x65, 0x72, 0x69, 0x65e5, 0x672c, 0x5186, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5186, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0,
-0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf, 0x3b, 0x3b, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa,
-0xcbe, 0xcaf, 0xcbf, 0x3b, 0x3b, 0x3b, 0x3b, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf,
-0xc97, 0xcb3, 0xcc1, 0x6c1, 0x650, 0x646, 0x62f, 0x64f, 0x633, 0x62a, 0x672, 0x646, 0x6cd, 0x20, 0x631, 0x6c4, 0x67e, 0x64e, 0x6d2, 0x49a,
-0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435, 0x441, 0x456, 0x3b, 0x3b, 0x49a, 0x430,
-0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435, 0x441, 0x456, 0x3b, 0x3b, 0x3b, 0x3b, 0x49a,
-0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435, 0x441, 0x456, 0x41a, 0x44b, 0x440, 0x433,
-0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0x3b, 0x3b, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441,
-0x442, 0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0x3b, 0x3b, 0x3b, 0x3b, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442,
-0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xb300,
-0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0xc870, 0xc120, 0x20, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0x20, 0xc778, 0xbbfc, 0x20, 0xacf5, 0xd654, 0xad6d, 0x20,
-0xc6d0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xc870, 0xc120, 0x20, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0x20, 0xc778, 0xbbfc, 0x20, 0xacf5, 0xd654,
-0xad6d, 0x20, 0xc6d0, 0x49, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x72, 0x79, 0x2019, 0x55, 0x62, 0x75, 0x72, 0x75,
-0x6e, 0x64, 0x69, 0xea5, 0xeb2, 0xea7, 0x20, 0xe81, 0xeb5, 0xe9a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xea5, 0xeb2, 0xea7, 0x20,
-0xe81, 0xeb5, 0xe9a, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x3b,
-0x3b, 0x65, 0x69, 0x72, 0x6f, 0x46, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67,
-0xf3, 0x4b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x79, 0x61, 0x20, 0x41, 0x6e, 0x67, 0xf3, 0x6c, 0x61, 0x46, 0x61, 0x6c,
-0xe1, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43, 0x45, 0x75, 0x72, 0x61, 0x73, 0x3b, 0x3b,
-0x65, 0x75, 0x72, 0x61, 0x73, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x69, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75,
-0x72, 0x173, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x3b, 0x3b,
-0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x3b, 0x3b,
-0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x438, 0x52, 0x69, 0x6e,
-0x67, 0x67, 0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52,
-0x69, 0x6e, 0x67, 0x67, 0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x44, 0x6f, 0x6c, 0x61, 0x72,
-0x20, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x42,
-0x72, 0x75, 0x6e, 0x65, 0x69, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72,
-0x61, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f,
-0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a,
-0x65, 0x77, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x65, 0x77, 0x72,
-0x6f, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x54, 0x101, 0x72, 0x61, 0x20, 0x6f, 0x20, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f,
-0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x74, 0x101, 0x72, 0x61, 0x20, 0x6f, 0x20, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72,
-0x6f, 0x61, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924,
-0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930,
-0x941, 0x92a, 0x92f, 0x947, 0x41c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x20, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x3b, 0x3b, 0x41c,
-0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x20, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x3b, 0x3b, 0x3b, 0x3b, 0x41c, 0x43e, 0x43d, 0x433,
-0x43e, 0x43b, 0x20, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948,
-0x92f, 0x93e, 0x901, 0x3b, 0x3b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x3b,
-0x3b, 0x3b, 0x3b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x92d, 0x93e, 0x930,
-0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20,
-0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942,
-0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x3b,
-0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b,
-0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e,
-0x3b, 0x3b, 0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e, 0x3b, 0x3b, 0x3b, 0x3b, 0xb2d, 0xb3e,
-0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x3b, 0x627, 0x641,
-0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627,
-0x646, 0x6cd, 0x20, 0x6a9, 0x644, 0x62f, 0x627, 0x631, 0x647, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20,
-0x6a9, 0x644, 0x62f, 0x627, 0x631, 0x647, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20, 0x6a9,
-0x644, 0x62f, 0x627, 0x631, 0x6d2, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x3b, 0x631, 0x6cc, 0x627,
-0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627,
-0x646, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x3b, 0x3b, 0x627,
-0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x627,
-0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x7a, 0x142, 0x6f, 0x74, 0x79,
-0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b,
-0x69, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x65, 0x3b, 0x7a, 0x142, 0x6f,
-0x74, 0x79, 0x63, 0x68, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x63, 0x68, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x65, 0x67,
-0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x65, 0x67, 0x6f, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73,
-0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65,
-0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x69, 0x73, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65,
-0x69, 0x72, 0x6f, 0x73, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b,
-0x3b, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
-0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x73, 0x65, 0x73, 0x63,
-0x75, 0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x65,
-0x73, 0x63, 0x75, 0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x3b,
-0x3b, 0x3b, 0x3b, 0x65, 0x73, 0x63, 0x75, 0x64, 0x6f, 0x73, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x64,
-0x69, 0x61, 0x6e, 0x6f, 0x73, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64,
-0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x73,
-0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x64,
-0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55,
-0x6e, 0x69, 0x64, 0x6f, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41,
-0x43, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43,
-0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45,
-0x41, 0x43, 0x29, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f,
-0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f,
-0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43,
-0x45, 0x41, 0x4f, 0x29, 0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x3b,
-0x3b, 0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b,
-0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x6d, 0x65, 0x74,
-0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x6d, 0x65,
-0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b,
-0x3b, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e,
-0x6f, 0x73, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20,
-0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x3b, 0x3b, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x20, 0x64, 0x65,
-0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65,
-0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x73, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f,
-0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20,
-0x73, 0x75, 0xed, 0xe7, 0x6f, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x75, 0xed, 0xe7, 0x6f, 0x3b,
-0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x73, 0x75, 0xed, 0xe7, 0x6f, 0x73, 0xa2d, 0xa3e, 0xa30,
-0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa07, 0xa06, 0x3b, 0x3b, 0xa2d, 0xa3e, 0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa07,
-0xa06, 0x3b, 0x3b, 0x3b, 0x3b, 0xa2d, 0xa3e, 0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa0f, 0x631, 0x648, 0x67e, 0x626, 0x6cc,
-0x6c1, 0x53, 0x6f, 0x6c, 0x20, 0x50, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f,
-0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x44, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0xf3, 0x6c, 0x61, 0x72, 0x20,
-0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a,
-0x65, 0x72, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x3b, 0x3b, 0x3b,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x6c, 0x65, 0x75, 0x20, 0x72, 0x6f,
-0x6d, 0xe2, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x75, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x73, 0x63,
-0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x3b, 0x6c, 0x65, 0x69,
-0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x6c, 0x65, 0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76,
-0x65, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65,
-0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69,
-0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x440, 0x43e,
-0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x440, 0x43e, 0x441, 0x441,
-0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439,
-0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438,
-0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x435, 0x439, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x43e, 0x433, 0x43e,
-0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443,
-0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431,
-0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b,
-0x44f, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x435, 0x439,
-0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x43a,
-0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x3b, 0x43a, 0x430, 0x437, 0x430,
-0x445, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a,
-0x438, 0x445, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x442,
-0x435, 0x43d, 0x433, 0x435, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x442, 0x435, 0x43d, 0x433,
-0x435, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x43a, 0x438, 0x440,
-0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441,
-0x43a, 0x438, 0x445, 0x20, 0x441, 0x43e, 0x43c, 0x430, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x445, 0x20,
-0x441, 0x43e, 0x43c, 0x43e, 0x432, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x441, 0x43e,
-0x43c, 0x430, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439, 0x3b, 0x3b, 0x43c, 0x43e,
-0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439, 0x3b, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432,
-0x441, 0x43a, 0x438, 0x445, 0x20, 0x43b, 0x435, 0x44f, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x445, 0x20,
-0x43b, 0x435, 0x435, 0x432, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x43b, 0x435, 0x44f,
-0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x430, 0x3b, 0x3b, 0x443,
-0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x430, 0x3b, 0x3b, 0x443, 0x43a,
-0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x438, 0x435, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44b, 0x3b, 0x443, 0x43a, 0x440, 0x430,
-0x438, 0x43d, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d,
-0x441, 0x43a, 0x43e, 0x439, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44b, 0x66, 0x61, 0x72, 0xe2, 0x6e, 0x67, 0x61, 0x20, 0x43,
-0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x421, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430,
-0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f,
-0x441, 0x43a, 0x430, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x445, 0x20,
-0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65,
-0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e,
-0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65,
-0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62,
-0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f,
-0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x65, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72,
-0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e,
-0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x6f,
-0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x45,
-0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x3b, 0x65, 0x76, 0x72,
-0x61, 0x53, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b,
-0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x61, 0x20, 0x64, 0x69, 0x6e, 0x61,
-0x72, 0x61, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x68, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x61, 0x411, 0x43e,
-0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20,
-0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b,
-0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447,
-0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440,
-0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e,
-0x432, 0x430, 0x447, 0x43a, 0x435, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x435, 0x20,
-0x43c, 0x430, 0x440, 0x43a, 0x65, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446,
-0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438,
-0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430, 0x415, 0x432, 0x440, 0x43e, 0x3b, 0x3b, 0x435, 0x432, 0x440,
-0x43e, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x430, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x430, 0x41b, 0x430, 0x440, 0x3b, 0x3b, 0x43b, 0x430,
-0x440, 0x3b, 0x3b, 0x3b, 0x3b, 0x43b, 0x430, 0x440, 0x44b, 0x421, 0x43e, 0x43c, 0x3b, 0x3b, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x3b,
-0x3b, 0x441, 0x43e, 0x43c, 0x44b, 0x44, 0x6f, 0x72, 0x61, 0x20, 0x72, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61,
-0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x64a, 0x20, 0x631, 0x67e, 0x64a, 0x3b, 0x3b, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627,
-0x646, 0x64a, 0x20, 0x631, 0x67e, 0x64a, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x64a, 0x20, 0x631,
-0x67e, 0x64a, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x3b,
-0x3b, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x3b, 0x3b,
-0x3b, 0x3b, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x65,
-0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0xe1, 0x3b, 0x65, 0x75, 0x72, 0x61,
-0x3b, 0x65, 0x75, 0x72, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b,
-0x65, 0x76, 0x72, 0x69, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x76, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61,
-0x20, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x20, 0x4a, 0x61, 0x62,
-0x75, 0x75, 0x74, 0x69, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x6b, 0x61, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74,
-0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x6b, 0x61, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69,
-0x42, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x62, 0x69, 0x72,
-0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x69, 0x72, 0x74,
-0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61,
-0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65,
-0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65, 0x6e,
-0x79, 0x61, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65,
-0x73, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f,
-0x73, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x73, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x62, 0x65,
-0x6c, 0x69, 0x63, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65,
-0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65,
-0xf1, 0x6f, 0x73, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69,
-0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x73, 0x72, 0x65, 0x61,
-0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72,
-0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x72, 0x65, 0x61, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x72,
-0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x73, 0x50, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f,
-0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65,
-0x73, 0x6f, 0x73, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c,
-0x6f, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62,
-0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62,
-0x69, 0x61, 0x6e, 0x6f, 0x73, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63,
-0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69,
-0x63, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x73,
-0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x75, 0x62, 0x61,
-0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70,
-0x65, 0x73, 0x6f, 0x73, 0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d,
-0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69,
-0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69,
-0x63, 0x61, 0x6e, 0x6f, 0x73, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69,
-0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75,
-0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x65,
-0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f,
-0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72,
-0x61, 0x6c, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e,
-0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x43, 0x65,
-0x6e, 0x74, 0x72, 0x61, 0x6c, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61,
-0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x65, 0x73, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72,
-0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61,
-0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72,
-0x61, 0x73, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65,
-0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e,
-0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x73,
-0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65,
-0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e,
-0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x73, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72,
-0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d,
-0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f,
-0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x73, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f,
-0x73, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b,
-0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x3b,
-0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x65, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f,
-0x73, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65,
-0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x6f, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61,
-0x6e, 0x6f, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65,
-0x73, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73,
-0x20, 0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75,
-0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b,
-0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73, 0x62, 0x6f, 0x6c,
-0xed, 0x76, 0x61, 0x72, 0x20, 0x73, 0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76,
-0x61, 0x72, 0x20, 0x73, 0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76,
-0x61, 0x72, 0x65, 0x73, 0x20, 0x73, 0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x73, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e,
-0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c,
-0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b,
-0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x7a, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61,
-0x46, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x3b, 0x66, 0x61,
-0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61,
-0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x7a, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e,
-0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67,
-0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e,
-0x67, 0x69, 0x20, 0x7a, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
-0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
-0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67,
-0x69, 0x20, 0x7a, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72,
-0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b,
-0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x421, 0x43e, 0x43c, 0x43e, 0x43d,
-0x4e3, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20,
-0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf,
-0xbcd, 0x3b, 0x3b, 0x3b, 0x3b, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0xb95, 0xbb3,
-0xbcd, 0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0x3b, 0x3b,
-0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0x3b, 0x3b, 0x3b,
-0x3b, 0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0xb95, 0xbb3,
-0xbcd, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0x3b, 0x3b,
-0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0x3b, 0x3b, 0x3b,
-0x3b, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0xb95, 0xbb3,
-0xbcd, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0xb87, 0xbb2, 0xb99, 0xbcd,
-0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0x3b, 0x3b, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x20,
-0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x44f, 0x20, 0x441, 0x443, 0x43c, 0x44b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x441, 0x443, 0x43c, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc3f, 0x3b, 0x3b, 0xc30, 0xc42, 0xc2a,
-0xc3e, 0xc2f, 0xc3f, 0x3b, 0x3b, 0x3b, 0x3b, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc32, 0xc41, 0xe1a, 0xe32, 0xe17, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0xe1a, 0xe32, 0xe17, 0xe44, 0xe17, 0xe22, 0xf61, 0xf74, 0xf0b, 0xf68, 0xf53, 0xf0b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42,
-0xf62, 0xf0b, 0xf66, 0xf92, 0xf7c, 0xf62, 0xf0b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61, 0x74,
-0x6f, 0x6e, 0x67, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x66, 0x61,
-0x6b, 0x61, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0xfc, 0x72, 0x6b, 0x20, 0x4c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x3b, 0x3b,
-0x54, 0xfc, 0x72, 0x6b, 0x20, 0x6c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0xfc, 0x72, 0x6b, 0x20,
-0x6c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x54, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79,
-0x3b, 0x3b, 0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x3b, 0x3b, 0x3b, 0x3b,
-0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20,
-0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x3b, 0x3b, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x3b, 0x3b,
-0x3b, 0x3b, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x443, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441,
-0x44c, 0x43a, 0x430, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b,
-0x433, 0x440, 0x438, 0x432, 0x43d, 0x456, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d,
-0x456, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9,
-0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a,
-0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc,
-0x6c1, 0x3b, 0x3b, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x628,
-0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6d2, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f,
-0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x3b, 0x3b, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e,
-0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f,
-0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e,
-0x43c, 0x3b, 0x3b, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x3b, 0x3b, 0x3b,
-0x3b, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x110, 0x1ed3, 0x6e, 0x67, 0x20,
-0x56, 0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x110, 0x1ed3, 0x6e, 0x67, 0x20, 0x56,
-0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x50, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b,
-0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x62, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72,
-0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x62, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70,
-0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79,
-0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61,
-0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x62, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x20, 0x53, 0x6f, 0x77, 0x77,
-0x75, 0x2d, 0x6a, 0x61, 0x6e, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46,
-0x41, 0x20, 0x79, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x20, 0x53, 0x6f, 0x77, 0x77, 0x75, 0x2d, 0x6a, 0x61, 0x6e,
-0x74, 0x69, 0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x79, 0x61, 0x73, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41,
-0x66, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x69, 0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x59, 0x61, 0x73, 0x65, 0x4d, 0x7a,
-0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x69, 0x52, 0x61, 0x6e, 0x64,
-0x69, 0x20, 0x79, 0x61, 0x73, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x4e,
-0xe1, 0xec, 0x72, 0xe0, 0x20, 0x74, 0x69, 0x20, 0x4f, 0x72, 0xed, 0x6c, 0x1eb9, 0x300, 0x2d, 0xe8, 0x64, 0xe8, 0x20, 0x4e,
-0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0xe1, 0xed, 0x72, 0xe0, 0x20, 0x4e,
-0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x20, 0x74, 0x69, 0x20, 0x4f, 0x72,
-0xed, 0x6c, 0x25b, 0x301, 0xe8, 0x64, 0x65, 0x20, 0x42, 0x49, 0x4b, 0x45, 0x41, 0x4f, 0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74,
-0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x69, 0x2d, 0x53, 0x6f,
-0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b,
-0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64,
-0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61,
-0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61,
-0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d,
-0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72,
-0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76,
-0x61, 0x10d, 0x6b, 0x65, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d,
-0x61, 0x72, 0x6b, 0x65, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67,
-0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e,
-0x69, 0x68, 0x20, 0x6d, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x41a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b,
-0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445,
-0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438,
-0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a,
-0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x435, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435,
-0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x435, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x435, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430,
-0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a,
-0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430,
-0x47, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x53, 0x69, 0x64, 0x69, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a,
-0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e,
-0x4e, 0x61, 0x1ecb, 0x72, 0x61, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79,
-0x61, 0x67, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x3b, 0x3b, 0x67, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x73,
-0x69, 0x256, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x263, 0x65, 0x74,
-0x6f, 0x256, 0x6f, 0x66, 0x65, 0x20, 0x61, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66,
-0x72, 0x61, 0x6e, 0x63, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x263, 0x65, 0x74, 0x6f, 0x256, 0x6f, 0x66, 0x65,
-0x20, 0x61, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20,
-0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x263, 0x65, 0x74, 0x6f, 0x256, 0x6f, 0x66, 0x65, 0x20, 0x61, 0x66,
-0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x42, 0x43, 0x45,
-0x41, 0x4f, 0x50, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x3b,
-0x3b, 0x70, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x3b,
-0x3b, 0x3b, 0x70, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x53,
-0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x3b, 0x53, 0x63, 0x68,
-0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63, 0x68,
-0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e,
-0x6f, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x6e, 0x6f,
-0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67,
-0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72,
-0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e,
-0x6f, 0x3b, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x72,
-0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x75, 0x20,
-0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x69, 0x20, 0x53,
-0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x45, 0x41, 0x43, 0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x20, 0x47, 0x61, 0x6d,
-0x6d, 0x62, 0x69, 0x44, 0x6f, 0x6c, 0x61, 0x61, 0x72, 0x20, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x55,
-0x67, 0x69, 0x79, 0x79, 0x61, 0x20, 0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x4e, 0x61, 0x79, 0x72, 0x61, 0x61,
-0x20, 0x4e, 0x69, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x4c, 0x65, 0x77, 0x6f, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72,
-0x61, 0x61, 0x20, 0x4c, 0x69, 0x79, 0x6f, 0x6e, 0x43, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b,
-0x65, 0x6e, 0x79, 0x61, 0x4e, 0x6a, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x65, 0x6c, 0x20, 0x4b, 0x65, 0x6e,
-0x79, 0x61, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69,
-0x71, 0x75, 0x65, 0x44, 0x6f, 0x6c, 0x61, 0x20, 0x79, 0x61, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61,
-0x68, 0x65, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x73, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x2d30, 0x2d37,
-0x2d54, 0x2d49, 0x2d4e, 0x20, 0x2d4f, 0x20, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x61, 0x64, 0x72, 0x69, 0x6d, 0x20, 0x6e, 0x20,
-0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x41, 0x7a, 0x7a, 0x61, 0x79, 0x72, 0x69,
-0x3b, 0x3b, 0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x6e, 0x20, 0x5a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x3b, 0x3b,
-0x3b, 0x49, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x65, 0x6e, 0x20, 0x6e, 0x20, 0x5a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x45, 0x73,
-0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x53, 0x68, 0x69,
-0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x73,
-0x65, 0x66, 0x61, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x55, 0x53, 0x20, 0x13a0,
-0x13d5, 0x13b3, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x13a0, 0x13d5, 0x13b3, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x13a0, 0x13d5, 0x13b3,
-0x72, 0x6f, 0x75, 0x70, 0x69, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x53, 0x68, 0x69, 0x6c, 0xed, 0x69,
-0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0xed, 0x61, 0x53, 0x69, 0x6c, 0x69,
-0x6e, 0x67, 0x69, 0x20, 0x65, 0x79, 0x61, 0x20, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x53, 0x6b, 0x75, 0x64, 0x75,
-0x20, 0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53,
-0x6b, 0x75, 0x64, 0x75, 0x20, 0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x53, 0x69, 0x6c,
-0x69, 0x6e, 0x67, 0x69, 0x74, 0x61, 0x62, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4e, 0x61, 0x6d, 0x69,
-0x62, 0x69, 0x61, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x69, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e,
-0xed, 0x20, 0x65, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20,
-0x65, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x53, 0x69, 0x72, 0x69, 0x6e, 0x6a, 0x69, 0x20, 0x79, 0x61,
-0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61,
-0x6e, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x41, 0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b,
-0x2019, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x41, 0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f,
-0x6b, 0x2019, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x43, 0x46, 0x41, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43,
-0x45, 0x41, 0x4f, 0x29, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61,
-0x44, 0x65, 0x72, 0x68, 0x65, 0x6d, 0x20, 0x55, 0x6d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x69, 0x930, 0x93e, 0x902, 0x420, 0x43e,
-0x441, 0x441, 0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x43d, 0x20, 0x441,
-0x43e, 0x43c, 0x3b, 0x3b, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x44c, 0x43c, 0x430, 0x448,
-0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x439, 0x441, 0x43a, 0x457, 0x439, 0x20, 0x440, 0xa64b, 0x301, 0x431, 0x43b, 0x44c, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x439, 0x441, 0x43a, 0x430, 0x433, 0x461, 0x20, 0x440, 0xa64b, 0x431,
-0x43b, 0x467, 0x300, 0x4e, 0x66, 0x61, 0x6c, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75,
-0x43, 0x46, 0x41, 0x20, 0x46, 0xe0, 0x6c, 0xe2, 0x14b, 0x20, 0x42, 0x45, 0x41, 0x43, 0x46, 0x72, 0x1ce, 0x14b, 0x20, 0x43,
-0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x73, 0x65, 0x65, 0x66, 0x61, 0x20, 0x79, 0x61, 0x74, 0x69, 0x20,
-0x42, 0x43, 0x45, 0x41, 0x4f, 0x46, 0x259, 0x6c, 0xe1, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43,
-0x29, 0x66, 0x72, 0xe1, 0x14b, 0x73, 0x6f, 0x6c, 0x61, 0x69, 0x20, 0x42, 0x45, 0x41, 0x43, 0x46, 0x72, 0x61, 0x14b, 0x20,
-0x43, 0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b, 0x439, 0x430, 0x20, 0x441, 0x43e,
-0x43b, 0x43a, 0x443, 0x43e, 0x431, 0x430, 0x439, 0x430, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b,
-0x44b, 0x439, 0x430, 0x20, 0x441, 0x43e, 0x43b, 0x43a, 0x443, 0x43e, 0x431, 0x430, 0x439, 0x430, 0x49, 0x68, 0x65, 0x6c, 0x61, 0x20,
-0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x20, 0xa55c, 0xa55e, 0xa54c,
-0x4c, 0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x20, 0x44, 0x61, 0x6c, 0x61, 0x46, 0x25b, 0x6c, 0xe2, 0x14b, 0x73, 0x68,
-0x69, 0x72, 0xe8, 0x66, 0x65, 0x6c, 0xe1, 0x14b, 0x20, 0x43, 0x46, 0x41, 0xd804, 0xdd1d, 0xd804, 0xdd01, 0xd804, 0xdd23, 0xd804, 0xdd18,
-0xd804, 0xdd2c, 0xd804, 0xdd25, 0xd804, 0xdd28, 0x20, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd0b, 0x3b, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd01, 0xd804,
-0xdd23, 0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd25, 0xd804, 0xdd28, 0x20, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd0b, 0x3b, 0x3b, 0x3b, 0x3b,
-0xd804, 0xdd1d, 0xd804, 0xdd01, 0xd804, 0xdd23, 0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd25, 0xd804, 0xdd28, 0x20, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804,
-0xdd0b, 0xd804, 0xdd03, 0xd804, 0xdd28, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd20, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x20,
-0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd28, 0x3b, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd28, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0xd804, 0xdd18,
-0xd804, 0xdd28, 0xd804, 0xdd20, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd28, 0x3b, 0x3b, 0x3b,
-0x3b, 0xd804, 0xdd03, 0xd804, 0xdd28, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd20, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x20,
-0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd28, 0x62f, 0x6cc, 0x646, 0x627, 0x631, 0x6cc, 0x20, 0x639, 0x6ce, 0x631, 0x627, 0x642,
-0x6cc, 0x695, 0x6cc, 0x627, 0x6b5, 0x6cc, 0x20, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0x6cc, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65,
-0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x65,
-0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x6a, 0x3b, 0x65, 0x75, 0x72, 0x61,
-0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x77, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x6e2f, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x6e2f, 0x5e63, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x69, 0x73, 0x6f, 0x3b, 0x3b,
-0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d,
-0x67, 0x61, 0x20, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f
+static constexpr char16_t currency_display_name_data[] = {
+0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61,
+0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x69,
+0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x43, 0x46, 0x41, 0x20, 0x46, 0xe0, 0x6c, 0xe2, 0x14b, 0x20, 0x42, 0x45,
+0x41, 0x43, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x53, 0x69, 0x64, 0x69,
+0x46, 0x72, 0xe2, 0x6e, 0x6b, 0x65, 0x20, 0x43, 0x46, 0x41, 0x4c, 0x65,
+0x6b, 0x75, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61, 0x72, 0x45,
+0x75, 0x72, 0x6f, 0x6a, 0x61, 0x44, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x20,
+0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x12e8, 0x12a2, 0x1275,
+0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645,
+0x635, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627,
+0x626, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631,
+0x64a, 0x646, 0x64a, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20,
+0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c,
+0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x641, 0x631, 0x646, 0x643,
+0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x646, 0x627, 0x643, 0x641, 0x627,
+0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631,
+0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625,
+0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f,
+0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x62f,
+0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x62c, 0x646,
+0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x62f, 0x64a, 0x646,
+0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x623, 0x648, 0x642, 0x64a, 0x629,
+0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x62f, 0x631,
+0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x631, 0x64a, 0x627, 0x644,
+0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642,
+0x637, 0x631, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f,
+0x64a, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x62c,
+0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633,
+0x648, 0x62f, 0x627, 0x646, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f,
+0x627, 0x646, 0x64a, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a,
+0x629, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a,
+0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a,
+0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x65, 0x75, 0x72,
+0x6f, 0x570, 0x561, 0x575, 0x56f, 0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580,
+0x561, 0x574, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1,
+0x9aa, 0x9c0, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79,
+0x61, 0x20, 0x54, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x41,
+0x6d, 0x61, 0x6e, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61,
+0x6e, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x43c, 0x430, 0x43d, 0x430,
+0x442, 0x66, 0x72, 0xe1, 0x14b, 0x73, 0x65, 0x66, 0x61, 0x20, 0x46, 0x72,
+0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x9ac, 0x9be,
+0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be,
+0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf,
+0x46, 0x72, 0x1ce, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45,
+0x41, 0x43, 0x29, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x431, 0x435, 0x43b, 0x430,
+0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c,
+0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20,
+0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x92d, 0x93e,
+0x930, 0x924, 0x928, 0x93f, 0x20, 0x930, 0x941, 0x92a, 0x940, 0x42, 0x6f, 0x73,
+0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f,
+0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72,
+0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b,
+0x61, 0x41a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b,
+0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x411, 0x44a, 0x43b, 0x433,
+0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x1019, 0x103c, 0x1014,
+0x103a, 0x1019, 0x102c, 0x20, 0x1000, 0x103b, 0x1015, 0x103a, 0x6e2f, 0x5e63, 0x4eba, 0x6c11,
+0x5e01, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20,
+0x50, 0x65, 0x73, 0x6f, 0x44, 0x65, 0x72, 0x68, 0x65, 0x6d, 0x20, 0x55,
+0x6d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x69, 0x62f, 0x6cc, 0x646, 0x627, 0x631,
+0x6cc, 0x20, 0x639, 0x6ce, 0x631, 0x627, 0x642, 0x6cc, 0x695, 0x6cc, 0x627, 0x6b5,
+0x6cc, 0x20, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0x6cc, 0xd804, 0xdd1d, 0xd804, 0xdd01,
+0xd804, 0xdd23, 0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd25, 0xd804, 0xdd28, 0x20, 0xd804,
+0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd0b, 0xd804, 0xdd03, 0xd804, 0xdd28, 0xd804, 0xdd1a, 0xd804,
+0xdd34, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd20, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x20,
+0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd28, 0x420, 0x43e, 0x441, 0x441,
+0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x55, 0x53, 0x20, 0x13a0, 0x13d5,
+0x13b3, 0x45, 0x73, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79,
+0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x6e2f, 0x5143, 0x6fb3, 0x95e8,
+0x5e01, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x6fb3, 0x9580, 0x5143, 0x65b0, 0x53f0, 0x5e63, 0x440,
+0x461, 0x441, 0x441, 0x456, 0x301, 0x439, 0x441, 0x43a, 0x457, 0x439, 0x20, 0x440,
+0xa64b, 0x301, 0x431, 0x43b, 0x44c, 0x420, 0x430, 0x4ab, 0x4ab, 0x435, 0x439, 0x20,
+0x442, 0x435, 0x43d, 0x43a, 0x4d7, 0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b,
+0x6f, 0x72, 0x75, 0x6e, 0x61, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b,
+0x72, 0x6f, 0x6e, 0x65, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x20, 0x930, 0x92a,
+0x947, 0x93d, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20,
+0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b,
+0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41,
+0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20,
+0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61,
+0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0xf51,
+0xf44, 0xf74, 0xf63, 0xf0b, 0xf40, 0xfb2, 0xf58, 0x53, 0x68, 0x69, 0x6c, 0x69,
+0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61,
+0x55, 0x53, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x45, 0x61, 0x73,
+0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20,
+0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
+0x6c, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42,
+0x61, 0x68, 0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c,
+0x61, 0x72, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20,
+0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65,
+0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42, 0x65, 0x72, 0x6d, 0x75,
+0x64, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42,
+0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x50, 0x75, 0x6c,
+0x61, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x46,
+0x72, 0x61, 0x6e, 0x63, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46, 0x41, 0x20,
+0x46, 0x72, 0x61, 0x6e, 0x63, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61,
+0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x43, 0x61, 0x79, 0x6d,
+0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44,
+0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61,
+0x6c, 0x61, 0x6e, 0x64, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x44,
+0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72, 0x6f, 0x6e, 0x65, 0x45,
+0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x4e, 0x61, 0x6b, 0x66,
+0x61, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x4c, 0x69, 0x6c, 0x61, 0x6e,
+0x67, 0x65, 0x6e, 0x69, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64,
+0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x50, 0x6f, 0x75,
+0x6e, 0x64, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44,
+0x61, 0x6c, 0x61, 0x73, 0x69, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69, 0x61,
+0x6e, 0x20, 0x43, 0x65, 0x64, 0x69, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c,
+0x74, 0x61, 0x72, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x4b, 0x20,
+0x50, 0x6f, 0x75, 0x6e, 0x64, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65,
+0x73, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x48, 0x6f, 0x6e,
+0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65,
+0x65, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x6e, 0x20,
+0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c,
+0x69, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x68, 0x65, 0x6b, 0x65, 0x6c,
+0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x53, 0x68,
+0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64,
+0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20,
+0x50, 0x61, 0x74, 0x61, 0x63, 0x61, 0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61,
+0x73, 0x79, 0x20, 0x41, 0x72, 0x69, 0x61, 0x72, 0x79, 0x4d, 0x61, 0x6c,
+0x61, 0x77, 0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61,
+0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x69,
+0x6e, 0x67, 0x67, 0x69, 0x74, 0x4d, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x69,
+0x61, 0x6e, 0x20, 0x52, 0x75, 0x66, 0x69, 0x79, 0x61, 0x61, 0x4d, 0x61,
+0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65,
+0x65, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f,
+0x6c, 0x6c, 0x61, 0x72, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e,
+0x20, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74,
+0x61, 0x6e, 0x69, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x50, 0x61, 0x70,
+0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65,
+0x61, 0x6e, 0x20, 0x4b, 0x69, 0x6e, 0x61, 0x52, 0x77, 0x61, 0x6e, 0x64,
+0x61, 0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x53, 0x74, 0x20, 0x48,
+0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x53,
+0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x54, 0x61, 0x6c, 0x61, 0x53, 0x65,
+0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x52, 0x75,
+0x70, 0x65, 0x65, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65,
+0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x53,
+0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e,
+0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e,
+0x20, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x53, 0x6f, 0x6c, 0x6f,
+0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20,
+0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
+0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x6f, 0x75,
+0x6e, 0x64, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50,
+0x6f, 0x75, 0x6e, 0x64, 0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x20,
+0x4b, 0x72, 0x6f, 0x6e, 0x61, 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x46,
+0x72, 0x61, 0x6e, 0x63, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61,
+0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x6f,
+0x6e, 0x67, 0x61, 0x6e, 0x20, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61,
+0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54,
+0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c,
+0x6c, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x41,
+0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73,
+0x20, 0x44, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x42, 0x72, 0x69, 0x74, 0x69,
+0x73, 0x68, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6e, 0x75,
+0x61, 0x74, 0x75, 0x20, 0x56, 0x61, 0x74, 0x75, 0x5a, 0x61, 0x6d, 0x62,
+0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x67, 0x68,
+0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x263, 0x65, 0x74, 0x6f,
+0x256, 0x6f, 0x66, 0x65, 0x20, 0x61, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x67,
+0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20,
+0x42, 0x43, 0x45, 0x41, 0x4f, 0x46, 0x259, 0x6c, 0xe1, 0x14b, 0x20, 0x43,
+0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x64, 0x6f, 0x6e,
+0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x50, 0x69, 0x73, 0x6f,
+0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61,
+0x73, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72,
+0x69, 0x65, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41,
+0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x66, 0x72, 0x61, 0x6e,
+0x63, 0x20, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x66,
+0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45,
+0x41, 0x43, 0x29, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x61,
+0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20,
+0x63, 0x6f, 0x6d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x66, 0x72, 0x61, 0x6e,
+0x63, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x66,
+0x72, 0x61, 0x6e, 0x63, 0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74,
+0x69, 0x65, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x50,
+0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65,
+0x6e, 0x67, 0x6f, 0x75, 0x72, 0x64, 0x65, 0x20, 0x68, 0x61, 0xef, 0x74,
+0x69, 0x65, 0x6e, 0x6e, 0x65, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20,
+0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x6f, 0x75, 0x67, 0x75,
+0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e,
+0x69, 0x65, 0x6e, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x6d, 0x61,
+0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x64, 0x69, 0x72,
+0x68, 0x61, 0x6d, 0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61, 0x69, 0x6e,
+0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61,
+0x69, 0x73, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x64, 0x65, 0x73,
+0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x66,
+0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x6c,
+0x69, 0x76, 0x72, 0x65, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e,
+0x65, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x73,
+0x69, 0x65, 0x6e, 0x76, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x6e, 0x75,
+0x61, 0x74, 0x75, 0x61, 0x6e, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x75, 0x20,
+0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f,
+0xd83a, 0xdd0a, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x20, 0xd83a,
+0xdd05, 0xd83a, 0xdd0a, 0xd83a, 0xdd00, 0x20, 0xd83a, 0xdd16, 0xd83a, 0xdd2d, 0xd83a, 0xdd45,
+0xd83a, 0xdd2a, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd32, 0xd83a, 0xdd3a,
+0xd83a, 0xdd2b, 0x20, 0xd83a, 0xdd00, 0xd83a, 0xdd2c, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a,
+0xdd33, 0xd83a, 0xdd22, 0xd83a, 0xdd0a, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a,
+0xdd32, 0x20, 0xd83a, 0xdd1a, 0xd83a, 0xdd35, 0xd83a, 0xdd26, 0xd83a, 0xdd2e, 0xd83a, 0xdd45,
+0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0x20, 0xd83a, 0xdd00, 0xd83a, 0xdd2c, 0xd83a, 0xdd2a, 0xd83a,
+0xdd2d, 0xd83a, 0xdd33, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a,
+0xdd01, 0xd83a, 0xdd22, 0xd83a, 0xdd24, 0xd83a, 0xdd22, 0xd83a, 0xdd27, 0xd83a, 0xdd2d, 0x20,
+0xd83a, 0xdd18, 0xd83a, 0xdd22, 0xd83a, 0xdd25, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd32,
+0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd05, 0xd83a, 0xdd2d, 0xd83a, 0xdd23, 0xd83a, 0xdd2d,
+0x20, 0xd83a, 0xdd18, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a,
+0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd0a, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a,
+0xdd32, 0x20, 0xd83a, 0xdd18, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd2b, 0xd83a, 0xdd32,
+0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd01, 0xd83a, 0xdd22, 0xd83a, 0xdd24, 0xd83a, 0xdd22,
+0x20, 0xd83a, 0xdd02, 0xd83a, 0xdd2d, 0xd83a, 0xdd26, 0xd83a, 0xdd2b, 0xd83a, 0xdd2a, 0xd83a,
+0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a,
+0xdd13, 0xd83a, 0xdd3a, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0x20, 0xd83a, 0xdd03,
+0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd3c, 0xd83a, 0xdd22, 0xd83a, 0xdd32,
+0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e,
+0xd83a, 0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd34, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0x20, 0xd83a,
+0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd36, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a,
+0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd02, 0xd83a,
+0xdd2b, 0xd83a, 0xdd34, 0xd83a, 0xdd2e, 0xd83a, 0xdd32, 0x20, 0xd83a, 0xdd05, 0xd83a, 0xdd2b,
+0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd24, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22,
+0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x69,
+0x20, 0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x45, 0x41, 0x43,
+0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x20, 0x47, 0x61, 0x6d, 0x6d, 0x62,
+0x69, 0x44, 0x6f, 0x6c, 0x61, 0x61, 0x72, 0x20, 0x4c, 0x69, 0x62, 0x65,
+0x72, 0x69, 0x79, 0x61, 0x61, 0x55, 0x67, 0x69, 0x79, 0x79, 0x61, 0x20,
+0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x4e, 0x61, 0x79, 0x72,
+0x61, 0x61, 0x20, 0x4e, 0x69, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61,
+0x4c, 0x65, 0x77, 0x6f, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x61, 0x61,
+0x20, 0x4c, 0x69, 0x79, 0x6f, 0x6e, 0x50, 0x75, 0x6e, 0x6e, 0x64, 0x20,
+0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x53, 0x69, 0x6c,
+0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x79, 0x61, 0x20, 0x59, 0x75, 0x67,
+0x61, 0x6e, 0x64, 0x61, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x20,
+0x10da, 0x10d0, 0x10e0, 0x10d8, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65,
+0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x395, 0x3c5, 0x3c1,
+0x3ce, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf,
+0xaaf, 0xabe, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x72, 0x20, 0x4e, 0x61, 0x6a,
+0x65, 0x72, 0x69, 0x79, 0x61, 0x646, 0x64e, 0x64a, 0x652, 0x631, 0x64e, 0x53,
+0x69, 0x64, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x47, 0x68, 0x61, 0x6e, 0x61,
+0x4b, 0x75, 0x257, 0x69, 0x6e, 0x20, 0x53, 0x65, 0x66, 0x61, 0x20, 0x6e,
+0x61, 0x20, 0x41, 0x66, 0x69, 0x72, 0x6b, 0x61, 0x20, 0x54, 0x61, 0x20,
+0x59, 0x61, 0x6d, 0x6d, 0x61, 0x5e9, 0x5e7, 0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9,
+0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e,
+0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e,
+0x74, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3,
+0x6e, 0x61, 0x4e, 0x61, 0x1ecb, 0x72, 0x61, 0x52, 0x75, 0x70, 0x69, 0x61,
+0x68, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x50,
+0x75, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e,
+0x67, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x76, 0x69, 0x7a,
+0x7a, 0x65, 0x72, 0x6f, 0x65e5, 0x672c, 0x5186, 0x41, 0x331, 0x6e, 0x61, 0x69,
+0x72, 0x61, 0x73, 0x65, 0x65, 0x66, 0x61, 0x20, 0x79, 0x61, 0x74, 0x69,
+0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x53, 0x6b, 0x75, 0x64, 0x75, 0x20,
+0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75,
+0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x41, 0x7a, 0x7a, 0x61, 0x79,
+0x72, 0x69, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x64,
+0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6d, 0x75, 0x74, 0x20, 0x6b,
+0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67,
+0x69, 0x74, 0x61, 0x62, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79,
+0x61, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20,
+0x4b, 0x65, 0x6e, 0x79, 0x61, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20,
+0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf, 0x6c1, 0x650, 0x646, 0x62f, 0x64f, 0x633,
+0x62a, 0x672, 0x646, 0x6cd, 0x20, 0x631, 0x6c4, 0x67e, 0x64e, 0x6d2, 0x907, 0x902,
+0x921, 0x93f, 0x92f, 0x928, 0x20, 0x930, 0x942, 0x92a, 0x940, 0x49a, 0x430, 0x437,
+0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435,
+0x441, 0x456, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787,
+0x17b6, 0x43, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20,
+0x4b, 0x65, 0x6e, 0x79, 0x61, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0xc911,
+0xad6d, 0x20, 0xc704, 0xc548, 0xd654, 0xc870, 0xc120, 0x20, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758,
+0x20, 0xc778, 0xbbfc, 0x20, 0xacf5, 0xd654, 0xad6d, 0x20, 0xc6d0, 0x43, 0x46, 0x41,
+0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f,
+0x29, 0x6c, 0xee, 0x72, 0x65, 0x79, 0xea, 0x20, 0x74, 0x69, 0x72, 0x6b,
+0xee, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45,
+0x41, 0x43, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d,
+0x20, 0x441, 0x43e, 0x43c, 0x443, 0x53, 0x68, 0x69, 0x6c, 0xed, 0x69, 0x6e,
+0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61,
+0x6e, 0xed, 0x61, 0xea5, 0xeb2, 0xea7, 0x20, 0xe81, 0xeb5, 0xe9a, 0x65, 0x69,
+0x72, 0x6f, 0x46, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61,
+0x20, 0x4b, 0x6f, 0x6e, 0x67, 0xf3, 0x4b, 0x77, 0x61, 0x6e, 0x7a, 0x61,
+0x20, 0x79, 0x61, 0x20, 0x41, 0x6e, 0x67, 0xf3, 0x6c, 0x61, 0x46, 0x61,
+0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45,
+0x41, 0x43, 0x45, 0x75, 0x72, 0x61, 0x73, 0x4e, 0x66, 0x61, 0x6c, 0x61,
+0x6e, 0x67, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75,
+0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0x53, 0x69, 0x72, 0x69, 0x6e, 0x6a, 0x69, 0x20,
+0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x41c, 0x430, 0x43a, 0x435,
+0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440,
+0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20,
+0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0xd07, 0xd28, 0xd4d, 0xd24,
+0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x52, 0x69, 0x6e, 0x67, 0x67,
+0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x62f,
+0x648, 0x644, 0x631, 0x20, 0x628, 0x631, 0x648, 0x646, 0x64a, 0x631, 0x64a, 0x6a0,
+0x762, 0x64a, 0x62a, 0x20, 0x645, 0x644, 0x64a, 0x633, 0x64a, 0x627, 0x44, 0x6f,
+0x6c, 0x61, 0x72, 0x20, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x44, 0x6f,
+0x6c, 0x61, 0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72,
+0x61, 0x65, 0x77, 0x72, 0x6f, 0x987, 0x9a8, 0x9cd, 0x9a6, 0x9bf, 0x9af, 0x9bc,
+0x9be, 0x9a8, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9c0, 0x54, 0x101, 0x72, 0x61, 0x20,
+0x6f, 0x20, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61, 0x49, 0x72,
+0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61,
+0x6e, 0xed, 0x20, 0x65, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69,
+0x61, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x73,
+0x68, 0x69, 0x72, 0xe8, 0x41c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x20, 0x442,
+0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x44e, 0x430, 0x43d, 0x44c, 0x1833, 0x1825, 0x182c,
+0x1825, 0x1837, 0x1822, 0x182d, 0x180c, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x20, 0x6d,
+0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x73, 0x6f, 0x6c, 0x61, 0x69,
+0x20, 0x42, 0x45, 0x41, 0x43, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61,
+0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x69, 0x928, 0x947, 0x92a, 0x93e,
+0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x92d, 0x93e,
+0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e,
+0x66, 0x65, 0x6c, 0xe1, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x46, 0x25b, 0x6c,
+0xe2, 0x14b, 0x4e, 0x61, 0x69, 0x6a, 0xed, 0x72, 0x69, 0xe1, 0x20, 0x4e,
+0x61, 0xed, 0x72, 0x61, 0x7d6, 0x7cc, 0x7ec, 0x7e3, 0x7cd, 0x7ec, 0x7de, 0x7ca,
+0x20, 0x7df, 0x7ce, 0x7ec, 0x20, 0x7df, 0x7ca, 0x7eb, 0x20, 0x7dd, 0x7ca, 0x7d9,
+0x7ca, 0x7f2, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75,
+0x76, 0x64, 0x6e, 0x6f, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b,
+0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x44, 0x6f, 0x6c, 0x61, 0x20, 0x79,
+0x61, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61, 0x6e,
+0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72,
+0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e,
+0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x20, 0x42,
+0x69, 0x72, 0x72, 0x69, 0x69, 0x41b, 0x430, 0x440, 0x421, 0x43e, 0x43c, 0x46,
+0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x46, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x20,
+0x64, 0x69, 0x20, 0x41, 0x72, 0x75, 0x62, 0x61, 0x627, 0x641, 0x63a, 0x627,
+0x646, 0x6cd, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20, 0x6a9,
+0x644, 0x62f, 0x627, 0x631, 0x647, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc,
+0x631, 0x627, 0x646, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641,
+0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x7a, 0x142, 0x6f, 0x74, 0x79,
+0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x52, 0x65, 0x61, 0x6c, 0x20,
+0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x6b, 0x77,
+0x61, 0x6e, 0x7a, 0x61, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e,
+0x6f, 0x65, 0x73, 0x63, 0x75, 0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f,
+0x2d, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41,
+0x43, 0x29, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41,
+0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x70, 0x61, 0x74, 0x61,
+0x63, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x6d,
+0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d,
+0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x20,
+0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20,
+0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x66, 0x72,
+0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x75, 0xed, 0xe7, 0x6f, 0x64, 0xf3,
+0x6c, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61,
+0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0xa2d, 0xa3e,
+0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa07, 0xa06, 0x631, 0x648, 0x67e,
+0x626, 0x6cc, 0x6c1, 0x53, 0x6f, 0x6c, 0x20, 0x50, 0x65, 0x72, 0x75, 0x61,
+0x6e, 0x6f, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x44,
+0xf3, 0x6c, 0x61, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x6e, 0x6f, 0x6c, 0x65, 0x75, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65,
+0x73, 0x63, 0x6c, 0x65, 0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76,
+0x65, 0x6e, 0x65, 0x73, 0x63, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73,
+0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x68, 0x65, 0x6c, 0x65, 0x72, 0x69,
+0x20, 0x73, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61,
+0x49, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x72, 0x79, 0x2019,
+0x55, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x440, 0x43e, 0x441, 0x441,
+0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c,
+0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20,
+0x440, 0x443, 0x431, 0x43b, 0x44c, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a,
+0x438, 0x439, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x43a, 0x438, 0x440, 0x433,
+0x438, 0x437, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x441, 0x43e, 0x43c, 0x43c, 0x43e,
+0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439,
+0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433,
+0x440, 0x438, 0x432, 0x43d, 0x430, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b,
+0x439, 0x430, 0x20, 0x441, 0x43e, 0x43b, 0x43a, 0x443, 0x43e, 0x431, 0x430, 0x439,
+0x430, 0x4e, 0x6a, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x65,
+0x6c, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x66, 0x61, 0x72, 0xe2, 0x6e,
+0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43,
+0x29, 0x49, 0x68, 0x65, 0x6c, 0x61, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61,
+0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x92d, 0x93e, 0x930, 0x924, 0x940,
+0x92f, 0x20, 0x930, 0x942, 0x92a, 0x94d, 0x92f, 0x915, 0x92e, 0x94d, 0x1c65, 0x1c64,
+0x1c67, 0x1c5a, 0x1c5b, 0x20, 0x1c68, 0x1c6e, 0x1c71, 0x1c5f, 0x1c5c, 0x20, 0x1c74, 0x1c5f,
+0x1c60, 0x1c5f, 0xe8, 0x75, 0x72, 0x6f, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61,
+0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69,
+0x71, 0x75, 0x65, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438,
+0x43d, 0x430, 0x440, 0x411, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x445,
+0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20,
+0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d,
+0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x415, 0x432, 0x440, 0x43e, 0x45,
+0x76, 0x72, 0x6f, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69,
+0x6e, 0x61, 0x72, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
+0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x44,
+0x6f, 0x72, 0x61, 0x20, 0x72, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x6b, 0x61, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x64a, 0x20, 0x631,
+0x67e, 0x64a, 0x939, 0x93f, 0x902, 0x926, 0x941, 0x938, 0x94d, 0x924, 0x93e, 0x928,
+0x940, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x94b, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3,
+0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd,
+0x65, 0x76, 0x72, 0x6f, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b,
+0x61, 0x20, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61,
+0x46, 0x61, 0x72, 0x61, 0x6e, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74,
+0x69, 0x42, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62,
+0x62, 0x69, 0x79, 0x61, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b,
+0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x70, 0x65, 0x73, 0x6f, 0x20,
+0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x64, 0xf3, 0x6c,
+0x61, 0x72, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65, 0xf1, 0x6f, 0x62,
+0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x72, 0x65, 0x61, 0x6c,
+0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x50, 0x65,
+0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x70, 0x65,
+0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x6e,
+0x6f, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61,
+0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x70, 0x65, 0x73, 0x6f,
+0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x20,
+0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x64, 0xf3,
+0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e,
+0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f,
+0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69,
+0x63, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x71, 0x75,
+0x65, 0x74, 0x7a, 0x61, 0x6c, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61,
+0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x70, 0x65,
+0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x63,
+0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72,
+0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x62, 0x61, 0x6c, 0x62, 0x6f,
+0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x67, 0x75,
+0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75,
+0x61, 0x79, 0x6f, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61,
+0x6e, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70,
+0x69, 0x6e, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67,
+0x75, 0x61, 0x79, 0x6f, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20,
+0x73, 0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x2d30, 0x2d37, 0x2d54, 0x2d49,
+0x2d4e, 0x20, 0x2d4f, 0x20, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x52, 0x75,
+0x70, 0x65, 0x65, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0xe9, 0x73, 0x69,
+0x61, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20,
+0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67,
+0x69, 0x20, 0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x73,
+0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x53,
+0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61,
+0x6e, 0x6b, 0x65, 0x61, 0x64, 0x72, 0x69, 0x6d, 0x20, 0x6e, 0x20, 0x6c,
+0x6d, 0x263, 0x72, 0x69, 0x62, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0xb87,
+0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd,
+0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99,
+0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd,
+0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0xb87, 0xbb2,
+0xb99, 0xbcd, 0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x70,
+0x69, 0x6c, 0x61, 0x20, 0x54, 0x61, 0x69, 0x77, 0x61, 0x6e, 0x420, 0x43e,
+0x441, 0x441, 0x438, 0x44f, 0x20, 0x441, 0x443, 0x43c, 0x44b, 0xc2d, 0xc3e, 0xc30,
+0xc24, 0xc26, 0xc47, 0xc36, 0x20, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc3f, 0x41,
+0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b,
+0x2019, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x41, 0x6e, 0x67, 0x6f,
+0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x2019, 0x20, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0xe1a, 0xe32, 0xe17, 0xf61, 0xf74, 0xf0b, 0xf68, 0xf53,
+0xf0b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0xf66, 0xf92, 0xf7c, 0xf62,
+0xf0b, 0x1293, 0x1255, 0x134b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20,
+0x66, 0x61, 0x6b, 0x61, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0xfc, 0x72,
+0x6b, 0x20, 0x6c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x54, 0xfc, 0x72, 0x6b,
+0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x4e, 0x65,
+0x72, 0x61, 0x443, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430,
+0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x67e, 0x627, 0x6a9, 0x633, 0x62a,
+0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x628, 0x6be, 0x627,
+0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x62c, 0x6c7, 0x6ad,
+0x6af, 0x648, 0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x4f, 0x2018, 0x7a, 0x62,
+0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d,
+0x69, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20,
+0x441, 0x45e, 0x43c, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x20, 0xa55c, 0xa55e, 0xa54c, 0x4c,
+0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x20, 0x44, 0x61, 0x6c, 0x61,
+0x110, 0x1ed3, 0x6e, 0x67, 0x20, 0x56, 0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61,
+0x6d, 0x50, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69,
+0x6e, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x626, 0x20, 0x631, 0x648,
+0x67e, 0x6cc, 0x627, 0x648, 0x6af, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x626,
+0x20, 0x627, 0x648, 0x6af, 0x627, 0x646, 0x6cc, 0x627, 0x6cc, 0x631, 0x627, 0x646,
+0x626, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20,
+0x43, 0x46, 0x41, 0x20, 0x62, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b,
+0x20, 0x53, 0x6f, 0x77, 0x77, 0x75, 0x2d, 0x6a, 0x61, 0x6e, 0x74, 0x49,
+0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x79, 0x61, 0x73, 0x65, 0x4d, 0x7a,
+0x61, 0x6e, 0x74, 0x73, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61,
+0x4e, 0xe1, 0xed, 0x72, 0xe0, 0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72,
+0xed, 0xe0, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x73, 0xec, 0x20, 0xec, 0x77,
+0x254, 0x300, 0x2d, 0x6f, 0x6f, 0x72, 0xf9, 0x6e, 0x20, 0x41, 0x66, 0xed,
+0x72, 0xed, 0x6b, 0xe0, 0x79, 0x69, 0x6e, 0x7a, 0x6d, 0x69, 0x6e, 0x7a,
+0x62, 0x69, 0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x4d, 0x72,
+0x61, 0x73, 0x69, 0x72, 0x20, 0x52, 0x65, 0x6a, 0x61, 0x72, 0x52, 0x65,
+0x61, 0x75, 0x20, 0x42, 0x72, 0x61, 0x73, 0x69, 0x75, 0x77, 0x61, 0x72,
+0x61, 0x50, 0x65, 0x73, 0x6f, 0x20, 0x4b, 0x75, 0x72, 0x169, 0x62, 0x69,
+0x79, 0x61, 0x77, 0x61, 0x72, 0x61, 0x42, 0x75, 0x72, 0x69, 0x77, 0x61,
+0x72, 0x69, 0x20, 0x57, 0x65, 0x6e, 0x65, 0x73, 0x75, 0x65, 0x72, 0x61,
+0x77, 0x61, 0x72, 0x61, 0x50, 0xe1, 0x6b, 0x65, 0x73, 0x74, 0xe1, 0x6e,
+0x69, 0x20, 0x72, 0x75, 0x70, 0x69, 0x47, 0x61, 0x72, 0x269, 0x256, 0x6f,
+0x6e, 0x74, 0x1dd, 0x6e, 0x61, 0x20, 0x67, 0x269, 0x74, 0x65, 0x14b, 0x73,
+0x68, 0x69, 0x6c, 0x65, 0x6c, 0x61, 0x14b, 0x20, 0x6b, 0x61, 0x73, 0x25b,
+0x25b, 0x66, 0x61, 0x92d, 0x93e, 0x930, 0x924, 0x947, 0x20, 0x926, 0x93e, 0x20,
+0x930, 0x941, 0x92a, 0x92f, 0x93e
};
-static const char16_t currency_format_data[] = {
-0x25, 0x31, 0x25, 0x32, 0x25, 0x32, 0x25, 0x31, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x28, 0x25, 0x32, 0x25, 0x31, 0x29, 0x25,
-0x31, 0xa0, 0x25, 0x32, 0x28, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x29, 0x28, 0x25, 0x31, 0x25, 0x32, 0x29, 0x28, 0x25, 0x32,
-0xa0, 0x25, 0x31, 0x29, 0x25, 0x32, 0x2d, 0x25, 0x31, 0x25, 0x32, 0x2212, 0x25, 0x31, 0x200e, 0x25, 0x32, 0xa0, 0x25, 0x31,
-0x200e, 0x28, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x29, 0x25, 0x32, 0x2d, 0xa0, 0x25, 0x31
+static constexpr char16_t currency_format_data[] = {
+0x25, 0x31, 0x25, 0x32, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x28, 0x25, 0x32,
+0x25, 0x31, 0x29, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x28, 0x25, 0x31, 0xa0,
+0x25, 0x32, 0x29, 0x200f, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x61c, 0x25, 0x31,
+0x25, 0x32, 0x28, 0x61c, 0x25, 0x31, 0x25, 0x32, 0x29, 0x28, 0x25, 0x31,
+0x25, 0x32, 0x29, 0x28, 0x25, 0x31, 0x29, 0xa0, 0x25, 0x32, 0x28, 0x25,
+0x32, 0xa0, 0x25, 0x31, 0x29, 0x25, 0x32, 0x2d, 0x25, 0x31, 0x200f, 0x25,
+0x31, 0xa0, 0x200f, 0x25, 0x32, 0x200f, 0x200e, 0x2d, 0x25, 0x31, 0xa0, 0x200f,
+0x25, 0x32, 0x25, 0x32, 0xa0, 0x2d, 0x25, 0x31, 0x25, 0x32, 0x2212, 0x25,
+0x31, 0x25, 0x32, 0x2d, 0xa0, 0x25, 0x31, 0x200e, 0x25, 0x32, 0xa0, 0x25,
+0x31, 0x200e, 0x28, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x29, 0x25, 0x31, 0x202f,
+0x25, 0x32
};
-static const char16_t endonyms_data[] = {
-0x4f, 0x72, 0x6f, 0x6d, 0x6f, 0x6f, 0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x4b, 0x65, 0x65, 0x6e,
-0x69, 0x79, 0x61, 0x61, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66,
-0x72, 0x69, 0x6b, 0x61, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0xeb, 0x73, 0x68, 0x71, 0x69, 0x70, 0x53, 0x68, 0x71, 0x69,
-0x70, 0xeb, 0x72, 0x69, 0x4d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x69, 0x61, 0x20, 0x65, 0x20, 0x56, 0x65, 0x72, 0x69,
-0x75, 0x74, 0x4b, 0x6f, 0x73, 0x6f, 0x76, 0xeb, 0x12a0, 0x121b, 0x122d, 0x129b, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x627, 0x644, 0x639,
-0x631, 0x628, 0x64a, 0x629, 0x645, 0x635, 0x631, 0x627, 0x644, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x627, 0x644, 0x628, 0x62d, 0x631, 0x64a,
-0x646, 0x62a, 0x634, 0x627, 0x62f, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a,
-0x625, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x627, 0x627, 0x644, 0x639, 0x631, 0x627, 0x642, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644,
-0x627, 0x644, 0x623, 0x631, 0x62f, 0x646, 0x627, 0x644, 0x643, 0x648, 0x64a, 0x62a, 0x644, 0x628, 0x646, 0x627, 0x646, 0x644, 0x64a, 0x628,
-0x64a, 0x627, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x627, 0x627, 0x644, 0x645, 0x63a, 0x631, 0x628, 0x639, 0x64f, 0x645,
-0x627, 0x646, 0x627, 0x644, 0x623, 0x631, 0x627, 0x636, 0x64a, 0x20, 0x627, 0x644, 0x641, 0x644, 0x633, 0x637, 0x64a, 0x646, 0x64a, 0x629,
-0x642, 0x637, 0x631, 0x627, 0x644, 0x645, 0x645, 0x644, 0x643, 0x629, 0x20, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627,
-0x644, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x629, 0x627, 0x644, 0x635, 0x648, 0x645, 0x627, 0x644, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627,
-0x646, 0x633, 0x648, 0x631, 0x64a, 0x627, 0x62a, 0x648, 0x646, 0x633, 0x627, 0x644, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x627,
-0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x645, 0x62a, 0x62d, 0x62f, 0x629, 0x627, 0x644, 0x635, 0x62d, 0x631, 0x627,
-0x621, 0x20, 0x627, 0x644, 0x63a, 0x631, 0x628, 0x64a, 0x629, 0x627, 0x644, 0x64a, 0x645, 0x646, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627,
-0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x641, 0x635, 0x62d, 0x649,
-0x20, 0x627, 0x644, 0x62d, 0x62f, 0x64a, 0x62b, 0x629, 0x627, 0x644, 0x639, 0x627, 0x644, 0x645, 0x570, 0x561, 0x575, 0x565, 0x580, 0x565,
-0x576, 0x540, 0x561, 0x575, 0x561, 0x57d, 0x57f, 0x561, 0x576, 0x985, 0x9b8, 0x9ae, 0x9c0, 0x9af, 0x9bc, 0x9be, 0x9ad, 0x9be, 0x9f0, 0x9a4,
-0x61, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e,
-0x430, 0x437, 0x4d9, 0x440, 0x431, 0x430, 0x458, 0x4b9, 0x430, 0x43d, 0x410, 0x437, 0x4d9, 0x440, 0x431, 0x430, 0x458, 0x4b9, 0x430, 0x43d,
-0x65, 0x75, 0x73, 0x6b, 0x61, 0x72, 0x61, 0x45, 0x73, 0x70, 0x61, 0x69, 0x6e, 0x69, 0x61, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be,
-0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0xf62, 0xfab, 0xf7c, 0xf44, 0xf0b, 0xf41, 0xf60, 0xf56,
-0xfb2, 0xf74, 0xf42, 0x62, 0x72, 0x65, 0x7a, 0x68, 0x6f, 0x6e, 0x65, 0x67, 0x46, 0x72, 0x61, 0xf1, 0x73, 0x431, 0x44a, 0x43b,
-0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x438, 0x44f, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c,
-0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x430, 0x44f, 0x411, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x44c, 0x1781, 0x17d2,
-0x1798, 0x17c2, 0x179a, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787, 0x17b6, 0x63, 0x61, 0x74, 0x61, 0x6c, 0xe0, 0x45, 0x73, 0x70, 0x61,
-0x6e, 0x79, 0x61, 0x41, 0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, 0x46, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x49, 0x74, 0xe0, 0x6c,
-0x69, 0x61, 0x7b80, 0x4f53, 0x4e2d, 0x6587, 0x4e2d, 0x56fd, 0x4e2d, 0x56fd, 0x9999, 0x6e2f, 0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x4e2d, 0x56fd, 0x6fb3,
-0x95e8, 0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x65b0, 0x52a0, 0x5761, 0x7e41, 0x9ad4, 0x4e2d, 0x6587, 0x4e2d, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225, 0x884c,
-0x653f, 0x5340, 0x4e2d, 0x570b, 0x6fb3, 0x9580, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x53f0, 0x7063, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b,
-0x69, 0x48, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x42, 0x6f, 0x73, 0x6e, 0x61, 0x20, 0x69, 0x20, 0x48, 0x65, 0x72,
-0x63, 0x65, 0x67, 0x6f, 0x76, 0x69, 0x6e, 0x61, 0x10d, 0x65, 0x161, 0x74, 0x69, 0x6e, 0x61, 0x10c, 0x65, 0x73, 0x6b, 0x6f,
-0x64, 0x61, 0x6e, 0x73, 0x6b, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x47, 0x72, 0xf8, 0x6e, 0x6c, 0x61, 0x6e, 0x64,
-0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x41, 0x72, 0x75, 0x62, 0x61, 0x42, 0x65, 0x6c, 0x67, 0x69,
-0xeb, 0x43, 0x75, 0x72, 0x61, 0xe7, 0x61, 0x6f, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x6d, 0x65, 0x43, 0x61, 0x72, 0x69,
-0x62, 0x69, 0x73, 0x63, 0x68, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x53, 0x69, 0x6e, 0x74, 0x2d,
-0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c,
-0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x6e, 0x20, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, 0x41, 0x6e,
-0x74, 0x69, 0x67, 0x75, 0x61, 0x20, 0x26, 0x20, 0x42, 0x61, 0x72, 0x62, 0x75, 0x64, 0x61, 0x41, 0x75, 0x73, 0x74, 0x72,
-0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x41, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61,
-0x42, 0x61, 0x68, 0x61, 0x6d, 0x61, 0x73, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x42, 0x65, 0x6c, 0x67, 0x69,
-0x75, 0x6d, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x42, 0x6f, 0x74, 0x73, 0x77,
-0x61, 0x6e, 0x61, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x4f, 0x63,
-0x65, 0x61, 0x6e, 0x20, 0x54, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69,
-0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x6f, 0x6e, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67,
-0x6c, 0x69, 0x73, 0x68, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c,
-0x61, 0x6e, 0x64, 0x73, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64,
-0x43, 0x6f, 0x63, 0x6f, 0x73, 0x20, 0x28, 0x4b, 0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x49, 0x73, 0x6c, 0x61,
-0x6e, 0x64, 0x73, 0x43, 0x6f, 0x6f, 0x6b, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x43, 0x79, 0x70, 0x72, 0x75,
-0x73, 0x44, 0x65, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x45, 0x72, 0x69, 0x74,
-0x72, 0x65, 0x61, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x46,
-0x69, 0x6a, 0x69, 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x47, 0x61,
-0x6d, 0x62, 0x69, 0x61, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x79, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x47, 0x69, 0x62, 0x72,
-0x61, 0x6c, 0x74, 0x61, 0x72, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x47, 0x75, 0x61, 0x6d, 0x47, 0x75, 0x79, 0x61,
-0x6e, 0x61, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e,
-0x61, 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63,
-0x61, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4b, 0x69, 0x72, 0x69, 0x62, 0x61, 0x74, 0x69, 0x4c, 0x65, 0x73, 0x6f, 0x74, 0x68,
-0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x4d, 0x61, 0x63, 0x61, 0x6f, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68,
-0x69, 0x6e, 0x61, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x63, 0x61, 0x72, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x4d,
-0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x4d, 0x61, 0x6c, 0x74, 0x61, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x6c,
-0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x4d, 0x69, 0x63,
-0x72, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x4e, 0x61, 0x6d,
-0x69, 0x62, 0x69, 0x61, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73,
-0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x4e, 0x69,
-0x75, 0x65, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x6f, 0x72, 0x74,
-0x68, 0x65, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x61, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73,
-0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x50, 0x61, 0x6c, 0x61, 0x75, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e,
-0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73,
-0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x50, 0x75, 0x65, 0x72,
-0x74, 0x6f, 0x20, 0x52, 0x69, 0x63, 0x6f, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x53, 0x74, 0x20, 0x4b, 0x69, 0x74, 0x74,
-0x73, 0x20, 0x26, 0x20, 0x4e, 0x65, 0x76, 0x69, 0x73, 0x53, 0x74, 0x20, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x53, 0x74, 0x20,
-0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x26, 0x20, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73,
-0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f,
-0x6e, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x61, 0x53,
-0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
-0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x53, 0x75, 0x64, 0x61, 0x6e,
-0x45, 0x73, 0x77, 0x61, 0x74, 0x69, 0x6e, 0x69, 0x53, 0x77, 0x65, 0x64, 0x65, 0x6e, 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65,
-0x72, 0x6c, 0x61, 0x6e, 0x64, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x54, 0x6f, 0x6b, 0x65, 0x6c, 0x61, 0x75,
-0x54, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61,
-0x67, 0x6f, 0x54, 0x75, 0x72, 0x6b, 0x73, 0x20, 0x26, 0x20, 0x43, 0x61, 0x69, 0x63, 0x6f, 0x73, 0x20, 0x49, 0x73, 0x6c,
-0x61, 0x6e, 0x64, 0x73, 0x54, 0x75, 0x76, 0x61, 0x6c, 0x75, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x55, 0x6e, 0x69, 0x74,
-0x65, 0x64, 0x20, 0x41, 0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73, 0x42, 0x72, 0x69, 0x74,
-0x69, 0x73, 0x68, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b, 0x69,
-0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x4f, 0x75, 0x74, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x49,
-0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68,
-0x20, 0x56, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x55, 0x2e, 0x53, 0x2e, 0x20,
-0x56, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61,
-0x5a, 0x69, 0x6d, 0x62, 0x61, 0x62, 0x77, 0x65, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x47, 0x61, 0x72, 0x63, 0x69, 0x61,
-0x49, 0x73, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x61, 0x6e, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x53, 0x6f, 0x75,
-0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x53, 0x69, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e,
-0x57, 0x6f, 0x72, 0x6c, 0x64, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x65, 0x73, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x74, 0x6f,
-0x4d, 0x6f, 0x6e, 0x64, 0x6f, 0x65, 0x65, 0x73, 0x74, 0x69, 0x45, 0x65, 0x73, 0x74, 0x69, 0x66, 0xf8, 0x72, 0x6f, 0x79,
-0x73, 0x6b, 0x74, 0x46, 0xf8, 0x72, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x75, 0x6f, 0x6d, 0x69, 0x53, 0x75, 0x6f, 0x6d, 0x69,
-0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x67, 0xe9, 0x72, 0x69,
-0x65, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x71, 0x75, 0x65, 0x42, 0xe9, 0x6e, 0x69, 0x6e, 0x42, 0x75, 0x72, 0x6b, 0x69, 0x6e,
-0x61, 0x20, 0x46, 0x61, 0x73, 0x6f, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x75, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61,
-0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x52, 0xe9, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x71, 0x75,
-0x65, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x66, 0x72, 0x69, 0x63, 0x61, 0x69, 0x6e, 0x65, 0x54, 0x63, 0x68, 0x61,
-0x64, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61,
-0x73, 0x61, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x43,
-0xf4, 0x74, 0x65, 0x20, 0x64, 0x2019, 0x49, 0x76, 0x6f, 0x69, 0x72, 0x65, 0x44, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69,
-0x47, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x20, 0xe9, 0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x65, 0x47, 0x75,
-0x79, 0x61, 0x6e, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x79, 0x6e, 0xe9,
-0x73, 0x69, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x47, 0x61, 0x62, 0x6f, 0x6e, 0x47, 0x75,
-0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x48, 0x61, 0xef, 0x74, 0x69, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f,
-0x75, 0x72, 0x67, 0x4d, 0x61, 0x6c, 0x69, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4d, 0x61, 0x75,
-0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74,
-0x65, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x4d, 0x61, 0x72, 0x6f, 0x63, 0x4e, 0x6f, 0x75, 0x76, 0x65, 0x6c, 0x6c, 0x65,
-0x2d, 0x43, 0x61, 0x6c, 0xe9, 0x64, 0x6f, 0x6e, 0x69, 0x65, 0x4c, 0x61, 0x20, 0x52, 0xe9, 0x75, 0x6e, 0x69, 0x6f, 0x6e,
-0x53, 0xe9, 0x6e, 0xe9, 0x67, 0x61, 0x6c, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x50, 0x69, 0x65, 0x72, 0x72, 0x65, 0x2d,
-0x65, 0x74, 0x2d, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x6f, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x20,
-0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x79, 0x72, 0x69, 0x65, 0x54, 0x6f, 0x67,
-0x6f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x2d, 0x65, 0x74, 0x2d, 0x46, 0x75,
-0x74, 0x75, 0x6e, 0x61, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x42, 0x61, 0x72, 0x74, 0x68, 0xe9, 0x6c, 0x65, 0x6d, 0x79,
-0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x46, 0x72, 0x79, 0x73, 0x6b, 0x4e, 0x65, 0x64,
-0x65, 0x72, 0x6c, 0xe2, 0x6e, 0x47, 0xe0, 0x69, 0x64, 0x68, 0x6c, 0x69, 0x67, 0x41, 0x6e, 0x20, 0x52, 0xec, 0x6f, 0x67,
-0x68, 0x61, 0x63, 0x68, 0x64, 0x20, 0x41, 0x6f, 0x6e, 0x61, 0x69, 0x63, 0x68, 0x74, 0x65, 0x67, 0x61, 0x6c, 0x65, 0x67,
-0x6f, 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x10e1, 0x10d0, 0x10e5, 0x10d0, 0x10e0, 0x10d7,
-0x10d5, 0x10d4, 0x10da, 0x10dd, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61,
-0x6e, 0x64, 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69, 0x63, 0x68, 0x69, 0x73, 0x63, 0x68, 0x65, 0x73, 0x20, 0x44,
-0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x65, 0x6e, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x65, 0x6e,
-0x4c, 0x69, 0x65, 0x63, 0x68, 0x74, 0x65, 0x6e, 0x73, 0x74, 0x65, 0x69, 0x6e, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x75,
-0x72, 0x67, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x48, 0x6f, 0x63, 0x68, 0x64, 0x65, 0x75, 0x74,
-0x73, 0x63, 0x68, 0x395, 0x3bb, 0x3bb, 0x3b7, 0x3bd, 0x3b9, 0x3ba, 0x3ac, 0x395, 0x3bb, 0x3bb, 0x3ac, 0x3b4, 0x3b1, 0x39a, 0x3cd, 0x3c0,
-0x3c1, 0x3bf, 0x3c2, 0x6b, 0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x75, 0x74, 0x4b, 0x61, 0x6c, 0x61, 0x61, 0x6c,
-0x6c, 0x69, 0x74, 0x20, 0x4e, 0x75, 0x6e, 0x61, 0x61, 0x74, 0xa97, 0xac1, 0xa9c, 0xab0, 0xabe, 0xaa4, 0xac0, 0xaad, 0xabe, 0xab0,
-0xaa4, 0x48, 0x61, 0x75, 0x73, 0x61, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x47, 0x61, 0x6e, 0x61, 0x4e, 0x69,
-0x6a, 0x61, 0x72, 0x5e2, 0x5d1, 0x5e8, 0x5d9, 0x5ea, 0x5d9, 0x5e9, 0x5e8, 0x5d0, 0x5dc, 0x939, 0x93f, 0x928, 0x94d, 0x926, 0x940, 0x92d,
-0x93e, 0x930, 0x924, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x4d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x6f, 0x72, 0x73, 0x7a, 0xe1,
-0x67, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0xcd, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x64, 0x6f, 0x6e,
-0x65, 0x73, 0x69, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x75, 0x61, 0x4d, 0x75, 0x6e, 0x64, 0x6f,
-0x47, 0x61, 0x65, 0x69, 0x6c, 0x67, 0x65, 0xc9, 0x69, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x52, 0xed, 0x6f, 0x63, 0x68, 0x74,
-0x20, 0x41, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x74, 0x68, 0x65, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f, 0x49, 0x74,
-0x61, 0x6c, 0x69, 0x61, 0x53, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x53, 0x76, 0x69, 0x7a, 0x7a, 0x65,
-0x72, 0x61, 0x43, 0x69, 0x74, 0x74, 0xe0, 0x20, 0x64, 0x65, 0x6c, 0x20, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x6f,
-0x65e5, 0x672c, 0x8a9e, 0x4a, 0x61, 0x77, 0x61, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0xe9, 0x73, 0x69, 0x61, 0xc95, 0xca8, 0xccd, 0xca8,
-0xca1, 0xcad, 0xcbe, 0xcb0, 0xca4, 0x6a9, 0x672, 0x634, 0x64f, 0x631, 0x6c1, 0x650, 0x646, 0x62f, 0x648, 0x633, 0x62a, 0x627, 0x646, 0x49b,
-0x430, 0x437, 0x430, 0x49b, 0x20, 0x442, 0x456, 0x43b, 0x456, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x4b, 0x69,
-0x6e, 0x79, 0x61, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x55, 0x20, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x43a, 0x44b, 0x440,
-0x433, 0x44b, 0x437, 0x447, 0x430, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0xd55c, 0xad6d, 0xc5b4, 0xb300, 0xd55c,
-0xbbfc, 0xad6d, 0xc870, 0xc120, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0xc778, 0xbbfc, 0xacf5, 0xd654, 0xad6d, 0x6b, 0x75, 0x72, 0x64, 0xee, 0x54, 0x69,
-0x72, 0x6b, 0x69, 0x79, 0x65, 0x49, 0x6b, 0x69, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x55, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64,
-0x69, 0xea5, 0xeb2, 0xea7, 0x6c, 0x61, 0x74, 0x76, 0x69, 0x65, 0x161, 0x75, 0x4c, 0x61, 0x74, 0x76, 0x69, 0x6a, 0x61, 0x6c,
-0x69, 0x6e, 0x67, 0xe1, 0x6c, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0xed, 0x6b, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b,
-0x6f, 0x6e, 0x67, 0xf3, 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x74, 0xed, 0x6b, 0x69, 0x41, 0x6e, 0x67, 0xf3,
-0x6c, 0x61, 0x52, 0x65, 0x70, 0x69, 0x62, 0x69, 0x6b, 0x69, 0x20, 0x79, 0x61, 0x20, 0x41, 0x66, 0x72, 0xed, 0x6b, 0x61,
-0x20, 0x79, 0x61, 0x20, 0x4b, 0xe1, 0x74, 0x69, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x69,
-0x173, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x61, 0x43c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x421, 0x435,
-0x432, 0x435, 0x440, 0x43d, 0x430, 0x20, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x438, 0x458, 0x430, 0x4d, 0x61, 0x6c, 0x61,
-0x67, 0x61, 0x73, 0x79, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x69, 0x6b, 0x61, 0x72, 0x61, 0x4d, 0x65, 0x6c, 0x61,
-0x79, 0x75, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61, 0xd2e, 0xd32, 0xd2f,
-0xd3e, 0xd33, 0xd02, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0x4d, 0x61, 0x6c, 0x74, 0x69, 0x4d, 0x101, 0x6f, 0x72, 0x69, 0x41,
-0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61, 0x92e, 0x930, 0x93e, 0x920, 0x940, 0x43c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x41c, 0x43e,
-0x43d, 0x433, 0x43e, 0x43b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x62, 0x6f, 0x6b, 0x6d,
-0xe5, 0x6c, 0x4e, 0x6f, 0x72, 0x67, 0x65, 0x53, 0x76, 0x61, 0x6c, 0x62, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x67, 0x20, 0x4a,
-0x61, 0x6e, 0x20, 0x4d, 0x61, 0x79, 0x65, 0x6e, 0xb13, 0xb21, 0xb3c, 0xb3f, 0xb06, 0xb2d, 0xb3e, 0xb30, 0xb24, 0x67e, 0x69a, 0x62a,
-0x648, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x641, 0x627, 0x631,
-0x633, 0x6cc, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x62f, 0x631, 0x6cc, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x50, 0x6f, 0x6c, 0x73,
-0x6b, 0x61, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x41, 0x6e, 0x67,
-0x6f, 0x6c, 0x61, 0x43, 0x61, 0x62, 0x6f, 0x20, 0x56, 0x65, 0x72, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x6f, 0x72, 0x2d, 0x4c,
-0x65, 0x73, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x20, 0x45, 0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c,
-0x47, 0x75, 0x69, 0x6e, 0xe9, 0x2d, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x75, 0x72,
-0x67, 0x6f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x2c, 0x20, 0x52, 0x41, 0x45, 0x20, 0x64, 0x61, 0x20, 0x43, 0x68, 0x69, 0x6e,
-0x61, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea, 0x73,
-0x20, 0x65, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x75, 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c, 0x53, 0xe3, 0x6f, 0x20,
-0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x53, 0x75, 0xed, 0xe7, 0x61,
-0xa2a, 0xa70, 0xa1c, 0xa3e, 0xa2c, 0xa40, 0xa2d, 0xa3e, 0xa30, 0xa24, 0x67e, 0x646, 0x62c, 0x627, 0x628, 0x6cc, 0x52, 0x75, 0x6e, 0x61,
-0x73, 0x69, 0x6d, 0x69, 0x50, 0x65, 0x72, 0xfa, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x45, 0x63, 0x75, 0x61, 0x64,
-0x6f, 0x72, 0x72, 0x75, 0x6d, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x53, 0x76, 0x69, 0x7a, 0x72, 0x61, 0x72, 0x6f, 0x6d,
-0xe2, 0x6e, 0x103, 0x52, 0x6f, 0x6d, 0xe2, 0x6e, 0x69, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20,
-0x4d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x61, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x44f,
-0x41a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x442, 0x430, 0x43d, 0x41a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x438, 0x44f, 0x41c, 0x43e, 0x43b,
-0x434, 0x43e, 0x432, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x430, 0x53, 0xe4, 0x6e, 0x67, 0xf6, 0x4b, 0xf6, 0x64, 0xf6,
-0x72, 0xf6, 0x73, 0xea, 0x73, 0x65, 0x20, 0x74, 0xee, 0x20, 0x42, 0xea, 0x61, 0x66, 0x72, 0xee, 0x6b, 0x61, 0x441, 0x440,
-0x43f, 0x441, 0x43a, 0x438, 0x421, 0x440, 0x431, 0x438, 0x458, 0x430, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x43, 0x72, 0x6e, 0x61,
-0x20, 0x47, 0x6f, 0x72, 0x61, 0x53, 0x72, 0x62, 0x69, 0x6a, 0x61, 0x411, 0x43e, 0x441, 0x43d, 0x430, 0x20, 0x438, 0x20, 0x425,
-0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x438, 0x43d, 0x430, 0x426, 0x440, 0x43d, 0x430, 0x20, 0x413, 0x43e, 0x440, 0x430, 0x41a,
-0x43e, 0x441, 0x43e, 0x432, 0x43e, 0x4b, 0x6f, 0x73, 0x6f, 0x76, 0x6f, 0x438, 0x440, 0x43e, 0x43d, 0x413, 0x443, 0x44b, 0x440, 0x434,
-0x437, 0x44b, 0x441, 0x442, 0x43e, 0x43d, 0x423, 0x4d5, 0x440, 0x4d5, 0x441, 0x435, 0x63, 0x68, 0x69, 0x53, 0x68, 0x6f, 0x6e, 0x61,
-0x633, 0x646, 0x68c, 0x64a, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0xdc3, 0xdd2, 0xd82, 0xdc4, 0xdbd, 0xdc1, 0xdca, 0x200d, 0xdbb,
-0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0xdc0, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f,
-0x76, 0x65, 0x6e, 0x73, 0x6b, 0x6f, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x161, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f,
-0x76, 0x65, 0x6e, 0x69, 0x6a, 0x61, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61,
-0x6c, 0x69, 0x79, 0x61, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x69, 0x79, 0x61, 0x65,
-0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x41, 0x72, 0x67, 0x65,
-0x6e, 0x74, 0x69, 0x6e, 0x61, 0x42, 0x65, 0x6c, 0x69, 0x63, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6f,
-0x6d, 0x62, 0x69, 0x61, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x20, 0x52, 0x69, 0x63, 0x61, 0x43, 0x75, 0x62, 0x61, 0x52, 0x65,
-0x70, 0xfa, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x45, 0x6c,
-0x20, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x20, 0x45, 0x63, 0x75, 0x61,
-0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x48, 0x6f, 0x6e, 0x64, 0x75,
-0x72, 0x61, 0x73, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f,
-0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f, 0x4e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x50, 0x61, 0x6e, 0x61, 0x6d,
-0xe1, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x45, 0x73,
-0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x55, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x56,
-0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c, 0x61, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x61, 0x73, 0x65, 0x73, 0x70, 0x61,
-0xf1, 0x6f, 0x6c, 0x20, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x4c,
-0x61, 0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0xe9, 0x72, 0x69, 0x63, 0x61, 0x43, 0x65, 0x75, 0x74, 0x61, 0x20, 0x79, 0x20,
-0x4d, 0x65, 0x6c, 0x69, 0x6c, 0x6c, 0x61, 0x4b, 0x69, 0x73, 0x77, 0x61, 0x68, 0x69, 0x6c, 0x69, 0x4a, 0x61, 0x6d, 0x68,
-0x75, 0x72, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x69, 0x64, 0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x73, 0x69, 0x61, 0x20,
-0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x53, 0x76, 0x65, 0x72, 0x69,
-0x67, 0x65, 0xc5, 0x6c, 0x61, 0x6e, 0x64, 0x442, 0x43e, 0x4b7, 0x438, 0x43a, 0x4e3, 0x422, 0x43e, 0x4b7, 0x438, 0x43a, 0x438, 0x441,
-0x442, 0x43e, 0x43d, 0xba4, 0xbae, 0xbbf, 0xbb4, 0xbcd, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0xbbe, 0xbae, 0xbb2, 0xbc7, 0xb9a, 0xbbf,
-0xbaf, 0xbbe, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x442,
-0x430, 0x442, 0x430, 0x440, 0xc24, 0xc46, 0xc32, 0xc41, 0xc17, 0xc41, 0xc2d, 0xc3e, 0xc30, 0xc24, 0xc26, 0xc47, 0xc36, 0xc02, 0xe44, 0xe17,
-0xe22, 0xf56, 0xf7c, 0xf51, 0xf0b, 0xf66, 0xf90, 0xf51, 0xf0b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf53, 0xf42, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42,
-0xf62, 0xf0b, 0x1275, 0x130d, 0x122d, 0x129b, 0x12a4, 0x122d, 0x1275, 0x122b, 0x6c, 0x65, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61, 0x74, 0x6f,
-0x6e, 0x67, 0x61, 0x54, 0xfc, 0x72, 0x6b, 0xe7, 0x65, 0x54, 0xfc, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x4b, 0x131, 0x62, 0x72,
-0x131, 0x73, 0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x64, 0x69, 0x6c, 0x69, 0x54, 0xfc, 0x72, 0x6b, 0x6d, 0x65,
-0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x626, 0x6c7, 0x64a, 0x63a, 0x6c7, 0x631, 0x686, 0x6d5, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x443,
-0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x430, 0x627, 0x631, 0x62f, 0x648,
-0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x4f, 0x2bb, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74,
-0x6f, 0x6e, 0x627, 0x648, 0x632, 0x628, 0x6cc, 0x6a9, 0x45e, 0x437, 0x431, 0x435, 0x43a, 0x447, 0x430, 0x40e, 0x437, 0x431, 0x435, 0x43a,
-0x438, 0x441, 0x442, 0x43e, 0x43d, 0x54, 0x69, 0x1ebf, 0x6e, 0x67, 0x20, 0x56, 0x69, 0x1ec7, 0x74, 0x56, 0x69, 0x1ec7, 0x74, 0x20,
-0x4e, 0x61, 0x6d, 0x56, 0x6f, 0x6c, 0x61, 0x70, 0xfc, 0x6b, 0x43, 0x79, 0x6d, 0x72, 0x61, 0x65, 0x67, 0x59, 0x20, 0x44,
-0x65, 0x79, 0x72, 0x6e, 0x61, 0x73, 0x20, 0x55, 0x6e, 0x65, 0x64, 0x69, 0x67, 0x57, 0x6f, 0x6c, 0x6f, 0x66, 0x53, 0x65,
-0x6e, 0x65, 0x67, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x69, 0x58, 0x68, 0x6f, 0x73, 0x61, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x74,
-0x73, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x5d9, 0x5d9, 0x5b4, 0x5d3, 0x5d9, 0x5e9, 0x5d5, 0x5d5, 0x5e2, 0x5dc, 0x5d8,
-0xc8, 0x64, 0xe8, 0x20, 0x59, 0x6f, 0x72, 0xf9, 0x62, 0xe1, 0x4f, 0x72, 0x69, 0x6c, 0x1eb9, 0x300, 0x2d, 0xe8, 0x64, 0xe8,
-0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x4f, 0x72, 0xed, 0x6c, 0x25b, 0x301, 0xe8, 0x64, 0x65, 0x20, 0x42,
-0x25b, 0x300, 0x6e, 0x25b, 0x300, 0x69, 0x73, 0x69, 0x5a, 0x75, 0x6c, 0x75, 0x69, 0x4e, 0x69, 0x6e, 0x67, 0x69, 0x7a, 0x69,
-0x6d, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x6e, 0x79, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x4e, 0x6f, 0x72, 0x65,
-0x67, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x69, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x438, 0x47, 0x61, 0x65,
-0x6c, 0x67, 0x45, 0x6c, 0x6c, 0x61, 0x6e, 0x20, 0x56, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x77,
-0x65, 0x6b, 0x52, 0x79, 0x77, 0x76, 0x61, 0x6e, 0x65, 0x74, 0x68, 0x20, 0x55, 0x6e, 0x79, 0x73, 0x41, 0x6b, 0x61, 0x6e,
-0x47, 0x61, 0x61, 0x6e, 0x61, 0x915, 0x94b, 0x902, 0x915, 0x923, 0x940, 0x41, 0x73, 0x1ee5, 0x73, 0x1ee5, 0x20, 0x49, 0x67, 0x62,
-0x6f, 0x4e, 0x61, 0x1ecb, 0x6a, 0x1ecb, 0x72, 0x1ecb, 0x61, 0x4b, 0x69, 0x6b, 0x61, 0x6d, 0x62, 0x61, 0x66, 0x75, 0x72, 0x6c,
-0x61, 0x6e, 0x45, 0x28b, 0x65, 0x67, 0x62, 0x65, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65,
-0x54, 0x6f, 0x67, 0x6f, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65, 0x2bb, 0x14c, 0x6c, 0x65, 0x6c, 0x6f, 0x20, 0x48, 0x61,
-0x77, 0x61, 0x69, 0x2bb, 0x69, 0x2bb, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x75, 0x69, 0x20, 0x50, 0x16b,
-0x20, 0x2bb, 0x49, 0x61, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61,
-0x73, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x74, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x46, 0x72, 0x61,
-0x6e, 0x6b, 0x72, 0x69, 0x69, 0x63, 0x68, 0x4c, 0x69, 0xe4, 0x63, 0x68, 0x74, 0x65, 0x73, 0x63, 0x68, 0x74, 0xe4, 0x69,
-0xa188, 0xa320, 0xa259, 0xa34f, 0xa1e9, 0x4e, 0x65, 0x64, 0x64, 0x65, 0x72, 0x73, 0x61, 0x73, 0x73, 0x2019, 0x73, 0x63, 0x68, 0x44,
-0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x65, 0x64, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x6e,
-0x65, 0x6e, 0x64, 0x61, 0x76, 0x76, 0x69, 0x73, 0xe1, 0x6d, 0x65, 0x67, 0x69, 0x65, 0x6c, 0x6c, 0x61, 0x4e, 0x6f, 0x72,
-0x67, 0x61, 0x53, 0x75, 0x6f, 0x70, 0x6d, 0x61, 0x52, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x45, 0x6b, 0x65, 0x67, 0x75, 0x73,
-0x69, 0x69, 0x4b, 0x69, 0x74, 0x61, 0x69, 0x74, 0x61, 0x50, 0x75, 0x6c, 0x61, 0x61, 0x72, 0x42, 0x75, 0x72, 0x6b, 0x69,
-0x62, 0x61, 0x61, 0x20, 0x46, 0x61, 0x61, 0x73, 0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x75, 0x6e, 0x47, 0x61, 0x6d,
-0x6d, 0x62, 0x69, 0x47, 0x61, 0x6e, 0x61, 0x61, 0x47, 0x69, 0x6e, 0x65, 0x47, 0x69, 0x6e, 0x65, 0x2d, 0x42, 0x69, 0x73,
-0x61, 0x61, 0x77, 0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e,
-0x69, 0x4e, 0x69, 0x6a, 0x65, 0x65, 0x72, 0x4e, 0x69, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x53, 0x65, 0x72, 0x61,
-0x61, 0x20, 0x6c, 0x69, 0x79, 0x6f, 0x6e, 0x47, 0x69, 0x6b, 0x75, 0x79, 0x75, 0x4b, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x75,
-0x72, 0x73, 0x65, 0x6e, 0x61, 0x69, 0x73, 0x69, 0x4e, 0x64, 0x65, 0x62, 0x65, 0x6c, 0x65, 0x4b, 0x69, 0x68, 0x6f, 0x72,
-0x6f, 0x6d, 0x62, 0x6f, 0x2d5c, 0x2d30, 0x2d5b, 0x2d4d, 0x2d43, 0x2d49, 0x2d5c, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x54, 0x61, 0x73,
-0x68, 0x65, 0x6c, 0x1e25, 0x69, 0x79, 0x74, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x54, 0x61, 0x71, 0x62, 0x61, 0x79, 0x6c,
-0x69, 0x74, 0x4c, 0x65, 0x7a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x6b, 0x6f, 0x72, 0x65,
-0x48, 0x69, 0x62, 0x65, 0x6e, 0x61, 0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x4b, 0x79, 0x69, 0x76,
-0x75, 0x6e, 0x6a, 0x6f, 0x62, 0x61, 0x6d, 0x61, 0x6e, 0x61, 0x6b, 0x61, 0x6e, 0x4b, 0x129, 0x65, 0x6d, 0x62, 0x75, 0x13e3,
-0x13b3, 0x13a9, 0x13cc, 0x13ca, 0x20, 0x13a2, 0x13f3, 0x13be, 0x13b5, 0x13cd, 0x13d4, 0x13c5, 0x20, 0x13cd, 0x13a6, 0x13da, 0x13a9, 0x6b, 0x72, 0x65,
-0x6f, 0x6c, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x4d, 0x6f, 0x72, 0x69, 0x73, 0x43, 0x68, 0x69, 0x6d,
-0x61, 0x6b, 0x6f, 0x6e, 0x64, 0x65, 0x4b, 0x268, 0x6c, 0x61, 0x61, 0x6e, 0x67, 0x69, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61,
-0x6e, 0xed, 0x61, 0x4c, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x49, 0x63, 0x68,
-0x69, 0x62, 0x65, 0x6d, 0x62, 0x61, 0x6b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x4b, 0x61,
-0x62, 0x75, 0x20, 0x56, 0x65, 0x72, 0x64, 0x69, 0x4b, 0x129, 0x6d, 0x129, 0x72, 0x169, 0x4b, 0x61, 0x6c, 0x65, 0x6e, 0x6a,
-0x69, 0x6e, 0x45, 0x6d, 0x65, 0x74, 0x61, 0x62, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4b, 0x68, 0x6f, 0x65, 0x6b, 0x68,
-0x6f, 0x65, 0x67, 0x6f, 0x77, 0x61, 0x62, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x62, 0x4b, 0x69, 0x6d, 0x61, 0x63,
-0x68, 0x61, 0x6d, 0x65, 0x4b, 0xf6, 0x6c, 0x73, 0x63, 0x68, 0x44, 0x6f, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e,
-0x64, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x61, 0x4f, 0x6c, 0x75, 0x73, 0x6f, 0x67, 0x61, 0x4c, 0x75, 0x6c, 0x75,
-0x68, 0x69, 0x61, 0x4b, 0x69, 0x70, 0x61, 0x72, 0x65, 0x54, 0x61, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x4b, 0x69, 0x74,
-0x65, 0x73, 0x6f, 0x4b, 0x65, 0x6e, 0x69, 0x61, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x20, 0x63, 0x69, 0x69, 0x6e, 0x69, 0x4d,
-0x61, 0x61, 0x6c, 0x69, 0x4b, 0x69, 0x72, 0x75, 0x77, 0x61, 0x44, 0x68, 0x6f, 0x6c, 0x75, 0x6f, 0x52, 0x75, 0x6b, 0x69,
-0x67, 0x61, 0x54, 0x61, 0x6d, 0x61, 0x7a, 0x69, 0x263, 0x74, 0x20, 0x6e, 0x20, 0x6c, 0x61, 0x1e6d, 0x6c, 0x61, 0x1e63, 0x4d,
-0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69,
-0x4b, 0x69, 0x73, 0x68, 0x61, 0x6d, 0x62, 0x61, 0x61, 0x92c, 0x921, 0x93c, 0x94b, 0x43d, 0x43e, 0x445, 0x447, 0x438, 0x439, 0x43d,
-0x446, 0x435, 0x440, 0x43a, 0x43e, 0x432, 0x43d, 0x43e, 0x441, 0x43b, 0x43e, 0x432, 0x435, 0x301, 0x43d, 0x441, 0x43a, 0x457, 0x439, 0x440,
-0x461, 0x441, 0x441, 0x456, 0x301, 0x430, 0x54, 0x73, 0x68, 0x69, 0x6c, 0x75, 0x62, 0x61, 0x44, 0x69, 0x74, 0x75, 0x6e, 0x67,
-0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75, 0x4c, 0xeb, 0x74, 0x7a, 0x65, 0x62, 0x75, 0x65, 0x72, 0x67,
-0x65, 0x73, 0x63, 0x68, 0x41, 0x67, 0x68, 0x65, 0x6d, 0x4b, 0xe0, 0x6d, 0xe0, 0x6c, 0xfb, 0x14b, 0x181, 0xe0, 0x73, 0xe0,
-0x61, 0x4b, 0xe0, 0x6d, 0x25b, 0x300, 0x72, 0xfb, 0x6e, 0x5a, 0x61, 0x72, 0x6d, 0x61, 0x63, 0x69, 0x69, 0x6e, 0x65, 0x4e,
-0x69, 0x17e, 0x65, 0x72, 0x64, 0x75, 0xe1, 0x6c, 0xe1, 0x6a, 0x6f, 0x6f, 0x6c, 0x61, 0x53, 0x65, 0x6e, 0x65, 0x67, 0x61,
-0x6c, 0x65, 0x77, 0x6f, 0x6e, 0x64, 0x6f, 0x4b, 0x61, 0x6d, 0x259, 0x72, 0xfa, 0x6e, 0x72, 0x69, 0x6b, 0x70, 0x61, 0x6b,
-0x61, 0x6d, 0x25b, 0x72, 0xfa, 0x6e, 0x4d, 0x61, 0x6b, 0x75, 0x61, 0x55, 0x6d, 0x6f, 0x7a, 0x61, 0x6d, 0x62, 0x69, 0x6b,
-0x69, 0x4d, 0x55, 0x4e, 0x44, 0x41, 0x14a, 0x6b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x14b, 0x4b, 0x77, 0x61, 0x73, 0x69, 0x6f,
-0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x6e, 0x54, 0x68, 0x6f, 0x6b, 0x20, 0x4e, 0x61, 0x74, 0x68, 0x441, 0x430, 0x445, 0x430,
-0x20, 0x442, 0x44b, 0x43b, 0x430, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b, 0x439, 0x430, 0x49, 0x73, 0x68, 0x69, 0x73, 0x61,
-0x6e, 0x67, 0x75, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x54, 0x61, 0x73, 0x61, 0x77, 0x61, 0x71, 0x20,
-0x73, 0x65, 0x6e, 0x6e, 0x69, 0xa559, 0xa524, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x56, 0x61, 0x69, 0x4c, 0x61, 0x69, 0x62, 0x68, 0x69,
-0x79, 0x61, 0x57, 0x61, 0x6c, 0x73, 0x65, 0x72, 0x53, 0x63, 0x68, 0x77, 0x69, 0x7a, 0x6e, 0x75, 0x61, 0x73, 0x75, 0x65,
-0x4b, 0x65, 0x6d, 0x65, 0x6c, 0xfa, 0x6e, 0x61, 0x73, 0x74, 0x75, 0x72, 0x69, 0x61, 0x6e, 0x75, 0x4e, 0x64, 0x61, 0xa78c,
-0x61, 0x4b, 0x61, 0x6d, 0x25b, 0x6c, 0xfb, 0x6e, 0x6b, 0x61, 0x6b, 0x254, 0x4b, 0x61, 0x6d, 0x25b, 0x72, 0x75, 0x6e, 0x6d,
-0x65, 0x74, 0x61, 0x2bc, 0x4b, 0x61, 0x6d, 0x61, 0x6c, 0x75, 0x6e, 0x53, 0x68, 0x77, 0xf3, 0x14b, 0xf2, 0x20, 0x6e, 0x67,
-0x69, 0x65, 0x6d, 0x62, 0x254, 0x254, 0x6e, 0x4b, 0xe0, 0x6d, 0x61, 0x6c, 0xfb, 0x6d, 0xd804, 0xdd0c, 0xd804, 0xdd0b, 0xd804, 0xdd34,
-0xd804, 0xdd1f, 0xd804, 0xdd33, 0xd804, 0xdd26, 0xd804, 0xdd1d, 0xd804, 0xdd01, 0xd804, 0xdd23, 0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd0c, 0xd804, 0xdd34,
-0xd804, 0xdd1e, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd16, 0xd804, 0xdd34, 0x4c, 0x61, 0x6b, 0x21f, 0xf3, 0x6c, 0x2bc, 0x69, 0x79, 0x61,
-0x70, 0x69, 0x4d, 0xed, 0x6c, 0x61, 0x68, 0x61, 0x14b, 0x73, 0x6b, 0x61, 0x20, 0x54, 0x21f, 0x61, 0x6d, 0xe1, 0x6b, 0x21f,
-0x6f, 0x10d, 0x68, 0x65, 0x2d5c, 0x2d30, 0x2d4e, 0x2d30, 0x2d63, 0x2d49, 0x2d56, 0x2d5c, 0x6a9, 0x648, 0x631, 0x62f, 0x6cc, 0x6cc, 0x20, 0x646,
-0x627, 0x648, 0x6d5, 0x646, 0x62f, 0x6cc, 0x639, 0x6ce, 0x631, 0x627, 0x642, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0x64, 0x6f, 0x6c, 0x6e,
-0x6f, 0x73, 0x65, 0x72, 0x62, 0x161, 0x107, 0x69, 0x6e, 0x61, 0x4e, 0x69, 0x6d, 0x73, 0x6b, 0x61, 0x68, 0x6f, 0x72, 0x6e,
-0x6a, 0x6f, 0x73, 0x65, 0x72, 0x62, 0x161, 0x107, 0x69, 0x6e, 0x61, 0x4e, 0x11b, 0x6d, 0x73, 0x6b, 0x61, 0x70, 0x72, 0x16b,
-0x73, 0x69, 0x73, 0x6b, 0x61, 0x6e, 0x73, 0x77, 0x12b, 0x74, 0x61, 0x69, 0x61, 0x6e, 0x61, 0x72, 0xe2, 0x161, 0x6b, 0x69,
-0x65, 0x6c, 0xe2, 0x53, 0x75, 0x6f, 0x6d, 0xe2, 0x645, 0x627, 0x632, 0x631, 0x648, 0x646, 0x6cc, 0x644, 0x6ca, 0x631, 0x6cc, 0x20,
-0x634, 0x648, 0x645, 0x627, 0x644, 0x6cc, 0x7cb5, 0x8a9e, 0x4e2d, 0x83ef, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225, 0x884c,
-0x653f, 0x5340, 0x7ca4, 0x8bed, 0x4e2d, 0x534e, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x56fd, 0x42, 0x69, 0x6e, 0x69, 0x73, 0x61, 0x79, 0x61
+static constexpr char16_t endonyms_data[] = {
+0x410, 0x525, 0x441, 0x448, 0x4d9, 0x430, 0x49a, 0x44b, 0x440, 0x4ad, 0x442, 0x4d9,
+0x44b, 0x43b, 0x430, 0x51, 0x61, 0x66, 0x61, 0x72, 0x4f, 0x74, 0x6f, 0x62,
+0x62, 0x69, 0x61, 0x59, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x45, 0x72,
+0x65, 0x74, 0x72, 0x69, 0x61, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61,
+0x6e, 0x73, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b,
+0x61, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0xeb, 0x41, 0x67, 0x68, 0x65,
+0x6d, 0x4b, 0xe0, 0x6d, 0xe0, 0x6c, 0xfb, 0x14b, 0x41, 0x6b, 0x61, 0x6e,
+0x47, 0x61, 0x61, 0x6e, 0x61, 0x41, 0x6b, 0x6f, 0x6f, 0x73, 0x65, 0x4b,
+0x61, 0x6d, 0x65, 0x72, 0xfb, 0x6e, 0x73, 0x68, 0x71, 0x69, 0x70, 0x53,
+0x68, 0x71, 0x69, 0x70, 0xeb, 0x72, 0x69, 0x4b, 0x6f, 0x73, 0x6f, 0x76,
+0xeb, 0x4d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x69, 0x61, 0x20, 0x65,
+0x20, 0x56, 0x65, 0x72, 0x69, 0x75, 0x74, 0x12a0, 0x121b, 0x122d, 0x129b, 0x12a2,
+0x1275, 0x12ee, 0x1335, 0x12eb, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x645,
+0x635, 0x631, 0x627, 0x644, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x627, 0x644, 0x628,
+0x62d, 0x631, 0x64a, 0x646, 0x62a, 0x634, 0x627, 0x62f, 0x62c, 0x632, 0x631, 0x20,
+0x627, 0x644, 0x642, 0x645, 0x631, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x625,
+0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x627, 0x627, 0x644, 0x639, 0x631, 0x627, 0x642,
+0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x627, 0x644, 0x623, 0x631, 0x62f,
+0x646, 0x627, 0x644, 0x643, 0x648, 0x64a, 0x62a, 0x644, 0x628, 0x646, 0x627, 0x646,
+0x644, 0x64a, 0x628, 0x64a, 0x627, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646,
+0x64a, 0x627, 0x627, 0x644, 0x645, 0x63a, 0x631, 0x628, 0x639, 0x64f, 0x645, 0x627,
+0x646, 0x627, 0x644, 0x623, 0x631, 0x627, 0x636, 0x64a, 0x20, 0x627, 0x644, 0x641,
+0x644, 0x633, 0x637, 0x64a, 0x646, 0x64a, 0x629, 0x642, 0x637, 0x631, 0x627, 0x644,
+0x645, 0x645, 0x644, 0x643, 0x629, 0x20, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a,
+0x629, 0x20, 0x627, 0x644, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x629, 0x627, 0x644,
+0x635, 0x648, 0x645, 0x627, 0x644, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644,
+0x633, 0x648, 0x62f, 0x627, 0x646, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646,
+0x633, 0x648, 0x631, 0x64a, 0x627, 0x62a, 0x648, 0x646, 0x633, 0x627, 0x644, 0x625,
+0x645, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a,
+0x629, 0x20, 0x627, 0x644, 0x645, 0x62a, 0x62d, 0x62f, 0x629, 0x627, 0x644, 0x635,
+0x62d, 0x631, 0x627, 0x621, 0x20, 0x627, 0x644, 0x63a, 0x631, 0x628, 0x64a, 0x629,
+0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x641, 0x635,
+0x62d, 0x649, 0x20, 0x627, 0x644, 0x62d, 0x62f, 0x64a, 0x62b, 0x629, 0x627, 0x644,
+0x639, 0x627, 0x644, 0x645, 0x627, 0x644, 0x64a, 0x645, 0x646, 0x61, 0x72, 0x61,
+0x67, 0x6f, 0x6e, 0xe9, 0x73, 0x45, 0x73, 0x70, 0x61, 0x6e, 0x79, 0x61,
+0x570, 0x561, 0x575, 0x565, 0x580, 0x565, 0x576, 0x540, 0x561, 0x575, 0x561, 0x57d,
+0x57f, 0x561, 0x576, 0x985, 0x9b8, 0x9ae, 0x9c0, 0x9af, 0x9bc, 0x9be, 0x9ad, 0x9be,
+0x9f0, 0x9a4, 0x61, 0x73, 0x74, 0x75, 0x72, 0x69, 0x61, 0x6e, 0x75, 0x45,
+0x73, 0x70, 0x61, 0xf1, 0x61, 0x4b, 0x69, 0x70, 0x61, 0x72, 0x65, 0x54,
+0x61, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x41, 0x74, 0x73, 0x61, 0x6d,
+0x61, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x41, 0x7a,
+0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x62a, 0x6c6, 0x631, 0x6a9,
+0x62c, 0x647, 0x430, 0x437, 0x4d9, 0x440, 0x431, 0x430, 0x458, 0x4b9, 0x430, 0x43d,
+0x410, 0x437, 0x4d9, 0x440, 0x431, 0x430, 0x458, 0x4b9, 0x430, 0x43d, 0x72, 0x69,
+0x6b, 0x70, 0x61, 0x6b, 0x61, 0x6d, 0x25b, 0x72, 0xfa, 0x6e, 0x62, 0x61,
+0x6d, 0x61, 0x6e, 0x61, 0x6b, 0x61, 0x6e, 0x4d, 0x61, 0x6c, 0x69, 0x9ac,
+0x9be, 0x982, 0x9b2, 0x9be, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6,
+0x9ad, 0x9be, 0x9b0, 0x9a4, 0x181, 0xe0, 0x73, 0xe0, 0x61, 0x4b, 0xe0, 0x6d,
+0x25b, 0x300, 0x72, 0xfb, 0x6e, 0x431, 0x430, 0x448, 0x4a1, 0x43e, 0x440, 0x442,
+0x20, 0x442, 0x435, 0x43b, 0x435, 0x65, 0x75, 0x73, 0x6b, 0x61, 0x72, 0x61,
+0x45, 0x73, 0x70, 0x61, 0x69, 0x6e, 0x69, 0x61, 0x431, 0x435, 0x43b, 0x430,
+0x440, 0x443, 0x441, 0x43a, 0x430, 0x44f, 0x411, 0x435, 0x43b, 0x430, 0x440, 0x443,
+0x441, 0x44c, 0x49, 0x63, 0x68, 0x69, 0x62, 0x65, 0x6d, 0x62, 0x61, 0x5a,
+0x61, 0x6d, 0x62, 0x69, 0x61, 0x48, 0x69, 0x62, 0x65, 0x6e, 0x61, 0x48,
+0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x92d, 0x94b, 0x91c,
+0x92a, 0x941, 0x930, 0x940, 0x92d, 0x93e, 0x930, 0x924, 0x1265, 0x120a, 0x1295, 0x12a4,
+0x122d, 0x1275, 0x122b, 0x92c, 0x930, 0x2019, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73,
+0x6b, 0x69, 0x42, 0x6f, 0x73, 0x6e, 0x61, 0x20, 0x69, 0x20, 0x48, 0x65,
+0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x69, 0x6e, 0x61, 0x431, 0x43e, 0x441,
+0x430, 0x43d, 0x441, 0x43a, 0x438, 0x411, 0x43e, 0x441, 0x43d, 0x430, 0x20, 0x438,
+0x20, 0x425, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x438, 0x43d, 0x430,
+0x62, 0x72, 0x65, 0x7a, 0x68, 0x6f, 0x6e, 0x65, 0x67, 0x46, 0x72, 0x61,
+0xf1, 0x73, 0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x411,
+0x44a, 0x43b, 0x433, 0x430, 0x440, 0x438, 0x44f, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019,
+0x102c, 0x7cb5, 0x8a9e, 0x4e2d, 0x83ef, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x570b, 0x9999, 0x6e2f,
+0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x7ca4, 0x8bed, 0x4e2d, 0x534e, 0x4eba, 0x6c11, 0x5171,
+0x548c, 0x56fd, 0x63, 0x61, 0x74, 0x61, 0x6c, 0xe0, 0x41, 0x6e, 0x64, 0x6f,
+0x72, 0x72, 0x61, 0x46, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x49, 0x74, 0xe0,
+0x6c, 0x69, 0x61, 0x43, 0x65, 0x62, 0x75, 0x61, 0x6e, 0x6f, 0x50, 0x69,
+0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x54, 0x61, 0x6d, 0x61, 0x7a,
+0x69, 0x263, 0x74, 0x20, 0x6e, 0x20, 0x6c, 0x61, 0x1e6d, 0x6c, 0x61, 0x1e63,
+0x4d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x6a9, 0x648, 0x631, 0x62f, 0x6cc, 0x6cc,
+0x20, 0x646, 0x627, 0x648, 0x6d5, 0x646, 0x62f, 0x6cc, 0x639, 0x6ce, 0x631, 0x627,
+0x642, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0xd804, 0xdd0c, 0xd804, 0xdd0b, 0xd804, 0xdd34,
+0xd804, 0xdd1f, 0xd804, 0xdd33, 0xd804, 0xdd26, 0xd804, 0xdd1d, 0xd804, 0xdd01, 0xd804, 0xdd23,
+0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd1e, 0xd804, 0xdd22,
+0xd804, 0xdd27, 0xd804, 0xdd16, 0xd804, 0xdd34, 0x43d, 0x43e, 0x445, 0x447, 0x438, 0x439,
+0x43d, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x13e3, 0x13b3, 0x13a9, 0x13cc, 0x13ca, 0x20,
+0x13a2, 0x13f3, 0x13be, 0x13b5, 0x13cd, 0x13d4, 0x13c5, 0x20, 0x13cd, 0x13a6, 0x13da, 0x13a9,
+0x43, 0x68, 0x69, 0x6b, 0x61, 0x73, 0x68, 0x73, 0x68, 0x61, 0x6e, 0x6f,
+0x6d, 0x70, 0x61, 0x2bc, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53,
+0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x75, 0x6b, 0x69, 0x67, 0x61, 0x55,
+0x67, 0x61, 0x6e, 0x64, 0x61, 0x7b80, 0x4f53, 0x4e2d, 0x6587, 0x4e2d, 0x56fd, 0x4e2d,
+0x56fd, 0x9999, 0x6e2f, 0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x4e2d, 0x56fd, 0x6fb3, 0x95e8,
+0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x65b0, 0x52a0, 0x5761, 0x7e41, 0x9ad4, 0x4e2d, 0x6587,
+0x4e2d, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x4e2d, 0x570b, 0x6fb3,
+0x9580, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x53f0, 0x7063, 0x446, 0x435, 0x440, 0x43a,
+0x43e, 0x432, 0x43d, 0x43e, 0x441, 0x43b, 0x43e, 0x432, 0x435, 0x301, 0x43d, 0x441,
+0x43a, 0x457, 0x439, 0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x430, 0x447, 0x4d1,
+0x432, 0x430, 0x448, 0x420, 0x430, 0x4ab, 0x4ab, 0x435, 0x439, 0x4b, 0xf6, 0x6c,
+0x73, 0x63, 0x68, 0x44, 0x6f, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61,
+0x6e, 0x64, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x77, 0x65, 0x6b, 0x52, 0x79,
+0x77, 0x76, 0x61, 0x6e, 0x65, 0x74, 0x68, 0x20, 0x55, 0x6e, 0x79, 0x73,
+0x63, 0x6f, 0x72, 0x73, 0x75, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x61,
+0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69, 0x48, 0x72, 0x76, 0x61,
+0x74, 0x73, 0x6b, 0x61, 0x10d, 0x65, 0x161, 0x74, 0x69, 0x6e, 0x61, 0x10c,
+0x65, 0x73, 0x6b, 0x6f, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x44, 0x61, 0x6e,
+0x6d, 0x61, 0x72, 0x6b, 0x47, 0x72, 0xf8, 0x6e, 0x6c, 0x61, 0x6e, 0x64,
+0x78b, 0x7a8, 0x788, 0x7ac, 0x780, 0x7a8, 0x784, 0x7a6, 0x790, 0x7b0, 0x78b, 0x7a8,
+0x788, 0x7ac, 0x780, 0x7a8, 0x20, 0x783, 0x7a7, 0x787, 0x7b0, 0x796, 0x7ac, 0x921,
+0x94b, 0x917, 0x930, 0x940, 0x64, 0x75, 0xe1, 0x6c, 0xe1, 0x43, 0x61, 0x6d,
+0x65, 0x72, 0x6f, 0x75, 0x6e, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61,
+0x6e, 0x64, 0x73, 0x41, 0x72, 0x75, 0x62, 0x61, 0x56, 0x6c, 0x61, 0x61,
+0x6d, 0x73, 0x42, 0x65, 0x6c, 0x67, 0x69, 0xeb, 0x43, 0x61, 0x72, 0x69,
+0x62, 0x69, 0x73, 0x63, 0x68, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c,
+0x61, 0x6e, 0x64, 0x43, 0x75, 0x72, 0x61, 0xe7, 0x61, 0x6f, 0x53, 0x69,
+0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x53, 0x75,
+0x72, 0x69, 0x6e, 0x61, 0x6d, 0x65, 0xf62, 0xfab, 0xf7c, 0xf44, 0xf0b, 0xf41,
+0xf60, 0xf56, 0xfb2, 0xf74, 0xf42, 0x4b, 0x129, 0x65, 0x6d, 0x62, 0x75, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e,
+0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0xd801, 0xdc00, 0xd801, 0xdc4d,
+0xd801, 0xdc4a, 0xd801, 0xdc2e, 0xd801, 0xdc47, 0xd801, 0xdc0f, 0xd801, 0xdc2d, 0xd801, 0xdc4c,
+0xd801, 0xdc34, 0xd801, 0xdc3b, 0xd801, 0xdc32, 0xd801, 0xdc3c, 0x20, 0xd801, 0xdc1d, 0xd801,
+0xdc3b, 0xd801, 0xdc29, 0xd801, 0xdc3b, 0xd801, 0xdc45, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x6e, 0x20, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x41, 0x6e, 0x67,
+0x75, 0x69, 0x6c, 0x6c, 0x61, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61,
+0x20, 0x26, 0x20, 0x42, 0x61, 0x72, 0x62, 0x75, 0x64, 0x61, 0x41, 0x75,
+0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67,
+0x6c, 0x69, 0x73, 0x68, 0x41, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x42,
+0x61, 0x68, 0x61, 0x6d, 0x61, 0x73, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64,
+0x6f, 0x73, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x75, 0x6d, 0x42, 0x65, 0x6c,
+0x69, 0x7a, 0x65, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x42, 0x6f,
+0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73,
+0x68, 0x20, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x4f, 0x63, 0x65,
+0x61, 0x6e, 0x20, 0x54, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f, 0x72, 0x79,
+0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x56, 0x69, 0x72, 0x67,
+0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x42, 0x75,
+0x72, 0x75, 0x6e, 0x64, 0x69, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x6f,
+0x6e, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e,
+0x67, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x43,
+0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64,
+0x73, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x20, 0x49,
+0x73, 0x6c, 0x61, 0x6e, 0x64, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x20, 0x28,
+0x4b, 0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x43, 0x6f, 0x6f, 0x6b, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x43, 0x79, 0x70, 0x72, 0x75, 0x73, 0x44, 0x65,
+0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x47,
+0x61, 0x72, 0x63, 0x69, 0x61, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
+0x61, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x45, 0x73, 0x77, 0x61,
+0x74, 0x69, 0x6e, 0x69, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x46, 0x61,
+0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e,
+0x64, 0x73, 0x46, 0x69, 0x6a, 0x69, 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e,
+0x64, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x47, 0x65, 0x72, 0x6d, 0x61,
+0x6e, 0x79, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x47, 0x69, 0x62, 0x72, 0x61,
+0x6c, 0x74, 0x61, 0x72, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x47,
+0x75, 0x61, 0x6d, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x47,
+0x75, 0x79, 0x61, 0x6e, 0x61, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f,
+0x6e, 0x67, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61,
+0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x49, 0x72, 0x65,
+0x6c, 0x61, 0x6e, 0x64, 0x49, 0x73, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20,
+0x4d, 0x61, 0x6e, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x4a, 0x61, 0x6d,
+0x61, 0x69, 0x63, 0x61, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x4b, 0x69,
+0x72, 0x69, 0x62, 0x61, 0x74, 0x69, 0x4c, 0x65, 0x73, 0x6f, 0x74, 0x68,
+0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x4d, 0x61, 0x63, 0x61,
+0x6f, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x4d,
+0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x63, 0x61, 0x72, 0x4d, 0x61, 0x6c,
+0x61, 0x77, 0x69, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x4d,
+0x61, 0x6c, 0x64, 0x69, 0x76, 0x65, 0x73, 0x4d, 0x61, 0x6c, 0x74, 0x61,
+0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75,
+0x73, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x4d,
+0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x4e, 0x61, 0x6d,
+0x69, 0x62, 0x69, 0x61, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x4e, 0x65, 0x74,
+0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4e, 0x65, 0x77, 0x20,
+0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x69, 0x67, 0x65, 0x72,
+0x69, 0x61, 0x4e, 0x69, 0x75, 0x65, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c,
+0x6b, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x6f, 0x72, 0x74,
+0x68, 0x65, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x61,
+0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x50, 0x61, 0x6b, 0x69,
+0x73, 0x74, 0x61, 0x6e, 0x50, 0x61, 0x6c, 0x61, 0x75, 0x50, 0x61, 0x70,
+0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65,
+0x61, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73,
+0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x20, 0x52,
+0x69, 0x63, 0x6f, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x53, 0x74, 0x20,
+0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x53, 0x74, 0x20, 0x4b, 0x69, 0x74,
+0x74, 0x73, 0x20, 0x26, 0x20, 0x4e, 0x65, 0x76, 0x69, 0x73, 0x53, 0x74,
+0x20, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x53, 0x74, 0x20, 0x56, 0x69, 0x6e,
+0x63, 0x65, 0x6e, 0x74, 0x20, 0x26, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47,
+0x72, 0x65, 0x6e, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x53, 0x65, 0x79,
+0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x65, 0x72, 0x72,
+0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x61,
+0x70, 0x6f, 0x72, 0x65, 0x53, 0x69, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x61,
+0x72, 0x74, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x61,
+0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61,
+0x6e, 0x64, 0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64,
+0x61, 0x6e, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x53, 0x77, 0x65, 0x64, 0x65,
+0x6e, 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64,
+0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x54, 0x6f, 0x6b, 0x65,
+0x6c, 0x61, 0x75, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0x72, 0x69, 0x6e,
+0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67,
+0x6f, 0x54, 0x75, 0x72, 0x6b, 0x73, 0x20, 0x26, 0x20, 0x43, 0x61, 0x69,
+0x63, 0x6f, 0x73, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x54,
+0x75, 0x76, 0x61, 0x6c, 0x75, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20,
+0x41, 0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65,
+0x73, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x45, 0x6e, 0x67,
+0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b,
+0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x4f,
+0x75, 0x74, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x73, 0x6c, 0x61,
+0x6e, 0x64, 0x73, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x56, 0x69, 0x72, 0x67,
+0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x56, 0x61,
+0x6e, 0x75, 0x61, 0x74, 0x75, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x5a, 0x69,
+0x6d, 0x62, 0x61, 0x62, 0x77, 0x65, 0x44d, 0x440, 0x437, 0x44f, 0x43d, 0x44c,
+0x20, 0x43a, 0x435, 0x43b, 0x44c, 0x420, 0x443, 0x437, 0x43e, 0x43d, 0x44c, 0x20,
+0x43c, 0x430, 0x441, 0x442, 0x43e, 0x440, 0x45, 0x73, 0x70, 0x65, 0x72, 0x61,
+0x6e, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x64, 0x6f, 0x65, 0x65, 0x73, 0x74,
+0x69, 0x45, 0x65, 0x73, 0x74, 0x69, 0x45, 0x28b, 0x65, 0x67, 0x62, 0x65,
+0x47, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65,
+0x54, 0x6f, 0x67, 0x6f, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65, 0x65,
+0x77, 0x6f, 0x6e, 0x64, 0x6f, 0x4b, 0x61, 0x6d, 0x259, 0x72, 0xfa, 0x6e,
+0x66, 0xf8, 0x72, 0x6f, 0x79, 0x73, 0x6b, 0x74, 0x46, 0xf8, 0x72, 0x6f,
+0x79, 0x61, 0x72, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x73,
+0x75, 0x6f, 0x6d, 0x69, 0x53, 0x75, 0x6f, 0x6d, 0x69, 0x66, 0x72, 0x61,
+0x6e, 0xe7, 0x61, 0x69, 0x73, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x41,
+0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x71,
+0x75, 0x65, 0x42, 0xe9, 0x6e, 0x69, 0x6e, 0x42, 0x75, 0x72, 0x6b, 0x69,
+0x6e, 0x61, 0x20, 0x46, 0x61, 0x73, 0x6f, 0x66, 0x72, 0x61, 0x6e, 0xe7,
+0x61, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e,
+0x52, 0xe9, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x71, 0x75, 0x65, 0x20, 0x63,
+0x65, 0x6e, 0x74, 0x72, 0x61, 0x66, 0x72, 0x69, 0x63, 0x61, 0x69, 0x6e,
+0x65, 0x54, 0x63, 0x68, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x65,
+0x73, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x42, 0x72, 0x61, 0x7a, 0x7a,
+0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d,
+0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x44, 0x6a, 0x69, 0x62,
+0x6f, 0x75, 0x74, 0x69, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x20, 0xe9,
+0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x65, 0x47, 0x75,
+0x79, 0x61, 0x6e, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69,
+0x73, 0x65, 0x50, 0x6f, 0x6c, 0x79, 0x6e, 0xe9, 0x73, 0x69, 0x65, 0x20,
+0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x47, 0x61, 0x62,
+0x6f, 0x6e, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65,
+0x48, 0x61, 0xef, 0x74, 0x69, 0x43, 0xf4, 0x74, 0x65, 0x20, 0x64, 0x2019,
+0x49, 0x76, 0x6f, 0x69, 0x72, 0x65, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62,
+0x6f, 0x75, 0x72, 0x67, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71,
+0x75, 0x65, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65,
+0x4d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x79, 0x6f, 0x74,
+0x74, 0x65, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x4d, 0x61, 0x72, 0x6f,
+0x63, 0x4e, 0x6f, 0x75, 0x76, 0x65, 0x6c, 0x6c, 0x65, 0x2d, 0x43, 0x61,
+0x6c, 0xe9, 0x64, 0x6f, 0x6e, 0x69, 0x65, 0x4c, 0x61, 0x20, 0x52, 0xe9,
+0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x42,
+0x61, 0x72, 0x74, 0x68, 0xe9, 0x6c, 0x65, 0x6d, 0x79, 0x53, 0x61, 0x69,
+0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x53, 0x61, 0x69,
+0x6e, 0x74, 0x2d, 0x50, 0x69, 0x65, 0x72, 0x72, 0x65, 0x2d, 0x65, 0x74,
+0x2d, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x6f, 0x6e, 0x53, 0xe9, 0x6e,
+0xe9, 0x67, 0x61, 0x6c, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73,
+0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x75, 0x69, 0x73, 0x73,
+0x65, 0x53, 0x79, 0x72, 0x69, 0x65, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x69,
+0x65, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x2d, 0x65, 0x74, 0x2d, 0x46,
+0x75, 0x74, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x72, 0x6c, 0x61, 0x6e, 0x49,
+0x74, 0x61, 0x6c, 0x69, 0x65, 0x50, 0x75, 0x6c, 0x61, 0x61, 0x72, 0x53,
+0x65, 0x6e, 0x65, 0x67, 0x61, 0x61, 0x6c, 0xd83a, 0xdd06, 0xd83a, 0xdd35, 0xd83a,
+0xdd24, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd04, 0xd83a, 0xdd35, 0xd83a, 0xdd2a, 0xd83a,
+0xdd33, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0x20, 0xd83a, 0xdd0a, 0xd83a, 0xdd22,
+0xd83a, 0xdd27, 0xd83a, 0xdd2e, 0xd83a, 0xdd45, 0xd83a, 0xdd11, 0xd83a, 0xdd22, 0xd83a, 0xdd25,
+0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd32, 0xd83a, 0xdd18,
+0xd83a, 0xdd22, 0xd83a, 0xdd25, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22,
+0xd83a, 0xdd18, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0xd83a, 0xdd18, 0xd83a, 0xdd2d,
+0xd83a, 0xdd32, 0xd83a, 0xdd2b, 0x2d, 0xd83a, 0xdd04, 0xd83a, 0xdd2d, 0xd83a, 0xdd27, 0xd83a,
+0xdd22, 0xd83a, 0xdd31, 0xd83a, 0xdd2e, 0xd83a, 0xdd45, 0xd83a, 0xdd02, 0xd83a, 0xdd22, 0xd83a,
+0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a,
+0xdd44, 0xd83a, 0xdd03, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd3c, 0xd83a, 0xdd22, 0xd83a,
+0xdd32, 0xd83a, 0xdd2d, 0xd83a, 0xdd45, 0xd83a, 0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd36, 0xd83a,
+0xdd2b, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a,
+0xdd10, 0xd83a, 0xdd2d, 0xd83a, 0xdd45, 0xd83a, 0xdd36, 0xd83a, 0xdd2b, 0xd83a, 0xdd2a, 0xd83a,
+0xdd05, 0xd83a, 0xdd2b, 0xd83a, 0xdd32, 0xd83a, 0xdd2b, 0xd83a, 0xdd3a, 0xd83a, 0xdd22, 0xd83a,
+0xdd44, 0xd83a, 0xdd24, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a,
+0xdd24, 0xd83a, 0xdd2e, 0xd83a, 0xdd32, 0x42, 0x75, 0x72, 0x6b, 0x69, 0x62, 0x61,
+0x61, 0x20, 0x46, 0x61, 0x61, 0x73, 0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72,
+0x75, 0x75, 0x6e, 0x47, 0x61, 0x6d, 0x6d, 0x62, 0x69, 0x47, 0x61, 0x6e,
+0x61, 0x61, 0x47, 0x69, 0x6e, 0x65, 0x2d, 0x42, 0x69, 0x73, 0x61, 0x61,
+0x77, 0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x4d,
+0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x4e, 0x69, 0x6a, 0x65, 0x72,
+0x69, 0x79, 0x61, 0x61, 0x4e, 0x69, 0x6a, 0x65, 0x65, 0x72, 0x53, 0x65,
+0x72, 0x61, 0x61, 0x20, 0x6c, 0x69, 0x79, 0x6f, 0x6e, 0x47, 0xe0, 0x69,
+0x64, 0x68, 0x6c, 0x69, 0x67, 0x41, 0x6e, 0x20, 0x52, 0xec, 0x6f, 0x67,
+0x68, 0x61, 0x63, 0x68, 0x64, 0x20, 0x41, 0x6f, 0x6e, 0x61, 0x69, 0x63,
+0x68, 0x74, 0x65, 0x47, 0xe3, 0x67, 0x61, 0x6c, 0x65, 0x67, 0x6f, 0x4c,
+0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64,
+0x61, 0x130d, 0x12d5, 0x12dd, 0x129b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8,
+0x10e1, 0x10d0, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10d5, 0x10d4, 0x10da, 0x10dd, 0x44, 0x65,
+0x75, 0x74, 0x73, 0x63, 0x68, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68,
+0x6c, 0x61, 0x6e, 0x64, 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69,
+0x63, 0x68, 0x69, 0x73, 0x63, 0x68, 0x65, 0x73, 0x20, 0x44, 0x65, 0x75,
+0x74, 0x73, 0x63, 0x68, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x65, 0x6e, 0x49,
+0x74, 0x61, 0x6c, 0x69, 0x65, 0x6e, 0x4c, 0x69, 0x65, 0x63, 0x68, 0x74,
+0x65, 0x6e, 0x73, 0x74, 0x65, 0x69, 0x6e, 0x4c, 0x75, 0x78, 0x65, 0x6d,
+0x62, 0x75, 0x72, 0x67, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65,
+0x72, 0x20, 0x48, 0x6f, 0x63, 0x68, 0x64, 0x65, 0x75, 0x74, 0x73, 0x63,
+0x68, 0x395, 0x3bb, 0x3bb, 0x3b7, 0x3bd, 0x3b9, 0x3ba, 0x3ac, 0x395, 0x3bb, 0x3bb,
+0x3ac, 0x3b4, 0x3b1, 0x39a, 0x3cd, 0x3c0, 0x3c1, 0x3bf, 0x3c2, 0x61, 0x76, 0x61,
+0xf1, 0x65, 0x2019, 0x1ebd, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x69,
+0xa97, 0xac1, 0xa9c, 0xab0, 0xabe, 0xaa4, 0xac0, 0xaad, 0xabe, 0xab0, 0xaa4, 0x45,
+0x6b, 0x65, 0x67, 0x75, 0x73, 0x69, 0x69, 0x48, 0x61, 0x75, 0x73, 0x61,
+0x4e, 0x69, 0x6a, 0x61, 0x72, 0x2bb, 0x14c, 0x6c, 0x65, 0x6c, 0x6f, 0x20,
+0x48, 0x61, 0x77, 0x61, 0x69, 0x2bb, 0x69, 0x2bb, 0x41, 0x6d, 0x65, 0x6c,
+0x69, 0x6b, 0x61, 0x20, 0x48, 0x75, 0x69, 0x20, 0x50, 0x16b, 0x20, 0x2bb,
+0x49, 0x61, 0x5e2, 0x5d1, 0x5e8, 0x5d9, 0x5ea, 0x5d9, 0x5e9, 0x5e8, 0x5d0, 0x5dc,
+0x939, 0x93f, 0x928, 0x94d, 0x926, 0x940, 0x48, 0x69, 0x6e, 0x64, 0x69, 0x20,
+0x28, 0x4c, 0x61, 0x74, 0x69, 0x6e, 0x29, 0x6d, 0x61, 0x67, 0x79, 0x61,
+0x72, 0x4d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x6f, 0x72, 0x73, 0x7a, 0xe1,
+0x67, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0xcd, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x49, 0x64, 0x6f, 0x49, 0x67, 0x62, 0x6f, 0x4e, 0x61,
+0x1ecb, 0x6a, 0x1ecb, 0x72, 0x1ecb, 0x61, 0x61, 0x6e, 0x61, 0x72, 0xe2, 0x161,
+0x6b, 0x69, 0x65, 0x6c, 0xe2, 0x53, 0x75, 0x6f, 0x6d, 0xe2, 0x69, 0x6e,
+0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x75, 0x61, 0x4d, 0x75, 0x6e,
+0x64, 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x75,
+0x65, 0x45, 0x73, 0x74, 0x6f, 0x6e, 0x69, 0x61, 0x1403, 0x14c4, 0x1483, 0x144e,
+0x1450, 0x1466, 0x1472, 0x14c7, 0x1455, 0x14a5, 0x47, 0x61, 0x65, 0x69, 0x6c, 0x67,
+0x65, 0xc9, 0x69, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x52, 0xed, 0x6f, 0x63,
+0x68, 0x74, 0x20, 0x41, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x74, 0x68, 0x65,
+0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f, 0x49, 0x74, 0x61, 0x6c,
+0x69, 0x61, 0x53, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f,
+0x53, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x61, 0x43, 0x69, 0x74, 0x74,
+0xe0, 0x20, 0x64, 0x65, 0x6c, 0x20, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61,
+0x6e, 0x6f, 0x65e5, 0x672c, 0x8a9e, 0x4a, 0x61, 0x77, 0x61, 0x49, 0x6e, 0x64,
+0x6f, 0x6e, 0xe9, 0x73, 0x69, 0x61, 0x4b, 0x61, 0x6a, 0x65, 0x6a, 0x6f,
+0x6f, 0x6c, 0x61, 0x53, 0x65, 0x6e, 0x65, 0x67, 0x61, 0x6c, 0x6b, 0x61,
+0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x4b, 0x61,
+0x62, 0x75, 0x20, 0x56, 0x65, 0x72, 0x64, 0x69, 0x54, 0x61, 0x71, 0x62,
+0x61, 0x79, 0x6c, 0x69, 0x74, 0x4c, 0x65, 0x7a, 0x7a, 0x61, 0x79, 0x65,
+0x72, 0x6b, 0x61, 0x6b, 0x254, 0x4b, 0x61, 0x6d, 0x25b, 0x72, 0x75, 0x6e,
+0x6b, 0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x75, 0x74, 0x4b,
+0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x74, 0x20, 0x4e, 0x75, 0x6e,
+0x61, 0x61, 0x74, 0x4b, 0x61, 0x6c, 0x65, 0x6e, 0x6a, 0x69, 0x6e, 0x45,
+0x6d, 0x65, 0x74, 0x61, 0x62, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4b,
+0x69, 0x6b, 0x61, 0x6d, 0x62, 0x61, 0xc95, 0xca8, 0xccd, 0xca8, 0xca1, 0xcad,
+0xcbe, 0xcb0, 0xca4, 0x6a9, 0x672, 0x634, 0x64f, 0x631, 0x6c1, 0x650, 0x646, 0x62f,
+0x648, 0x633, 0x62a, 0x627, 0x646, 0x915, 0x949, 0x936, 0x941, 0x930, 0x939, 0x93f,
+0x902, 0x926, 0x94b, 0x938, 0x94d, 0x924, 0x93e, 0x928, 0x49b, 0x430, 0x437, 0x430,
+0x49b, 0x20, 0x442, 0x456, 0x43b, 0x456, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441,
+0x442, 0x430, 0x43d, 0x4b, 0x25b, 0x6e, 0x79, 0x61, 0x14b, 0x1781, 0x17d2, 0x1798,
+0x17c2, 0x179a, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787, 0x17b6, 0x4b, 0x2bc, 0x69,
+0x63, 0x68, 0x65, 0x2bc, 0x47, 0x69, 0x6b, 0x75, 0x79, 0x75, 0x4b, 0x69,
+0x6e, 0x79, 0x61, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x55, 0x20, 0x52,
+0x77, 0x61, 0x6e, 0x64, 0x61, 0x915, 0x94b, 0x902, 0x915, 0x923, 0x940, 0xd55c,
+0xad6d, 0xc5b4, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0xc911, 0xad6d, 0xc870, 0xc120, 0xbbfc, 0xc8fc,
+0xc8fc, 0xc758, 0xc778, 0xbbfc, 0xacf5, 0xd654, 0xad6d, 0x4b, 0x6f, 0x79, 0x72, 0x61,
+0x62, 0x6f, 0x72, 0x6f, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69, 0x4d, 0x61,
+0x61, 0x6c, 0x69, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x20, 0x63, 0x69, 0x69,
+0x6e, 0x69, 0x4b, 0x70, 0x25b, 0x6c, 0x25b, 0x25b, 0x6b, 0x75, 0x72, 0x64,
+0xee, 0x20, 0x28, 0x6b, 0x75, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0xee, 0x29,
+0x54, 0x69, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x4b, 0x77, 0x61, 0x73, 0x69,
+0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x6e, 0x43a, 0x44b, 0x440, 0x433,
+0x44b, 0x437, 0x447, 0x430, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442,
+0x430, 0x43d, 0x4c, 0x61, 0x6b, 0x21f, 0xf3, 0x6c, 0x2bc, 0x69, 0x79, 0x61,
+0x70, 0x69, 0x4d, 0xed, 0x6c, 0x61, 0x68, 0x61, 0x14b, 0x73, 0x6b, 0x61,
+0x20, 0x54, 0x21f, 0x61, 0x6d, 0xe1, 0x6b, 0x21f, 0x6f, 0x10d, 0x68, 0x65,
+0x4b, 0x268, 0x6c, 0x61, 0x61, 0x6e, 0x67, 0x69, 0x54, 0x61, 0x61, 0x6e,
+0x73, 0x61, 0x6e, 0xed, 0x61, 0xea5, 0xeb2, 0xea7, 0x4c, 0x61, 0x74, 0x69,
+0x6e, 0x61, 0x43, 0x69, 0x76, 0x69, 0x74, 0x61, 0x73, 0x20, 0x56, 0x61,
+0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x61, 0x74, 0x76, 0x69, 0x65,
+0x161, 0x75, 0x4c, 0x61, 0x74, 0x76, 0x69, 0x6a, 0x61, 0x6c, 0x69, 0x6e,
+0x67, 0xe1, 0x6c, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0xed, 0x6b,
+0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0xf3, 0x20, 0x44,
+0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x74, 0xed, 0x6b, 0x69, 0x41, 0x6e,
+0x67, 0xf3, 0x6c, 0x61, 0x52, 0x65, 0x70, 0x69, 0x62, 0x69, 0x6b, 0x69,
+0x20, 0x79, 0x61, 0x20, 0x41, 0x66, 0x72, 0xed, 0x6b, 0x61, 0x20, 0x79,
+0x61, 0x20, 0x4b, 0xe1, 0x74, 0x69, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x6c,
+0x69, 0x65, 0x74, 0x75, 0x76, 0x69, 0x173, 0x4c, 0x69, 0x65, 0x74, 0x75,
+0x76, 0x61, 0x6c, 0x61, 0x20, 0x2e, 0x6c, 0x6f, 0x6a, 0x62, 0x61, 0x6e,
+0x2e, 0x64, 0x6f, 0x6c, 0x6e, 0x6f, 0x73, 0x65, 0x72, 0x62, 0x161, 0x107,
+0x69, 0x6e, 0x61, 0x4e, 0x69, 0x6d, 0x73, 0x6b, 0x61, 0x4e, 0x65, 0x64,
+0x64, 0x65, 0x72, 0x73, 0x61, 0x73, 0x73, 0x2019, 0x73, 0x63, 0x68, 0x44,
+0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x65,
+0x64, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x6e, 0x54, 0x73,
+0x68, 0x69, 0x6c, 0x75, 0x62, 0x61, 0x44, 0x69, 0x74, 0x75, 0x6e, 0x67,
+0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75, 0x6a, 0x75,
+0x6c, 0x65, 0x76, 0x73, 0xe1, 0x6d, 0x65, 0x67, 0x69, 0x65, 0x6c, 0x6c,
+0x61, 0x44, 0x68, 0x6f, 0x6c, 0x75, 0x6f, 0x4c, 0xeb, 0x74, 0x7a, 0x65,
+0x62, 0x75, 0x65, 0x72, 0x67, 0x65, 0x73, 0x63, 0x68, 0x4c, 0x75, 0x6c,
+0x75, 0x68, 0x69, 0x61, 0x43c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441,
+0x43a, 0x438, 0x421, 0x435, 0x432, 0x435, 0x440, 0x43d, 0x430, 0x20, 0x41c, 0x430,
+0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x438, 0x458, 0x430, 0x4b, 0x69, 0x6d, 0x61,
+0x63, 0x68, 0x61, 0x6d, 0x65, 0x92e, 0x948, 0x925, 0x93f, 0x932, 0x940, 0x4d,
+0x61, 0x6b, 0x75, 0x61, 0x55, 0x6d, 0x6f, 0x7a, 0x61, 0x6d, 0x62, 0x69,
+0x6b, 0x69, 0x43, 0x68, 0x69, 0x6d, 0x61, 0x6b, 0x6f, 0x6e, 0x64, 0x65,
+0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x4d, 0x61, 0x64, 0x61,
+0x67, 0x61, 0x73, 0x69, 0x6b, 0x61, 0x72, 0x61, 0xd2e, 0xd32, 0xd2f, 0xd3e,
+0xd33, 0xd02, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0x4d, 0x65, 0x6c, 0x61,
+0x79, 0x75, 0x628, 0x647, 0x627, 0x633, 0x20, 0x645, 0x644, 0x627, 0x64a, 0x648,
+0x628, 0x631, 0x648, 0x646, 0x64a, 0x645, 0x644, 0x64a, 0x633, 0x64a, 0x627, 0x42,
+0x72, 0x75, 0x6e, 0x65, 0x69, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75,
+0x72, 0x61, 0x4d, 0x61, 0x6c, 0x74, 0x69, 0x9ae, 0x9c8, 0x9a4, 0x9c8, 0x9b2,
+0x9cb, 0x9a8, 0x9cd, 0x987, 0x9a8, 0x9cd, 0x9a6, 0x9bf, 0x9af, 0x9bc, 0x9be, 0xabc3,
+0xabe4, 0xabc7, 0xabe9, 0xabc2, 0xabe3, 0xabdf, 0x47, 0x61, 0x65, 0x6c, 0x67, 0x45,
+0x6c, 0x6c, 0x61, 0x6e, 0x20, 0x56, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x4d,
+0x101, 0x6f, 0x72, 0x69, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61,
+0x4d, 0x61, 0x70, 0x75, 0x64, 0x75, 0x6e, 0x67, 0x75, 0x6e, 0x92e, 0x930,
+0x93e, 0x920, 0x940, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x61, 0x645,
+0x627, 0x632, 0x631, 0x648, 0x646, 0x6cc, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x4b,
+0x129, 0x6d, 0x129, 0x72, 0x169, 0x6d, 0x65, 0x74, 0x61, 0x2bc, 0x4b, 0x61,
+0x6d, 0x61, 0x6c, 0x75, 0x6e, 0x4b, 0x61, 0x6e, 0x69, 0x65, 0x6e, 0x2bc,
+0x6b, 0xe9, 0x68, 0x61, 0x43c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x41c, 0x43e,
+0x43d, 0x433, 0x43e, 0x43b, 0x182e, 0x1823, 0x1829, 0x182d, 0x1823, 0x182f, 0x6b, 0x72,
+0x65, 0x6f, 0x6c, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e,
+0x4d, 0x6f, 0x72, 0x69, 0x73, 0x4d, 0x55, 0x4e, 0x44, 0x41, 0x14a, 0x6b,
+0x61, 0x6d, 0x65, 0x72, 0x75, 0x14b, 0x4d, 0x76, 0x73, 0x6b, 0x6f, 0x6b,
+0x65, 0x4b, 0x68, 0x6f, 0x65, 0x6b, 0x68, 0x6f, 0x65, 0x67, 0x6f, 0x77,
+0x61, 0x62, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x62, 0x44, 0x69,
+0x6e, 0xe9, 0x20, 0x42, 0x69, 0x7a, 0x61, 0x61, 0x64, 0x928, 0x947, 0x92a,
+0x93e, 0x932, 0x940, 0x53, 0x68, 0x77, 0xf3, 0x14b, 0xf2, 0x20, 0x6e, 0x67,
+0x69, 0x65, 0x6d, 0x62, 0x254, 0x254, 0x6e, 0x4b, 0xe0, 0x6d, 0x61, 0x6c,
+0xfb, 0x6d, 0x4e, 0x64, 0x61, 0xa78c, 0x61, 0x4b, 0x61, 0x6d, 0x25b, 0x6c,
+0xfb, 0x6e, 0x4e, 0x61, 0x69, 0x6a, 0xed, 0x72, 0x69, 0xe1, 0x20, 0x50,
+0xed, 0x6a, 0x69, 0x6e, 0x4e, 0x61, 0x69, 0x6a, 0xed, 0x72, 0x69, 0x61,
+0x7d2, 0x7de, 0x7cf, 0x7d6, 0x7cc, 0x7ec, 0x7e3, 0x7cd, 0x7eb, 0x644, 0x6ca, 0x631,
+0x6cc, 0x20, 0x634, 0x648, 0x645, 0x627, 0x644, 0x6cc, 0x64, 0x61, 0x76, 0x76,
+0x69, 0x73, 0xe1, 0x6d, 0x65, 0x67, 0x69, 0x65, 0x6c, 0x6c, 0x61, 0x4e,
+0x6f, 0x72, 0x67, 0x61, 0x53, 0x75, 0x6f, 0x70, 0x6d, 0x61, 0x52, 0x75,
+0x6f, 0x167, 0x167, 0x61, 0x53, 0x65, 0x73, 0x6f, 0x74, 0x68, 0x6f, 0x20,
+0x73, 0x61, 0x20, 0x4c, 0x65, 0x62, 0x6f, 0x61, 0x41, 0x66, 0x72, 0x69,
+0x6b, 0x61, 0x20, 0x42, 0x6f, 0x72, 0x77, 0x61, 0x69, 0x73, 0x69, 0x4e,
+0x64, 0x65, 0x62, 0x65, 0x6c, 0x65, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20,
+0x62, 0x6f, 0x6b, 0x6d, 0xe5, 0x6c, 0x4e, 0x6f, 0x72, 0x67, 0x65, 0x53,
+0x76, 0x61, 0x6c, 0x62, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x67, 0x20, 0x4a,
+0x61, 0x6e, 0x20, 0x4d, 0x61, 0x79, 0x65, 0x6e, 0x6e, 0x6f, 0x72, 0x73,
+0x6b, 0x20, 0x6e, 0x79, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x4e, 0x6f, 0x72,
+0x65, 0x67, 0x54, 0x68, 0x6f, 0x6b, 0x20, 0x4e, 0x61, 0x74, 0x68, 0x4e,
+0x79, 0x61, 0x6e, 0x6a, 0x61, 0x52, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x6b,
+0x6f, 0x72, 0x65, 0x6f, 0x63, 0x63, 0x69, 0x74, 0x61, 0x6e, 0x45, 0x73,
+0x70, 0x61, 0x6e, 0x68, 0x61, 0xb13, 0xb21, 0xb3c, 0xb3f, 0xb06, 0xb2d, 0xb3e,
+0xb30, 0xb24, 0x4f, 0x72, 0x6f, 0x6d, 0x6f, 0x6f, 0x49, 0x74, 0x6f, 0x6f,
+0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x4b, 0x65, 0x65, 0x6e, 0x69, 0x79,
+0x61, 0x61, 0xd801, 0xdccf, 0xd801, 0xdcd8, 0xd801, 0xdcfb, 0xd801, 0xdcd8, 0xd801, 0xdcfb,
+0xd801, 0xdcdf, 0x438, 0x440, 0x43e, 0x43d, 0x413, 0x443, 0x44b, 0x440, 0x434, 0x437,
+0x44b, 0x441, 0x442, 0x43e, 0x43d, 0x423, 0x4d5, 0x440, 0x4d5, 0x441, 0x435, 0x50,
+0x61, 0x70, 0x69, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x75, 0x4b, 0xf2, 0x72,
+0x73, 0x6f, 0x75, 0x67e, 0x69a, 0x62a, 0x648, 0x627, 0x641, 0x63a, 0x627, 0x646,
+0x633, 0x62a, 0x627, 0x646, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x641,
+0x627, 0x631, 0x633, 0x6cc, 0x62f, 0x631, 0x6cc, 0x70, 0x6f, 0x6c, 0x73, 0x6b,
+0x69, 0x50, 0x6f, 0x6c, 0x73, 0x6b, 0x61, 0x70, 0x6f, 0x72, 0x74, 0x75,
+0x67, 0x75, 0xea, 0x73, 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x41, 0x6e,
+0x67, 0x6f, 0x6c, 0x61, 0x43, 0x61, 0x62, 0x6f, 0x20, 0x56, 0x65, 0x72,
+0x64, 0x65, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x20, 0x45, 0x71, 0x75, 0x61,
+0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x2d,
+0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62,
+0x75, 0x72, 0x67, 0x6f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x2c, 0x20, 0x52,
+0x41, 0x45, 0x20, 0x64, 0x61, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x4d,
+0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x70, 0x6f, 0x72,
+0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x20, 0x65, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x75, 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c, 0x53, 0xe3,
+0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed,
+0x6e, 0x63, 0x69, 0x70, 0x65, 0x53, 0x75, 0xed, 0xe7, 0x61, 0x54, 0x69,
+0x6d, 0x6f, 0x72, 0x2d, 0x4c, 0x65, 0x73, 0x74, 0x65, 0x70, 0x72, 0x16b,
+0x73, 0x69, 0x73, 0x6b, 0x61, 0x6e, 0x50, 0x14d, 0x6c, 0x69, 0xa2a, 0xa70,
+0xa1c, 0xa3e, 0xa2c, 0xa40, 0xa2d, 0xa3e, 0xa30, 0xa24, 0x67e, 0x646, 0x62c, 0x627,
+0x628, 0x6cc, 0x52, 0x75, 0x6e, 0x61, 0x73, 0x69, 0x6d, 0x69, 0x50, 0x65,
+0x72, 0xfa, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x45, 0x63, 0x75,
+0x61, 0x64, 0x6f, 0x72, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x103, 0x52, 0x6f,
+0x6d, 0xe2, 0x6e, 0x69, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69,
+0x63, 0x61, 0x20, 0x4d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x61, 0x72, 0x75,
+0x6d, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x53, 0x76, 0x69, 0x7a, 0x72,
+0x61, 0x4b, 0x69, 0x68, 0x6f, 0x72, 0x6f, 0x6d, 0x62, 0x6f, 0x49, 0x6b,
+0x69, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x55, 0x62, 0x75, 0x72, 0x75, 0x6e,
+0x64, 0x69, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x420, 0x43e, 0x441,
+0x441, 0x438, 0x44f, 0x41a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x442, 0x430, 0x43d,
+0x41a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x438, 0x44f, 0x41c, 0x43e, 0x43b, 0x434,
+0x43e, 0x432, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x430, 0x4b, 0x69,
+0x72, 0x75, 0x77, 0x61, 0x53, 0x61, 0x68, 0x6f, 0x441, 0x430, 0x445, 0x430,
+0x20, 0x442, 0x44b, 0x43b, 0x430, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b,
+0x439, 0x430, 0x4b, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x75, 0x72, 0x53, 0xe4,
+0x6e, 0x67, 0xf6, 0x4b, 0xf6, 0x64, 0xf6, 0x72, 0xf6, 0x73, 0xea, 0x73,
+0x65, 0x20, 0x74, 0xee, 0x20, 0x42, 0xea, 0x61, 0x66, 0x72, 0xee, 0x6b,
+0x61, 0x49, 0x73, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x67, 0x75, 0x54, 0x61,
+0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x938, 0x902, 0x938, 0x94d, 0x915,
+0x943, 0x924, 0x20, 0x92d, 0x93e, 0x937, 0x93e, 0x92d, 0x93e, 0x930, 0x924, 0x903,
+0x1c65, 0x1c5f, 0x1c71, 0x1c5b, 0x1c5f, 0x1c72, 0x1c64, 0x1c64, 0x1c71, 0x1c70, 0x1c64, 0x1c6d,
+0x1c5f, 0x938, 0x93e, 0x928, 0x924, 0x93e, 0x921, 0x93c, 0x940, 0x73, 0x61, 0x72,
+0x64, 0x75, 0x73, 0x65, 0x6e, 0x61, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438,
+0x421, 0x440, 0x431, 0x438, 0x458, 0x430, 0x41a, 0x43e, 0x441, 0x43e, 0x432, 0x43e,
+0x426, 0x440, 0x43d, 0x430, 0x20, 0x413, 0x43e, 0x440, 0x430, 0x73, 0x72, 0x70,
+0x73, 0x6b, 0x69, 0x4b, 0x6f, 0x73, 0x6f, 0x76, 0x6f, 0x43, 0x72, 0x6e,
+0x61, 0x20, 0x47, 0x6f, 0x72, 0x61, 0x53, 0x72, 0x62, 0x69, 0x6a, 0x61,
+0x4b, 0x69, 0x73, 0x68, 0x61, 0x6d, 0x62, 0x61, 0x61, 0x63, 0x68, 0x69,
+0x53, 0x68, 0x6f, 0x6e, 0x61, 0xa188, 0xa320, 0xa259, 0xa34f, 0xa1e9, 0x73, 0x69,
+0x63, 0x69, 0x6c, 0x69, 0x61, 0x6e, 0x75, 0x53, 0x69, 0x64, 0x61, 0x61,
+0x6d, 0x75, 0x20, 0x41, 0x66, 0x6f, 0x49, 0x74, 0x69, 0x79, 0x6f, 0x6f,
+0x70, 0x68, 0x69, 0x79, 0x61, 0x15b, 0x6c, 0x14d, 0x6e, 0x73, 0x6b, 0x69,
+0x633, 0x646, 0x68c, 0x64a, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x938,
+0x93f, 0x928, 0x94d, 0x927, 0x940, 0xdc3, 0xdd2, 0xd82, 0xdc4, 0xdbd, 0xdc1, 0xdca,
+0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0xdc0, 0x73, 0xe4, 0xe4,
+0x2b9, 0x6d, 0x1e9, 0x69, 0xf5, 0x6c, 0x6c, 0x4c, 0xe4, 0xe4, 0x2b9, 0x64,
+0x64, 0x6a, 0xe2, 0x6e, 0x6e, 0x61, 0x6d, 0x73, 0x6c, 0x6f, 0x76, 0x65,
+0x6e, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x73,
+0x6b, 0x6f, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x161, 0x10d, 0x69, 0x6e,
+0x61, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x6a, 0x61, 0x4f, 0x6c,
+0x75, 0x73, 0x6f, 0x67, 0x61, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c,
+0x69, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61, 0x4a,
+0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x69,
+0x79, 0x61, 0x6a9, 0x648, 0x631, 0x62f, 0x6cc, 0x20, 0x62e, 0x648, 0x627, 0x631,
+0x6af, 0xc5, 0x61, 0x72, 0x6a, 0x65, 0x6c, 0x73, 0x61, 0x65, 0x6d, 0x69,
+0x65, 0x6e, 0x20, 0x67, 0xef, 0x65, 0x6c, 0x65, 0x65, 0x73, 0x70, 0x61,
+0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x45, 0x73, 0x70, 0x61, 0xf1,
+0x61, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x42, 0x65,
+0x6c, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x61, 0x73,
+0x43, 0x65, 0x75, 0x74, 0x61, 0x20, 0x79, 0x20, 0x4d, 0x65, 0x6c, 0x69,
+0x6c, 0x6c, 0x61, 0x43, 0x68, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6f,
+0x6d, 0x62, 0x69, 0x61, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x20, 0x52, 0x69,
+0x63, 0x61, 0x43, 0x75, 0x62, 0x61, 0x52, 0x65, 0x70, 0xfa, 0x62, 0x6c,
+0x69, 0x63, 0x61, 0x20, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61,
+0x6e, 0x61, 0x45, 0x6c, 0x20, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f,
+0x72, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x20, 0x45, 0x63, 0x75, 0x61,
+0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d,
+0x61, 0x6c, 0x61, 0x48, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x61, 0x73, 0x65,
+0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x6c, 0x61, 0x74, 0x69, 0x6e,
+0x6f, 0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x4c, 0x61,
+0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0xe9, 0x72, 0x69, 0x63, 0x61, 0x65,
+0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0xe9,
+0x78, 0x69, 0x63, 0x6f, 0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f, 0x4e, 0x69,
+0x63, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x50, 0x61, 0x6e, 0x61, 0x6d,
+0xe1, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x46, 0x69, 0x6c,
+0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f,
+0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x55, 0x72, 0x75, 0x67,
+0x75, 0x61, 0x79, 0x56, 0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c, 0x61,
+0x2d5c, 0x2d30, 0x2d4e, 0x2d30, 0x2d63, 0x2d49, 0x2d56, 0x2d5c, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54,
+0x2d49, 0x2d31, 0x42, 0x61, 0x73, 0x61, 0x20, 0x53, 0x75, 0x6e, 0x64, 0x61,
+0x4b, 0x69, 0x73, 0x77, 0x61, 0x68, 0x69, 0x6c, 0x69, 0x4a, 0x61, 0x6d,
+0x68, 0x75, 0x72, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x69, 0x64, 0x65,
+0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x73, 0x69, 0x61, 0x20, 0x79, 0x61, 0x20,
+0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x73, 0x69, 0x53, 0x77, 0x61, 0x74, 0x69,
+0x65, 0x53, 0x77, 0x61, 0x74, 0x69, 0x6e, 0x69, 0x73, 0x76, 0x65, 0x6e,
+0x73, 0x6b, 0x61, 0x53, 0x76, 0x65, 0x72, 0x69, 0x67, 0x65, 0xc5, 0x6c,
+0x61, 0x6e, 0x64, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72,
+0x74, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x46, 0x72, 0x61, 0x6e, 0x6b,
+0x72, 0x69, 0x69, 0x63, 0x68, 0x4c, 0x69, 0xe4, 0x63, 0x68, 0x74, 0x65,
+0x73, 0x63, 0x68, 0x74, 0xe4, 0x69, 0x723, 0x718, 0x72a, 0x71d, 0x71d, 0x710,
+0x725, 0x71d, 0x72a, 0x729, 0x723, 0x718, 0x72a, 0x71d, 0x710, 0x2d5c, 0x2d30, 0x2d5b,
+0x2d4d, 0x2d43, 0x2d49, 0x2d5c, 0x54, 0x61, 0x73, 0x68, 0x65, 0x6c, 0x1e25, 0x69,
+0x79, 0x74, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0xaabc, 0xaa95, 0xaa92, 0xaabe,
+0x4b, 0x69, 0x74, 0x61, 0x69, 0x74, 0x61, 0x442, 0x43e, 0x4b7, 0x438, 0x43a,
+0x4e3, 0x422, 0x43e, 0x4b7, 0x438, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0xba4,
+0xbae, 0xbbf, 0xbb4, 0xbcd, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0xbbe, 0xbae,
+0xbb2, 0xbc7, 0xb9a, 0xbbf, 0xbaf, 0xbbe, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa,
+0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x70,
+0x61, 0x74, 0x61, 0x73, 0x20, 0x54, 0x61, 0x72, 0x6f, 0x6b, 0x6f, 0x54,
+0x61, 0x73, 0x61, 0x77, 0x61, 0x71, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69,
+0x4e, 0x69, 0x17e, 0x65, 0x72, 0x442, 0x430, 0x442, 0x430, 0x440, 0xc24, 0xc46,
+0xc32, 0xc41, 0xc17, 0xc41, 0xc2d, 0xc3e, 0xc30, 0xc24, 0xc26, 0xc47, 0xc36, 0xc02,
+0x4b, 0x69, 0x74, 0x65, 0x73, 0x6f, 0x4b, 0x65, 0x6e, 0x69, 0x61, 0xe44,
+0xe17, 0xe22, 0xf56, 0xf7c, 0xf51, 0xf0b, 0xf66, 0xf90, 0xf51, 0xf0b, 0xf62, 0xf92,
+0xfb1, 0xf0b, 0xf53, 0xf42, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0x1275,
+0x130d, 0x1228, 0x1275, 0x130d, 0x122d, 0x129b, 0x54, 0x6f, 0x6b, 0x20, 0x50, 0x69,
+0x73, 0x69, 0x6e, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x69, 0x75,
+0x67, 0x69, 0x6e, 0x69, 0x6c, 0x65, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61,
+0x74, 0x6f, 0x6e, 0x67, 0x61, 0x58, 0x69, 0x74, 0x73, 0x6f, 0x6e, 0x67,
+0x61, 0x53, 0x65, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x41, 0x66, 0x6f,
+0x72, 0x69, 0x6b, 0x61, 0x20, 0x42, 0x6f, 0x72, 0x77, 0x61, 0x54, 0xfc,
+0x72, 0x6b, 0xe7, 0x65, 0x54, 0xfc, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x4b,
+0x131, 0x62, 0x72, 0x131, 0x73, 0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e,
+0x20, 0x64, 0x69, 0x6c, 0x69, 0x54, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e,
+0x69, 0x73, 0x74, 0x61, 0x6e, 0x4b, 0x61, 0x74, 0x61, 0x62, 0x443, 0x43a,
+0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x423, 0x43a, 0x440, 0x430,
+0x457, 0x43d, 0x430, 0x68, 0x6f, 0x72, 0x6e, 0x6a, 0x6f, 0x73, 0x65, 0x72,
+0x62, 0x161, 0x107, 0x69, 0x6e, 0x61, 0x4e, 0x11b, 0x6d, 0x73, 0x6b, 0x61,
+0x627, 0x631, 0x62f, 0x648, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x626, 0x6c7, 0x64a,
+0x63a, 0x6c7, 0x631, 0x686, 0x6d5, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x6f, 0x2018,
+0x7a, 0x62, 0x65, 0x6b, 0x4f, 0x2bb, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73,
+0x74, 0x6f, 0x6e, 0x627, 0x648, 0x632, 0x628, 0x6cc, 0x6a9, 0x45e, 0x437, 0x431,
+0x435, 0x43a, 0x447, 0x430, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442,
+0x43e, 0x43d, 0xa559, 0xa524, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x56, 0x61, 0x69, 0x4c,
+0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x54, 0x73, 0x68, 0x69, 0x76,
+0x65, 0x6e, 0x1e13, 0x61, 0x54, 0x69, 0x1ebf, 0x6e, 0x67, 0x20, 0x56, 0x69,
+0x1ec7, 0x74, 0x56, 0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x56, 0x6f,
+0x6c, 0x61, 0x70, 0xfc, 0x6b, 0x4b, 0x79, 0x69, 0x76, 0x75, 0x6e, 0x6a,
+0x6f, 0x77, 0x61, 0x6c, 0x6f, 0x6e, 0x57, 0x61, 0x6c, 0x73, 0x65, 0x72,
+0x53, 0x63, 0x68, 0x77, 0x69, 0x7a, 0x57, 0x61, 0x72, 0x6c, 0x70, 0x69,
+0x72, 0x69, 0x43, 0x79, 0x6d, 0x72, 0x61, 0x65, 0x67, 0x59, 0x20, 0x44,
+0x65, 0x79, 0x72, 0x6e, 0x61, 0x73, 0x20, 0x55, 0x6e, 0x65, 0x64, 0x69,
+0x67, 0x628, 0x644, 0x648, 0x686, 0x6cc, 0x20, 0x28, 0x631, 0x62e, 0x634, 0x627,
+0x646, 0x6cc, 0x29, 0x626, 0x648, 0x645, 0x627, 0x646, 0x645, 0x62a, 0x62d, 0x62f,
+0x6cc, 0x646, 0x20, 0x639, 0x631, 0x628, 0x6cc, 0x646, 0x20, 0x627, 0x645, 0x627,
+0x631, 0x627, 0x62a, 0x46, 0x72, 0x79, 0x73, 0x6b, 0x4e, 0x65, 0x64, 0x65,
+0x72, 0x6c, 0xe2, 0x6e, 0x12c8, 0x120b, 0x12ed, 0x1273, 0x1271, 0x57, 0x6f, 0x6c,
+0x6f, 0x66, 0x49, 0x73, 0x69, 0x58, 0x68, 0x6f, 0x73, 0x61, 0x45, 0x4d,
+0x7a, 0x61, 0x6e, 0x74, 0x73, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b,
+0x61, 0x6e, 0x75, 0x61, 0x73, 0x75, 0x65, 0x4b, 0x65, 0x6d, 0x65, 0x6c,
+0xfa, 0x6e, 0x5d9, 0x5d9, 0x5b4, 0x5d3, 0x5d9, 0x5e9, 0x5d0, 0x5d5, 0x5e7, 0x5e8,
+0x5d0, 0x5b7, 0x5d9, 0x5e0, 0x5e2, 0xc8, 0x64, 0xe8, 0x20, 0x59, 0x6f, 0x72,
+0xf9, 0x62, 0xe1, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x42,
+0x25b, 0x300, 0x6e, 0x25b, 0x300, 0x5a, 0x61, 0x72, 0x6d, 0x61, 0x63, 0x69,
+0x69, 0x6e, 0x65, 0x56, 0x61, 0x68, 0x63, 0x75, 0x65, 0x6e, 0x67, 0x68,
+0x43, 0x75, 0x6e, 0x67, 0x68, 0x67, 0x6f, 0x7a, 0x69, 0x73, 0x69, 0x5a,
+0x75, 0x6c, 0x75, 0x69, 0x4e, 0x69, 0x6e, 0x67, 0x69, 0x7a, 0x69, 0x6d,
+0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x68,
+0x67, 0xe1, 0x67, 0x4d, 0x72, 0x61, 0x73, 0x69, 0x72, 0x6e, 0x68, 0x65,
+0x1ebd, 0x67, 0x61, 0x74, 0x75, 0x42, 0x72, 0x61, 0x73, 0x69, 0x75, 0xf1,
+0x65, 0x6e, 0x67, 0x61, 0x74, 0xfa, 0x4b, 0x75, 0x72, 0x169, 0x62, 0x69,
+0x79, 0x61, 0x57, 0x65, 0x6e, 0x65, 0x73, 0x75, 0x65, 0x72, 0x61, 0x939,
+0x930, 0x93f, 0x92f, 0x93e, 0x923, 0x935, 0x940, 0x4e, 0x6f, 0x72, 0x64, 0x66,
+0x72, 0x69, 0x69, 0x73, 0x6b, 0x54, 0x6a, 0x69, 0x69, 0x73, 0x6b, 0x6c,
+0x75, 0x6e, 0x930, 0x93e, 0x91c, 0x938, 0x94d, 0x925, 0x93e, 0x928, 0x940, 0x43c,
+0x43e, 0x43a, 0x448, 0x435, 0x43d, 0x44c, 0x20, 0x43a, 0x44f, 0x43b, 0x44c, 0x74,
+0x6f, 0x6b, 0x69, 0x20, 0x70, 0x6f, 0x6e, 0x61, 0x6d, 0x61, 0x20, 0x61,
+0x6c, 0x65, 0x50, 0x69, 0x6a, 0x69, 0x6e, 0x53, 0x6f, 0x6c, 0x6f, 0x6d,
+0x6f, 0x6e, 0x20, 0x41, 0x65, 0x6c, 0x61, 0x6e, 0x4f, 0x62, 0x6f, 0x6c,
+0x6f, 0x628, 0x644, 0x6c6, 0x686, 0x6cc, 0x42, 0x61, 0x6c, 0xf3, 0x63, 0x68,
+0x69, 0x50, 0xe1, 0x6b, 0x65, 0x73, 0x74, 0xe1, 0x6e, 0x6c, 0x69, 0x67,
+0x75, 0x72, 0x65, 0xd803, 0xdd0c, 0xd803, 0xdd17, 0xd803, 0xdd25, 0xd803, 0xdd1d, 0xd803,
+0xdd19, 0xd803, 0xdd1a, 0xd803, 0xdd12, 0xd803, 0xdd19, 0xd803, 0xdd1d, 0x62a, 0x648, 0x631,
+0x648, 0x627, 0x644, 0x6cc, 0x61, 0x6e, 0x69, 0x69, 0x20, 0x6b, 0x61, 0x67,
+0x269, 0x6a, 0x61, 0x42, 0x65, 0x6e, 0x25b, 0x25b, 0x915, 0x93e, 0x902, 0x917,
+0x921, 0x93c, 0x940, 0x76, 0x65, 0x6e, 0x65, 0x74, 0x6f
};
-static const char language_name_list[] =
+static constexpr char language_name_list[] =
"Default\0"
"C\0"
"Abkhazian\0"
-"Oromo\0"
"Afar\0"
"Afrikaans\0"
+"Aghem\0"
+"Akan\0"
+"Akkadian\0"
+"Akoose\0"
"Albanian\0"
+"American Sign Language\0"
"Amharic\0"
+"Ancient Egyptian\0"
+"Ancient Greek\0"
"Arabic\0"
+"Aragonese\0"
+"Aramaic\0"
"Armenian\0"
"Assamese\0"
+"Asturian\0"
+"Asu\0"
+"Atsam\0"
+"Avaric\0"
+"Avestan\0"
"Aymara\0"
"Azerbaijani\0"
+"Bafia\0"
+"Balinese\0"
+"Bambara\0"
+"Bamun\0"
+"Bangla\0"
+"Basaa\0"
"Bashkir\0"
"Basque\0"
-"Bengali\0"
-"Dzongkha\0"
-"Bihari\0"
+"Batak Toba\0"
+"Belarusian\0"
+"Bemba\0"
+"Bena\0"
+"Bhojpuri\0"
"Bislama\0"
+"Blin\0"
+"Bodo\0"
+"Bosnian\0"
"Breton\0"
+"Buginese\0"
"Bulgarian\0"
"Burmese\0"
-"Belarusian\0"
-"Khmer\0"
+"Cantonese\0"
"Catalan\0"
+"Cebuano\0"
+"Central Atlas Tamazight\0"
+"Central Kurdish\0"
+"Chakma\0"
+"Chamorro\0"
+"Chechen\0"
+"Cherokee\0"
+"Chickasaw\0"
+"Chiga\0"
"Chinese\0"
+"Church Slavic\0"
+"Chuvash\0"
+"Colognian\0"
+"Coptic\0"
+"Cornish\0"
"Corsican\0"
+"Cree\0"
"Croatian\0"
"Czech\0"
"Danish\0"
+"Divehi\0"
+"Dogri\0"
+"Duala\0"
"Dutch\0"
+"Dzongkha\0"
+"Embu\0"
"English\0"
+"Erzya\0"
"Esperanto\0"
"Estonian\0"
+"Ewe\0"
+"Ewondo\0"
"Faroese\0"
"Fijian\0"
+"Filipino\0"
"Finnish\0"
"French\0"
-"Western Frisian\0"
-"Gaelic\0"
+"Friulian\0"
+"Fula\0" // Fulah
+"Scottish Gaelic\0"
+"Ga\0"
"Galician\0"
+"Ganda\0"
+"Geez\0"
"Georgian\0"
"German\0"
+"Gothic\0"
"Greek\0"
-"Greenlandic\0"
"Guarani\0"
"Gujarati\0"
+"Gusii\0"
+"Haitian Creole\0"
"Hausa\0"
+"Hawaiian\0"
"Hebrew\0"
+"Herero\0"
"Hindi\0"
+"Hiri Motu\0"
"Hungarian\0"
"Icelandic\0"
+"Ido\0"
+"Igbo\0"
+"Inari Sami\0"
"Indonesian\0"
+"Ingush\0"
"Interlingua\0"
"Interlingue\0"
"Inuktitut\0"
-"Inupiak\0"
+"Inupiaq\0"
"Irish\0"
"Italian\0"
"Japanese\0"
"Javanese\0"
+"Jju\0"
+"Jola-Fonyi\0"
+"Kabuverdianu\0"
+"Kabyle\0"
+"Kako\0"
+"Kalaallisut\0"
+"Kalenjin\0"
+"Kamba\0"
"Kannada\0"
+"Kanuri\0"
"Kashmiri\0"
"Kazakh\0"
+"Kenyang\0"
+"Khmer\0"
+"Kʼicheʼ\0"
+"Kikuyu\0"
"Kinyarwanda\0"
-"Kirghiz\0"
+"Komi\0"
+"Kongo\0"
+"Konkani\0"
"Korean\0"
+"Koro\0"
+"Koyraboro Senni\0"
+"Koyra Chiini\0"
+"Kpelle\0"
+"Kuanyama\0"
"Kurdish\0"
-"Rundi\0"
+"Kwasio\0"
+"Kyrgyz\0"
+"Lakota\0"
+"Langi\0"
"Lao\0"
"Latin\0"
"Latvian\0"
+"Lezghian\0"
+"Limburgish\0"
"Lingala\0"
+"Literary Chinese\0"
"Lithuanian\0"
+"Lojban\0"
+"Lower Sorbian\0"
+"Low German\0"
+"Luba-Katanga\0"
+"Lule Sami\0"
+"Luo\0"
+"Luxembourgish\0"
+"Luyia\0"
"Macedonian\0"
+"Machame\0"
+"Maithili\0"
+"Makhuwa-Meetto\0"
+"Makonde\0"
"Malagasy\0"
-"Malay\0"
"Malayalam\0"
+"Malay\0"
"Maltese\0"
-"Maori\0"
+"Mandingo\0"
+"Manipuri\0"
+"Manx\0"
+"Māori\0"
+"Mapuche\0"
"Marathi\0"
"Marshallese\0"
+"Masai\0"
+"Mazanderani\0"
+"Mende\0"
+"Meru\0"
+"Metaʼ\0"
+"Mohawk\0"
"Mongolian\0"
+"Morisyen\0"
+"Mundang\0"
+"Muscogee\0"
+"Nama\0"
"Nauru\0"
+"Navajo\0"
+"Ndonga\0"
"Nepali\0"
-"Norwegian Bokmal\0"
+"Newari\0"
+"Ngiemboon\0"
+"Ngomba\0"
+"Nigerian Pidgin\0"
+"N’Ko\0"
+"Northern Luri\0"
+"Northern Sami\0"
+"Northern Sotho\0"
+"North Ndebele\0"
+"Norwegian Bokmål\0"
+"Norwegian Nynorsk\0"
+"Nuer\0"
+"Nyanja\0"
+"Nyankole\0"
"Occitan\0"
-"Oriya\0"
+"Odia\0"
+"Ojibwa\0"
+"Old Irish\0"
+"Old Norse\0"
+"Old Persian\0"
+"Oromo\0"
+"Osage\0"
+"Ossetic\0"
+"Pahlavi\0"
+"Palauan\0"
+"Pali\0"
+"Papiamento\0"
"Pashto\0"
"Persian\0"
+"Phoenician\0"
"Polish\0"
"Portuguese\0"
+"Prussian\0"
"Punjabi\0"
"Quechua\0"
-"Romansh\0"
"Romanian\0"
+"Romansh\0"
+"Rombo\0"
+"Rundi\0"
"Russian\0"
+"Rwa\0"
+"Saho\0"
+"Yakut\0" // Sakha
+"Samburu\0"
"Samoan\0"
"Sango\0"
+"Sangu\0"
"Sanskrit\0"
+"Santali\0"
+"Sardinian\0"
+"Saurashtra\0"
+"Sena\0"
"Serbian\0"
-"Ossetic\0"
-"Southern Sotho\0"
-"Tswana\0"
+"Shambala\0"
"Shona\0"
+"Sichuan Yi\0"
+"Sicilian\0"
+"Sidamo\0"
+"Silesian\0"
"Sindhi\0"
"Sinhala\0"
-"Swati\0"
+"Skolt Sami\0"
"Slovak\0"
"Slovenian\0"
+"Soga\0"
"Somali\0"
+"Southern Kurdish\0"
+"Southern Sami\0"
+"Southern Sotho\0"
+"South Ndebele\0"
"Spanish\0"
+"Standard Moroccan Tamazight\0"
"Sundanese\0"
"Swahili\0"
+"Swati\0"
"Swedish\0"
-"Sardinian\0"
+"Swiss German\0"
+"Syriac\0"
+"Tachelhit\0"
+"Tahitian\0"
+"Tai Dam\0"
+"Taita\0"
"Tajik\0"
"Tamil\0"
+"Taroko\0"
+"Tasawaq\0"
"Tatar\0"
"Telugu\0"
+"Teso\0"
"Thai\0"
"Tibetan\0"
+"Tigre\0"
"Tigrinya\0"
+"Tokelau\0"
+"Tok Pisin\0"
"Tongan\0"
"Tsonga\0"
+"Tswana\0"
"Turkish\0"
"Turkmen\0"
-"Tahitian\0"
-"Uighur\0"
+"Tuvalu\0"
+"Tyap\0"
+"Ugaritic\0"
"Ukrainian\0"
+"Upper Sorbian\0"
"Urdu\0"
+"Uyghur\0"
"Uzbek\0"
+"Vai\0"
+"Venda\0"
"Vietnamese\0"
-"Volapuk\0"
+"Volapük\0"
+"Vunjo\0"
+"Walloon\0"
+"Walser\0"
+"Warlpiri\0"
"Welsh\0"
+"Western Balochi\0"
+"Western Frisian\0"
+"Wolaytta\0"
"Wolof\0"
"Xhosa\0"
+"Yangben\0"
"Yiddish\0"
"Yoruba\0"
+"Zarma\0"
"Zhuang\0"
"Zulu\0"
-"Norwegian Nynorsk\0"
-"Bosnian\0"
-"Divehi\0"
-"Manx\0"
-"Cornish\0"
-"Akan\0"
-"Konkani\0"
-"Ga\0"
-"Igbo\0"
-"Kamba\0"
-"Syriac\0"
-"Blin\0"
-"Geez\0"
-"Koro\0"
-"Sidamo\0"
-"Atsam\0"
-"Tigre\0"
-"Jju\0"
-"Friulian\0"
-"Venda\0"
-"Ewe\0"
-"Walamo\0"
-"Hawaiian\0"
-"Tyap\0"
-"Nyanja\0"
-"Filipino\0"
-"Swiss German\0"
-"Sichuan Yi\0"
-"Kpelle\0"
-"Low German\0"
-"South Ndebele\0"
-"Northern Sotho\0"
-"Northern Sami\0"
-"Taroko\0"
-"Gusii\0"
-"Taita\0"
-"Fulah\0"
-"Kikuyu\0"
-"Samburu\0"
-"Sena\0"
-"North Ndebele\0"
-"Rombo\0"
-"Tachelhit\0"
-"Kabyle\0"
-"Nyankole\0"
-"Bena\0"
-"Vunjo\0"
-"Bambara\0"
-"Embu\0"
-"Cherokee\0"
-"Morisyen\0"
-"Makonde\0"
-"Langi\0"
-"Ganda\0"
-"Bemba\0"
-"Kabuverdianu\0"
-"Meru\0"
-"Kalenjin\0"
-"Nama\0"
-"Machame\0"
-"Colognian\0"
-"Masai\0"
-"Soga\0"
-"Luyia\0"
-"Asu\0"
-"Teso\0"
-"Saho\0"
-"Koyra Chiini\0"
-"Rwa\0"
-"Luo\0"
-"Chiga\0"
-"Central Morocco Tamazight\0"
-"Koyraboro Senni\0"
-"Shambala\0"
-"Bodo\0"
-"Avaric\0"
-"Chamorro\0"
-"Chechen\0"
-"Church\0"
-"Chuvash\0"
-"Cree\0"
-"Haitian\0"
-"Herero\0"
-"Hiri Motu\0"
-"Kanuri\0"
-"Komi\0"
-"Kongo\0"
-"Kwanyama\0"
-"Limburgish\0"
-"Luba Katanga\0"
-"Luxembourgish\0"
-"Navaho\0"
-"Ndonga\0"
-"Ojibwa\0"
-"Pali\0"
-"Walloon\0"
-"Aghem\0"
-"Basaa\0"
-"Zarma\0"
-"Duala\0"
-"Jola Fonyi\0"
-"Ewondo\0"
-"Bafia\0"
-"Makhuwa Meetto\0"
-"Mundang\0"
-"Kwasio\0"
-"Nuer\0"
-"Sakha\0"
-"Sangu\0"
-"Congo Swahili\0"
-"Tasawaq\0"
-"Vai\0"
-"Walser\0"
-"Yangben\0"
-"Avestan\0"
-"Asturian\0"
-"Ngomba\0"
-"Kako\0"
-"Meta\0"
-"Ngiemboon\0"
-"Aragonese\0"
-"Akkadian\0"
-"Ancient Egyptian\0"
-"Ancient Greek\0"
-"Aramaic\0"
-"Balinese\0"
-"Bamun\0"
-"Batak Toba\0"
-"Buginese\0"
-"Buhid\0"
-"Carian\0"
-"Chakma\0"
-"Classical Mandaic\0"
-"Coptic\0"
-"Dogri\0"
-"Eastern Cham\0"
-"Eastern Kayah\0"
-"Etruscan\0"
-"Gothic\0"
-"Hanunoo\0"
-"Ingush\0"
-"Large Flowery Miao\0"
-"Lepcha\0"
-"Limbu\0"
-"Lisu\0"
-"Lu\0"
-"Lycian\0"
-"Lydian\0"
-"Mandingo\0"
-"Manipuri\0"
-"Meroitic\0"
-"Northern Thai\0"
-"Old Irish\0"
-"Old Norse\0"
-"Old Persian\0"
-"Old Turkish\0"
-"Pahlavi\0"
-"Parthian\0"
-"Phoenician\0"
-"Prakrit Language\0"
-"Rejang\0"
-"Sabaean\0"
-"Samaritan\0"
-"Santali\0"
-"Saurashtra\0"
-"Sora\0"
-"Sylheti\0"
-"Tagbanwa\0"
-"Tai Dam\0"
-"Tai Nua\0"
-"Ugaritic\0"
-"Akoose\0"
-"Lakota\0"
-"Standard Moroccan Tamazight\0"
-"Mapuche\0"
-"Central Kurdish\0"
-"Lower Sorbian\0"
-"Upper Sorbian\0"
-"Kenyang\0"
-"Mohawk\0"
-"Nko\0"
-"Prussian\0"
-"Kiche\0"
-"Southern Sami\0"
-"Lule Sami\0"
-"Inari Sami\0"
-"Skolt Sami\0"
-"Warlpiri\0"
-"Manichaean Middle Persian\0"
-"Mende\0"
-"Ancient North Arabian\0"
-"Linear A\0"
-"Hmong Njua\0"
-"Ho\0"
-"Lezghian\0"
-"Bassa\0"
-"Mono\0"
-"Tedim Chin\0"
-"Maithili\0"
-"Ahom\0"
-"American Sign Language\0"
-"Ardhamagadhi Prakrit\0"
-"Bhojpuri\0"
-"Hieroglyphic Luwian\0"
-"Literary Chinese\0"
-"Mazanderani\0"
-"Mru\0"
-"Newari\0"
-"Northern Luri\0"
-"Palauan\0"
-"Papiamento\0"
-"Saraiki\0"
-"Tokelau\0"
-"Tok Pisin\0"
-"Tuvalu\0"
-"Uncoded Languages\0"
-"Cantonese\0"
-"Osage\0"
-"Tangut\0"
-"Ido\0"
-"Lojban\0"
-"Sicilian\0"
-"Southern Kurdish\0"
-"Western Balochi\0"
-"Cebuano\0"
-"Erzya\0"
-"Chickasaw\0"
-"Muscogee\0"
-"Silesian\0"
+"Kaingang\0"
+"Nheengatu\0"
+"Haryanvi\0"
+"Northern Frisian\0"
+"Rajasthani\0"
+"Moksha\0"
+"Toki Pona\0"
+"Pijin\0"
+"Obolo\0"
+"Baluchi\0"
+"Ligurian\0"
+"Rohingya\0"
+"Torwali\0"
+"Anii\0"
+"Kangri\0"
+"Venetian\0"
;
-static const quint16 language_name_index[] = {
+static constexpr quint16 language_name_index[] = {
0, // AnyLanguage
8, // C
10, // Abkhazian
- 20, // Oromo
- 26, // Afar
- 31, // Afrikaans
- 41, // Albanian
- 50, // Amharic
- 58, // Arabic
- 65, // Armenian
- 74, // Assamese
- 83, // Aymara
- 90, // Azerbaijani
- 102, // Bashkir
- 110, // Basque
- 117, // Bengali
- 125, // Dzongkha
- 134, // Bihari
- 141, // Bislama
- 149, // Breton
- 156, // Bulgarian
- 166, // Burmese
- 174, // Belarusian
- 185, // Khmer
- 191, // Catalan
- 199, // Chinese
- 207, // Corsican
- 216, // Croatian
- 225, // Czech
- 231, // Danish
- 238, // Dutch
- 244, // English
- 252, // Esperanto
- 262, // Estonian
- 271, // Faroese
- 279, // Fijian
- 286, // Finnish
- 294, // French
- 301, // Western Frisian
- 317, // Gaelic
- 324, // Galician
- 333, // Georgian
- 342, // German
- 349, // Greek
- 355, // Greenlandic
- 367, // Guarani
- 375, // Gujarati
- 384, // Hausa
- 390, // Hebrew
- 397, // Hindi
- 403, // Hungarian
- 413, // Icelandic
- 423, // Indonesian
- 434, // Interlingua
- 446, // Interlingue
- 458, // Inuktitut
- 468, // Inupiak
- 476, // Irish
- 482, // Italian
- 490, // Japanese
- 499, // Javanese
- 508, // Kannada
- 516, // Kashmiri
- 525, // Kazakh
- 532, // Kinyarwanda
- 544, // Kirghiz
- 552, // Korean
- 559, // Kurdish
- 567, // Rundi
- 573, // Lao
- 577, // Latin
- 583, // Latvian
- 591, // Lingala
- 599, // Lithuanian
- 610, // Macedonian
- 621, // Malagasy
- 630, // Malay
- 636, // Malayalam
- 646, // Maltese
- 654, // Maori
- 660, // Marathi
- 668, // Marshallese
- 680, // Mongolian
- 690, // Nauru
- 696, // Nepali
- 703, // Norwegian Bokmal
- 720, // Occitan
- 728, // Oriya
- 734, // Pashto
- 741, // Persian
- 749, // Polish
- 756, // Portuguese
- 767, // Punjabi
- 775, // Quechua
- 783, // Romansh
- 791, // Romanian
- 800, // Russian
- 808, // Samoan
- 815, // Sango
- 821, // Sanskrit
- 830, // Serbian
- 838, // Ossetic
- 846, // Southern Sotho
- 861, // Tswana
- 868, // Shona
- 874, // Sindhi
- 881, // Sinhala
- 889, // Swati
- 895, // Slovak
- 902, // Slovenian
- 912, // Somali
- 919, // Spanish
- 927, // Sundanese
- 937, // Swahili
- 945, // Swedish
- 953, // Sardinian
- 963, // Tajik
- 969, // Tamil
- 975, // Tatar
- 981, // Telugu
- 988, // Thai
- 993, // Tibetan
- 1001, // Tigrinya
- 1010, // Tongan
- 1017, // Tsonga
- 1024, // Turkish
- 1032, // Turkmen
- 1040, // Tahitian
- 1049, // Uighur
- 1056, // Ukrainian
- 1066, // Urdu
- 1071, // Uzbek
- 1077, // Vietnamese
- 1088, // Volapuk
- 1096, // Welsh
- 1102, // Wolof
- 1108, // Xhosa
- 1114, // Yiddish
- 1122, // Yoruba
- 1129, // Zhuang
- 1136, // Zulu
- 1141, // Norwegian Nynorsk
- 1159, // Bosnian
- 1167, // Divehi
- 1174, // Manx
- 1179, // Cornish
- 1187, // Akan
- 1192, // Konkani
- 1200, // Ga
- 1203, // Igbo
- 1208, // Kamba
- 1214, // Syriac
- 1221, // Blin
- 1226, // Geez
- 1231, // Koro
- 1236, // Sidamo
- 1243, // Atsam
- 1249, // Tigre
- 1255, // Jju
- 1259, // Friulian
- 1268, // Venda
- 1274, // Ewe
- 1278, // Walamo
- 1285, // Hawaiian
- 1294, // Tyap
- 1299, // Nyanja
- 1306, // Filipino
- 1315, // Swiss German
- 1328, // Sichuan Yi
- 1339, // Kpelle
- 1346, // Low German
- 1357, // South Ndebele
- 1371, // Northern Sotho
- 1386, // Northern Sami
- 1400, // Taroko
- 1407, // Gusii
- 1413, // Taita
- 1419, // Fulah
- 1425, // Kikuyu
- 1432, // Samburu
- 1440, // Sena
- 1445, // North Ndebele
- 1459, // Rombo
- 1465, // Tachelhit
- 1475, // Kabyle
- 1482, // Nyankole
- 1491, // Bena
- 1496, // Vunjo
- 1502, // Bambara
- 1510, // Embu
- 1515, // Cherokee
- 1524, // Morisyen
- 1533, // Makonde
- 1541, // Langi
- 1547, // Ganda
- 1553, // Bemba
- 1559, // Kabuverdianu
- 1572, // Meru
- 1577, // Kalenjin
- 1586, // Nama
- 1591, // Machame
- 1599, // Colognian
- 1609, // Masai
- 1615, // Soga
- 1620, // Luyia
- 1626, // Asu
- 1630, // Teso
- 1635, // Saho
- 1640, // Koyra Chiini
- 1653, // Rwa
- 1657, // Luo
- 1661, // Chiga
- 1667, // Central Morocco Tamazight
- 1693, // Koyraboro Senni
- 1709, // Shambala
- 1718, // Bodo
- 1723, // Avaric
- 1730, // Chamorro
- 1739, // Chechen
- 1747, // Church
- 1754, // Chuvash
- 1762, // Cree
- 1767, // Haitian
- 1775, // Herero
- 1782, // Hiri Motu
- 1792, // Kanuri
- 1799, // Komi
- 1804, // Kongo
- 1810, // Kwanyama
- 1819, // Limburgish
- 1830, // Luba Katanga
- 1843, // Luxembourgish
- 1857, // Navaho
- 1864, // Ndonga
- 1871, // Ojibwa
- 1878, // Pali
- 1883, // Walloon
- 1891, // Aghem
- 1897, // Basaa
- 1903, // Zarma
- 1909, // Duala
- 1915, // Jola Fonyi
- 1926, // Ewondo
- 1933, // Bafia
- 1939, // Makhuwa Meetto
- 1954, // Mundang
- 1962, // Kwasio
- 1969, // Nuer
- 1974, // Sakha
- 1980, // Sangu
- 1986, // Congo Swahili
- 2000, // Tasawaq
- 2008, // Vai
- 2012, // Walser
- 2019, // Yangben
- 2027, // Avestan
- 2035, // Asturian
- 2044, // Ngomba
- 2051, // Kako
- 2056, // Meta
- 2061, // Ngiemboon
- 2071, // Aragonese
- 2081, // Akkadian
- 2090, // Ancient Egyptian
- 2107, // Ancient Greek
- 2121, // Aramaic
- 2129, // Balinese
- 2138, // Bamun
- 2144, // Batak Toba
- 2155, // Buginese
- 2164, // Buhid
- 2170, // Carian
- 2177, // Chakma
- 2184, // Classical Mandaic
- 2202, // Coptic
- 2209, // Dogri
- 2215, // Eastern Cham
- 2228, // Eastern Kayah
- 2242, // Etruscan
- 2251, // Gothic
- 2258, // Hanunoo
- 2266, // Ingush
- 2273, // Large Flowery Miao
- 2292, // Lepcha
- 2299, // Limbu
- 2305, // Lisu
- 2310, // Lu
- 2313, // Lycian
- 2320, // Lydian
- 2327, // Mandingo
- 2336, // Manipuri
- 2345, // Meroitic
- 2354, // Northern Thai
- 2368, // Old Irish
- 2378, // Old Norse
- 2388, // Old Persian
- 2400, // Old Turkish
- 2412, // Pahlavi
- 2420, // Parthian
- 2429, // Phoenician
- 2440, // Prakrit Language
- 2457, // Rejang
- 2464, // Sabaean
- 2472, // Samaritan
- 2482, // Santali
- 2490, // Saurashtra
- 2501, // Sora
- 2506, // Sylheti
- 2514, // Tagbanwa
- 2523, // Tai Dam
- 2531, // Tai Nua
- 2539, // Ugaritic
- 2548, // Akoose
- 2555, // Lakota
- 2562, // Standard Moroccan Tamazight
- 2590, // Mapuche
- 2598, // Central Kurdish
- 2614, // Lower Sorbian
- 2628, // Upper Sorbian
- 2642, // Kenyang
- 2650, // Mohawk
- 2657, // Nko
- 2661, // Prussian
- 2670, // Kiche
- 2676, // Southern Sami
- 2690, // Lule Sami
- 2700, // Inari Sami
- 2711, // Skolt Sami
- 2722, // Warlpiri
- 2731, // Manichaean Middle Persian
- 2757, // Mende
- 2763, // Ancient North Arabian
- 2785, // Linear A
- 2794, // Hmong Njua
- 2805, // Ho
- 2808, // Lezghian
- 2817, // Bassa
- 2823, // Mono
- 2828, // Tedim Chin
- 2839, // Maithili
- 2848, // Ahom
- 2853, // American Sign Language
- 2876, // Ardhamagadhi Prakrit
- 2897, // Bhojpuri
- 2906, // Hieroglyphic Luwian
- 2926, // Literary Chinese
- 2943, // Mazanderani
- 2955, // Mru
- 2959, // Newari
- 2966, // Northern Luri
- 2980, // Palauan
- 2988, // Papiamento
- 2999, // Saraiki
- 3007, // Tokelau
- 3015, // Tok Pisin
- 3025, // Tuvalu
- 3032, // Uncoded Languages
- 3050, // Cantonese
- 3060, // Osage
- 3066, // Tangut
- 3073, // Ido
- 3077, // Lojban
- 3084, // Sicilian
- 3093, // Southern Kurdish
- 3110, // Western Balochi
- 3126, // Cebuano
- 3134, // Erzya
- 3140, // Chickasaw
- 3150, // Muscogee
- 3159, // Silesian
+ 20, // Afar
+ 25, // Afrikaans
+ 35, // Aghem
+ 41, // Akan
+ 46, // Akkadian
+ 55, // Akoose
+ 62, // Albanian
+ 71, // American Sign Language
+ 94, // Amharic
+ 102, // Ancient Egyptian
+ 119, // Ancient Greek
+ 133, // Arabic
+ 140, // Aragonese
+ 150, // Aramaic
+ 158, // Armenian
+ 167, // Assamese
+ 176, // Asturian
+ 185, // Asu
+ 189, // Atsam
+ 195, // Avaric
+ 202, // Avestan
+ 210, // Aymara
+ 217, // Azerbaijani
+ 229, // Bafia
+ 235, // Balinese
+ 244, // Bambara
+ 252, // Bamun
+ 258, // Bangla
+ 265, // Basaa
+ 271, // Bashkir
+ 279, // Basque
+ 286, // Batak Toba
+ 297, // Belarusian
+ 308, // Bemba
+ 314, // Bena
+ 319, // Bhojpuri
+ 328, // Bislama
+ 336, // Blin
+ 341, // Bodo
+ 346, // Bosnian
+ 354, // Breton
+ 361, // Buginese
+ 370, // Bulgarian
+ 380, // Burmese
+ 388, // Cantonese
+ 398, // Catalan
+ 406, // Cebuano
+ 414, // Central Atlas Tamazight
+ 438, // Central Kurdish
+ 454, // Chakma
+ 461, // Chamorro
+ 470, // Chechen
+ 478, // Cherokee
+ 487, // Chickasaw
+ 497, // Chiga
+ 503, // Chinese
+ 511, // Church
+ 525, // Chuvash
+ 533, // Colognian
+ 543, // Coptic
+ 550, // Cornish
+ 558, // Corsican
+ 567, // Cree
+ 572, // Croatian
+ 581, // Czech
+ 587, // Danish
+ 594, // Divehi
+ 601, // Dogri
+ 607, // Duala
+ 613, // Dutch
+ 619, // Dzongkha
+ 628, // Embu
+ 633, // English
+ 641, // Erzya
+ 647, // Esperanto
+ 657, // Estonian
+ 666, // Ewe
+ 670, // Ewondo
+ 677, // Faroese
+ 685, // Fijian
+ 692, // Filipino
+ 701, // Finnish
+ 709, // French
+ 716, // Friulian
+ 725, // Fulah
+ 730, // Gaelic
+ 746, // Ga
+ 749, // Galician
+ 758, // Ganda
+ 764, // Geez
+ 769, // Georgian
+ 778, // German
+ 785, // Gothic
+ 792, // Greek
+ 798, // Guarani
+ 806, // Gujarati
+ 815, // Gusii
+ 821, // Haitian
+ 836, // Hausa
+ 842, // Hawaiian
+ 851, // Hebrew
+ 858, // Herero
+ 865, // Hindi
+ 871, // Hiri Motu
+ 881, // Hungarian
+ 891, // Icelandic
+ 901, // Ido
+ 905, // Igbo
+ 910, // Inari Sami
+ 921, // Indonesian
+ 932, // Ingush
+ 939, // Interlingua
+ 951, // Interlingue
+ 963, // Inuktitut
+ 973, // Inupiaq
+ 981, // Irish
+ 987, // Italian
+ 995, // Japanese
+ 1004, // Javanese
+ 1013, // Jju
+ 1017, // Jola-Fonyi
+ 1028, // Kabuverdianu
+ 1041, // Kabyle
+ 1048, // Kako
+ 1053, // Kalaallisut
+ 1065, // Kalenjin
+ 1074, // Kamba
+ 1080, // Kannada
+ 1088, // Kanuri
+ 1095, // Kashmiri
+ 1104, // Kazakh
+ 1111, // Kenyang
+ 1119, // Khmer
+ 1125, // Kiche
+ 1135, // Kikuyu
+ 1142, // Kinyarwanda
+ 1154, // Komi
+ 1159, // Kongo
+ 1165, // Konkani
+ 1173, // Korean
+ 1180, // Koro
+ 1185, // Koyraboro Senni
+ 1201, // Koyra Chiini
+ 1214, // Kpelle
+ 1221, // Kuanyama
+ 1230, // Kurdish
+ 1238, // Kwasio
+ 1245, // Kyrgyz
+ 1252, // Lakota
+ 1259, // Langi
+ 1265, // Lao
+ 1269, // Latin
+ 1275, // Latvian
+ 1283, // Lezghian
+ 1292, // Limburgish
+ 1303, // Lingala
+ 1311, // Literary Chinese
+ 1328, // Lithuanian
+ 1339, // Lojban
+ 1346, // Lower Sorbian
+ 1360, // Low German
+ 1371, // Luba-Katanga
+ 1384, // Lule Sami
+ 1394, // Luo
+ 1398, // Luxembourgish
+ 1412, // Luyia
+ 1418, // Macedonian
+ 1429, // Machame
+ 1437, // Maithili
+ 1446, // Makhuwa-Meetto
+ 1461, // Makonde
+ 1469, // Malagasy
+ 1478, // Malayalam
+ 1488, // Malay
+ 1494, // Maltese
+ 1502, // Mandingo
+ 1511, // Manipuri
+ 1520, // Manx
+ 1525, // Maori
+ 1532, // Mapuche
+ 1540, // Marathi
+ 1548, // Marshallese
+ 1560, // Masai
+ 1566, // Mazanderani
+ 1578, // Mende
+ 1584, // Meru
+ 1589, // Meta
+ 1596, // Mohawk
+ 1603, // Mongolian
+ 1613, // Morisyen
+ 1622, // Mundang
+ 1630, // Muscogee
+ 1639, // Nama
+ 1644, // Nauru
+ 1650, // Navajo
+ 1657, // Ndonga
+ 1664, // Nepali
+ 1671, // Newari
+ 1678, // Ngiemboon
+ 1688, // Ngomba
+ 1695, // Nigerian Pidgin
+ 1711, // Nko
+ 1718, // Northern Luri
+ 1732, // Northern Sami
+ 1746, // Northern Sotho
+ 1761, // North Ndebele
+ 1775, // Norwegian Bokmal
+ 1793, // Norwegian Nynorsk
+ 1811, // Nuer
+ 1816, // Nyanja
+ 1823, // Nyankole
+ 1832, // Occitan
+ 1840, // Odia
+ 1845, // Ojibwa
+ 1852, // Old Irish
+ 1862, // Old Norse
+ 1872, // Old Persian
+ 1884, // Oromo
+ 1890, // Osage
+ 1896, // Ossetic
+ 1904, // Pahlavi
+ 1912, // Palauan
+ 1920, // Pali
+ 1925, // Papiamento
+ 1936, // Pashto
+ 1943, // Persian
+ 1951, // Phoenician
+ 1962, // Polish
+ 1969, // Portuguese
+ 1980, // Prussian
+ 1989, // Punjabi
+ 1997, // Quechua
+ 2005, // Romanian
+ 2014, // Romansh
+ 2022, // Rombo
+ 2028, // Rundi
+ 2034, // Russian
+ 2042, // Rwa
+ 2046, // Saho
+ 2051, // Sakha
+ 2057, // Samburu
+ 2065, // Samoan
+ 2072, // Sango
+ 2078, // Sangu
+ 2084, // Sanskrit
+ 2093, // Santali
+ 2101, // Sardinian
+ 2111, // Saurashtra
+ 2122, // Sena
+ 2127, // Serbian
+ 2135, // Shambala
+ 2144, // Shona
+ 2150, // Sichuan Yi
+ 2161, // Sicilian
+ 2170, // Sidamo
+ 2177, // Silesian
+ 2186, // Sindhi
+ 2193, // Sinhala
+ 2201, // Skolt Sami
+ 2212, // Slovak
+ 2219, // Slovenian
+ 2229, // Soga
+ 2234, // Somali
+ 2241, // Southern Kurdish
+ 2258, // Southern Sami
+ 2272, // Southern Sotho
+ 2287, // South Ndebele
+ 2301, // Spanish
+ 2309, // Standard Moroccan Tamazight
+ 2337, // Sundanese
+ 2347, // Swahili
+ 2355, // Swati
+ 2361, // Swedish
+ 2369, // Swiss German
+ 2382, // Syriac
+ 2389, // Tachelhit
+ 2399, // Tahitian
+ 2408, // Tai Dam
+ 2416, // Taita
+ 2422, // Tajik
+ 2428, // Tamil
+ 2434, // Taroko
+ 2441, // Tasawaq
+ 2449, // Tatar
+ 2455, // Telugu
+ 2462, // Teso
+ 2467, // Thai
+ 2472, // Tibetan
+ 2480, // Tigre
+ 2486, // Tigrinya
+ 2495, // Tokelau
+ 2503, // Tok Pisin
+ 2513, // Tongan
+ 2520, // Tsonga
+ 2527, // Tswana
+ 2534, // Turkish
+ 2542, // Turkmen
+ 2550, // Tuvalu
+ 2557, // Tyap
+ 2562, // Ugaritic
+ 2571, // Ukrainian
+ 2581, // Upper Sorbian
+ 2595, // Urdu
+ 2600, // Uyghur
+ 2607, // Uzbek
+ 2613, // Vai
+ 2617, // Venda
+ 2623, // Vietnamese
+ 2634, // Volapuk
+ 2643, // Vunjo
+ 2649, // Walloon
+ 2657, // Walser
+ 2664, // Warlpiri
+ 2673, // Welsh
+ 2679, // Western Balochi
+ 2695, // Western Frisian
+ 2711, // Wolaytta
+ 2720, // Wolof
+ 2726, // Xhosa
+ 2732, // Yangben
+ 2740, // Yiddish
+ 2748, // Yoruba
+ 2755, // Zarma
+ 2761, // Zhuang
+ 2768, // Zulu
+ 2773, // Kaingang
+ 2782, // Nheengatu
+ 2792, // Haryanvi
+ 2801, // Northern Frisian
+ 2818, // Rajasthani
+ 2829, // Moksha
+ 2836, // Toki Pona
+ 2846, // Pijin
+ 2852, // Obolo
+ 2858, // Baluchi
+ 2866, // Ligurian
+ 2875, // Rohingya
+ 2884, // Torwali
+ 2892, // Anii
+ 2897, // Kangri
+ 2904, // Venetian
};
-static const char script_name_list[] =
+static constexpr char script_name_list[] =
"Default\0"
+"Adlam\0"
+"Ahom\0"
+"Anatolian Hieroglyphs\0"
"Arabic\0"
-"Cyrillic\0"
-"Deseret\0"
-"Gurmukhi\0"
-"Simplified Han\0"
-"Traditional Han\0"
-"Latin\0"
-"Mongolian\0"
-"Tifinagh\0"
"Armenian\0"
-"Bengali\0"
-"Cherokee\0"
-"Devanagari\0"
-"Ethiopic\0"
-"Georgian\0"
-"Greek\0"
-"Gujarati\0"
-"Hebrew\0"
-"Japanese\0"
-"Khmer\0"
-"Kannada\0"
-"Korean\0"
-"Lao\0"
-"Malayalam\0"
-"Myanmar\0"
-"Oriya\0"
-"Tamil\0"
-"Telugu\0"
-"Thaana\0"
-"Thai\0"
-"Tibetan\0"
-"Sinhala\0"
-"Syriac\0"
-"Yi\0"
-"Vai\0"
"Avestan\0"
"Balinese\0"
"Bamum\0"
+"Bangla\0"
+"Bassa Vah\0"
"Batak\0"
+"Bhaiksuki\0"
"Bopomofo\0"
"Brahmi\0"
+"Braille\0"
"Buginese\0"
"Buhid\0"
-"Canadian Aboriginal\0"
+"Unified Canadian Aboriginal Syllabics\0"
"Carian\0"
+"Caucasian Albanian\0"
"Chakma\0"
"Cham\0"
+"Cherokee\0"
"Coptic\0"
+"Sumero-Akkadian Cuneiform\0"
"Cypriot\0"
-"Egyptian Hieroglyphs\0"
+"Cyrillic\0"
+"Deseret\0"
+"Devanagari\0"
+"Duployan shorthand\0"
+"Egyptian hieroglyphs\0"
+"Elbasan\0"
+"Ethiopic\0"
"Fraser\0"
+"Georgian\0"
"Glagolitic\0"
"Gothic\0"
-"Han\0"
+"Grantha\0"
+"Greek\0"
+"Gujarati\0"
+"Gurmukhi\0"
"Hangul\0"
+"Han\0"
"Hanunoo\0"
+"Han with Bopomofo\0"
+"Hatran\0"
+"Hebrew\0"
+"Hiragana\0"
"Imperial Aramaic\0"
"Inscriptional Pahlavi\0"
"Inscriptional Parthian\0"
+"Jamo\0"
+"Japanese\0"
"Javanese\0"
"Kaithi\0"
+"Kannada\0"
"Katakana\0"
"Kayah Li\0"
"Kharoshthi\0"
+"Khmer\0"
+"Khojki\0"
+"Khudawadi\0"
+"Korean\0"
"Lanna\0"
+"Lao\0"
+"Latin\0"
"Lepcha\0"
"Limbu\0"
+"Linear A\0"
"Linear B\0"
"Lycian\0"
"Lydian\0"
+"Mahajani\0"
+"Malayalam\0"
"Mandaean\0"
+"Manichaean\0"
+"Marchen\0"
"Meitei Mayek\0"
-"Meroitic\0"
+"Mende\0"
"Meroitic Cursive\0"
-"Nko\0"
+"Meroitic\0"
+"Modi\0"
+"Mongolian\0"
+"Mro\0"
+"Multani\0"
+"Myanmar\0"
+"Nabataean\0"
+"Newa\0"
"New Tai Lue\0"
+"N’Ko\0"
+"Odia\0"
"Ogham\0"
"Ol Chiki\0"
+"Old Hungarian\0"
"Old Italic\0"
+"Old North Arabian\0"
+"Old Permic\0"
"Old Persian\0"
"Old South Arabian\0"
"Orkhon\0"
+"Osage\0"
"Osmanya\0"
-"Phags Pa\0"
+"Pahawh Hmong\0"
+"Palmyrene\0"
+"Pau Cin Hau\0"
+"Phags-pa\0"
"Phoenician\0"
"Pollard Phonetic\0"
+"Psalter Pahlavi\0"
"Rejang\0"
"Runic\0"
"Samaritan\0"
"Saurashtra\0"
"Sharada\0"
"Shavian\0"
+"Siddham\0"
+"SignWriting\0"
+"Simplified Han\0"
+"Sinhala\0"
"Sora Sompeng\0"
-"Cuneiform\0"
"Sundanese\0"
"Syloti Nagri\0"
+"Syriac\0"
"Tagalog\0"
"Tagbanwa\0"
"Tai Le\0"
"Tai Viet\0"
"Takri\0"
-"Ugaritic\0"
-"Braille\0"
-"Hiragana\0"
-"Caucasian Albanian\0"
-"Bassa Vah\0"
-"Duployan\0"
-"Elbasan\0"
-"Grantha\0"
-"Pahawh Hmong\0"
-"Khojki\0"
-"Linear A\0"
-"Mahajani\0"
-"Manichaean\0"
-"Mende Kikakui\0"
-"Modi\0"
-"Mro\0"
-"Old North Arabian\0"
-"Nabataean\0"
-"Palmyrene\0"
-"Pau Cin Hau\0"
-"Old Permic\0"
-"Psalter Pahlavi\0"
-"Siddham\0"
-"Khudawadi\0"
+"Tamil\0"
+"Tangut\0"
+"Telugu\0"
+"Thaana\0"
+"Thai\0"
+"Tibetan\0"
+"Tifinagh\0"
"Tirhuta\0"
+"Traditional Han\0"
+"Ugaritic\0"
+"Vai\0"
"Varang Kshiti\0"
-"Ahom\0"
-"Anatolian Hieroglyphs\0"
-"Hatran\0"
-"Multani\0"
-"Old Hungarian\0"
-"Sign Writing\0"
-"Adlam\0"
-"Bhaiksuki\0"
-"Marchen\0"
-"Newa\0"
-"Osage\0"
-"Tangut\0"
-"Han with Bopomofo\0"
-"Jamo\0"
+"Yi\0"
+"Hanifi Rohingya\0"
;
-static const quint16 script_name_index[] = {
+static constexpr quint16 script_name_index[] = {
0, // AnyScript
- 8, // Arabic
- 15, // Cyrillic
- 24, // Deseret
- 32, // Gurmukhi
- 41, // Simplified Han
- 56, // Traditional Han
- 72, // Latin
- 78, // Mongolian
- 88, // Tifinagh
- 97, // Armenian
- 106, // Bengali
- 114, // Cherokee
- 123, // Devanagari
- 134, // Ethiopic
- 143, // Georgian
- 152, // Greek
- 158, // Gujarati
- 167, // Hebrew
- 174, // Japanese
- 183, // Khmer
- 189, // Kannada
- 197, // Korean
- 204, // Lao
- 208, // Malayalam
- 218, // Myanmar
- 226, // Oriya
- 232, // Tamil
- 238, // Telugu
- 245, // Thaana
- 252, // Thai
- 257, // Tibetan
- 265, // Sinhala
- 273, // Syriac
- 280, // Yi
- 283, // Vai
- 287, // Avestan
- 295, // Balinese
- 304, // Bamum
- 310, // Batak
- 316, // Bopomofo
- 325, // Brahmi
- 332, // Buginese
- 341, // Buhid
- 347, // Canadian Aboriginal
- 367, // Carian
- 374, // Chakma
- 381, // Cham
- 386, // Coptic
- 393, // Cypriot
- 401, // Egyptian Hieroglyphs
- 422, // Fraser
- 429, // Glagolitic
- 440, // Gothic
- 447, // Han
- 451, // Hangul
- 458, // Hanunoo
- 466, // Imperial Aramaic
- 483, // Inscriptional Pahlavi
- 505, // Inscriptional Parthian
- 528, // Javanese
- 537, // Kaithi
- 544, // Katakana
- 553, // Kayah Li
- 562, // Kharoshthi
- 573, // Lanna
- 579, // Lepcha
- 586, // Limbu
- 592, // Linear B
- 601, // Lycian
- 608, // Lydian
- 615, // Mandaean
- 624, // Meitei Mayek
- 637, // Meroitic
- 646, // Meroitic Cursive
- 663, // Nko
- 667, // New Tai Lue
- 679, // Ogham
- 685, // Ol Chiki
- 694, // Old Italic
- 705, // Old Persian
- 717, // Old South Arabian
- 735, // Orkhon
- 742, // Osmanya
- 750, // Phags Pa
- 759, // Phoenician
- 770, // Pollard Phonetic
- 787, // Rejang
- 794, // Runic
- 800, // Samaritan
- 810, // Saurashtra
- 821, // Sharada
- 829, // Shavian
- 837, // Sora Sompeng
- 850, // Cuneiform
- 860, // Sundanese
- 870, // Syloti Nagri
- 883, // Tagalog
- 891, // Tagbanwa
- 900, // Tai Le
- 907, // Tai Viet
- 916, // Takri
- 922, // Ugaritic
- 931, // Braille
- 939, // Hiragana
- 948, // Caucasian Albanian
- 967, // Bassa Vah
- 977, // Duployan
- 986, // Elbasan
- 994, // Grantha
- 1002, // Pahawh Hmong
- 1015, // Khojki
- 1022, // Linear A
- 1031, // Mahajani
- 1040, // Manichaean
- 1051, // Mende Kikakui
- 1065, // Modi
- 1070, // Mro
- 1074, // Old North Arabian
- 1092, // Nabataean
- 1102, // Palmyrene
- 1112, // Pau Cin Hau
- 1124, // Old Permic
- 1135, // Psalter Pahlavi
- 1151, // Siddham
- 1159, // Khudawadi
- 1169, // Tirhuta
- 1177, // Varang Kshiti
- 1191, // Ahom
- 1196, // Anatolian Hieroglyphs
- 1218, // Hatran
- 1225, // Multani
- 1233, // Old Hungarian
- 1247, // Sign Writing
- 1260, // Adlam
- 1266, // Bhaiksuki
- 1276, // Marchen
- 1284, // Newa
- 1289, // Osage
- 1295, // Tangut
- 1302, // Han with Bopomofo
- 1320, // Jamo
+ 8, // Adlam
+ 14, // Ahom
+ 19, // Anatolian Hieroglyphs
+ 41, // Arabic
+ 48, // Armenian
+ 57, // Avestan
+ 65, // Balinese
+ 74, // Bamum
+ 80, // Bangla
+ 87, // Bassa Vah
+ 97, // Batak
+ 103, // Bhaiksuki
+ 113, // Bopomofo
+ 122, // Brahmi
+ 129, // Braille
+ 137, // Buginese
+ 146, // Buhid
+ 152, // Canadian Aboriginal
+ 190, // Carian
+ 197, // Caucasian Albanian
+ 216, // Chakma
+ 223, // Cham
+ 228, // Cherokee
+ 237, // Coptic
+ 244, // Cuneiform
+ 270, // Cypriot
+ 278, // Cyrillic
+ 287, // Deseret
+ 295, // Devanagari
+ 306, // Duployan
+ 325, // Egyptian hieroglyphs
+ 346, // Elbasan
+ 354, // Ethiopic
+ 363, // Fraser
+ 370, // Georgian
+ 379, // Glagolitic
+ 390, // Gothic
+ 397, // Grantha
+ 405, // Greek
+ 411, // Gujarati
+ 420, // Gurmukhi
+ 429, // Hangul
+ 436, // Han
+ 440, // Hanunoo
+ 448, // Han with Bopomofo
+ 466, // Hatran
+ 473, // Hebrew
+ 480, // Hiragana
+ 489, // Imperial Aramaic
+ 506, // Inscriptional Pahlavi
+ 528, // Inscriptional Parthian
+ 551, // Jamo
+ 556, // Japanese
+ 565, // Javanese
+ 574, // Kaithi
+ 581, // Kannada
+ 589, // Katakana
+ 598, // Kayah Li
+ 607, // Kharoshthi
+ 618, // Khmer
+ 624, // Khojki
+ 631, // Khudawadi
+ 641, // Korean
+ 648, // Lanna
+ 654, // Lao
+ 658, // Latin
+ 664, // Lepcha
+ 671, // Limbu
+ 677, // Linear A
+ 686, // Linear B
+ 695, // Lycian
+ 702, // Lydian
+ 709, // Mahajani
+ 718, // Malayalam
+ 728, // Mandaean
+ 737, // Manichaean
+ 748, // Marchen
+ 756, // Meitei Mayek
+ 769, // Mende
+ 775, // Meroitic Cursive
+ 792, // Meroitic
+ 801, // Modi
+ 806, // Mongolian
+ 816, // Mro
+ 820, // Multani
+ 828, // Myanmar
+ 836, // Nabataean
+ 846, // Newa
+ 851, // New Tai Lue
+ 863, // Nko
+ 870, // Odia
+ 875, // Ogham
+ 881, // Ol Chiki
+ 890, // Old Hungarian
+ 904, // Old Italic
+ 915, // Old North Arabian
+ 933, // Old Permic
+ 944, // Old Persian
+ 956, // Old South Arabian
+ 974, // Orkhon
+ 981, // Osage
+ 987, // Osmanya
+ 995, // Pahawh Hmong
+ 1008, // Palmyrene
+ 1018, // Pau Cin Hau
+ 1030, // Phags-pa
+ 1039, // Phoenician
+ 1050, // Pollard Phonetic
+ 1067, // Psalter Pahlavi
+ 1083, // Rejang
+ 1090, // Runic
+ 1096, // Samaritan
+ 1106, // Saurashtra
+ 1117, // Sharada
+ 1125, // Shavian
+ 1133, // Siddham
+ 1141, // SignWriting
+ 1153, // Simplified Han
+ 1168, // Sinhala
+ 1176, // Sora Sompeng
+ 1189, // Sundanese
+ 1199, // Syloti Nagri
+ 1212, // Syriac
+ 1219, // Tagalog
+ 1227, // Tagbanwa
+ 1236, // Tai Le
+ 1243, // Tai Viet
+ 1252, // Takri
+ 1258, // Tamil
+ 1264, // Tangut
+ 1271, // Telugu
+ 1278, // Thaana
+ 1285, // Thai
+ 1290, // Tibetan
+ 1298, // Tifinagh
+ 1307, // Tirhuta
+ 1315, // Traditional Han
+ 1331, // Ugaritic
+ 1340, // Vai
+ 1344, // Varang Kshiti
+ 1358, // Yi
+ 1361, // Hanifi
};
-static const char country_name_list[] =
+static constexpr char territory_name_list[] =
"Default\0"
"Afghanistan\0"
+"Åland Islands\0"
"Albania\0"
"Algeria\0"
"American Samoa\0"
@@ -5500,10 +7190,11 @@ static const char country_name_list[] =
"Angola\0"
"Anguilla\0"
"Antarctica\0"
-"Antigua And Barbuda\0"
+"Antigua & Barbuda\0"
"Argentina\0"
"Armenia\0"
"Aruba\0"
+"Ascension Island\0"
"Australia\0"
"Austria\0"
"Azerbaijan\0"
@@ -5518,11 +7209,12 @@ static const char country_name_list[] =
"Bermuda\0"
"Bhutan\0"
"Bolivia\0"
-"Bosnia And Herzegowina\0"
+"Bosnia & Herzegovina\0"
"Botswana\0"
"Bouvet Island\0"
"Brazil\0"
"British Indian Ocean Territory\0"
+"British Virgin Islands\0"
"Brunei\0"
"Bulgaria\0"
"Burkina Faso\0"
@@ -5530,43 +7222,49 @@ static const char country_name_list[] =
"Cambodia\0"
"Cameroon\0"
"Canada\0"
+"Canary Islands\0"
"Cape Verde\0"
+"Caribbean Netherlands\0"
"Cayman Islands\0"
"Central African Republic\0"
+"Ceuta & Melilla\0"
"Chad\0"
"Chile\0"
"China\0"
"Christmas Island\0"
-"Cocos Islands\0"
+"Clipperton Island\0"
+"Cocos (Keeling) Islands\0"
"Colombia\0"
"Comoros\0"
-"Congo Kinshasa\0"
-"Congo Brazzaville\0"
+"Congo - Brazzaville\0"
+"Congo - Kinshasa\0"
"Cook Islands\0"
"Costa Rica\0"
-"Ivory Coast\0"
"Croatia\0"
"Cuba\0"
+"Curaçao\0"
"Cyprus\0"
-"Czech Republic\0"
+"Czechia\0"
"Denmark\0"
+"Diego Garcia\0"
"Djibouti\0"
"Dominica\0"
"Dominican Republic\0"
-"East Timor\0"
"Ecuador\0"
"Egypt\0"
"El Salvador\0"
"Equatorial Guinea\0"
"Eritrea\0"
"Estonia\0"
+"Eswatini\0"
"Ethiopia\0"
+"Europe\0"
+"European Union\0"
"Falkland Islands\0"
"Faroe Islands\0"
"Fiji\0"
"Finland\0"
"France\0"
-"Guernsey\0"
"French Guiana\0"
"French Polynesia\0"
"French Southern Territories\0"
@@ -5582,13 +7280,14 @@ static const char country_name_list[] =
"Guadeloupe\0"
"Guam\0"
"Guatemala\0"
+"Guernsey\0"
+"Guinea-Bissau\0"
"Guinea\0"
-"Guinea Bissau\0"
"Guyana\0"
"Haiti\0"
-"Heard And McDonald Islands\0"
+"Heard & McDonald Islands\0"
"Honduras\0"
-"Hong Kong\0"
+"Hong Kong SAR China\0"
"Hungary\0"
"Iceland\0"
"India\0"
@@ -5596,19 +7295,22 @@ static const char country_name_list[] =
"Iran\0"
"Iraq\0"
"Ireland\0"
+"Isle of Man\0"
"Israel\0"
"Italy\0"
+"Côte d’Ivoire\0" // Ivory Coast
"Jamaica\0"
"Japan\0"
+"Jersey\0"
"Jordan\0"
"Kazakhstan\0"
"Kenya\0"
"Kiribati\0"
-"North Korea\0"
-"South Korea\0"
+"Kosovo\0"
"Kuwait\0"
"Kyrgyzstan\0"
"Laos\0"
+"Latin America\0"
"Latvia\0"
"Lebanon\0"
"Lesotho\0"
@@ -5617,8 +7319,8 @@ static const char country_name_list[] =
"Liechtenstein\0"
"Lithuania\0"
"Luxembourg\0"
-"Macau\0"
-"Macedonia\0"
+"Macao SAR China\0"
+"North Macedonia\0"
"Madagascar\0"
"Malawi\0"
"Malaysia\0"
@@ -5635,25 +7337,27 @@ static const char country_name_list[] =
"Moldova\0"
"Monaco\0"
"Mongolia\0"
+"Montenegro\0"
"Montserrat\0"
"Morocco\0"
"Mozambique\0"
-"Myanmar\0"
+"Myanmar (Burma)\0"
"Namibia\0"
"Nauru\0"
"Nepal\0"
"Netherlands\0"
-"Cura Sao\0"
"New Caledonia\0"
"New Zealand\0"
"Nicaragua\0"
-"Niger\0"
"Nigeria\0"
+"Niger\0"
"Niue\0"
"Norfolk Island\0"
"Northern Mariana Islands\0"
+"North Korea\0"
"Norway\0"
"Oman\0"
+"Outlying Oceania\0"
"Pakistan\0"
"Palau\0"
"Palestinian Territories\0"
@@ -5662,40 +7366,45 @@ static const char country_name_list[] =
"Paraguay\0"
"Peru\0"
"Philippines\0"
-"Pitcairn\0"
+"Pitcairn Islands\0"
"Poland\0"
"Portugal\0"
"Puerto Rico\0"
"Qatar\0"
-"Reunion\0"
+"Réunion\0"
"Romania\0"
"Russia\0"
"Rwanda\0"
-"Saint Kitts And Nevis\0"
-"Saint Lucia\0"
-"Saint Vincent And The Grenadines\0"
+"St. Barthélemy\0"
+"St. Helena\0"
+"St. Kitts & Nevis\0"
+"St. Lucia\0"
+"St. Martin\0"
+"St. Pierre & Miquelon\0"
+"St. Vincent & Grenadines\0"
"Samoa\0"
"San Marino\0"
-"Sao Tome And Principe\0"
+"São Tomé & Príncipe\0"
"Saudi Arabia\0"
"Senegal\0"
+"Serbia\0"
"Seychelles\0"
"Sierra Leone\0"
"Singapore\0"
+"Sint Maarten\0"
"Slovakia\0"
"Slovenia\0"
"Solomon Islands\0"
"Somalia\0"
"South Africa\0"
-"South Georgia And The South Sandwich Islands\0"
+"South Georgia & South Sandwich Islands\0"
+"South Korea\0"
+"South Sudan\0"
"Spain\0"
"Sri Lanka\0"
-"Saint Helena\0"
-"Saint Pierre And Miquelon\0"
"Sudan\0"
"Suriname\0"
-"Svalbard And Jan Mayen Islands\0"
-"Swaziland\0"
+"Svalbard & Jan Mayen\0"
"Sweden\0"
"Switzerland\0"
"Syria\0"
@@ -5703,844 +7412,800 @@ static const char country_name_list[] =
"Tajikistan\0"
"Tanzania\0"
"Thailand\0"
+"Timor-Leste\0"
"Togo\0"
"Tokelau\0"
"Tonga\0"
-"Trinidad And Tobago\0"
+"Trinidad & Tobago\0"
+"Tristan da Cunha\0"
"Tunisia\0"
-"Turkey\0"
+"Türkiye\0" // Turkey
"Turkmenistan\0"
-"Turks And Caicos Islands\0"
+"Turks & Caicos Islands\0"
"Tuvalu\0"
"Uganda\0"
"Ukraine\0"
"United Arab Emirates\0"
"United Kingdom\0"
+"U.S. Outlying Islands\0"
"United States\0"
-"United States Minor Outlying Islands\0"
+"U.S. Virgin Islands\0"
"Uruguay\0"
"Uzbekistan\0"
"Vanuatu\0"
-"Vatican City State\0"
+"Vatican City\0"
"Venezuela\0"
"Vietnam\0"
-"British Virgin Islands\0"
-"United States Virgin Islands\0"
-"Wallis And Futuna Islands\0"
+"Wallis & Futuna\0"
"Western Sahara\0"
+"world\0"
"Yemen\0"
-"Canary Islands\0"
"Zambia\0"
"Zimbabwe\0"
-"Clipperton Island\0"
-"Montenegro\0"
-"Serbia\0"
-"Saint Barthelemy\0"
-"Saint Martin\0"
-"Latin America\0"
-"Ascension Island\0"
-"Aland Islands\0"
-"Diego Garcia\0"
-"Ceuta And Melilla\0"
-"Isle Of Man\0"
-"Jersey\0"
-"Tristan Da Cunha\0"
-"South Sudan\0"
-"Bonaire\0"
-"Sint Maarten\0"
-"Kosovo\0"
-"European Union\0"
-"Outlying Oceania\0"
-"World\0"
-"Europe\0"
;
-static const quint16 country_name_index[] = {
- 0, // AnyCountry
+static constexpr quint16 territory_name_index[] = {
+ 0, // AnyTerritory
8, // Afghanistan
- 20, // Albania
- 28, // Algeria
- 36, // American Samoa
- 51, // Andorra
- 59, // Angola
- 66, // Anguilla
- 75, // Antarctica
- 86, // Antigua And Barbuda
- 106, // Argentina
- 116, // Armenia
- 124, // Aruba
- 130, // Australia
- 140, // Austria
- 148, // Azerbaijan
- 159, // Bahamas
- 167, // Bahrain
- 175, // Bangladesh
- 186, // Barbados
- 195, // Belarus
- 203, // Belgium
- 211, // Belize
- 218, // Benin
- 224, // Bermuda
- 232, // Bhutan
- 239, // Bolivia
- 247, // Bosnia And Herzegowina
- 270, // Botswana
- 279, // Bouvet Island
- 293, // Brazil
- 300, // British Indian Ocean Territory
- 331, // Brunei
- 338, // Bulgaria
- 347, // Burkina Faso
- 360, // Burundi
- 368, // Cambodia
- 377, // Cameroon
- 386, // Canada
- 393, // Cape Verde
- 404, // Cayman Islands
- 419, // Central African Republic
- 444, // Chad
- 449, // Chile
- 455, // China
- 461, // Christmas Island
- 478, // Cocos Islands
- 492, // Colombia
- 501, // Comoros
- 509, // Congo Kinshasa
- 524, // Congo Brazzaville
- 542, // Cook Islands
- 555, // Costa Rica
- 566, // Ivory Coast
- 578, // Croatia
- 586, // Cuba
- 591, // Cyprus
- 598, // Czech Republic
- 613, // Denmark
- 621, // Djibouti
- 630, // Dominica
- 639, // Dominican Republic
- 658, // East Timor
- 669, // Ecuador
- 677, // Egypt
- 683, // El Salvador
- 695, // Equatorial Guinea
- 713, // Eritrea
- 721, // Estonia
- 729, // Ethiopia
- 738, // Falkland Islands
- 755, // Faroe Islands
- 769, // Fiji
- 774, // Finland
- 782, // France
- 789, // Guernsey
- 798, // French Guiana
- 812, // French Polynesia
- 829, // French Southern Territories
- 857, // Gabon
- 863, // Gambia
- 870, // Georgia
- 878, // Germany
- 886, // Ghana
- 892, // Gibraltar
- 902, // Greece
- 909, // Greenland
- 919, // Grenada
- 927, // Guadeloupe
- 938, // Guam
- 943, // Guatemala
- 953, // Guinea
- 960, // Guinea Bissau
- 974, // Guyana
- 981, // Haiti
- 987, // Heard And McDonald Islands
- 1014, // Honduras
- 1023, // Hong Kong
- 1033, // Hungary
- 1041, // Iceland
- 1049, // India
- 1055, // Indonesia
- 1065, // Iran
- 1070, // Iraq
- 1075, // Ireland
- 1083, // Israel
- 1090, // Italy
- 1096, // Jamaica
- 1104, // Japan
- 1110, // Jordan
- 1117, // Kazakhstan
- 1128, // Kenya
- 1134, // Kiribati
- 1143, // North Korea
- 1155, // South Korea
- 1167, // Kuwait
- 1174, // Kyrgyzstan
- 1185, // Laos
- 1190, // Latvia
- 1197, // Lebanon
- 1205, // Lesotho
- 1213, // Liberia
- 1221, // Libya
- 1227, // Liechtenstein
- 1241, // Lithuania
- 1251, // Luxembourg
- 1262, // Macau
- 1268, // Macedonia
- 1278, // Madagascar
- 1289, // Malawi
- 1296, // Malaysia
- 1305, // Maldives
- 1314, // Mali
- 1319, // Malta
- 1325, // Marshall Islands
- 1342, // Martinique
- 1353, // Mauritania
- 1364, // Mauritius
- 1374, // Mayotte
- 1382, // Mexico
- 1389, // Micronesia
- 1400, // Moldova
- 1408, // Monaco
- 1415, // Mongolia
- 1424, // Montserrat
- 1435, // Morocco
- 1443, // Mozambique
- 1454, // Myanmar
- 1462, // Namibia
- 1470, // Nauru
- 1476, // Nepal
- 1482, // Netherlands
- 1494, // Cura Sao
- 1503, // New Caledonia
- 1517, // New Zealand
- 1529, // Nicaragua
- 1539, // Niger
- 1545, // Nigeria
- 1553, // Niue
- 1558, // Norfolk Island
- 1573, // Northern Mariana Islands
- 1598, // Norway
- 1605, // Oman
- 1610, // Pakistan
- 1619, // Palau
- 1625, // Palestinian Territories
- 1649, // Panama
- 1656, // Papua New Guinea
- 1673, // Paraguay
- 1682, // Peru
- 1687, // Philippines
- 1699, // Pitcairn
- 1708, // Poland
- 1715, // Portugal
- 1724, // Puerto Rico
- 1736, // Qatar
- 1742, // Reunion
- 1750, // Romania
- 1758, // Russia
- 1765, // Rwanda
- 1772, // Saint Kitts And Nevis
- 1794, // Saint Lucia
- 1806, // Saint Vincent And The Grenadines
- 1839, // Samoa
- 1845, // San Marino
- 1856, // Sao Tome And Principe
- 1878, // Saudi Arabia
- 1891, // Senegal
- 1899, // Seychelles
- 1910, // Sierra Leone
- 1923, // Singapore
- 1933, // Slovakia
- 1942, // Slovenia
- 1951, // Solomon Islands
- 1967, // Somalia
- 1975, // South Africa
- 1988, // South Georgia And The South Sandwich Islands
- 2033, // Spain
- 2039, // Sri Lanka
- 2049, // Saint Helena
- 2062, // Saint Pierre And Miquelon
- 2088, // Sudan
- 2094, // Suriname
- 2103, // Svalbard And Jan Mayen Islands
- 2134, // Swaziland
- 2144, // Sweden
- 2151, // Switzerland
- 2163, // Syria
- 2169, // Taiwan
- 2176, // Tajikistan
- 2187, // Tanzania
- 2196, // Thailand
- 2205, // Togo
- 2210, // Tokelau
- 2218, // Tonga
- 2224, // Trinidad And Tobago
- 2244, // Tunisia
- 2252, // Turkey
- 2259, // Turkmenistan
- 2272, // Turks And Caicos Islands
- 2297, // Tuvalu
- 2304, // Uganda
- 2311, // Ukraine
- 2319, // United Arab Emirates
- 2340, // United Kingdom
- 2355, // United States
- 2369, // United States Minor Outlying Islands
- 2406, // Uruguay
- 2414, // Uzbekistan
- 2425, // Vanuatu
- 2433, // Vatican City State
- 2452, // Venezuela
- 2462, // Vietnam
- 2470, // British Virgin Islands
- 2493, // United States Virgin Islands
- 2522, // Wallis And Futuna Islands
- 2548, // Western Sahara
- 2563, // Yemen
- 2569, // Canary Islands
- 2584, // Zambia
- 2591, // Zimbabwe
- 2600, // Clipperton Island
- 2618, // Montenegro
- 2629, // Serbia
- 2636, // Saint Barthelemy
- 2653, // Saint Martin
- 2666, // Latin America
- 2680, // Ascension Island
- 2697, // Aland Islands
- 2711, // Diego Garcia
- 2724, // Ceuta And Melilla
- 2742, // Isle Of Man
- 2754, // Jersey
- 2761, // Tristan Da Cunha
- 2778, // South Sudan
- 2790, // Bonaire
- 2798, // Sint Maarten
- 2811, // Kosovo
- 2818, // European Union
- 2833, // Outlying Oceania
- 2850, // World
- 2856, // Europe
+ 20, // Aland Islands
+ 35, // Albania
+ 43, // Algeria
+ 51, // American Samoa
+ 66, // Andorra
+ 74, // Angola
+ 81, // Anguilla
+ 90, // Antarctica
+ 101, // Antigua and Barbuda
+ 119, // Argentina
+ 129, // Armenia
+ 137, // Aruba
+ 143, // Ascension Island
+ 160, // Australia
+ 170, // Austria
+ 178, // Azerbaijan
+ 189, // Bahamas
+ 197, // Bahrain
+ 205, // Bangladesh
+ 216, // Barbados
+ 225, // Belarus
+ 233, // Belgium
+ 241, // Belize
+ 248, // Benin
+ 254, // Bermuda
+ 262, // Bhutan
+ 269, // Bolivia
+ 277, // Bosnia and Herzegovina
+ 298, // Botswana
+ 307, // Bouvet Island
+ 321, // Brazil
+ 328, // British Indian Ocean Territory
+ 359, // British Virgin Islands
+ 382, // Brunei
+ 389, // Bulgaria
+ 398, // Burkina Faso
+ 411, // Burundi
+ 419, // Cambodia
+ 428, // Cameroon
+ 437, // Canada
+ 444, // Canary Islands
+ 459, // Cape Verde
+ 470, // Caribbean Netherlands
+ 492, // Cayman Islands
+ 507, // Central African Republic
+ 532, // Ceuta and Melilla
+ 548, // Chad
+ 553, // Chile
+ 559, // China
+ 565, // Christmas Island
+ 582, // Clipperton Island
+ 600, // Cocos Islands
+ 624, // Colombia
+ 633, // Comoros
+ 641, // Congo - Brazzaville
+ 661, // Congo - Kinshasa
+ 678, // Cook Islands
+ 691, // Costa Rica
+ 702, // Croatia
+ 710, // Cuba
+ 715, // Curacao
+ 724, // Cyprus
+ 731, // Czechia
+ 739, // Denmark
+ 747, // Diego Garcia
+ 760, // Djibouti
+ 769, // Dominica
+ 778, // Dominican Republic
+ 797, // Ecuador
+ 805, // Egypt
+ 811, // El Salvador
+ 823, // Equatorial Guinea
+ 841, // Eritrea
+ 849, // Estonia
+ 857, // Eswatini
+ 866, // Ethiopia
+ 875, // Europe
+ 882, // European Union
+ 897, // Falkland Islands
+ 914, // Faroe Islands
+ 928, // Fiji
+ 933, // Finland
+ 941, // France
+ 948, // French Guiana
+ 962, // French Polynesia
+ 979, // French Southern Territories
+ 1007, // Gabon
+ 1013, // Gambia
+ 1020, // Georgia
+ 1028, // Germany
+ 1036, // Ghana
+ 1042, // Gibraltar
+ 1052, // Greece
+ 1059, // Greenland
+ 1069, // Grenada
+ 1077, // Guadeloupe
+ 1088, // Guam
+ 1093, // Guatemala
+ 1103, // Guernsey
+ 1112, // Guinea-Bissau
+ 1126, // Guinea
+ 1133, // Guyana
+ 1140, // Haiti
+ 1146, // Heard and McDonald Islands
+ 1171, // Honduras
+ 1180, // Hong Kong
+ 1200, // Hungary
+ 1208, // Iceland
+ 1216, // India
+ 1222, // Indonesia
+ 1232, // Iran
+ 1237, // Iraq
+ 1242, // Ireland
+ 1250, // Isle of Man
+ 1262, // Israel
+ 1269, // Italy
+ 1275, // Ivory Coast
+ 1292, // Jamaica
+ 1300, // Japan
+ 1306, // Jersey
+ 1313, // Jordan
+ 1320, // Kazakhstan
+ 1331, // Kenya
+ 1337, // Kiribati
+ 1346, // Kosovo
+ 1353, // Kuwait
+ 1360, // Kyrgyzstan
+ 1371, // Laos
+ 1376, // Latin America
+ 1390, // Latvia
+ 1397, // Lebanon
+ 1405, // Lesotho
+ 1413, // Liberia
+ 1421, // Libya
+ 1427, // Liechtenstein
+ 1441, // Lithuania
+ 1451, // Luxembourg
+ 1462, // Macao
+ 1478, // Macedonia
+ 1494, // Madagascar
+ 1505, // Malawi
+ 1512, // Malaysia
+ 1521, // Maldives
+ 1530, // Mali
+ 1535, // Malta
+ 1541, // Marshall Islands
+ 1558, // Martinique
+ 1569, // Mauritania
+ 1580, // Mauritius
+ 1590, // Mayotte
+ 1598, // Mexico
+ 1605, // Micronesia
+ 1616, // Moldova
+ 1624, // Monaco
+ 1631, // Mongolia
+ 1640, // Montenegro
+ 1651, // Montserrat
+ 1662, // Morocco
+ 1670, // Mozambique
+ 1681, // Myanmar
+ 1697, // Namibia
+ 1705, // Nauru
+ 1711, // Nepal
+ 1717, // Netherlands
+ 1729, // New Caledonia
+ 1743, // New Zealand
+ 1755, // Nicaragua
+ 1765, // Nigeria
+ 1773, // Niger
+ 1779, // Niue
+ 1784, // Norfolk Island
+ 1799, // Northern Mariana Islands
+ 1824, // North Korea
+ 1836, // Norway
+ 1843, // Oman
+ 1848, // Outlying Oceania
+ 1865, // Pakistan
+ 1874, // Palau
+ 1880, // Palestinian Territories
+ 1904, // Panama
+ 1911, // Papua New Guinea
+ 1928, // Paraguay
+ 1937, // Peru
+ 1942, // Philippines
+ 1954, // Pitcairn
+ 1971, // Poland
+ 1978, // Portugal
+ 1987, // Puerto Rico
+ 1999, // Qatar
+ 2005, // Reunion
+ 2014, // Romania
+ 2022, // Russia
+ 2029, // Rwanda
+ 2036, // Saint Barthelemy
+ 2052, // Saint Helena
+ 2063, // Saint Kitts and Nevis
+ 2081, // Saint Lucia
+ 2091, // Saint Martin
+ 2102, // Saint Pierre and Miquelon
+ 2124, // Saint Vincent and Grenadines
+ 2149, // Samoa
+ 2155, // San Marino
+ 2166, // Sao Tome and Principe
+ 2189, // Saudi Arabia
+ 2202, // Senegal
+ 2210, // Serbia
+ 2217, // Seychelles
+ 2228, // Sierra Leone
+ 2241, // Singapore
+ 2251, // Sint Maarten
+ 2264, // Slovakia
+ 2273, // Slovenia
+ 2282, // Solomon Islands
+ 2298, // Somalia
+ 2306, // South Africa
+ 2319, // South Georgia and South Sandwich Islands
+ 2358, // South Korea
+ 2370, // South Sudan
+ 2382, // Spain
+ 2388, // Sri Lanka
+ 2398, // Sudan
+ 2404, // Suriname
+ 2413, // Svalbard and Jan Mayen
+ 2434, // Sweden
+ 2441, // Switzerland
+ 2453, // Syria
+ 2459, // Taiwan
+ 2466, // Tajikistan
+ 2477, // Tanzania
+ 2486, // Thailand
+ 2495, // Timor-Leste
+ 2507, // Togo
+ 2512, // Tokelau
+ 2520, // Tonga
+ 2526, // Trinidad and Tobago
+ 2544, // Tristan da Cunha
+ 2561, // Tunisia
+ 2569, // Turkey
+ 2578, // Turkmenistan
+ 2591, // Turks and Caicos Islands
+ 2614, // Tuvalu
+ 2621, // Uganda
+ 2628, // Ukraine
+ 2636, // United Arab Emirates
+ 2657, // United Kingdom
+ 2672, // United States Outlying Islands
+ 2694, // United States
+ 2708, // United States Virgin Islands
+ 2728, // Uruguay
+ 2736, // Uzbekistan
+ 2747, // Vanuatu
+ 2755, // Vatican City
+ 2768, // Venezuela
+ 2778, // Vietnam
+ 2786, // Wallis and Futuna
+ 2802, // Western Sahara
+ 2817, // world
+ 2823, // Yemen
+ 2829, // Zambia
+ 2836, // Zimbabwe
};
-static const unsigned char language_code_list[] =
-" \0" // AnyLanguage
-" \0" // C
-"ab\0" // Abkhazian
-"om\0" // Oromo
-"aa\0" // Afar
-"af\0" // Afrikaans
-"sq\0" // Albanian
-"am\0" // Amharic
-"ar\0" // Arabic
-"hy\0" // Armenian
-"as\0" // Assamese
-"ay\0" // Aymara
-"az\0" // Azerbaijani
-"ba\0" // Bashkir
-"eu\0" // Basque
-"bn\0" // Bengali
-"dz\0" // Dzongkha
-"bh\0" // Bihari
-"bi\0" // Bislama
-"br\0" // Breton
-"bg\0" // Bulgarian
-"my\0" // Burmese
-"be\0" // Belarusian
-"km\0" // Khmer
-"ca\0" // Catalan
-"zh\0" // Chinese
-"co\0" // Corsican
-"hr\0" // Croatian
-"cs\0" // Czech
-"da\0" // Danish
-"nl\0" // Dutch
-"en\0" // English
-"eo\0" // Esperanto
-"et\0" // Estonian
-"fo\0" // Faroese
-"fj\0" // Fijian
-"fi\0" // Finnish
-"fr\0" // French
-"fy\0" // Western Frisian
-"gd\0" // Gaelic
-"gl\0" // Galician
-"ka\0" // Georgian
-"de\0" // German
-"el\0" // Greek
-"kl\0" // Greenlandic
-"gn\0" // Guarani
-"gu\0" // Gujarati
-"ha\0" // Hausa
-"he\0" // Hebrew
-"hi\0" // Hindi
-"hu\0" // Hungarian
-"is\0" // Icelandic
-"id\0" // Indonesian
-"ia\0" // Interlingua
-"ie\0" // Interlingue
-"iu\0" // Inuktitut
-"ik\0" // Inupiak
-"ga\0" // Irish
-"it\0" // Italian
-"ja\0" // Japanese
-"jv\0" // Javanese
-"kn\0" // Kannada
-"ks\0" // Kashmiri
-"kk\0" // Kazakh
-"rw\0" // Kinyarwanda
-"ky\0" // Kirghiz
-"ko\0" // Korean
-"ku\0" // Kurdish
-"rn\0" // Rundi
-"lo\0" // Lao
-"la\0" // Latin
-"lv\0" // Latvian
-"ln\0" // Lingala
-"lt\0" // Lithuanian
-"mk\0" // Macedonian
-"mg\0" // Malagasy
-"ms\0" // Malay
-"ml\0" // Malayalam
-"mt\0" // Maltese
-"mi\0" // Maori
-"mr\0" // Marathi
-"mh\0" // Marshallese
-"mn\0" // Mongolian
-"na\0" // Nauru
-"ne\0" // Nepali
-"nb\0" // Norwegian Bokmal
-"oc\0" // Occitan
-"or\0" // Oriya
-"ps\0" // Pashto
-"fa\0" // Persian
-"pl\0" // Polish
-"pt\0" // Portuguese
-"pa\0" // Punjabi
-"qu\0" // Quechua
-"rm\0" // Romansh
-"ro\0" // Romanian
-"ru\0" // Russian
-"sm\0" // Samoan
-"sg\0" // Sango
-"sa\0" // Sanskrit
-"sr\0" // Serbian
-"os\0" // Ossetic
-"st\0" // Southern Sotho
-"tn\0" // Tswana
-"sn\0" // Shona
-"sd\0" // Sindhi
-"si\0" // Sinhala
-"ss\0" // Swati
-"sk\0" // Slovak
-"sl\0" // Slovenian
-"so\0" // Somali
-"es\0" // Spanish
-"su\0" // Sundanese
-"sw\0" // Swahili
-"sv\0" // Swedish
-"sc\0" // Sardinian
-"tg\0" // Tajik
-"ta\0" // Tamil
-"tt\0" // Tatar
-"te\0" // Telugu
-"th\0" // Thai
-"bo\0" // Tibetan
-"ti\0" // Tigrinya
-"to\0" // Tongan
-"ts\0" // Tsonga
-"tr\0" // Turkish
-"tk\0" // Turkmen
-"ty\0" // Tahitian
-"ug\0" // Uighur
-"uk\0" // Ukrainian
-"ur\0" // Urdu
-"uz\0" // Uzbek
-"vi\0" // Vietnamese
-"vo\0" // Volapuk
-"cy\0" // Welsh
-"wo\0" // Wolof
-"xh\0" // Xhosa
-"yi\0" // Yiddish
-"yo\0" // Yoruba
-"za\0" // Zhuang
-"zu\0" // Zulu
-"nn\0" // Norwegian Nynorsk
-"bs\0" // Bosnian
-"dv\0" // Divehi
-"gv\0" // Manx
-"kw\0" // Cornish
-"ak\0" // Akan
-"kok" // Konkani
-"gaa" // Ga
-"ig\0" // Igbo
-"kam" // Kamba
-"syr" // Syriac
-"byn" // Blin
-"gez" // Geez
-"kfo" // Koro
-"sid" // Sidamo
-"cch" // Atsam
-"tig" // Tigre
-"kaj" // Jju
-"fur" // Friulian
-"ve\0" // Venda
-"ee\0" // Ewe
-"wal" // Walamo
-"haw" // Hawaiian
-"kcg" // Tyap
-"ny\0" // Nyanja
-"fil" // Filipino
-"gsw" // Swiss German
-"ii\0" // Sichuan Yi
-"kpe" // Kpelle
-"nds" // Low German
-"nr\0" // South Ndebele
-"nso" // Northern Sotho
-"se\0" // Northern Sami
-"trv" // Taroko
-"guz" // Gusii
-"dav" // Taita
-"ff\0" // Fulah
-"ki\0" // Kikuyu
-"saq" // Samburu
-"seh" // Sena
-"nd\0" // North Ndebele
-"rof" // Rombo
-"shi" // Tachelhit
-"kab" // Kabyle
-"nyn" // Nyankole
-"bez" // Bena
-"vun" // Vunjo
-"bm\0" // Bambara
-"ebu" // Embu
-"chr" // Cherokee
-"mfe" // Morisyen
-"kde" // Makonde
-"lag" // Langi
-"lg\0" // Ganda
-"bem" // Bemba
-"kea" // Kabuverdianu
-"mer" // Meru
-"kln" // Kalenjin
-"naq" // Nama
-"jmc" // Machame
-"ksh" // Colognian
-"mas" // Masai
-"xog" // Soga
-"luy" // Luyia
-"asa" // Asu
-"teo" // Teso
-"ssy" // Saho
-"khq" // Koyra Chiini
-"rwk" // Rwa
-"luo" // Luo
-"cgg" // Chiga
-"tzm" // Central Morocco Tamazight
-"ses" // Koyraboro Senni
-"ksb" // Shambala
-"brx" // Bodo
-"av\0" // Avaric
-"ch\0" // Chamorro
-"ce\0" // Chechen
-"cu\0" // Church
-"cv\0" // Chuvash
-"cr\0" // Cree
-"ht\0" // Haitian
-"hz\0" // Herero
-"ho\0" // Hiri Motu
-"kr\0" // Kanuri
-"kv\0" // Komi
-"kg\0" // Kongo
-"kj\0" // Kwanyama
-"li\0" // Limburgish
-"lu\0" // Luba Katanga
-"lb\0" // Luxembourgish
-"nv\0" // Navaho
-"ng\0" // Ndonga
-"oj\0" // Ojibwa
-"pi\0" // Pali
-"wa\0" // Walloon
-"agq" // Aghem
-"bas" // Basaa
-"dje" // Zarma
-"dua" // Duala
-"dyo" // Jola Fonyi
-"ewo" // Ewondo
-"ksf" // Bafia
-"mgh" // Makhuwa Meetto
-"mua" // Mundang
-"nmg" // Kwasio
-"nus" // Nuer
-"sah" // Sakha
-"sbp" // Sangu
-"swc" // Congo Swahili
-"twq" // Tasawaq
-"vai" // Vai
-"wae" // Walser
-"yav" // Yangben
-"ae\0" // Avestan
-"ast" // Asturian
-"jgo" // Ngomba
-"kkj" // Kako
-"mgo" // Meta
-"nnh" // Ngiemboon
-"an\0" // Aragonese
-"akk" // Akkadian
-"egy" // Ancient Egyptian
-"grc" // Ancient Greek
-"arc" // Aramaic
-"ban" // Balinese
-"bax" // Bamun
-"bbc" // Batak Toba
-"bug" // Buginese
-"bku" // Buhid
-"xcr" // Carian
-"ccp" // Chakma
-"myz" // Classical Mandaic
-"cop" // Coptic
-"doi" // Dogri
-"cjm" // Eastern Cham
-"eky" // Eastern Kayah
-"ett" // Etruscan
-"got" // Gothic
-"hnn" // Hanunoo
-"inh" // Ingush
-"hmd" // Large Flowery Miao
-"lep" // Lepcha
-"lif" // Limbu
-"lis" // Lisu
-"khb" // Lu
-"xlc" // Lycian
-"xld" // Lydian
-"man" // Mandingo
-"mni" // Manipuri
-"xmr" // Meroitic
-"nod" // Northern Thai
-"sga" // Old Irish
-"non" // Old Norse
-"peo" // Old Persian
-"otk" // Old Turkish
-"pal" // Pahlavi
-"xpr" // Parthian
-"phn" // Phoenician
-"pra" // Prakrit Language
-"rej" // Rejang
-"xsa" // Sabaean
-"smp" // Samaritan
-"sat" // Santali
-"saz" // Saurashtra
-"srb" // Sora
-"syl" // Sylheti
-"tbw" // Tagbanwa
-"blt" // Tai Dam
-"tdd" // Tai Nua
-"uga" // Ugaritic
-"bss" // Akoose
-"lkt" // Lakota
-"zgh" // Standard Moroccan Tamazight
-"arn" // Mapuche
-"ckb" // Central Kurdish
-"dsb" // Lower Sorbian
-"hsb" // Upper Sorbian
-"ken" // Kenyang
-"moh" // Mohawk
-"nqo" // Nko
-"prg" // Prussian
-"quc" // Kiche
-"sma" // Southern Sami
-"smj" // Lule Sami
-"smn" // Inari Sami
-"sms" // Skolt Sami
-"wbp" // Warlpiri
-"xmn" // Manichaean Middle Persian
-"men" // Mende
-"xna" // Ancient North Arabian
-"lab" // Linear A
-"hnj" // Hmong Njua
-"hoc" // Ho
-"lez" // Lezghian
-"bsq" // Bassa
-"mru" // Mono
-"ctd" // Tedim Chin
-"mai" // Maithili
-"aho" // Ahom
-"ase" // American Sign Language
-"pka" // Ardhamagadhi Prakrit
-"bho" // Bhojpuri
-"hlu" // Hieroglyphic Luwian
-"lzh" // Literary Chinese
-"mzn" // Mazanderani
-"mro" // Mru
-"new" // Newari
-"lrc" // Northern Luri
-"pau" // Palauan
-"pap" // Papiamento
-"skr" // Saraiki
-"tkl" // Tokelau
-"tpi" // Tok Pisin
-"tvl" // Tuvalu
-"mis" // Uncoded Languages
-"yue" // Cantonese
-"osa" // Osage
-"txg" // Tangut
-"io\0" // Ido
-"jbo" // Lojban
-"scn" // Sicilian
-"sdh" // Southern Kurdish
-"bgn" // Western Balochi
-"ceb" // Cebuano
-"myv" // Erzya
-"cic" // Chickasaw
-"mus" // Muscogee
-"szl" // Silesian
-;
+constexpr std::array<LanguageCodeEntry, 344> languageCodeList {
+ LanguageCodeEntry {{}, {'u', 'n', 'd'}, {'u', 'n', 'd'}, {'u', 'n', 'd'}}, // AnyLanguage
+ LanguageCodeEntry {{}, {'u', 'n', 'd'}, {'u', 'n', 'd'}, {'u', 'n', 'd'}}, // C
+ LanguageCodeEntry {{'a', 'b'}, {'a', 'b', 'k'}, {'a', 'b', 'k'}, {'a', 'b', 'k'}}, // Abkhazian
+ LanguageCodeEntry {{'a', 'a'}, {'a', 'a', 'r'}, {'a', 'a', 'r'}, {'a', 'a', 'r'}}, // Afar
+ LanguageCodeEntry {{'a', 'f'}, {'a', 'f', 'r'}, {'a', 'f', 'r'}, {'a', 'f', 'r'}}, // Afrikaans
+ LanguageCodeEntry {{}, {}, {}, {'a', 'g', 'q'}}, // Aghem
+ LanguageCodeEntry {{'a', 'k'}, {'a', 'k', 'a'}, {'a', 'k', 'a'}, {'a', 'k', 'a'}}, // Akan
+ LanguageCodeEntry {{}, {'a', 'k', 'k'}, {'a', 'k', 'k'}, {'a', 'k', 'k'}}, // Akkadian
+ LanguageCodeEntry {{}, {}, {}, {'b', 's', 's'}}, // Akoose
+ LanguageCodeEntry {{'s', 'q'}, {'a', 'l', 'b'}, {'s', 'q', 'i'}, {'s', 'q', 'i'}}, // Albanian
+ LanguageCodeEntry {{}, {}, {}, {'a', 's', 'e'}}, // American Sign Language
+ LanguageCodeEntry {{'a', 'm'}, {'a', 'm', 'h'}, {'a', 'm', 'h'}, {'a', 'm', 'h'}}, // Amharic
+ LanguageCodeEntry {{}, {'e', 'g', 'y'}, {'e', 'g', 'y'}, {'e', 'g', 'y'}}, // Ancient Egyptian
+ LanguageCodeEntry {{}, {'g', 'r', 'c'}, {'g', 'r', 'c'}, {'g', 'r', 'c'}}, // Ancient Greek
+ LanguageCodeEntry {{'a', 'r'}, {'a', 'r', 'a'}, {'a', 'r', 'a'}, {'a', 'r', 'a'}}, // Arabic
+ LanguageCodeEntry {{'a', 'n'}, {'a', 'r', 'g'}, {'a', 'r', 'g'}, {'a', 'r', 'g'}}, // Aragonese
+ LanguageCodeEntry {{}, {'a', 'r', 'c'}, {'a', 'r', 'c'}, {'a', 'r', 'c'}}, // Aramaic
+ LanguageCodeEntry {{'h', 'y'}, {'a', 'r', 'm'}, {'h', 'y', 'e'}, {'h', 'y', 'e'}}, // Armenian
+ LanguageCodeEntry {{'a', 's'}, {'a', 's', 'm'}, {'a', 's', 'm'}, {'a', 's', 'm'}}, // Assamese
+ LanguageCodeEntry {{}, {'a', 's', 't'}, {'a', 's', 't'}, {'a', 's', 't'}}, // Asturian
+ LanguageCodeEntry {{}, {}, {}, {'a', 's', 'a'}}, // Asu
+ LanguageCodeEntry {{}, {}, {}, {'c', 'c', 'h'}}, // Atsam
+ LanguageCodeEntry {{'a', 'v'}, {'a', 'v', 'a'}, {'a', 'v', 'a'}, {'a', 'v', 'a'}}, // Avaric
+ LanguageCodeEntry {{'a', 'e'}, {'a', 'v', 'e'}, {'a', 'v', 'e'}, {'a', 'v', 'e'}}, // Avestan
+ LanguageCodeEntry {{'a', 'y'}, {'a', 'y', 'm'}, {'a', 'y', 'm'}, {'a', 'y', 'm'}}, // Aymara
+ LanguageCodeEntry {{'a', 'z'}, {'a', 'z', 'e'}, {'a', 'z', 'e'}, {'a', 'z', 'e'}}, // Azerbaijani
+ LanguageCodeEntry {{}, {}, {}, {'k', 's', 'f'}}, // Bafia
+ LanguageCodeEntry {{}, {'b', 'a', 'n'}, {'b', 'a', 'n'}, {'b', 'a', 'n'}}, // Balinese
+ LanguageCodeEntry {{'b', 'm'}, {'b', 'a', 'm'}, {'b', 'a', 'm'}, {'b', 'a', 'm'}}, // Bambara
+ LanguageCodeEntry {{}, {}, {}, {'b', 'a', 'x'}}, // Bamun
+ LanguageCodeEntry {{'b', 'n'}, {'b', 'e', 'n'}, {'b', 'e', 'n'}, {'b', 'e', 'n'}}, // Bangla
+ LanguageCodeEntry {{}, {'b', 'a', 's'}, {'b', 'a', 's'}, {'b', 'a', 's'}}, // Basaa
+ LanguageCodeEntry {{'b', 'a'}, {'b', 'a', 'k'}, {'b', 'a', 'k'}, {'b', 'a', 'k'}}, // Bashkir
+ LanguageCodeEntry {{'e', 'u'}, {'b', 'a', 'q'}, {'e', 'u', 's'}, {'e', 'u', 's'}}, // Basque
+ LanguageCodeEntry {{}, {}, {}, {'b', 'b', 'c'}}, // Batak Toba
+ LanguageCodeEntry {{'b', 'e'}, {'b', 'e', 'l'}, {'b', 'e', 'l'}, {'b', 'e', 'l'}}, // Belarusian
+ LanguageCodeEntry {{}, {'b', 'e', 'm'}, {'b', 'e', 'm'}, {'b', 'e', 'm'}}, // Bemba
+ LanguageCodeEntry {{}, {}, {}, {'b', 'e', 'z'}}, // Bena
+ LanguageCodeEntry {{}, {'b', 'h', 'o'}, {'b', 'h', 'o'}, {'b', 'h', 'o'}}, // Bhojpuri
+ LanguageCodeEntry {{'b', 'i'}, {'b', 'i', 's'}, {'b', 'i', 's'}, {'b', 'i', 's'}}, // Bislama
+ LanguageCodeEntry {{}, {'b', 'y', 'n'}, {'b', 'y', 'n'}, {'b', 'y', 'n'}}, // Blin
+ LanguageCodeEntry {{}, {}, {}, {'b', 'r', 'x'}}, // Bodo
+ LanguageCodeEntry {{'b', 's'}, {'b', 'o', 's'}, {'b', 'o', 's'}, {'b', 'o', 's'}}, // Bosnian
+ LanguageCodeEntry {{'b', 'r'}, {'b', 'r', 'e'}, {'b', 'r', 'e'}, {'b', 'r', 'e'}}, // Breton
+ LanguageCodeEntry {{}, {'b', 'u', 'g'}, {'b', 'u', 'g'}, {'b', 'u', 'g'}}, // Buginese
+ LanguageCodeEntry {{'b', 'g'}, {'b', 'u', 'l'}, {'b', 'u', 'l'}, {'b', 'u', 'l'}}, // Bulgarian
+ LanguageCodeEntry {{'m', 'y'}, {'b', 'u', 'r'}, {'m', 'y', 'a'}, {'m', 'y', 'a'}}, // Burmese
+ LanguageCodeEntry {{}, {}, {}, {'y', 'u', 'e'}}, // Cantonese
+ LanguageCodeEntry {{'c', 'a'}, {'c', 'a', 't'}, {'c', 'a', 't'}, {'c', 'a', 't'}}, // Catalan
+ LanguageCodeEntry {{}, {'c', 'e', 'b'}, {'c', 'e', 'b'}, {'c', 'e', 'b'}}, // Cebuano
+ LanguageCodeEntry {{}, {}, {}, {'t', 'z', 'm'}}, // Central Atlas Tamazight
+ LanguageCodeEntry {{}, {}, {}, {'c', 'k', 'b'}}, // Central Kurdish
+ LanguageCodeEntry {{}, {}, {}, {'c', 'c', 'p'}}, // Chakma
+ LanguageCodeEntry {{'c', 'h'}, {'c', 'h', 'a'}, {'c', 'h', 'a'}, {'c', 'h', 'a'}}, // Chamorro
+ LanguageCodeEntry {{'c', 'e'}, {'c', 'h', 'e'}, {'c', 'h', 'e'}, {'c', 'h', 'e'}}, // Chechen
+ LanguageCodeEntry {{}, {'c', 'h', 'r'}, {'c', 'h', 'r'}, {'c', 'h', 'r'}}, // Cherokee
+ LanguageCodeEntry {{}, {}, {}, {'c', 'i', 'c'}}, // Chickasaw
+ LanguageCodeEntry {{}, {}, {}, {'c', 'g', 'g'}}, // Chiga
+ LanguageCodeEntry {{'z', 'h'}, {'c', 'h', 'i'}, {'z', 'h', 'o'}, {'z', 'h', 'o'}}, // Chinese
+ LanguageCodeEntry {{'c', 'u'}, {'c', 'h', 'u'}, {'c', 'h', 'u'}, {'c', 'h', 'u'}}, // Church
+ LanguageCodeEntry {{'c', 'v'}, {'c', 'h', 'v'}, {'c', 'h', 'v'}, {'c', 'h', 'v'}}, // Chuvash
+ LanguageCodeEntry {{}, {}, {}, {'k', 's', 'h'}}, // Colognian
+ LanguageCodeEntry {{}, {'c', 'o', 'p'}, {'c', 'o', 'p'}, {'c', 'o', 'p'}}, // Coptic
+ LanguageCodeEntry {{'k', 'w'}, {'c', 'o', 'r'}, {'c', 'o', 'r'}, {'c', 'o', 'r'}}, // Cornish
+ LanguageCodeEntry {{'c', 'o'}, {'c', 'o', 's'}, {'c', 'o', 's'}, {'c', 'o', 's'}}, // Corsican
+ LanguageCodeEntry {{'c', 'r'}, {'c', 'r', 'e'}, {'c', 'r', 'e'}, {'c', 'r', 'e'}}, // Cree
+ LanguageCodeEntry {{'h', 'r'}, {'h', 'r', 'v'}, {'h', 'r', 'v'}, {'h', 'r', 'v'}}, // Croatian
+ LanguageCodeEntry {{'c', 's'}, {'c', 'z', 'e'}, {'c', 'e', 's'}, {'c', 'e', 's'}}, // Czech
+ LanguageCodeEntry {{'d', 'a'}, {'d', 'a', 'n'}, {'d', 'a', 'n'}, {'d', 'a', 'n'}}, // Danish
+ LanguageCodeEntry {{'d', 'v'}, {'d', 'i', 'v'}, {'d', 'i', 'v'}, {'d', 'i', 'v'}}, // Divehi
+ LanguageCodeEntry {{}, {'d', 'o', 'i'}, {'d', 'o', 'i'}, {'d', 'o', 'i'}}, // Dogri
+ LanguageCodeEntry {{}, {'d', 'u', 'a'}, {'d', 'u', 'a'}, {'d', 'u', 'a'}}, // Duala
+ LanguageCodeEntry {{'n', 'l'}, {'d', 'u', 't'}, {'n', 'l', 'd'}, {'n', 'l', 'd'}}, // Dutch
+ LanguageCodeEntry {{'d', 'z'}, {'d', 'z', 'o'}, {'d', 'z', 'o'}, {'d', 'z', 'o'}}, // Dzongkha
+ LanguageCodeEntry {{}, {}, {}, {'e', 'b', 'u'}}, // Embu
+ LanguageCodeEntry {{'e', 'n'}, {'e', 'n', 'g'}, {'e', 'n', 'g'}, {'e', 'n', 'g'}}, // English
+ LanguageCodeEntry {{}, {'m', 'y', 'v'}, {'m', 'y', 'v'}, {'m', 'y', 'v'}}, // Erzya
+ LanguageCodeEntry {{'e', 'o'}, {'e', 'p', 'o'}, {'e', 'p', 'o'}, {'e', 'p', 'o'}}, // Esperanto
+ LanguageCodeEntry {{'e', 't'}, {'e', 's', 't'}, {'e', 's', 't'}, {'e', 's', 't'}}, // Estonian
+ LanguageCodeEntry {{'e', 'e'}, {'e', 'w', 'e'}, {'e', 'w', 'e'}, {'e', 'w', 'e'}}, // Ewe
+ LanguageCodeEntry {{}, {'e', 'w', 'o'}, {'e', 'w', 'o'}, {'e', 'w', 'o'}}, // Ewondo
+ LanguageCodeEntry {{'f', 'o'}, {'f', 'a', 'o'}, {'f', 'a', 'o'}, {'f', 'a', 'o'}}, // Faroese
+ LanguageCodeEntry {{'f', 'j'}, {'f', 'i', 'j'}, {'f', 'i', 'j'}, {'f', 'i', 'j'}}, // Fijian
+ LanguageCodeEntry {{}, {'f', 'i', 'l'}, {'f', 'i', 'l'}, {'f', 'i', 'l'}}, // Filipino
+ LanguageCodeEntry {{'f', 'i'}, {'f', 'i', 'n'}, {'f', 'i', 'n'}, {'f', 'i', 'n'}}, // Finnish
+ LanguageCodeEntry {{'f', 'r'}, {'f', 'r', 'e'}, {'f', 'r', 'a'}, {'f', 'r', 'a'}}, // French
+ LanguageCodeEntry {{}, {'f', 'u', 'r'}, {'f', 'u', 'r'}, {'f', 'u', 'r'}}, // Friulian
+ LanguageCodeEntry {{'f', 'f'}, {'f', 'u', 'l'}, {'f', 'u', 'l'}, {'f', 'u', 'l'}}, // Fulah
+ LanguageCodeEntry {{'g', 'd'}, {'g', 'l', 'a'}, {'g', 'l', 'a'}, {'g', 'l', 'a'}}, // Gaelic
+ LanguageCodeEntry {{}, {'g', 'a', 'a'}, {'g', 'a', 'a'}, {'g', 'a', 'a'}}, // Ga
+ LanguageCodeEntry {{'g', 'l'}, {'g', 'l', 'g'}, {'g', 'l', 'g'}, {'g', 'l', 'g'}}, // Galician
+ LanguageCodeEntry {{'l', 'g'}, {'l', 'u', 'g'}, {'l', 'u', 'g'}, {'l', 'u', 'g'}}, // Ganda
+ LanguageCodeEntry {{}, {'g', 'e', 'z'}, {'g', 'e', 'z'}, {'g', 'e', 'z'}}, // Geez
+ LanguageCodeEntry {{'k', 'a'}, {'g', 'e', 'o'}, {'k', 'a', 't'}, {'k', 'a', 't'}}, // Georgian
+ LanguageCodeEntry {{'d', 'e'}, {'g', 'e', 'r'}, {'d', 'e', 'u'}, {'d', 'e', 'u'}}, // German
+ LanguageCodeEntry {{}, {'g', 'o', 't'}, {'g', 'o', 't'}, {'g', 'o', 't'}}, // Gothic
+ LanguageCodeEntry {{'e', 'l'}, {'g', 'r', 'e'}, {'e', 'l', 'l'}, {'e', 'l', 'l'}}, // Greek
+ LanguageCodeEntry {{'g', 'n'}, {'g', 'r', 'n'}, {'g', 'r', 'n'}, {'g', 'r', 'n'}}, // Guarani
+ LanguageCodeEntry {{'g', 'u'}, {'g', 'u', 'j'}, {'g', 'u', 'j'}, {'g', 'u', 'j'}}, // Gujarati
+ LanguageCodeEntry {{}, {}, {}, {'g', 'u', 'z'}}, // Gusii
+ LanguageCodeEntry {{'h', 't'}, {'h', 'a', 't'}, {'h', 'a', 't'}, {'h', 'a', 't'}}, // Haitian
+ LanguageCodeEntry {{'h', 'a'}, {'h', 'a', 'u'}, {'h', 'a', 'u'}, {'h', 'a', 'u'}}, // Hausa
+ LanguageCodeEntry {{}, {'h', 'a', 'w'}, {'h', 'a', 'w'}, {'h', 'a', 'w'}}, // Hawaiian
+ LanguageCodeEntry {{'h', 'e'}, {'h', 'e', 'b'}, {'h', 'e', 'b'}, {'h', 'e', 'b'}}, // Hebrew
+ LanguageCodeEntry {{'h', 'z'}, {'h', 'e', 'r'}, {'h', 'e', 'r'}, {'h', 'e', 'r'}}, // Herero
+ LanguageCodeEntry {{'h', 'i'}, {'h', 'i', 'n'}, {'h', 'i', 'n'}, {'h', 'i', 'n'}}, // Hindi
+ LanguageCodeEntry {{'h', 'o'}, {'h', 'm', 'o'}, {'h', 'm', 'o'}, {'h', 'm', 'o'}}, // Hiri Motu
+ LanguageCodeEntry {{'h', 'u'}, {'h', 'u', 'n'}, {'h', 'u', 'n'}, {'h', 'u', 'n'}}, // Hungarian
+ LanguageCodeEntry {{'i', 's'}, {'i', 'c', 'e'}, {'i', 's', 'l'}, {'i', 's', 'l'}}, // Icelandic
+ LanguageCodeEntry {{'i', 'o'}, {'i', 'd', 'o'}, {'i', 'd', 'o'}, {'i', 'd', 'o'}}, // Ido
+ LanguageCodeEntry {{'i', 'g'}, {'i', 'b', 'o'}, {'i', 'b', 'o'}, {'i', 'b', 'o'}}, // Igbo
+ LanguageCodeEntry {{}, {'s', 'm', 'n'}, {'s', 'm', 'n'}, {'s', 'm', 'n'}}, // Inari Sami
+ LanguageCodeEntry {{'i', 'd'}, {'i', 'n', 'd'}, {'i', 'n', 'd'}, {'i', 'n', 'd'}}, // Indonesian
+ LanguageCodeEntry {{}, {'i', 'n', 'h'}, {'i', 'n', 'h'}, {'i', 'n', 'h'}}, // Ingush
+ LanguageCodeEntry {{'i', 'a'}, {'i', 'n', 'a'}, {'i', 'n', 'a'}, {'i', 'n', 'a'}}, // Interlingua
+ LanguageCodeEntry {{'i', 'e'}, {'i', 'l', 'e'}, {'i', 'l', 'e'}, {'i', 'l', 'e'}}, // Interlingue
+ LanguageCodeEntry {{'i', 'u'}, {'i', 'k', 'u'}, {'i', 'k', 'u'}, {'i', 'k', 'u'}}, // Inuktitut
+ LanguageCodeEntry {{'i', 'k'}, {'i', 'p', 'k'}, {'i', 'p', 'k'}, {'i', 'p', 'k'}}, // Inupiaq
+ LanguageCodeEntry {{'g', 'a'}, {'g', 'l', 'e'}, {'g', 'l', 'e'}, {'g', 'l', 'e'}}, // Irish
+ LanguageCodeEntry {{'i', 't'}, {'i', 't', 'a'}, {'i', 't', 'a'}, {'i', 't', 'a'}}, // Italian
+ LanguageCodeEntry {{'j', 'a'}, {'j', 'p', 'n'}, {'j', 'p', 'n'}, {'j', 'p', 'n'}}, // Japanese
+ LanguageCodeEntry {{'j', 'v'}, {'j', 'a', 'v'}, {'j', 'a', 'v'}, {'j', 'a', 'v'}}, // Javanese
+ LanguageCodeEntry {{}, {}, {}, {'k', 'a', 'j'}}, // Jju
+ LanguageCodeEntry {{}, {}, {}, {'d', 'y', 'o'}}, // Jola-Fonyi
+ LanguageCodeEntry {{}, {}, {}, {'k', 'e', 'a'}}, // Kabuverdianu
+ LanguageCodeEntry {{}, {'k', 'a', 'b'}, {'k', 'a', 'b'}, {'k', 'a', 'b'}}, // Kabyle
+ LanguageCodeEntry {{}, {}, {}, {'k', 'k', 'j'}}, // Kako
+ LanguageCodeEntry {{'k', 'l'}, {'k', 'a', 'l'}, {'k', 'a', 'l'}, {'k', 'a', 'l'}}, // Kalaallisut
+ LanguageCodeEntry {{}, {}, {}, {'k', 'l', 'n'}}, // Kalenjin
+ LanguageCodeEntry {{}, {'k', 'a', 'm'}, {'k', 'a', 'm'}, {'k', 'a', 'm'}}, // Kamba
+ LanguageCodeEntry {{'k', 'n'}, {'k', 'a', 'n'}, {'k', 'a', 'n'}, {'k', 'a', 'n'}}, // Kannada
+ LanguageCodeEntry {{'k', 'r'}, {'k', 'a', 'u'}, {'k', 'a', 'u'}, {'k', 'a', 'u'}}, // Kanuri
+ LanguageCodeEntry {{'k', 's'}, {'k', 'a', 's'}, {'k', 'a', 's'}, {'k', 'a', 's'}}, // Kashmiri
+ LanguageCodeEntry {{'k', 'k'}, {'k', 'a', 'z'}, {'k', 'a', 'z'}, {'k', 'a', 'z'}}, // Kazakh
+ LanguageCodeEntry {{}, {}, {}, {'k', 'e', 'n'}}, // Kenyang
+ LanguageCodeEntry {{'k', 'm'}, {'k', 'h', 'm'}, {'k', 'h', 'm'}, {'k', 'h', 'm'}}, // Khmer
+ LanguageCodeEntry {{}, {}, {}, {'q', 'u', 'c'}}, // Kiche
+ LanguageCodeEntry {{'k', 'i'}, {'k', 'i', 'k'}, {'k', 'i', 'k'}, {'k', 'i', 'k'}}, // Kikuyu
+ LanguageCodeEntry {{'r', 'w'}, {'k', 'i', 'n'}, {'k', 'i', 'n'}, {'k', 'i', 'n'}}, // Kinyarwanda
+ LanguageCodeEntry {{'k', 'v'}, {'k', 'o', 'm'}, {'k', 'o', 'm'}, {'k', 'o', 'm'}}, // Komi
+ LanguageCodeEntry {{'k', 'g'}, {'k', 'o', 'n'}, {'k', 'o', 'n'}, {'k', 'o', 'n'}}, // Kongo
+ LanguageCodeEntry {{}, {'k', 'o', 'k'}, {'k', 'o', 'k'}, {'k', 'o', 'k'}}, // Konkani
+ LanguageCodeEntry {{'k', 'o'}, {'k', 'o', 'r'}, {'k', 'o', 'r'}, {'k', 'o', 'r'}}, // Korean
+ LanguageCodeEntry {{}, {}, {}, {'k', 'f', 'o'}}, // Koro
+ LanguageCodeEntry {{}, {}, {}, {'s', 'e', 's'}}, // Koyraboro Senni
+ LanguageCodeEntry {{}, {}, {}, {'k', 'h', 'q'}}, // Koyra Chiini
+ LanguageCodeEntry {{}, {'k', 'p', 'e'}, {'k', 'p', 'e'}, {'k', 'p', 'e'}}, // Kpelle
+ LanguageCodeEntry {{'k', 'j'}, {'k', 'u', 'a'}, {'k', 'u', 'a'}, {'k', 'u', 'a'}}, // Kuanyama
+ LanguageCodeEntry {{'k', 'u'}, {'k', 'u', 'r'}, {'k', 'u', 'r'}, {'k', 'u', 'r'}}, // Kurdish
+ LanguageCodeEntry {{}, {}, {}, {'n', 'm', 'g'}}, // Kwasio
+ LanguageCodeEntry {{'k', 'y'}, {'k', 'i', 'r'}, {'k', 'i', 'r'}, {'k', 'i', 'r'}}, // Kyrgyz
+ LanguageCodeEntry {{}, {}, {}, {'l', 'k', 't'}}, // Lakota
+ LanguageCodeEntry {{}, {}, {}, {'l', 'a', 'g'}}, // Langi
+ LanguageCodeEntry {{'l', 'o'}, {'l', 'a', 'o'}, {'l', 'a', 'o'}, {'l', 'a', 'o'}}, // Lao
+ LanguageCodeEntry {{'l', 'a'}, {'l', 'a', 't'}, {'l', 'a', 't'}, {'l', 'a', 't'}}, // Latin
+ LanguageCodeEntry {{'l', 'v'}, {'l', 'a', 'v'}, {'l', 'a', 'v'}, {'l', 'a', 'v'}}, // Latvian
+ LanguageCodeEntry {{}, {'l', 'e', 'z'}, {'l', 'e', 'z'}, {'l', 'e', 'z'}}, // Lezghian
+ LanguageCodeEntry {{'l', 'i'}, {'l', 'i', 'm'}, {'l', 'i', 'm'}, {'l', 'i', 'm'}}, // Limburgish
+ LanguageCodeEntry {{'l', 'n'}, {'l', 'i', 'n'}, {'l', 'i', 'n'}, {'l', 'i', 'n'}}, // Lingala
+ LanguageCodeEntry {{}, {}, {}, {'l', 'z', 'h'}}, // Literary Chinese
+ LanguageCodeEntry {{'l', 't'}, {'l', 'i', 't'}, {'l', 'i', 't'}, {'l', 'i', 't'}}, // Lithuanian
+ LanguageCodeEntry {{}, {'j', 'b', 'o'}, {'j', 'b', 'o'}, {'j', 'b', 'o'}}, // Lojban
+ LanguageCodeEntry {{}, {'d', 's', 'b'}, {'d', 's', 'b'}, {'d', 's', 'b'}}, // Lower Sorbian
+ LanguageCodeEntry {{}, {'n', 'd', 's'}, {'n', 'd', 's'}, {'n', 'd', 's'}}, // Low German
+ LanguageCodeEntry {{'l', 'u'}, {'l', 'u', 'b'}, {'l', 'u', 'b'}, {'l', 'u', 'b'}}, // Luba-Katanga
+ LanguageCodeEntry {{}, {'s', 'm', 'j'}, {'s', 'm', 'j'}, {'s', 'm', 'j'}}, // Lule Sami
+ LanguageCodeEntry {{}, {'l', 'u', 'o'}, {'l', 'u', 'o'}, {'l', 'u', 'o'}}, // Luo
+ LanguageCodeEntry {{'l', 'b'}, {'l', 't', 'z'}, {'l', 't', 'z'}, {'l', 't', 'z'}}, // Luxembourgish
+ LanguageCodeEntry {{}, {}, {}, {'l', 'u', 'y'}}, // Luyia
+ LanguageCodeEntry {{'m', 'k'}, {'m', 'a', 'c'}, {'m', 'k', 'd'}, {'m', 'k', 'd'}}, // Macedonian
+ LanguageCodeEntry {{}, {}, {}, {'j', 'm', 'c'}}, // Machame
+ LanguageCodeEntry {{}, {'m', 'a', 'i'}, {'m', 'a', 'i'}, {'m', 'a', 'i'}}, // Maithili
+ LanguageCodeEntry {{}, {}, {}, {'m', 'g', 'h'}}, // Makhuwa-Meetto
+ LanguageCodeEntry {{}, {}, {}, {'k', 'd', 'e'}}, // Makonde
+ LanguageCodeEntry {{'m', 'g'}, {'m', 'l', 'g'}, {'m', 'l', 'g'}, {'m', 'l', 'g'}}, // Malagasy
+ LanguageCodeEntry {{'m', 'l'}, {'m', 'a', 'l'}, {'m', 'a', 'l'}, {'m', 'a', 'l'}}, // Malayalam
+ LanguageCodeEntry {{'m', 's'}, {'m', 'a', 'y'}, {'m', 's', 'a'}, {'m', 's', 'a'}}, // Malay
+ LanguageCodeEntry {{'m', 't'}, {'m', 'l', 't'}, {'m', 'l', 't'}, {'m', 'l', 't'}}, // Maltese
+ LanguageCodeEntry {{}, {'m', 'a', 'n'}, {'m', 'a', 'n'}, {'m', 'a', 'n'}}, // Mandingo
+ LanguageCodeEntry {{}, {'m', 'n', 'i'}, {'m', 'n', 'i'}, {'m', 'n', 'i'}}, // Manipuri
+ LanguageCodeEntry {{'g', 'v'}, {'g', 'l', 'v'}, {'g', 'l', 'v'}, {'g', 'l', 'v'}}, // Manx
+ LanguageCodeEntry {{'m', 'i'}, {'m', 'a', 'o'}, {'m', 'r', 'i'}, {'m', 'r', 'i'}}, // Maori
+ LanguageCodeEntry {{}, {'a', 'r', 'n'}, {'a', 'r', 'n'}, {'a', 'r', 'n'}}, // Mapuche
+ LanguageCodeEntry {{'m', 'r'}, {'m', 'a', 'r'}, {'m', 'a', 'r'}, {'m', 'a', 'r'}}, // Marathi
+ LanguageCodeEntry {{'m', 'h'}, {'m', 'a', 'h'}, {'m', 'a', 'h'}, {'m', 'a', 'h'}}, // Marshallese
+ LanguageCodeEntry {{}, {'m', 'a', 's'}, {'m', 'a', 's'}, {'m', 'a', 's'}}, // Masai
+ LanguageCodeEntry {{}, {}, {}, {'m', 'z', 'n'}}, // Mazanderani
+ LanguageCodeEntry {{}, {'m', 'e', 'n'}, {'m', 'e', 'n'}, {'m', 'e', 'n'}}, // Mende
+ LanguageCodeEntry {{}, {}, {}, {'m', 'e', 'r'}}, // Meru
+ LanguageCodeEntry {{}, {}, {}, {'m', 'g', 'o'}}, // Meta
+ LanguageCodeEntry {{}, {'m', 'o', 'h'}, {'m', 'o', 'h'}, {'m', 'o', 'h'}}, // Mohawk
+ LanguageCodeEntry {{'m', 'n'}, {'m', 'o', 'n'}, {'m', 'o', 'n'}, {'m', 'o', 'n'}}, // Mongolian
+ LanguageCodeEntry {{}, {}, {}, {'m', 'f', 'e'}}, // Morisyen
+ LanguageCodeEntry {{}, {}, {}, {'m', 'u', 'a'}}, // Mundang
+ LanguageCodeEntry {{}, {'m', 'u', 's'}, {'m', 'u', 's'}, {'m', 'u', 's'}}, // Muscogee
+ LanguageCodeEntry {{}, {}, {}, {'n', 'a', 'q'}}, // Nama
+ LanguageCodeEntry {{'n', 'a'}, {'n', 'a', 'u'}, {'n', 'a', 'u'}, {'n', 'a', 'u'}}, // Nauru
+ LanguageCodeEntry {{'n', 'v'}, {'n', 'a', 'v'}, {'n', 'a', 'v'}, {'n', 'a', 'v'}}, // Navajo
+ LanguageCodeEntry {{'n', 'g'}, {'n', 'd', 'o'}, {'n', 'd', 'o'}, {'n', 'd', 'o'}}, // Ndonga
+ LanguageCodeEntry {{'n', 'e'}, {'n', 'e', 'p'}, {'n', 'e', 'p'}, {'n', 'e', 'p'}}, // Nepali
+ LanguageCodeEntry {{}, {'n', 'e', 'w'}, {'n', 'e', 'w'}, {'n', 'e', 'w'}}, // Newari
+ LanguageCodeEntry {{}, {}, {}, {'n', 'n', 'h'}}, // Ngiemboon
+ LanguageCodeEntry {{}, {}, {}, {'j', 'g', 'o'}}, // Ngomba
+ LanguageCodeEntry {{}, {}, {}, {'p', 'c', 'm'}}, // Nigerian Pidgin
+ LanguageCodeEntry {{}, {'n', 'q', 'o'}, {'n', 'q', 'o'}, {'n', 'q', 'o'}}, // Nko
+ LanguageCodeEntry {{}, {}, {}, {'l', 'r', 'c'}}, // Northern Luri
+ LanguageCodeEntry {{'s', 'e'}, {'s', 'm', 'e'}, {'s', 'm', 'e'}, {'s', 'm', 'e'}}, // Northern Sami
+ LanguageCodeEntry {{}, {'n', 's', 'o'}, {'n', 's', 'o'}, {'n', 's', 'o'}}, // Northern Sotho
+ LanguageCodeEntry {{'n', 'd'}, {'n', 'd', 'e'}, {'n', 'd', 'e'}, {'n', 'd', 'e'}}, // North Ndebele
+ LanguageCodeEntry {{'n', 'b'}, {'n', 'o', 'b'}, {'n', 'o', 'b'}, {'n', 'o', 'b'}}, // Norwegian Bokmal
+ LanguageCodeEntry {{'n', 'n'}, {'n', 'n', 'o'}, {'n', 'n', 'o'}, {'n', 'n', 'o'}}, // Norwegian Nynorsk
+ LanguageCodeEntry {{}, {}, {}, {'n', 'u', 's'}}, // Nuer
+ LanguageCodeEntry {{'n', 'y'}, {'n', 'y', 'a'}, {'n', 'y', 'a'}, {'n', 'y', 'a'}}, // Nyanja
+ LanguageCodeEntry {{}, {'n', 'y', 'n'}, {'n', 'y', 'n'}, {'n', 'y', 'n'}}, // Nyankole
+ LanguageCodeEntry {{'o', 'c'}, {'o', 'c', 'i'}, {'o', 'c', 'i'}, {'o', 'c', 'i'}}, // Occitan
+ LanguageCodeEntry {{'o', 'r'}, {'o', 'r', 'i'}, {'o', 'r', 'i'}, {'o', 'r', 'i'}}, // Odia
+ LanguageCodeEntry {{'o', 'j'}, {'o', 'j', 'i'}, {'o', 'j', 'i'}, {'o', 'j', 'i'}}, // Ojibwa
+ LanguageCodeEntry {{}, {'s', 'g', 'a'}, {'s', 'g', 'a'}, {'s', 'g', 'a'}}, // Old Irish
+ LanguageCodeEntry {{}, {'n', 'o', 'n'}, {'n', 'o', 'n'}, {'n', 'o', 'n'}}, // Old Norse
+ LanguageCodeEntry {{}, {'p', 'e', 'o'}, {'p', 'e', 'o'}, {'p', 'e', 'o'}}, // Old Persian
+ LanguageCodeEntry {{'o', 'm'}, {'o', 'r', 'm'}, {'o', 'r', 'm'}, {'o', 'r', 'm'}}, // Oromo
+ LanguageCodeEntry {{}, {'o', 's', 'a'}, {'o', 's', 'a'}, {'o', 's', 'a'}}, // Osage
+ LanguageCodeEntry {{'o', 's'}, {'o', 's', 's'}, {'o', 's', 's'}, {'o', 's', 's'}}, // Ossetic
+ LanguageCodeEntry {{}, {'p', 'a', 'l'}, {'p', 'a', 'l'}, {'p', 'a', 'l'}}, // Pahlavi
+ LanguageCodeEntry {{}, {'p', 'a', 'u'}, {'p', 'a', 'u'}, {'p', 'a', 'u'}}, // Palauan
+ LanguageCodeEntry {{'p', 'i'}, {'p', 'l', 'i'}, {'p', 'l', 'i'}, {'p', 'l', 'i'}}, // Pali
+ LanguageCodeEntry {{}, {'p', 'a', 'p'}, {'p', 'a', 'p'}, {'p', 'a', 'p'}}, // Papiamento
+ LanguageCodeEntry {{'p', 's'}, {'p', 'u', 's'}, {'p', 'u', 's'}, {'p', 'u', 's'}}, // Pashto
+ LanguageCodeEntry {{'f', 'a'}, {'p', 'e', 'r'}, {'f', 'a', 's'}, {'f', 'a', 's'}}, // Persian
+ LanguageCodeEntry {{}, {'p', 'h', 'n'}, {'p', 'h', 'n'}, {'p', 'h', 'n'}}, // Phoenician
+ LanguageCodeEntry {{'p', 'l'}, {'p', 'o', 'l'}, {'p', 'o', 'l'}, {'p', 'o', 'l'}}, // Polish
+ LanguageCodeEntry {{'p', 't'}, {'p', 'o', 'r'}, {'p', 'o', 'r'}, {'p', 'o', 'r'}}, // Portuguese
+ LanguageCodeEntry {{}, {}, {}, {'p', 'r', 'g'}}, // Prussian
+ LanguageCodeEntry {{'p', 'a'}, {'p', 'a', 'n'}, {'p', 'a', 'n'}, {'p', 'a', 'n'}}, // Punjabi
+ LanguageCodeEntry {{'q', 'u'}, {'q', 'u', 'e'}, {'q', 'u', 'e'}, {'q', 'u', 'e'}}, // Quechua
+ LanguageCodeEntry {{'r', 'o'}, {'r', 'u', 'm'}, {'r', 'o', 'n'}, {'r', 'o', 'n'}}, // Romanian
+ LanguageCodeEntry {{'r', 'm'}, {'r', 'o', 'h'}, {'r', 'o', 'h'}, {'r', 'o', 'h'}}, // Romansh
+ LanguageCodeEntry {{}, {}, {}, {'r', 'o', 'f'}}, // Rombo
+ LanguageCodeEntry {{'r', 'n'}, {'r', 'u', 'n'}, {'r', 'u', 'n'}, {'r', 'u', 'n'}}, // Rundi
+ LanguageCodeEntry {{'r', 'u'}, {'r', 'u', 's'}, {'r', 'u', 's'}, {'r', 'u', 's'}}, // Russian
+ LanguageCodeEntry {{}, {}, {}, {'r', 'w', 'k'}}, // Rwa
+ LanguageCodeEntry {{}, {}, {}, {'s', 's', 'y'}}, // Saho
+ LanguageCodeEntry {{}, {'s', 'a', 'h'}, {'s', 'a', 'h'}, {'s', 'a', 'h'}}, // Sakha
+ LanguageCodeEntry {{}, {}, {}, {'s', 'a', 'q'}}, // Samburu
+ LanguageCodeEntry {{'s', 'm'}, {'s', 'm', 'o'}, {'s', 'm', 'o'}, {'s', 'm', 'o'}}, // Samoan
+ LanguageCodeEntry {{'s', 'g'}, {'s', 'a', 'g'}, {'s', 'a', 'g'}, {'s', 'a', 'g'}}, // Sango
+ LanguageCodeEntry {{}, {}, {}, {'s', 'b', 'p'}}, // Sangu
+ LanguageCodeEntry {{'s', 'a'}, {'s', 'a', 'n'}, {'s', 'a', 'n'}, {'s', 'a', 'n'}}, // Sanskrit
+ LanguageCodeEntry {{}, {'s', 'a', 't'}, {'s', 'a', 't'}, {'s', 'a', 't'}}, // Santali
+ LanguageCodeEntry {{'s', 'c'}, {'s', 'r', 'd'}, {'s', 'r', 'd'}, {'s', 'r', 'd'}}, // Sardinian
+ LanguageCodeEntry {{}, {}, {}, {'s', 'a', 'z'}}, // Saurashtra
+ LanguageCodeEntry {{}, {}, {}, {'s', 'e', 'h'}}, // Sena
+ LanguageCodeEntry {{'s', 'r'}, {'s', 'r', 'p'}, {'s', 'r', 'p'}, {'s', 'r', 'p'}}, // Serbian
+ LanguageCodeEntry {{}, {}, {}, {'k', 's', 'b'}}, // Shambala
+ LanguageCodeEntry {{'s', 'n'}, {'s', 'n', 'a'}, {'s', 'n', 'a'}, {'s', 'n', 'a'}}, // Shona
+ LanguageCodeEntry {{'i', 'i'}, {'i', 'i', 'i'}, {'i', 'i', 'i'}, {'i', 'i', 'i'}}, // Sichuan Yi
+ LanguageCodeEntry {{}, {'s', 'c', 'n'}, {'s', 'c', 'n'}, {'s', 'c', 'n'}}, // Sicilian
+ LanguageCodeEntry {{}, {'s', 'i', 'd'}, {'s', 'i', 'd'}, {'s', 'i', 'd'}}, // Sidamo
+ LanguageCodeEntry {{}, {}, {}, {'s', 'z', 'l'}}, // Silesian
+ LanguageCodeEntry {{'s', 'd'}, {'s', 'n', 'd'}, {'s', 'n', 'd'}, {'s', 'n', 'd'}}, // Sindhi
+ LanguageCodeEntry {{'s', 'i'}, {'s', 'i', 'n'}, {'s', 'i', 'n'}, {'s', 'i', 'n'}}, // Sinhala
+ LanguageCodeEntry {{}, {'s', 'm', 's'}, {'s', 'm', 's'}, {'s', 'm', 's'}}, // Skolt Sami
+ LanguageCodeEntry {{'s', 'k'}, {'s', 'l', 'o'}, {'s', 'l', 'k'}, {'s', 'l', 'k'}}, // Slovak
+ LanguageCodeEntry {{'s', 'l'}, {'s', 'l', 'v'}, {'s', 'l', 'v'}, {'s', 'l', 'v'}}, // Slovenian
+ LanguageCodeEntry {{}, {}, {}, {'x', 'o', 'g'}}, // Soga
+ LanguageCodeEntry {{'s', 'o'}, {'s', 'o', 'm'}, {'s', 'o', 'm'}, {'s', 'o', 'm'}}, // Somali
+ LanguageCodeEntry {{}, {}, {}, {'s', 'd', 'h'}}, // Southern Kurdish
+ LanguageCodeEntry {{}, {'s', 'm', 'a'}, {'s', 'm', 'a'}, {'s', 'm', 'a'}}, // Southern Sami
+ LanguageCodeEntry {{'s', 't'}, {'s', 'o', 't'}, {'s', 'o', 't'}, {'s', 'o', 't'}}, // Southern Sotho
+ LanguageCodeEntry {{'n', 'r'}, {'n', 'b', 'l'}, {'n', 'b', 'l'}, {'n', 'b', 'l'}}, // South Ndebele
+ LanguageCodeEntry {{'e', 's'}, {'s', 'p', 'a'}, {'s', 'p', 'a'}, {'s', 'p', 'a'}}, // Spanish
+ LanguageCodeEntry {{}, {'z', 'g', 'h'}, {'z', 'g', 'h'}, {'z', 'g', 'h'}}, // Standard Moroccan Tamazight
+ LanguageCodeEntry {{'s', 'u'}, {'s', 'u', 'n'}, {'s', 'u', 'n'}, {'s', 'u', 'n'}}, // Sundanese
+ LanguageCodeEntry {{'s', 'w'}, {'s', 'w', 'a'}, {'s', 'w', 'a'}, {'s', 'w', 'a'}}, // Swahili
+ LanguageCodeEntry {{'s', 's'}, {'s', 's', 'w'}, {'s', 's', 'w'}, {'s', 's', 'w'}}, // Swati
+ LanguageCodeEntry {{'s', 'v'}, {'s', 'w', 'e'}, {'s', 'w', 'e'}, {'s', 'w', 'e'}}, // Swedish
+ LanguageCodeEntry {{}, {'g', 's', 'w'}, {'g', 's', 'w'}, {'g', 's', 'w'}}, // Swiss German
+ LanguageCodeEntry {{}, {'s', 'y', 'r'}, {'s', 'y', 'r'}, {'s', 'y', 'r'}}, // Syriac
+ LanguageCodeEntry {{}, {}, {}, {'s', 'h', 'i'}}, // Tachelhit
+ LanguageCodeEntry {{'t', 'y'}, {'t', 'a', 'h'}, {'t', 'a', 'h'}, {'t', 'a', 'h'}}, // Tahitian
+ LanguageCodeEntry {{}, {}, {}, {'b', 'l', 't'}}, // Tai Dam
+ LanguageCodeEntry {{}, {}, {}, {'d', 'a', 'v'}}, // Taita
+ LanguageCodeEntry {{'t', 'g'}, {'t', 'g', 'k'}, {'t', 'g', 'k'}, {'t', 'g', 'k'}}, // Tajik
+ LanguageCodeEntry {{'t', 'a'}, {'t', 'a', 'm'}, {'t', 'a', 'm'}, {'t', 'a', 'm'}}, // Tamil
+ LanguageCodeEntry {{}, {}, {}, {'t', 'r', 'v'}}, // Taroko
+ LanguageCodeEntry {{}, {}, {}, {'t', 'w', 'q'}}, // Tasawaq
+ LanguageCodeEntry {{'t', 't'}, {'t', 'a', 't'}, {'t', 'a', 't'}, {'t', 'a', 't'}}, // Tatar
+ LanguageCodeEntry {{'t', 'e'}, {'t', 'e', 'l'}, {'t', 'e', 'l'}, {'t', 'e', 'l'}}, // Telugu
+ LanguageCodeEntry {{}, {}, {}, {'t', 'e', 'o'}}, // Teso
+ LanguageCodeEntry {{'t', 'h'}, {'t', 'h', 'a'}, {'t', 'h', 'a'}, {'t', 'h', 'a'}}, // Thai
+ LanguageCodeEntry {{'b', 'o'}, {'t', 'i', 'b'}, {'b', 'o', 'd'}, {'b', 'o', 'd'}}, // Tibetan
+ LanguageCodeEntry {{}, {'t', 'i', 'g'}, {'t', 'i', 'g'}, {'t', 'i', 'g'}}, // Tigre
+ LanguageCodeEntry {{'t', 'i'}, {'t', 'i', 'r'}, {'t', 'i', 'r'}, {'t', 'i', 'r'}}, // Tigrinya
+ LanguageCodeEntry {{}, {'t', 'k', 'l'}, {'t', 'k', 'l'}, {'t', 'k', 'l'}}, // Tokelau
+ LanguageCodeEntry {{}, {'t', 'p', 'i'}, {'t', 'p', 'i'}, {'t', 'p', 'i'}}, // Tok Pisin
+ LanguageCodeEntry {{'t', 'o'}, {'t', 'o', 'n'}, {'t', 'o', 'n'}, {'t', 'o', 'n'}}, // Tongan
+ LanguageCodeEntry {{'t', 's'}, {'t', 's', 'o'}, {'t', 's', 'o'}, {'t', 's', 'o'}}, // Tsonga
+ LanguageCodeEntry {{'t', 'n'}, {'t', 's', 'n'}, {'t', 's', 'n'}, {'t', 's', 'n'}}, // Tswana
+ LanguageCodeEntry {{'t', 'r'}, {'t', 'u', 'r'}, {'t', 'u', 'r'}, {'t', 'u', 'r'}}, // Turkish
+ LanguageCodeEntry {{'t', 'k'}, {'t', 'u', 'k'}, {'t', 'u', 'k'}, {'t', 'u', 'k'}}, // Turkmen
+ LanguageCodeEntry {{}, {'t', 'v', 'l'}, {'t', 'v', 'l'}, {'t', 'v', 'l'}}, // Tuvalu
+ LanguageCodeEntry {{}, {}, {}, {'k', 'c', 'g'}}, // Tyap
+ LanguageCodeEntry {{}, {'u', 'g', 'a'}, {'u', 'g', 'a'}, {'u', 'g', 'a'}}, // Ugaritic
+ LanguageCodeEntry {{'u', 'k'}, {'u', 'k', 'r'}, {'u', 'k', 'r'}, {'u', 'k', 'r'}}, // Ukrainian
+ LanguageCodeEntry {{}, {'h', 's', 'b'}, {'h', 's', 'b'}, {'h', 's', 'b'}}, // Upper Sorbian
+ LanguageCodeEntry {{'u', 'r'}, {'u', 'r', 'd'}, {'u', 'r', 'd'}, {'u', 'r', 'd'}}, // Urdu
+ LanguageCodeEntry {{'u', 'g'}, {'u', 'i', 'g'}, {'u', 'i', 'g'}, {'u', 'i', 'g'}}, // Uyghur
+ LanguageCodeEntry {{'u', 'z'}, {'u', 'z', 'b'}, {'u', 'z', 'b'}, {'u', 'z', 'b'}}, // Uzbek
+ LanguageCodeEntry {{}, {'v', 'a', 'i'}, {'v', 'a', 'i'}, {'v', 'a', 'i'}}, // Vai
+ LanguageCodeEntry {{'v', 'e'}, {'v', 'e', 'n'}, {'v', 'e', 'n'}, {'v', 'e', 'n'}}, // Venda
+ LanguageCodeEntry {{'v', 'i'}, {'v', 'i', 'e'}, {'v', 'i', 'e'}, {'v', 'i', 'e'}}, // Vietnamese
+ LanguageCodeEntry {{'v', 'o'}, {'v', 'o', 'l'}, {'v', 'o', 'l'}, {'v', 'o', 'l'}}, // Volapuk
+ LanguageCodeEntry {{}, {}, {}, {'v', 'u', 'n'}}, // Vunjo
+ LanguageCodeEntry {{'w', 'a'}, {'w', 'l', 'n'}, {'w', 'l', 'n'}, {'w', 'l', 'n'}}, // Walloon
+ LanguageCodeEntry {{}, {}, {}, {'w', 'a', 'e'}}, // Walser
+ LanguageCodeEntry {{}, {}, {}, {'w', 'b', 'p'}}, // Warlpiri
+ LanguageCodeEntry {{'c', 'y'}, {'w', 'e', 'l'}, {'c', 'y', 'm'}, {'c', 'y', 'm'}}, // Welsh
+ LanguageCodeEntry {{}, {}, {}, {'b', 'g', 'n'}}, // Western Balochi
+ LanguageCodeEntry {{'f', 'y'}, {'f', 'r', 'y'}, {'f', 'r', 'y'}, {'f', 'r', 'y'}}, // Western Frisian
+ LanguageCodeEntry {{}, {'w', 'a', 'l'}, {'w', 'a', 'l'}, {'w', 'a', 'l'}}, // Wolaytta
+ LanguageCodeEntry {{'w', 'o'}, {'w', 'o', 'l'}, {'w', 'o', 'l'}, {'w', 'o', 'l'}}, // Wolof
+ LanguageCodeEntry {{'x', 'h'}, {'x', 'h', 'o'}, {'x', 'h', 'o'}, {'x', 'h', 'o'}}, // Xhosa
+ LanguageCodeEntry {{}, {}, {}, {'y', 'a', 'v'}}, // Yangben
+ LanguageCodeEntry {{'y', 'i'}, {'y', 'i', 'd'}, {'y', 'i', 'd'}, {'y', 'i', 'd'}}, // Yiddish
+ LanguageCodeEntry {{'y', 'o'}, {'y', 'o', 'r'}, {'y', 'o', 'r'}, {'y', 'o', 'r'}}, // Yoruba
+ LanguageCodeEntry {{}, {}, {}, {'d', 'j', 'e'}}, // Zarma
+ LanguageCodeEntry {{'z', 'a'}, {'z', 'h', 'a'}, {'z', 'h', 'a'}, {'z', 'h', 'a'}}, // Zhuang
+ LanguageCodeEntry {{'z', 'u'}, {'z', 'u', 'l'}, {'z', 'u', 'l'}, {'z', 'u', 'l'}}, // Zulu
+ LanguageCodeEntry {{}, {}, {}, {'k', 'g', 'p'}}, // Kaingang
+ LanguageCodeEntry {{}, {}, {}, {'y', 'r', 'l'}}, // Nheengatu
+ LanguageCodeEntry {{}, {}, {}, {'b', 'g', 'c'}}, // Haryanvi
+ LanguageCodeEntry {{}, {'f', 'r', 'r'}, {'f', 'r', 'r'}, {'f', 'r', 'r'}}, // Northern Frisian
+ LanguageCodeEntry {{}, {'r', 'a', 'j'}, {'r', 'a', 'j'}, {'r', 'a', 'j'}}, // Rajasthani
+ LanguageCodeEntry {{}, {'m', 'd', 'f'}, {'m', 'd', 'f'}, {'m', 'd', 'f'}}, // Moksha
+ LanguageCodeEntry {{}, {}, {}, {'t', 'o', 'k'}}, // Toki Pona
+ LanguageCodeEntry {{}, {}, {}, {'p', 'i', 's'}}, // Pijin
+ LanguageCodeEntry {{}, {}, {}, {'a', 'n', 'n'}}, // Obolo
+ LanguageCodeEntry {{}, {'b', 'a', 'l'}, {'b', 'a', 'l'}, {'b', 'a', 'l'}}, // Baluchi
+ LanguageCodeEntry {{}, {}, {}, {'l', 'i', 'j'}}, // Ligurian
+ LanguageCodeEntry {{}, {}, {}, {'r', 'h', 'g'}}, // Rohingya
+ LanguageCodeEntry {{}, {}, {}, {'t', 'r', 'w'}}, // Torwali
+ LanguageCodeEntry {{}, {}, {}, {'b', 'l', 'o'}}, // Anii
+ LanguageCodeEntry {{}, {}, {}, {'x', 'n', 'r'}}, // Kangri
+ LanguageCodeEntry {{}, {}, {}, {'v', 'e', 'c'}}, // Venetian
+};
-static const unsigned char script_code_list[] =
+static constexpr unsigned char script_code_list[] =
"Zzzz" // AnyScript
+"Adlm" // Adlam
+"Ahom" // Ahom
+"Hluw" // Anatolian Hieroglyphs
"Arab" // Arabic
-"Cyrl" // Cyrillic
-"Dsrt" // Deseret
-"Guru" // Gurmukhi
-"Hans" // Simplified Han
-"Hant" // Traditional Han
-"Latn" // Latin
-"Mong" // Mongolian
-"Tfng" // Tifinagh
"Armn" // Armenian
-"Beng" // Bengali
-"Cher" // Cherokee
-"Deva" // Devanagari
-"Ethi" // Ethiopic
-"Geor" // Georgian
-"Grek" // Greek
-"Gujr" // Gujarati
-"Hebr" // Hebrew
-"Jpan" // Japanese
-"Khmr" // Khmer
-"Knda" // Kannada
-"Kore" // Korean
-"Laoo" // Lao
-"Mlym" // Malayalam
-"Mymr" // Myanmar
-"Orya" // Oriya
-"Taml" // Tamil
-"Telu" // Telugu
-"Thaa" // Thaana
-"Thai" // Thai
-"Tibt" // Tibetan
-"Sinh" // Sinhala
-"Syrc" // Syriac
-"Yiii" // Yi
-"Vaii" // Vai
"Avst" // Avestan
"Bali" // Balinese
"Bamu" // Bamum
+"Beng" // Bangla
+"Bass" // Bassa Vah
"Batk" // Batak
+"Bhks" // Bhaiksuki
"Bopo" // Bopomofo
"Brah" // Brahmi
+"Brai" // Braille
"Bugi" // Buginese
"Buhd" // Buhid
"Cans" // Canadian Aboriginal
"Cari" // Carian
+"Aghb" // Caucasian Albanian
"Cakm" // Chakma
"Cham" // Cham
+"Cher" // Cherokee
"Copt" // Coptic
+"Xsux" // Cuneiform
"Cprt" // Cypriot
-"Egyp" // Egyptian Hieroglyphs
+"Cyrl" // Cyrillic
+"Dsrt" // Deseret
+"Deva" // Devanagari
+"Dupl" // Duployan
+"Egyp" // Egyptian hieroglyphs
+"Elba" // Elbasan
+"Ethi" // Ethiopic
"Lisu" // Fraser
+"Geor" // Georgian
"Glag" // Glagolitic
"Goth" // Gothic
-"Hani" // Han
+"Gran" // Grantha
+"Grek" // Greek
+"Gujr" // Gujarati
+"Guru" // Gurmukhi
"Hang" // Hangul
+"Hani" // Han
"Hano" // Hanunoo
+"Hanb" // Han with Bopomofo
+"Hatr" // Hatran
+"Hebr" // Hebrew
+"Hira" // Hiragana
"Armi" // Imperial Aramaic
"Phli" // Inscriptional Pahlavi
"Prti" // Inscriptional Parthian
+"Jamo" // Jamo
+"Jpan" // Japanese
"Java" // Javanese
"Kthi" // Kaithi
+"Knda" // Kannada
"Kana" // Katakana
"Kali" // Kayah Li
"Khar" // Kharoshthi
+"Khmr" // Khmer
+"Khoj" // Khojki
+"Sind" // Khudawadi
+"Kore" // Korean
"Lana" // Lanna
+"Laoo" // Lao
+"Latn" // Latin
"Lepc" // Lepcha
"Limb" // Limbu
+"Lina" // Linear A
"Linb" // Linear B
"Lyci" // Lycian
"Lydi" // Lydian
+"Mahj" // Mahajani
+"Mlym" // Malayalam
"Mand" // Mandaean
+"Mani" // Manichaean
+"Marc" // Marchen
"Mtei" // Meitei Mayek
-"Mero" // Meroitic
+"Mend" // Mende
"Merc" // Meroitic Cursive
-"Nkoo" // Nko
+"Mero" // Meroitic
+"Modi" // Modi
+"Mong" // Mongolian
+"Mroo" // Mro
+"Mult" // Multani
+"Mymr" // Myanmar
+"Nbat" // Nabataean
+"Newa" // Newa
"Talu" // New Tai Lue
+"Nkoo" // Nko
+"Orya" // Odia
"Ogam" // Ogham
"Olck" // Ol Chiki
+"Hung" // Old Hungarian
"Ital" // Old Italic
+"Narb" // Old North Arabian
+"Perm" // Old Permic
"Xpeo" // Old Persian
"Sarb" // Old South Arabian
"Orkh" // Orkhon
+"Osge" // Osage
"Osma" // Osmanya
-"Phag" // Phags Pa
+"Hmng" // Pahawh Hmong
+"Palm" // Palmyrene
+"Pauc" // Pau Cin Hau
+"Phag" // Phags-pa
"Phnx" // Phoenician
"Plrd" // Pollard Phonetic
+"Phlp" // Psalter Pahlavi
"Rjng" // Rejang
"Runr" // Runic
"Samr" // Samaritan
"Saur" // Saurashtra
"Shrd" // Sharada
"Shaw" // Shavian
+"Sidd" // Siddham
+"Sgnw" // SignWriting
+"Hans" // Simplified Han
+"Sinh" // Sinhala
"Sora" // Sora Sompeng
-"Xsux" // Cuneiform
"Sund" // Sundanese
"Sylo" // Syloti Nagri
+"Syrc" // Syriac
"Tglg" // Tagalog
"Tagb" // Tagbanwa
"Tale" // Tai Le
"Tavt" // Tai Viet
"Takr" // Takri
-"Ugar" // Ugaritic
-"Brai" // Braille
-"Hira" // Hiragana
-"Aghb" // Caucasian Albanian
-"Bass" // Bassa Vah
-"Dupl" // Duployan
-"Elba" // Elbasan
-"Gran" // Grantha
-"Hmng" // Pahawh Hmong
-"Khoj" // Khojki
-"Lina" // Linear A
-"Mahj" // Mahajani
-"Mani" // Manichaean
-"Mend" // Mende Kikakui
-"Modi" // Modi
-"Mroo" // Mro
-"Narb" // Old North Arabian
-"Nbat" // Nabataean
-"Palm" // Palmyrene
-"Pauc" // Pau Cin Hau
-"Perm" // Old Permic
-"Phlp" // Psalter Pahlavi
-"Sidd" // Siddham
-"Sind" // Khudawadi
+"Taml" // Tamil
+"Tang" // Tangut
+"Telu" // Telugu
+"Thaa" // Thaana
+"Thai" // Thai
+"Tibt" // Tibetan
+"Tfng" // Tifinagh
"Tirh" // Tirhuta
+"Hant" // Traditional Han
+"Ugar" // Ugaritic
+"Vaii" // Vai
"Wara" // Varang Kshiti
-"Ahom" // Ahom
-"Hluw" // Anatolian Hieroglyphs
-"Hatr" // Hatran
-"Mult" // Multani
-"Hung" // Old Hungarian
-"Sgnw" // Sign Writing
-"Adlm" // Adlam
-"Bhks" // Bhaiksuki
-"Marc" // Marchen
-"Newa" // Newa
-"Osge" // Osage
-"Tang" // Tangut
-"Hanb" // Han with Bopomofo
-"Jamo" // Jamo
+"Yiii" // Yi
+"Rohg" // Hanifi
;
-static const unsigned char country_code_list[] =
-"ZZ\0" // AnyCountry
+static constexpr unsigned char territory_code_list[] =
+"ZZ\0" // AnyTerritory
"AF\0" // Afghanistan
+"AX\0" // Aland Islands
"AL\0" // Albania
"DZ\0" // Algeria
"AS\0" // American Samoa
@@ -6548,10 +8213,11 @@ static const unsigned char country_code_list[] =
"AO\0" // Angola
"AI\0" // Anguilla
"AQ\0" // Antarctica
-"AG\0" // Antigua And Barbuda
+"AG\0" // Antigua and Barbuda
"AR\0" // Argentina
"AM\0" // Armenia
"AW\0" // Aruba
+"AC\0" // Ascension Island
"AU\0" // Australia
"AT\0" // Austria
"AZ\0" // Azerbaijan
@@ -6566,11 +8232,12 @@ static const unsigned char country_code_list[] =
"BM\0" // Bermuda
"BT\0" // Bhutan
"BO\0" // Bolivia
-"BA\0" // Bosnia And Herzegowina
+"BA\0" // Bosnia and Herzegovina
"BW\0" // Botswana
"BV\0" // Bouvet Island
"BR\0" // Brazil
"IO\0" // British Indian Ocean Territory
+"VG\0" // British Virgin Islands
"BN\0" // Brunei
"BG\0" // Bulgaria
"BF\0" // Burkina Faso
@@ -6578,43 +8245,49 @@ static const unsigned char country_code_list[] =
"KH\0" // Cambodia
"CM\0" // Cameroon
"CA\0" // Canada
+"IC\0" // Canary Islands
"CV\0" // Cape Verde
+"BQ\0" // Caribbean Netherlands
"KY\0" // Cayman Islands
"CF\0" // Central African Republic
+"EA\0" // Ceuta and Melilla
"TD\0" // Chad
"CL\0" // Chile
"CN\0" // China
"CX\0" // Christmas Island
+"CP\0" // Clipperton Island
"CC\0" // Cocos Islands
"CO\0" // Colombia
"KM\0" // Comoros
-"CD\0" // Congo Kinshasa
-"CG\0" // Congo Brazzaville
+"CG\0" // Congo - Brazzaville
+"CD\0" // Congo - Kinshasa
"CK\0" // Cook Islands
"CR\0" // Costa Rica
-"CI\0" // Ivory Coast
"HR\0" // Croatia
"CU\0" // Cuba
+"CW\0" // Curacao
"CY\0" // Cyprus
-"CZ\0" // Czech Republic
+"CZ\0" // Czechia
"DK\0" // Denmark
+"DG\0" // Diego Garcia
"DJ\0" // Djibouti
"DM\0" // Dominica
"DO\0" // Dominican Republic
-"TL\0" // East Timor
"EC\0" // Ecuador
"EG\0" // Egypt
"SV\0" // El Salvador
"GQ\0" // Equatorial Guinea
"ER\0" // Eritrea
"EE\0" // Estonia
+"SZ\0" // Eswatini
"ET\0" // Ethiopia
+"150" // Europe
+"EU\0" // European Union
"FK\0" // Falkland Islands
"FO\0" // Faroe Islands
"FJ\0" // Fiji
"FI\0" // Finland
"FR\0" // France
-"GG\0" // Guernsey
"GF\0" // French Guiana
"PF\0" // French Polynesia
"TF\0" // French Southern Territories
@@ -6630,11 +8303,12 @@ static const unsigned char country_code_list[] =
"GP\0" // Guadeloupe
"GU\0" // Guam
"GT\0" // Guatemala
+"GG\0" // Guernsey
+"GW\0" // Guinea-Bissau
"GN\0" // Guinea
-"GW\0" // Guinea Bissau
"GY\0" // Guyana
"HT\0" // Haiti
-"HM\0" // Heard And McDonald Islands
+"HM\0" // Heard and McDonald Islands
"HN\0" // Honduras
"HK\0" // Hong Kong
"HU\0" // Hungary
@@ -6644,19 +8318,22 @@ static const unsigned char country_code_list[] =
"IR\0" // Iran
"IQ\0" // Iraq
"IE\0" // Ireland
+"IM\0" // Isle of Man
"IL\0" // Israel
"IT\0" // Italy
+"CI\0" // Ivory Coast
"JM\0" // Jamaica
"JP\0" // Japan
+"JE\0" // Jersey
"JO\0" // Jordan
"KZ\0" // Kazakhstan
"KE\0" // Kenya
"KI\0" // Kiribati
-"KP\0" // North Korea
-"KR\0" // South Korea
+"XK\0" // Kosovo
"KW\0" // Kuwait
"KG\0" // Kyrgyzstan
"LA\0" // Laos
+"419" // Latin America
"LV\0" // Latvia
"LB\0" // Lebanon
"LS\0" // Lesotho
@@ -6665,7 +8342,7 @@ static const unsigned char country_code_list[] =
"LI\0" // Liechtenstein
"LT\0" // Lithuania
"LU\0" // Luxembourg
-"MO\0" // Macau
+"MO\0" // Macao
"MK\0" // Macedonia
"MG\0" // Madagascar
"MW\0" // Malawi
@@ -6683,6 +8360,7 @@ static const unsigned char country_code_list[] =
"MD\0" // Moldova
"MC\0" // Monaco
"MN\0" // Mongolia
+"ME\0" // Montenegro
"MS\0" // Montserrat
"MA\0" // Morocco
"MZ\0" // Mozambique
@@ -6691,17 +8369,18 @@ static const unsigned char country_code_list[] =
"NR\0" // Nauru
"NP\0" // Nepal
"NL\0" // Netherlands
-"CW\0" // Cura Sao
"NC\0" // New Caledonia
"NZ\0" // New Zealand
"NI\0" // Nicaragua
-"NE\0" // Niger
"NG\0" // Nigeria
+"NE\0" // Niger
"NU\0" // Niue
"NF\0" // Norfolk Island
"MP\0" // Northern Mariana Islands
+"KP\0" // North Korea
"NO\0" // Norway
"OM\0" // Oman
+"QO\0" // Outlying Oceania
"PK\0" // Pakistan
"PW\0" // Palau
"PS\0" // Palestinian Territories
@@ -6719,31 +8398,36 @@ static const unsigned char country_code_list[] =
"RO\0" // Romania
"RU\0" // Russia
"RW\0" // Rwanda
-"KN\0" // Saint Kitts And Nevis
+"BL\0" // Saint Barthelemy
+"SH\0" // Saint Helena
+"KN\0" // Saint Kitts and Nevis
"LC\0" // Saint Lucia
-"VC\0" // Saint Vincent And The Grenadines
+"MF\0" // Saint Martin
+"PM\0" // Saint Pierre and Miquelon
+"VC\0" // Saint Vincent and Grenadines
"WS\0" // Samoa
"SM\0" // San Marino
-"ST\0" // Sao Tome And Principe
+"ST\0" // Sao Tome and Principe
"SA\0" // Saudi Arabia
"SN\0" // Senegal
+"RS\0" // Serbia
"SC\0" // Seychelles
"SL\0" // Sierra Leone
"SG\0" // Singapore
+"SX\0" // Sint Maarten
"SK\0" // Slovakia
"SI\0" // Slovenia
"SB\0" // Solomon Islands
"SO\0" // Somalia
"ZA\0" // South Africa
-"GS\0" // South Georgia And The South Sandwich Islands
+"GS\0" // South Georgia and South Sandwich Islands
+"KR\0" // South Korea
+"SS\0" // South Sudan
"ES\0" // Spain
"LK\0" // Sri Lanka
-"SH\0" // Saint Helena
-"PM\0" // Saint Pierre And Miquelon
"SD\0" // Sudan
"SR\0" // Suriname
-"SJ\0" // Svalbard And Jan Mayen Islands
-"SZ\0" // Swaziland
+"SJ\0" // Svalbard and Jan Mayen
"SE\0" // Sweden
"CH\0" // Switzerland
"SY\0" // Syria
@@ -6751,56 +8435,36 @@ static const unsigned char country_code_list[] =
"TJ\0" // Tajikistan
"TZ\0" // Tanzania
"TH\0" // Thailand
+"TL\0" // Timor-Leste
"TG\0" // Togo
"TK\0" // Tokelau
"TO\0" // Tonga
-"TT\0" // Trinidad And Tobago
+"TT\0" // Trinidad and Tobago
+"TA\0" // Tristan da Cunha
"TN\0" // Tunisia
"TR\0" // Turkey
"TM\0" // Turkmenistan
-"TC\0" // Turks And Caicos Islands
+"TC\0" // Turks and Caicos Islands
"TV\0" // Tuvalu
"UG\0" // Uganda
"UA\0" // Ukraine
"AE\0" // United Arab Emirates
"GB\0" // United Kingdom
+"UM\0" // United States Outlying Islands
"US\0" // United States
-"UM\0" // United States Minor Outlying Islands
+"VI\0" // United States Virgin Islands
"UY\0" // Uruguay
"UZ\0" // Uzbekistan
"VU\0" // Vanuatu
-"VA\0" // Vatican City State
+"VA\0" // Vatican City
"VE\0" // Venezuela
"VN\0" // Vietnam
-"VG\0" // British Virgin Islands
-"VI\0" // United States Virgin Islands
-"WF\0" // Wallis And Futuna Islands
+"WF\0" // Wallis and Futuna
"EH\0" // Western Sahara
+"001" // world
"YE\0" // Yemen
-"IC\0" // Canary Islands
"ZM\0" // Zambia
"ZW\0" // Zimbabwe
-"CP\0" // Clipperton Island
-"ME\0" // Montenegro
-"RS\0" // Serbia
-"BL\0" // Saint Barthelemy
-"MF\0" // Saint Martin
-"419" // Latin America
-"AC\0" // Ascension Island
-"AX\0" // Aland Islands
-"DG\0" // Diego Garcia
-"EA\0" // Ceuta And Melilla
-"IM\0" // Isle Of Man
-"JE\0" // Jersey
-"TA\0" // Tristan Da Cunha
-"SS\0" // South Sudan
-"BQ\0" // Bonaire
-"SX\0" // Sint Maarten
-"XK\0" // Kosovo
-"EU\0" // European Union
-"QO\0" // Outlying Oceania
-"001" // World
-"150" // Europe
;
// GENERATED PART ENDS HERE
diff --git a/src/corelib/text/qlocale_icu.cpp b/src/corelib/text/qlocale_icu.cpp
index afe0aae583..55231286a0 100644
--- a/src/corelib/text/qlocale_icu.cpp
+++ b/src/corelib/text/qlocale_icu.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
#include "qdebug.h"
diff --git a/src/corelib/text/qlocale_mac.mm b/src/corelib/text/qlocale_mac.mm
index 95c8769096..89339be2eb 100644
--- a/src/corelib/text/qlocale_mac.mm
+++ b/src/corelib/text/qlocale_mac.mm
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qlocale_p.h"
@@ -43,95 +7,289 @@
#include "qvariant.h"
#include "qdatetime.h"
+#include "private/qstringiterator_p.h"
+#include "private/qgregoriancalendar_p.h"
#ifdef Q_OS_DARWIN
#include "private/qcore_mac_p.h"
#include <CoreFoundation/CoreFoundation.h>
#endif
+#include <QtCore/qloggingcategory.h>
+#include <QtCore/qcoreapplication.h>
+
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
/******************************************************************************
** Wrappers for Mac locale system functions
*/
-static QByteArray envVarLocale()
+Q_LOGGING_CATEGORY(lcLocale, "qt.core.locale")
+
+static void printLocalizationInformation()
{
- QByteArray
-#ifdef Q_OS_UNIX
- lang = qgetenv("LC_ALL");
- if (lang.isEmpty())
- lang = qgetenv("LC_NUMERIC");
- if (lang.isEmpty())
+ if (!lcLocale().isDebugEnabled())
+ return;
+
+#if defined(Q_OS_MACOS)
+ // Trigger initialization of standard user defaults, so that Foundation picks
+ // up -AppleLanguages and -AppleLocale passed on the command line.
+ Q_UNUSED(NSUserDefaults.standardUserDefaults);
#endif
- lang = qgetenv("LANG");
- return lang;
+
+ auto singleLineDescription = [](NSArray *array) {
+ NSString *str = [array description];
+ str = [str stringByReplacingOccurrencesOfString:@"\n" withString:@""];
+ return [str stringByReplacingOccurrencesOfString:@" " withString:@""];
+ };
+
+ bool allowMixedLocalizations = [NSBundle.mainBundle.infoDictionary[@"CFBundleAllowMixedLocalizations"] boolValue];
+
+ NSBundle *foundation = [NSBundle bundleForClass:NSBundle.class];
+ qCDebug(lcLocale).nospace() << "Launched with locale \"" << NSLocale.currentLocale.localeIdentifier
+ << "\" based on user's preferred languages " << singleLineDescription(NSLocale.preferredLanguages)
+ << ", main bundle localizations " << singleLineDescription(NSBundle.mainBundle.localizations)
+ << ", and allowing mixed localizations " << allowMixedLocalizations
+ << "; resulting in main bundle preferred localizations "
+ << singleLineDescription(NSBundle.mainBundle.preferredLocalizations)
+ << " and Foundation preferred localizations "
+ << singleLineDescription(foundation.preferredLocalizations);
+ qCDebug(lcLocale) << "Reflected by Qt as system locale"
+ << QLocale::system() << "with UI languges " << QLocale::system().uiLanguages();
}
+Q_COREAPP_STARTUP_FUNCTION(printLocalizationInformation);
static QString getMacLocaleName()
{
- QString result = QString::fromLocal8Bit(envVarLocale());
-
- QString lang, script, cntry;
- if (result.isEmpty()
- || (result != QLatin1String("C") && !qt_splitLocaleName(result, lang, script, cntry))) {
- QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
- CFStringRef locale = CFLocaleGetIdentifier(l);
- result = QString::fromCFString(locale);
- }
- return result;
+ QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
+ CFStringRef locale = CFLocaleGetIdentifier(l);
+ return QString::fromCFString(locale);
}
-static QString macMonthName(int month, bool short_format)
+static QVariant macMonthName(int month, QSystemLocale::QueryType type)
{
month -= 1;
if (month < 0 || month > 11)
- return QString();
+ return {};
QCFType<CFDateFormatterRef> formatter
= CFDateFormatterCreate(0, QCFType<CFLocaleRef>(CFLocaleCopyCurrent()),
kCFDateFormatterNoStyle, kCFDateFormatterNoStyle);
+
+ CFDateFormatterKey formatterType;
+ switch (type) {
+ case QSystemLocale::MonthNameLong:
+ formatterType = kCFDateFormatterMonthSymbols;
+ break;
+ case QSystemLocale::MonthNameShort:
+ formatterType = kCFDateFormatterShortMonthSymbols;
+ break;
+ case QSystemLocale::MonthNameNarrow:
+ formatterType = kCFDateFormatterVeryShortMonthSymbols;
+ break;
+ case QSystemLocale::StandaloneMonthNameLong:
+ formatterType = kCFDateFormatterStandaloneMonthSymbols;
+ break;
+ case QSystemLocale::StandaloneMonthNameShort:
+ formatterType = kCFDateFormatterShortStandaloneMonthSymbols;
+ break;
+ case QSystemLocale::StandaloneMonthNameNarrow:
+ formatterType = kCFDateFormatterVeryShortStandaloneMonthSymbols;
+ break;
+ default:
+ qWarning("macMonthName: Unsupported query type %d", type);
+ return {};
+ }
QCFType<CFArrayRef> values
- = static_cast<CFArrayRef>(CFDateFormatterCopyProperty(formatter,
- short_format ? kCFDateFormatterShortMonthSymbols
- : kCFDateFormatterMonthSymbols));
+ = static_cast<CFArrayRef>(CFDateFormatterCopyProperty(formatter, formatterType));
+
if (values != 0) {
CFStringRef cfstring = static_cast<CFStringRef>(CFArrayGetValueAtIndex(values, month));
return QString::fromCFString(cfstring);
}
- return QString();
+ return {};
}
-static QString macDayName(int day, bool short_format)
+static QVariant macDayName(int day, QSystemLocale::QueryType type)
{
if (day < 1 || day > 7)
- return QString();
+ return {};
QCFType<CFDateFormatterRef> formatter
= CFDateFormatterCreate(0, QCFType<CFLocaleRef>(CFLocaleCopyCurrent()),
kCFDateFormatterNoStyle, kCFDateFormatterNoStyle);
- QCFType<CFArrayRef> values = static_cast<CFArrayRef>(CFDateFormatterCopyProperty(formatter,
- short_format ? kCFDateFormatterShortWeekdaySymbols
- : kCFDateFormatterWeekdaySymbols));
+
+ CFDateFormatterKey formatterType;
+ switch (type) {
+ case QSystemLocale::DayNameLong:
+ formatterType = kCFDateFormatterWeekdaySymbols;
+ break;
+ case QSystemLocale::DayNameShort:
+ formatterType = kCFDateFormatterShortWeekdaySymbols;
+ break;
+ case QSystemLocale::DayNameNarrow:
+ formatterType = kCFDateFormatterVeryShortWeekdaySymbols;
+ break;
+ case QSystemLocale::StandaloneDayNameLong:
+ formatterType = kCFDateFormatterStandaloneWeekdaySymbols;
+ break;
+ case QSystemLocale::StandaloneDayNameShort:
+ formatterType = kCFDateFormatterShortStandaloneWeekdaySymbols;
+ break;
+ case QSystemLocale::StandaloneDayNameNarrow:
+ formatterType = kCFDateFormatterVeryShortStandaloneWeekdaySymbols;
+ break;
+ default:
+ qWarning("macDayName: Unsupported query type %d", type);
+ return {};
+ }
+ QCFType<CFArrayRef> values =
+ static_cast<CFArrayRef>(CFDateFormatterCopyProperty(formatter, formatterType));
+
if (values != 0) {
CFStringRef cfstring = static_cast<CFStringRef>(CFArrayGetValueAtIndex(values, day % 7));
return QString::fromCFString(cfstring);
}
- return QString();
+ return {};
}
-static QString macDateToString(QDate date, bool short_format)
+static QString macZeroDigit()
{
- QCFType<CFDateRef> myDate = QDateTime(date, QTime()).toCFDate();
+ static QString cachedZeroDigit;
+
+ if (cachedZeroDigit.isNull()) {
+ QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+ QCFType<CFNumberFormatterRef> numberFormatter =
+ CFNumberFormatterCreate(nullptr, locale, kCFNumberFormatterNoStyle);
+ const int zeroDigit = 0;
+ QCFType<CFStringRef> value
+ = CFNumberFormatterCreateStringWithValue(nullptr, numberFormatter,
+ kCFNumberIntType, &zeroDigit);
+ cachedZeroDigit = QString::fromCFString(value);
+ }
+
+ static QMacNotificationObserver localeChangeObserver = QMacNotificationObserver(
+ nil, NSCurrentLocaleDidChangeNotification, [&] {
+ qCDebug(lcLocale) << "System locale changed";
+ cachedZeroDigit = QString();
+ });
+
+ return cachedZeroDigit;
+}
+
+static QString zeroPad(QString &&number, qsizetype minDigits, const QString &zero)
+{
+ // Need to pad with zeros, possibly after a sign.
+ qsizetype insert = -1, digits = 0;
+ auto it = QStringIterator(number);
+ while (it.hasNext()) {
+ qsizetype here = it.index();
+ if (QChar::isDigit(it.next())) {
+ if (insert < 0)
+ insert = here;
+ ++digits;
+ } // else: assume we're stepping over a sign (or maybe grouping separator)
+ }
+ Q_ASSERT(digits > 0);
+ Q_ASSERT(insert >= 0);
+ while (digits++ < minDigits)
+ number.insert(insert, zero);
+
+ return std::move(number);
+}
+
+static QString trimTwoDigits(QString &&number)
+{
+ // Retain any sign, but remove all but the last two digits.
+ // We know number has at least four digits - it came from fourDigitYear().
+ // Note that each digit might be a surrogate pair.
+ qsizetype first = -1, prev = -1, last = -1;
+ auto it = QStringIterator(number);
+ while (it.hasNext()) {
+ qsizetype here = it.index();
+ if (QChar::isDigit(it.next())) {
+ if (first == -1)
+ last = first = here;
+ else if (last != -1)
+ prev = std::exchange(last, here);
+ }
+ }
+ Q_ASSERT(first >= 0);
+ Q_ASSERT(prev > first);
+ Q_ASSERT(last > prev);
+ number.remove(first, prev - first);
+ return std::move(number);
+}
+
+static QString fourDigitYear(int year, const QString &zero)
+{
+ // Return year formatted as an (at least) four digit number:
+ QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+ QCFType<CFNumberFormatterRef> numberFormatter =
+ CFNumberFormatterCreate(nullptr, locale, kCFNumberFormatterNoStyle);
+ QCFType<CFStringRef> value = CFNumberFormatterCreateStringWithValue(nullptr, numberFormatter,
+ kCFNumberIntType, &year);
+ auto text = QString::fromCFString(value);
+ if (year > -1000 && year < 1000)
+ text = zeroPad(std::move(text), 4, zero);
+ return text;
+}
+
+static QString macDateToStringImpl(QDate date, CFDateFormatterStyle style)
+{
+ // Use noon on the given date, to avoid complications that can arise for
+ // dates before 1900 (see QTBUG-54955) using different UTC offset than
+ // QDateTime extrapolates backwards from time_t functions that only work
+ // back to 1900. (Alaska and Phillipines may still be borked, though.)
+ QCFType<CFDateRef> myDate = QDateTime(date, QTime(12, 0)).toCFDate();
QCFType<CFLocaleRef> mylocale = CFLocaleCopyCurrent();
- CFDateFormatterStyle style = short_format ? kCFDateFormatterShortStyle : kCFDateFormatterLongStyle;
QCFType<CFDateFormatterRef> myFormatter
- = CFDateFormatterCreate(kCFAllocatorDefault,
- mylocale, style,
+ = CFDateFormatterCreate(kCFAllocatorDefault, mylocale, style,
kCFDateFormatterNoStyle);
- return QCFString(CFDateFormatterCreateStringWithDate(0, myFormatter, myDate));
+ QCFType<CFStringRef> text = CFDateFormatterCreateStringWithDate(nullptr, myFormatter, myDate);
+ return QString::fromCFString(text);
}
-static QString macTimeToString(QTime time, bool short_format)
+static QVariant macDateToString(QDate date, bool short_format)
+{
+ const int year = date.year();
+ QString fakeYear, trueYear;
+ if (year < 1583) {
+ // System API (in macOS 11.0, at least) discards sign :-(
+ // Simply negating the year won't do as the resulting year typically has
+ // a different pattern of week-days.
+ // Furthermore (see QTBUG-54955), Darwin uses the Julian calendar for
+ // dates before 1582-10-15, leading to discrepancies.
+ int matcher = QGregorianCalendar::yearSharingWeekDays(date);
+ Q_ASSERT(matcher >= 1583);
+ Q_ASSERT(matcher % 100 != date.month());
+ Q_ASSERT(matcher % 100 != date.day());
+ // i.e. there can't be any confusion between the two-digit year and
+ // month or day-of-month in the formatted date.
+ QString zero = macZeroDigit();
+ fakeYear = fourDigitYear(matcher, zero);
+ trueYear = fourDigitYear(year, zero);
+ date = QDate(matcher, date.month(), date.day());
+ }
+ QString text = macDateToStringImpl(date, short_format
+ ? kCFDateFormatterShortStyle
+ : kCFDateFormatterLongStyle);
+ if (year < 1583) {
+ if (text.contains(fakeYear))
+ return std::move(text).replace(fakeYear, trueYear);
+ // Cope with two-digit year:
+ fakeYear = trimTwoDigits(std::move(fakeYear));
+ trueYear = trimTwoDigits(std::move(trueYear));
+ if (text.contains(fakeYear))
+ return std::move(text).replace(fakeYear, trueYear);
+ // That should have worked.
+ qWarning("Failed to fix up year when formatting a date in year %d", year);
+ }
+ return text;
+}
+
+static QVariant macTimeToString(QTime time, bool short_format)
{
QCFType<CFDateRef> myDate = QDateTime(QDate::currentDate(), time).toCFDate();
QCFType<CFLocaleRef> mylocale = CFLocaleCopyCurrent();
@@ -140,7 +298,8 @@ static QString macTimeToString(QTime time, bool short_format)
mylocale,
kCFDateFormatterNoStyle,
style);
- return QCFString(CFDateFormatterCreateStringWithDate(0, myFormatter, myDate));
+ QCFType<CFStringRef> text = CFDateFormatterCreateStringWithDate(0, myFormatter, myDate);
+ return QString::fromCFString(text);
}
// Mac uses the Unicode CLDR format codes
@@ -148,126 +307,132 @@ static QString macTimeToString(QTime time, bool short_format)
// See also qtbase/util/locale_database/dateconverter.py
// Makes the assumption that input formats are always well formed and consecutive letters
// never exceed the maximum for the format code.
-static QString macToQtFormat(QStringView sys_fmt)
+static QVariant macToQtFormat(QStringView sys_fmt)
{
QString result;
- int i = 0;
+ qsizetype i = 0;
while (i < sys_fmt.size()) {
if (sys_fmt.at(i).unicode() == '\'') {
QString text = qt_readEscapedFormatString(sys_fmt, &i);
- if (text == QLatin1String("'"))
- result += QLatin1String("''");
+ if (text == "'"_L1)
+ result += "''"_L1;
else
- result += QLatin1Char('\'') + text + QLatin1Char('\'');
+ result += u'\'' + text + u'\'';
continue;
}
QChar c = sys_fmt.at(i);
- int repeat = qt_repeatCount(sys_fmt.mid(i));
+ qsizetype repeat = qt_repeatCount(sys_fmt.sliced(i));
switch (c.unicode()) {
// Qt does not support the following options
- case 'G': // Era (1..5): 4 = long, 1..3 = short, 5 = narrow
- case 'Y': // Year of Week (1..n): 1..n = padded number
- case 'U': // Cyclic Year Name (1..5): 4 = long, 1..3 = short, 5 = narrow
- case 'Q': // Quarter (1..4): 4 = long, 3 = short, 1..2 = padded number
- case 'q': // Standalone Quarter (1..4): 4 = long, 3 = short, 1..2 = padded number
- case 'w': // Week of Year (1..2): 1..2 = padded number
- case 'W': // Week of Month (1): 1 = number
- case 'D': // Day of Year (1..3): 1..3 = padded number
- case 'F': // Day of Week in Month (1): 1 = number
- case 'g': // Modified Julian Day (1..n): 1..n = padded number
- case 'A': // Milliseconds in Day (1..n): 1..n = padded number
- break;
-
- case 'y': // Year (1..n): 2 = short year, 1 & 3..n = padded number
- case 'u': // Extended Year (1..n): 2 = short year, 1 & 3..n = padded number
- // Qt only supports long (4) or short (2) year, use long for all others
- if (repeat == 2)
- result += QLatin1String("yy");
- else
- result += QLatin1String("yyyy");
- break;
- case 'M': // Month (1..5): 4 = long, 3 = short, 1..2 = number, 5 = narrow
- case 'L': // Standalone Month (1..5): 4 = long, 3 = short, 1..2 = number, 5 = narrow
- // Qt only supports long, short and number, use short for narrow
- if (repeat == 5)
- result += QLatin1String("MMM");
- else
- result += QString(repeat, QLatin1Char('M'));
- break;
- case 'd': // Day of Month (1..2): 1..2 padded number
- result += QString(repeat, c);
- break;
- case 'E': // Day of Week (1..6): 4 = long, 1..3 = short, 5..6 = narrow
- // Qt only supports long, short and padded number, use short for narrow
- if (repeat == 4)
- result += QLatin1String("dddd");
- else
- result += QLatin1String("ddd");
- break;
- case 'e': // Local Day of Week (1..6): 4 = long, 3 = short, 5..6 = narrow, 1..2 padded number
- case 'c': // Standalone Local Day of Week (1..6): 4 = long, 3 = short, 5..6 = narrow, 1..2 padded number
- // Qt only supports long, short and padded number, use short for narrow
- if (repeat >= 5)
- result += QLatin1String("ddd");
- else
- result += QString(repeat, QLatin1Char('d'));
- break;
- case 'a': // AM/PM (1): 1 = short
- // Translate to Qt uppercase AM/PM
- result += QLatin1String("AP");
- break;
- case 'h': // Hour [1..12] (1..2): 1..2 = padded number
- case 'K': // Hour [0..11] (1..2): 1..2 = padded number
- case 'j': // Local Hour [12 or 24] (1..2): 1..2 = padded number
- // Qt h is local hour
- result += QString(repeat, QLatin1Char('h'));
- break;
- case 'H': // Hour [0..23] (1..2): 1..2 = padded number
- case 'k': // Hour [1..24] (1..2): 1..2 = padded number
- // Qt H is 0..23 hour
- result += QString(repeat, QLatin1Char('H'));
- break;
- case 'm': // Minutes (1..2): 1..2 = padded number
- case 's': // Seconds (1..2): 1..2 = padded number
+ case 'A': // Milliseconds in Day (1..n): 1..n = padded number
+ case 'C': // Input skeleton symbol.
+ case 'D': // Day of Year (1..3): 1..3 = padded number
+ case 'F': // Day of Week in Month (1): 1 = number
+ case 'g': // Modified Julian Day (1..n): 1..n = padded number
+ case 'G': // Era (1..5): 4 = long, 1..3 = short, 5 = narrow
+ case 'j': // Input skeleton symbol.
+ case 'J': // Input skeleton symbol.
+ case 'l': // Deprecated Chinese leap month indicator.
+ case 'q': // Standalone Quarter (1..4): 4 = long, 3 = short, 1,2 = padded number
+ case 'Q': // Quarter (1..4): 4 = long, 3 = short, 1,2 = padded number
+ case 'U': // Cyclic Year Name (1..5): 4 = long, 1..3 = short, 5 = narrow
+ case 'w': // Week of Year (1,2): 1,2 = padded number
+ case 'W': // Week of Month (1): 1 = number
+ case 'Y': // Year for Week-of-year calendars (1..n): 1..n = padded number
+ break;
+
+ case 'u': // Extended Year (1..n), padded number.
+ // Explicitly has no special case for 'uu' as only the last two digits.
+ result += "yyyy"_L1;
+ break;
+ case 'y': // Year (1..n): 2 = short year, 1 & 3..n = padded number
+ // Qt only supports long (4) or short (2) year, use long for all others
+ if (repeat == 2)
+ result += "yy"_L1;
+ else
+ result += "yyyy"_L1;
+ break;
+ case 'L': // Standalone Month (1..5): 4 = long, 3 = short, 1,2 = number, 5 = narrow
+ case 'M': // Month (1..5): 4 = long, 3 = short, 1,2 = number, 5 = narrow
+ // Qt only supports long, short and number, use short for narrow
+ if (repeat == 5)
+ result += "MMM"_L1;
+ else
+ result += QString(repeat, u'M');
+ break;
+ case 'd': // Day of Month (1,2): 1,2 padded number
+ result += QString(repeat, c);
+ break;
+ case 'c': // Standalone version of 'e'
+ case 'e': // Local Day of Week (1..6): 4 = long, 3 = short, 5,6 = narrow, 1,2 padded number
+ // "Local" only affects numeric form: depends on locale's start-day of the week.
+ case 'E': // Day of Week (1..6): 4 = long, 1..3 = short, 5,6 = narrow
+ // Qt only supports long, short: use short for narrow and padded number.
+ if (repeat == 4)
+ result += "dddd"_L1;
+ else
+ result += "ddd"_L1;
+ break;
+ case 'a': // AM/PM (1..n): Qt supports no distinctions
+ case 'b': // Like a, but also distinguishing noon, midnight (ignore difference).
+ case 'B': // Flexible day period (at night, &c.)
+ // Translate to Qt AM/PM, using locale-appropriate case:
+ result += "Ap"_L1;
+ break;
+ case 'h': // Hour [1..12] (1,2): 1,2 = padded number
+ case 'K': // Hour [0..11] (1,2): 1,2 = padded number
+ result += QString(repeat, 'h'_L1);
+ break;
+ case 'H': // Hour [0..23] (1,2): 1,2 = padded number
+ case 'k': // Hour [1..24] (1,2): 1,2 = padded number
+ // Qt H is 0..23 hour
+ result += QString(repeat, 'H'_L1);
+ break;
+ case 'm': // Minutes (1,2): 1,2 = padded number
+ case 's': // Seconds (1,2): 1,2 = padded number
+ result += QString(repeat, c);
+ break;
+ case 'S': // Fractional second (1..n): 1..n = truncates to decimal places
+ // Qt uses msecs either unpadded or padded to 3 places
+ if (repeat < 3)
+ result += u'z';
+ else
+ result += "zzz"_L1;
+ break;
+ case 'O': // Time Zone (1, 4)
+ result += u't';
+ break;
+ case 'v': // Time Zone (1, 4)
+ case 'V': // Time Zone (1..4)
+ result += "tttt"_L1;
+ break;
+ case 'x': // Time Zone (1..5)
+ case 'X': // Time Zone (1..5)
+ result += (repeat > 1 && (repeat & 1)) ? "ttt"_L1 : "tt"_L1;
+ break;
+ case 'z': // Time Zone (1..4)
+ case 'Z': // Time Zone (1..5)
+ result += repeat < 4 ? "tt"_L1 : repeat > 4 ? "ttt"_L1 : "t"_L1;
+ break;
+ default:
+ // a..z and A..Z are reserved for format codes, so any occurrence of these not
+ // already processed are not known and so unsupported formats to be ignored.
+ // All other chars are allowed as literals.
+ if (c < u'A' || c > u'z' || (c > u'Z' && c < u'a'))
result += QString(repeat, c);
- break;
- case 'S': // Fractional second (1..n): 1..n = truncates to decimal places
- // Qt uses msecs either unpadded or padded to 3 places
- if (repeat < 3)
- result += QLatin1Char('z');
- else
- result += QLatin1String("zzz");
- break;
- case 'z': // Time Zone (1..4)
- case 'Z': // Time Zone (1..5)
- case 'O': // Time Zone (1, 4)
- case 'v': // Time Zone (1, 4)
- case 'V': // Time Zone (1..4)
- case 'X': // Time Zone (1..5)
- case 'x': // Time Zone (1..5)
- result += QLatin1Char('t');
- break;
- default:
- // a..z and A..Z are reserved for format codes, so any occurrence of these not
- // already processed are not known and so unsupported formats to be ignored.
- // All other chars are allowed as literals.
- if (c < QLatin1Char('A') || c > QLatin1Char('z') ||
- (c > QLatin1Char('Z') && c < QLatin1Char('a'))) {
- result += QString(repeat, c);
- }
- break;
+ break;
}
i += repeat;
}
- return result;
+ return !result.isEmpty() ? QVariant::fromValue(result) : QVariant();
}
-QString getMacDateFormat(CFDateFormatterStyle style)
+static QVariant getMacDateFormat(CFDateFormatterStyle style)
{
QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
QCFType<CFDateFormatterRef> formatter = CFDateFormatterCreate(kCFAllocatorDefault,
@@ -275,7 +440,7 @@ QString getMacDateFormat(CFDateFormatterStyle style)
return macToQtFormat(QString::fromCFString(CFDateFormatterGetFormat(formatter)));
}
-static QString getMacTimeFormat(CFDateFormatterStyle style)
+static QVariant getMacTimeFormat(CFDateFormatterStyle style)
{
QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
QCFType<CFDateFormatterRef> formatter = CFDateFormatterCreate(kCFAllocatorDefault,
@@ -292,11 +457,11 @@ static QVariant getCFLocaleValue(CFStringRef key)
return QString::fromCFString(CFStringRef(static_cast<CFTypeRef>(value)));
}
-static QLocale::MeasurementSystem macMeasurementSystem()
+static QVariant macMeasurementSystem()
{
QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
CFStringRef system = static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleMeasurementSystem));
- if (QString::fromCFString(system) == QLatin1String("Metric")) {
+ if (QString::fromCFString(system) == "Metric"_L1) {
return QLocale::MetricSystem;
} else {
return QLocale::ImperialSystem;
@@ -313,7 +478,7 @@ static quint8 macFirstDayOfWeek()
return day;
}
-static QString macCurrencySymbol(QLocale::CurrencySymbolFormat format)
+static QVariant macCurrencySymbol(QLocale::CurrencySymbolFormat format)
{
QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
switch (format) {
@@ -329,44 +494,33 @@ static QString macCurrencySymbol(QLocale::CurrencySymbolFormat format)
default:
break;
}
- return QString();
-}
-
-static QString macZeroDigit()
-{
- QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
- QCFType<CFNumberFormatterRef> numberFormatter =
- CFNumberFormatterCreate(nullptr, locale, kCFNumberFormatterNoStyle);
- static const int zeroDigit = 0;
- QCFType<CFStringRef> value = CFNumberFormatterCreateStringWithValue(nullptr, numberFormatter,
- kCFNumberIntType, &zeroDigit);
- return QString::fromCFString(value);
+ return {};
}
#ifndef QT_NO_SYSTEMLOCALE
-static QString macFormatCurrency(const QSystemLocale::CurrencyToStringArgument &arg)
+static QVariant macFormatCurrency(const QSystemLocale::CurrencyToStringArgument &arg)
{
QCFType<CFNumberRef> value;
- switch (arg.value.type()) {
- case QVariant::Int:
- case QVariant::UInt: {
+ switch (arg.value.metaType().id()) {
+ case QMetaType::Int:
+ case QMetaType::UInt: {
int v = arg.value.toInt();
value = CFNumberCreate(NULL, kCFNumberIntType, &v);
break;
}
- case QVariant::Double: {
+ case QMetaType::Double: {
double v = arg.value.toDouble();
value = CFNumberCreate(NULL, kCFNumberDoubleType, &v);
break;
}
- case QVariant::LongLong:
- case QVariant::ULongLong: {
+ case QMetaType::LongLong:
+ case QMetaType::ULongLong: {
qint64 v = arg.value.toLongLong();
value = CFNumberCreate(NULL, kCFNumberLongLongType, &v);
break;
}
default:
- return QString();
+ return {};
}
QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
@@ -402,17 +556,42 @@ static QVariant macQuoteString(QSystemLocale::QueryType type, QStringView str)
#ifndef QT_NO_SYSTEMLOCALE
-QLocale QSystemLocale::fallbackUiLocale() const
+QLocale QSystemLocale::fallbackLocale() const
{
return QLocale(getMacLocaleName());
}
-QVariant QSystemLocale::query(QueryType type, QVariant in) const
+template <auto CodeToValueFunction>
+static QVariant getLocaleValue(CFStringRef key)
+{
+ if (auto code = getCFLocaleValue(key); !code.isNull()) {
+ // If an invalid locale is requested with -AppleLocale, the system APIs
+ // will report invalid or empty locale values back to us, which codeToLanguage()
+ // and friends will fail to parse, resulting in returning QLocale::Any{L/C/S}.
+ // If this is the case, we fall down and return a null-variant, which
+ // QLocale's updateSystemPrivate() will interpret to use fallback logic.
+ if (auto value = CodeToValueFunction(code.toString()))
+ return value;
+ }
+ return QVariant();
+}
+
+static QLocale::Language codeToLanguage(QStringView s)
+{
+ return QLocalePrivate::codeToLanguage(s);
+}
+
+QVariant QSystemLocale::query(QueryType type, QVariant &&in) const
{
QMacAutoReleasePool pool;
+
switch(type) {
-// case Name:
-// return getMacLocaleName();
+ case LanguageId:
+ return getLocaleValue<codeToLanguage>(kCFLocaleLanguageCode);
+ case TerritoryId:
+ return getLocaleValue<QLocalePrivate::codeToTerritory>(kCFLocaleCountryCode);
+ case ScriptId:
+ return getLocaleValue<QLocalePrivate::codeToScript>(kCFLocaleScriptCode);
case DecimalPoint:
return getCFLocaleValue(kCFLocaleDecimalSeparator);
case GroupSeparator:
@@ -429,12 +608,18 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
: kCFDateFormatterLongStyle);
case DayNameLong:
case DayNameShort:
- return macDayName(in.toInt(), (type == DayNameShort));
+ case DayNameNarrow:
+ case StandaloneDayNameLong:
+ case StandaloneDayNameShort:
+ case StandaloneDayNameNarrow:
+ return macDayName(in.toInt(), type);
case MonthNameLong:
case MonthNameShort:
+ case MonthNameNarrow:
case StandaloneMonthNameLong:
case StandaloneMonthNameShort:
- return macMonthName(in.toInt(), (type == MonthNameShort || type == StandaloneMonthNameShort));
+ case StandaloneMonthNameNarrow:
+ return macMonthName(in.toInt(), type);
case DateToStringShort:
case DateToStringLong:
return macDateToString(in.toDate(), (type == DateToStringShort));
@@ -446,10 +631,10 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
case PositiveSign:
break;
case ZeroDigit:
- return QVariant(macZeroDigit());
+ return macZeroDigit();
case MeasurementSystem:
- return QVariant(static_cast<int>(macMeasurementSystem()));
+ return macMeasurementSystem();
case AMText:
case PMText: {
@@ -462,33 +647,18 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
case FirstDayOfWeek:
return QVariant(macFirstDayOfWeek());
case CurrencySymbol:
- return QVariant(macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
+ return macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
case CurrencyToString:
- return macFormatCurrency(in.value<QSystemLocale::CurrencyToStringArgument>());
+ return macFormatCurrency(in.value<CurrencyToStringArgument>());
case UILanguages: {
- QCFType<CFPropertyListRef> languages = CFPreferencesCopyValue(
- CFSTR("AppleLanguages"),
- kCFPreferencesAnyApplication,
- kCFPreferencesCurrentUser,
- kCFPreferencesAnyHost);
QStringList result;
- if (!languages)
- return QVariant(result);
-
- CFTypeID typeId = CFGetTypeID(languages);
- if (typeId == CFArrayGetTypeID()) {
- const int cnt = CFArrayGetCount(languages.as<CFArrayRef>());
- result.reserve(cnt);
- for (int i = 0; i < cnt; ++i) {
- const QString lang = QString::fromCFString(
- static_cast<CFStringRef>(CFArrayGetValueAtIndex(languages.as<CFArrayRef>(), i)));
- result.append(lang);
- }
- } else if (typeId == CFStringGetTypeID()) {
- result = QStringList(QString::fromCFString(languages.as<CFStringRef>()));
- } else {
- qWarning("QLocale::uiLanguages(): CFPreferencesCopyValue returned unhandled type \"%ls\"; please report to http://bugreports.qt.io",
- qUtf16Printable(QString::fromCFString(CFCopyTypeIDDescription(typeId))));
+ QCFType<CFArrayRef> languages = CFLocaleCopyPreferredLanguages();
+ const CFIndex cnt = CFArrayGetCount(languages);
+ result.reserve(cnt);
+ for (CFIndex i = 0; i < cnt; ++i) {
+ const QString lang = QString::fromCFString(
+ static_cast<CFStringRef>(CFArrayGetValueAtIndex(languages, i)));
+ result.append(lang);
}
return QVariant(result);
}
diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h
index b4064d747b..3044d137b9 100644
--- a/src/corelib/text/qlocale_p.h
+++ b/src/corelib/text/qlocale_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOCALE_P_H
#define QLOCALE_P_H
@@ -52,24 +16,98 @@
// We mean it.
//
-#include <QtCore/private/qglobal_p.h>
-#include "QtCore/qstring.h"
-#include "QtCore/qvarlengtharray.h"
-#include "QtCore/qvariant.h"
-#include "QtCore/qnumeric.h"
-#include <QtCore/qcalendar.h>
-
#include "qlocale.h"
+#include <QtCore/qcalendar.h>
+#include <QtCore/qlist.h>
+#include <QtCore/qnumeric.h>
+#include <QtCore/private/qnumeric_p.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qvariant.h>
+#include <QtCore/qvarlengtharray.h>
+#ifdef Q_OS_WASM
+#include <private/qstdweb_p.h>
+#endif
+
#include <limits>
#include <cmath>
+#include <string_view>
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_SYSTEMLOCALE
+template <typename T> struct QSimpleParsedNumber
+{
+ T result;
+ // When used < 0, -used is how much was used, but it was an error.
+ qsizetype used;
+ bool ok() const { return used > 0; }
+};
+
+template <typename MaskType, uchar Lowest> struct QCharacterSetMatch
+{
+ static constexpr int MaxRange = std::numeric_limits<MaskType>::digits;
+ MaskType mask;
+
+ constexpr QCharacterSetMatch(std::string_view set)
+ : mask(0)
+ {
+ for (char c : set) {
+ int idx = uchar(c) - Lowest;
+ mask |= MaskType(1) << idx;
+ }
+ }
+
+ constexpr bool matches(uchar c) const
+ {
+ unsigned idx = c - Lowest;
+ if (idx >= MaxRange)
+ return false;
+ return (mask >> idx) & 1;
+ }
+};
+
+namespace QtPrivate {
+inline constexpr char ascii_space_chars[] =
+ "\t" // 9: HT - horizontal tab
+ "\n" // 10: LF - line feed
+ "\v" // 11: VT - vertical tab
+ "\f" // 12: FF - form feed
+ "\r" // 13: CR - carriage return
+ " "; // 32: space
+
+template <const char *Set, int ForcedLowest = -1>
+inline constexpr auto makeCharacterSetMatch()
+{
+ constexpr auto view = std::string_view(Set);
+ constexpr uchar MinElement = *std::min_element(view.begin(), view.end());
+ constexpr uchar MaxElement = *std::max_element(view.begin(), view.end());
+ constexpr int Range = MaxElement - MinElement;
+ static_assert(Range < 64, "Characters in the set are 64 or more values apart");
+
+ if constexpr (ForcedLowest >= 0) {
+ // use the force
+ static_assert(ForcedLowest <= int(MinElement), "The force is not with you");
+ using MaskType = std::conditional_t<MaxElement - ForcedLowest < 32, quint32, quint64>;
+ return QCharacterSetMatch<MaskType, ForcedLowest>(view);
+ } else if constexpr (MaxElement < std::numeric_limits<qregisteruint>::digits) {
+ // if we can use a Lowest of zero, we can remove a subtraction
+ // from the matches() code at runtime
+ using MaskType = std::conditional_t<(MaxElement < 32), quint32, qregisteruint>;
+ return QCharacterSetMatch<MaskType, 0>(view);
+ } else {
+ using MaskType = std::conditional_t<(Range < 32), quint32, quint64>;
+ return QCharacterSetMatch<MaskType, MinElement>(view);
+ }
+}
+} // QtPrivate
+
struct QLocaleData;
+// Subclassed by Android platform plugin:
class Q_CORE_EXPORT QSystemLocale
{
+ Q_DISABLE_COPY_MOVE(QSystemLocale)
+ QSystemLocale *next = nullptr; // Maintains a stack.
+
public:
QSystemLocale();
virtual ~QSystemLocale();
@@ -85,7 +123,7 @@ public:
enum QueryType {
LanguageId, // uint
- CountryId, // uint
+ TerritoryId, // uint
DecimalPoint, // QString
GroupSeparator, // QString (empty QString means: don't group digits)
ZeroDigit, // QString
@@ -96,8 +134,10 @@ public:
TimeFormatShort, // QString
DayNameLong, // QString, in: int
DayNameShort, // QString, in: int
+ DayNameNarrow, // QString, in: int
MonthNameLong, // QString, in: int
MonthNameShort, // QString, in: int
+ MonthNameNarrow, // QString, in: int
DateToStringLong, // QString, in: QDate
DateToStringShort, // QString in: QDate
TimeToStringLong, // QString in: QTime
@@ -122,21 +162,21 @@ public:
ListToSeparatedString, // QString
LocaleChanged, // system locale changed
NativeLanguageName, // QString
- NativeCountryName, // QString
+ NativeTerritoryName, // QString
StandaloneMonthNameLong, // QString, in: int
- StandaloneMonthNameShort // QString, in: int
+ StandaloneMonthNameShort, // QString, in: int
+ StandaloneMonthNameNarrow, // QString, in: int
+ StandaloneDayNameLong, // QString, in: int
+ StandaloneDayNameShort, // QString, in: int
+ StandaloneDayNameNarrow // QString, in: int
};
- virtual QVariant query(QueryType type, QVariant in) const;
- virtual QLocale fallbackUiLocale() const;
+ virtual QVariant query(QueryType type, QVariant &&in = QVariant()) const;
- inline const QLocaleData *fallbackUiLocaleData() const;
-private:
- QSystemLocale(bool);
- friend class QSystemLocaleSingleton;
+ virtual QLocale fallbackLocale() const;
+ inline qsizetype fallbackLocaleIndex() const;
};
Q_DECLARE_TYPEINFO(QSystemLocale::QueryType, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(QSystemLocale::CurrencyToStringArgument, Q_MOVABLE_TYPE);
-#endif
+Q_DECLARE_TYPEINFO(QSystemLocale::CurrencyToStringArgument, Q_RELOCATABLE_TYPE);
#if QT_CONFIG(icu)
namespace QIcu {
@@ -148,50 +188,64 @@ namespace QIcu {
struct QLocaleId
{
- // bypass constructors
- static inline QLocaleId fromIds(ushort language, ushort script, ushort country)
+ [[nodiscard]] Q_AUTOTEST_EXPORT static QLocaleId fromName(QStringView name);
+ [[nodiscard]] inline bool operator==(QLocaleId other) const
+ { return language_id == other.language_id && script_id == other.script_id && territory_id == other.territory_id; }
+ [[nodiscard]] inline bool operator!=(QLocaleId other) const
+ { return !operator==(other); }
+ [[nodiscard]] inline bool isValid() const
{
- const QLocaleId localeId = { language, script, country };
- return localeId;
+ return language_id <= QLocale::LastLanguage && script_id <= QLocale::LastScript
+ && territory_id <= QLocale::LastTerritory;
+ }
+ [[nodiscard]] inline bool matchesAll() const
+ {
+ return !language_id && !script_id && !territory_id;
+ }
+ // Use as: filter.accept...(candidate)
+ [[nodiscard]] inline bool acceptLanguage(quint16 lang) const
+ {
+ // Always reject AnyLanguage (only used for last entry in locale_data array).
+ // So, when searching for AnyLanguage, accept everything *but* AnyLanguage.
+ return language_id ? lang == language_id : lang;
+ }
+ [[nodiscard]] inline bool acceptScriptTerritory(QLocaleId other) const
+ {
+ return (!territory_id || other.territory_id == territory_id)
+ && (!script_id || other.script_id == script_id);
}
- inline bool operator==(QLocaleId other) const
- { return language_id == other.language_id && script_id == other.script_id && country_id == other.country_id; }
- inline bool operator!=(QLocaleId other) const
- { return !operator==(other); }
-
- QLocaleId withLikelySubtagsAdded() const;
- QLocaleId withLikelySubtagsRemoved() const;
+ [[nodiscard]] QLocaleId withLikelySubtagsAdded() const;
+ [[nodiscard]] QLocaleId withLikelySubtagsRemoved() const;
- QByteArray name(char separator = '-') const;
+ [[nodiscard]] QByteArray name(char separator = '-') const;
- ushort language_id, script_id, country_id;
+ ushort language_id = 0, script_id = 0, territory_id = 0;
};
Q_DECLARE_TYPEINFO(QLocaleId, Q_PRIMITIVE_TYPE);
+
+using CharBuff = QVarLengthArray<char, 256>;
+
+struct ParsingResult
+{
+ enum State { // A duplicate of QValidator::State
+ Invalid,
+ Intermediate,
+ Acceptable
+ };
+
+ State state = Invalid;
+ CharBuff buff;
+};
+
struct QLocaleData
{
public:
- // TODO: Remove this?
- static const QLocaleData *findLocaleData(QLocale::Language language,
- QLocale::Script script,
- QLocale::Country country);
- // Having an offset of current locale, enables us to have multiple sources of data, i.e. user-provided calendar locales
- static uint findLocaleOffset(QLocale::Language language,
- QLocale::Script script,
- QLocale::Country country);
- static const QLocaleData *c();
-
- // Maximum number of significant digits needed to represent a double.
- // We cannot use std::numeric_limits here without constexpr.
- static const int DoubleMantissaBits = 53;
- static const int Log10_2_100000 = 30103; // log10(2) * 100000
- // same as C++11 std::numeric_limits<T>::max_digits10
- static const int DoubleMaxSignificant = (DoubleMantissaBits * Log10_2_100000) / 100000 + 2;
-
- // Maximum number of digits before decimal point to represent a double
- // Same as std::numeric_limits<double>::max_exponent10 + 1
- static const int DoubleMaxDigitsBeforeDecimal = 309;
+ // Having an index for each locale enables us to have diverse sources of
+ // data, e.g. calendar locales, as well as the main CLDR-derived data.
+ [[nodiscard]] static qsizetype findLocaleIndex(QLocaleId localeId);
+ [[nodiscard]] static const QLocaleData *c();
enum DoubleForm {
DFExponent = 0,
@@ -207,118 +261,164 @@ public:
LeftAdjusted = 0x04,
BlankBeforePositive = 0x08,
AlwaysShowSign = 0x10,
- ThousandsGroup = 0x20,
+ GroupDigits = 0x20,
CapitalEorX = 0x40,
ShowBase = 0x80,
UppercaseBase = 0x100,
ZeroPadExponent = 0x200,
- ForcePoint = 0x400,
- IndianNumberGrouping= 0x800
+ ForcePoint = 0x400
};
enum NumberMode { IntegerMode, DoubleStandardMode, DoubleScientificMode };
- typedef QVarLengthArray<char, 256> CharBuff;
-
- static QString doubleToString(const QString &zero, const QString &plus,
- const QString &minus, const QString &exponent,
- const QString &group, const QString &decimal,
- double d, int precision, DoubleForm form,
- int width, unsigned flags);
- static QString longLongToString(const QString &zero, const QString &group,
- const QString &plus, const QString &minus,
- qint64 l, int precision, int base,
- int width, unsigned flags);
- static QString unsLongLongToString(const QString &zero, const QString &group,
- const QString &plus,
- quint64 l, int precision,
- int base, int width, unsigned flags);
-
- QString doubleToString(double d,
- int precision = -1,
- DoubleForm form = DFSignificantDigits,
- int width = -1,
- unsigned flags = NoFlags) const;
- QString longLongToString(qint64 l, int precision = -1,
- int base = 10,
- int width = -1,
- unsigned flags = NoFlags) const;
- QString unsLongLongToString(quint64 l, int precision = -1,
- int base = 10,
- int width = -1,
- unsigned flags = NoFlags) const;
+private:
+ enum PrecisionMode {
+ PMDecimalDigits = 0x01,
+ PMSignificantDigits = 0x02,
+ PMChopTrailingZeros = 0x03
+ };
+
+ [[nodiscard]] QString decimalForm(QString &&digits, int decpt, int precision,
+ PrecisionMode pm, bool mustMarkDecimal,
+ bool groupDigits) const;
+ [[nodiscard]] QString exponentForm(QString &&digits, int decpt, int precision,
+ PrecisionMode pm, bool mustMarkDecimal,
+ int minExponentDigits) const;
+ [[nodiscard]] QString signPrefix(bool negative, unsigned flags) const;
+ [[nodiscard]] QString applyIntegerFormatting(QString &&numStr, bool negative, int precision,
+ int base, int width, unsigned flags) const;
+
+public:
+ [[nodiscard]] QString doubleToString(double d,
+ int precision = -1,
+ DoubleForm form = DFSignificantDigits,
+ int width = -1,
+ unsigned flags = NoFlags) const;
+ [[nodiscard]] QString longLongToString(qint64 l, int precision = -1,
+ int base = 10,
+ int width = -1,
+ unsigned flags = NoFlags) const;
+ [[nodiscard]] QString unsLongLongToString(quint64 l, int precision = -1,
+ int base = 10,
+ int width = -1,
+ unsigned flags = NoFlags) const;
// this function is meant to be called with the result of stringToDouble or bytearrayToDouble
- static float convertDoubleToFloat(double d, bool *ok)
+ // so *ok must have been properly set (if not null)
+ [[nodiscard]] static float convertDoubleToFloat(double d, bool *ok)
{
- if (qIsInf(d))
- return float(d);
- if (std::fabs(d) > std::numeric_limits<float>::max()) {
- if (ok)
- *ok = false;
- const float huge = std::numeric_limits<float>::infinity();
- return d < 0 ? -huge : huge;
- }
- if (d != 0 && float(d) == 0) {
- // Values that underflow double already failed. Match them:
- if (ok)
- *ok = false;
- return 0;
- }
- return float(d);
+ float result;
+ bool b = convertDoubleTo<float>(d, &result);
+ if (ok && *ok)
+ *ok = b;
+ return result;
}
- double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const;
- qint64 stringToLongLong(QStringView str, int base, bool *ok, QLocale::NumberOptions options) const;
- quint64 stringToUnsLongLong(QStringView str, int base, bool *ok, QLocale::NumberOptions options) const;
+ [[nodiscard]] double stringToDouble(QStringView str, bool *ok,
+ QLocale::NumberOptions options) const;
+ [[nodiscard]] QSimpleParsedNumber<qint64>
+ stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const;
+ [[nodiscard]] QSimpleParsedNumber<quint64>
+ stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const;
- static double bytearrayToDouble(const char *num, bool *ok);
// this function is used in QIntValidator (QtGui)
- Q_CORE_EXPORT static qint64 bytearrayToLongLong(const char *num, int base, bool *ok);
- static quint64 bytearrayToUnsLongLong(const char *num, int base, bool *ok);
+ [[nodiscard]] Q_CORE_EXPORT
+ static QSimpleParsedNumber<qint64> bytearrayToLongLong(QByteArrayView num, int base);
+ [[nodiscard]] static QSimpleParsedNumber<quint64>
+ bytearrayToUnsLongLong(QByteArrayView num, int base);
- bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
- CharBuff *result) const;
- inline char numericToCLocale(QStringView in) const;
+ [[nodiscard]] bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
+ NumberMode mode, CharBuff *result) const;
+
+ struct NumericData
+ {
+#ifndef QT_NO_SYSTEMLOCALE
+ // Only used for the system locale, to store data for the view to look at:
+ QString sysDecimal, sysGroup, sysMinus, sysPlus;
+#endif
+ QStringView decimal, group, minus, plus, exponent;
+ char32_t zeroUcs = 0;
+ qint8 zeroLen = 0;
+ bool isC = false; // C locale sets this and nothing else.
+ bool exponentCyrillic = false; // True only for floating-point parsing of Cyrillic.
+ void setZero(QStringView zero)
+ {
+ // No known locale has digits that are more than one Unicode
+ // code-point, so we can safely deal with digits as plain char32_t.
+ switch (zero.size()) {
+ case 1:
+ Q_ASSERT(!zero.at(0).isSurrogate());
+ zeroUcs = zero.at(0).unicode();
+ zeroLen = 1;
+ break;
+ case 2:
+ Q_ASSERT(zero.at(0).isHighSurrogate());
+ zeroUcs = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
+ zeroLen = 2;
+ break;
+ default:
+ Q_ASSERT(zero.size() == 0); // i.e. we got no value to use
+ break;
+ }
+ }
+ [[nodiscard]] bool isValid(NumberMode mode) const // Asserted as a sanity check.
+ {
+ if (isC)
+ return true;
+ if (exponentCyrillic && exponent != u"E" && exponent != u"\u0415")
+ return false;
+ return (zeroLen == 1 || zeroLen == 2) && zeroUcs > 0
+ && (mode == IntegerMode || !decimal.isEmpty())
+ // group may be empty (user config in system locale)
+ && !minus.isEmpty() && !plus.isEmpty()
+ && (mode != DoubleScientificMode || !exponent.isEmpty());
+ }
+ };
+ [[nodiscard]] inline NumericData numericData(NumberMode mode) const;
// this function is used in QIntValidator (QtGui)
- Q_CORE_EXPORT bool validateChars(QStringView str, NumberMode numMode, QByteArray *buff, int decDigits = -1,
- QLocale::NumberOptions number_options = QLocale::DefaultNumberOptions) const;
-
- QString decimalPoint() const;
- QString groupSeparator() const;
- QString listSeparator() const;
- QString percentSign() const;
- QString zeroDigit() const;
- uint zeroUcs() const;
- QString positiveSign() const;
- QString negativeSign() const;
- QString exponentSeparator() const;
+ [[nodiscard]] Q_CORE_EXPORT ParsingResult
+ validateChars(QStringView str, NumberMode numMode, int decDigits = -1,
+ QLocale::NumberOptions number_options = QLocale::DefaultNumberOptions) const;
+
+ // Access to assorted data members:
+ [[nodiscard]] QLocaleId id() const
+ { return QLocaleId { m_language_id, m_script_id, m_territory_id }; }
+
+ [[nodiscard]] QString decimalPoint() const;
+ [[nodiscard]] QString groupSeparator() const;
+ [[nodiscard]] QString listSeparator() const;
+ [[nodiscard]] QString percentSign() const;
+ [[nodiscard]] QString zeroDigit() const;
+ [[nodiscard]] char32_t zeroUcs() const;
+ [[nodiscard]] QString positiveSign() const;
+ [[nodiscard]] QString negativeSign() const;
+ [[nodiscard]] QString exponentSeparator() const;
struct DataRange
{
quint16 offset;
quint16 size;
- QString getData(const char16_t *table) const
+ [[nodiscard]] QString getData(const char16_t *table) const
{
return size > 0
? QString::fromRawData(reinterpret_cast<const QChar *>(table + offset), size)
: QString();
}
- QStringView viewData(const char16_t *table) const
+ [[nodiscard]] QStringView viewData(const char16_t *table) const
{
return { reinterpret_cast<const QChar *>(table + offset), size };
}
- QString getListEntry(const char16_t *table, int index) const
+ [[nodiscard]] QString getListEntry(const char16_t *table, qsizetype index) const
{
return listEntry(table, index).getData(table);
}
- QStringView viewListEntry(const char16_t *table, int index) const
+ [[nodiscard]] QStringView viewListEntry(const char16_t *table, qsizetype index) const
{
return listEntry(table, index).viewData(table);
}
- uint ucsFirst(const char16_t *table) const
+ [[nodiscard]] char32_t ucsFirst(const char16_t *table) const
{
if (size && !QChar::isSurrogate(table[offset]))
return table[offset];
@@ -327,7 +427,7 @@ public:
return 0;
}
private:
- DataRange listEntry(const char16_t *table, int index) const
+ [[nodiscard]] DataRange listEntry(const char16_t *table, qsizetype index) const
{
const char16_t separator = ';';
quint16 i = 0;
@@ -355,15 +455,15 @@ public:
X(byteCount) X(byteAmountSI) X(byteAmountIEC) \
X(currencySymbol) X(currencyDisplayName) \
X(currencyFormat) X(currencyFormatNegative) \
- X(endonymLanguage) X(endonymCountry)
+ X(endonymLanguage) X(endonymTerritory)
#define rangeGetter(name) \
- DataRange name() const { return { m_ ## name ## _idx, m_ ## name ## _size }; }
+ [[nodiscard]] DataRange name() const { return { m_ ## name ## _idx, m_ ## name ## _size }; }
ForEachQLocaleRange(rangeGetter)
#undef rangeGetter
public:
- quint16 m_language_id, m_script_id, m_country_id;
+ quint16 m_language_id, m_script_id, m_territory_id;
// Offsets, then sizes, for each range:
#define rangeIndex(name) quint16 m_ ## name ## _idx;
@@ -376,61 +476,66 @@ public:
#undef ForEachQLocaleRange
// Strays:
- char m_currency_iso_code[3];
- quint16 m_currency_digits : 2;
- quint16 m_currency_rounding : 3; // (not yet used !)
- quint16 m_first_day_of_week : 3;
- quint16 m_weekend_start : 3;
- quint16 m_weekend_end : 3;
+ char m_currency_iso_code[3];
+ quint8 m_currency_digits : 2;
+ quint8 m_currency_rounding : 3; // (not yet used !)
+ quint8 m_first_day_of_week : 3;
+ quint8 m_weekend_start : 3;
+ quint8 m_weekend_end : 3;
+ quint8 m_grouping_top : 2; // Don't group until more significant group has this many digits.
+ quint8 m_grouping_higher : 3; // Number of digits between grouping separators
+ quint8 m_grouping_least : 3; // Number of digits after last grouping separator (before decimal).
};
-class Q_CORE_EXPORT QLocalePrivate // A POD type
+class QLocalePrivate
{
public:
- static QLocalePrivate *create(
- const QLocaleData *data, const uint data_offset = 0,
- QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions)
- {
- auto *retval = new QLocalePrivate;
- retval->m_data = data;
- retval->ref.storeRelaxed(0);
- retval->m_data_offset = data_offset;
- retval->m_numberOptions = numberOptions;
- return retval;
- }
-
- static QLocalePrivate *get(QLocale &l) { return l.d; }
- static const QLocalePrivate *get(const QLocale &l) { return l.d; }
+ constexpr QLocalePrivate(const QLocaleData *data, qsizetype index,
+ QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions,
+ int refs = 0)
+ : m_data(data), ref Q_BASIC_ATOMIC_INITIALIZER(refs),
+ m_index(index), m_numberOptions(numberOptions) {}
- quint16 languageId() const { return m_data->m_language_id; }
- quint16 countryId() const { return m_data->m_country_id; }
+ [[nodiscard]] quint16 languageId() const { return m_data->m_language_id; }
+ [[nodiscard]] quint16 territoryId() const { return m_data->m_territory_id; }
- QByteArray bcp47Name(char separator = '-') const;
- QByteArray rawName(char separator = '-') const;
+ [[nodiscard]] QByteArray bcp47Name(char separator = '-') const;
- inline QLatin1String languageCode() const { return languageToCode(QLocale::Language(m_data->m_language_id)); }
- inline QLatin1String scriptCode() const { return scriptToCode(QLocale::Script(m_data->m_script_id)); }
- inline QLatin1String countryCode() const { return countryToCode(QLocale::Country(m_data->m_country_id)); }
-
- static QLatin1String languageToCode(QLocale::Language language);
- static QLatin1String scriptToCode(QLocale::Script script);
- static QLatin1String countryToCode(QLocale::Country country);
- static QLocale::Language codeToLanguage(QStringView code) noexcept;
- static QLocale::Script codeToScript(QStringView code) noexcept;
- static QLocale::Country codeToCountry(QStringView code) noexcept;
- static void getLangAndCountry(const QString &name, QLocale::Language &lang,
- QLocale::Script &script, QLocale::Country &cntry);
-
- QLocale::MeasurementSystem measurementSystem() const;
-
- const QLocaleData *m_data;
+ [[nodiscard]] inline std::array<char, 4>
+ languageCode(QLocale::LanguageCodeTypes codeTypes = QLocale::AnyLanguageCode) const
+ {
+ return languageToCode(QLocale::Language(m_data->m_language_id), codeTypes);
+ }
+ [[nodiscard]] inline QLatin1StringView scriptCode() const
+ { return scriptToCode(QLocale::Script(m_data->m_script_id)); }
+ [[nodiscard]] inline QLatin1StringView territoryCode() const
+ { return territoryToCode(QLocale::Territory(m_data->m_territory_id)); }
+
+ [[nodiscard]] static const QLocalePrivate *get(const QLocale &l) { return l.d; }
+ [[nodiscard]] static std::array<char, 4>
+ languageToCode(QLocale::Language language,
+ QLocale::LanguageCodeTypes codeTypes = QLocale::AnyLanguageCode);
+ [[nodiscard]] static QLatin1StringView scriptToCode(QLocale::Script script);
+ [[nodiscard]] static QLatin1StringView territoryToCode(QLocale::Territory territory);
+ [[nodiscard]] static QLocale::Language
+ codeToLanguage(QStringView code,
+ QLocale::LanguageCodeTypes codeTypes = QLocale::AnyLanguageCode) noexcept;
+ [[nodiscard]] static QLocale::Script codeToScript(QStringView code) noexcept;
+ [[nodiscard]] static QLocale::Territory codeToTerritory(QStringView code) noexcept;
+
+ [[nodiscard]] QLocale::MeasurementSystem measurementSystem() const;
+
+ // System locale has an m_data all its own; all others have m_data = locale_data + m_index
+ const QLocaleData *const m_data;
QBasicAtomicInt ref;
- uint m_data_offset;
+ qsizetype m_index; // System locale needs this updated when m_data->id() changes.
QLocale::NumberOptions m_numberOptions;
+
+ static QBasicAtomicInt s_generation;
};
#ifndef QT_NO_SYSTEMLOCALE
-const QLocaleData *QSystemLocale::fallbackUiLocaleData() const { return fallbackUiLocale().d->m_data; }
+qsizetype QSystemLocale::fallbackLocaleIndex() const { return fallbackLocale().d->m_index; }
#endif
template <>
@@ -438,87 +543,29 @@ inline QLocalePrivate *QSharedDataPointer<QLocalePrivate>::clone()
{
// cannot use QLocalePrivate's copy constructor
// since it is deleted in C++11
- return QLocalePrivate::create(d->m_data, d->m_data_offset, d->m_numberOptions);
+ return new QLocalePrivate(d->m_data, d->m_index, d->m_numberOptions);
}
-inline char QLocaleData::numericToCLocale(QStringView in) const
-{
- Q_ASSERT(in.size() == 1 || (in.size() == 2 && in.at(0).isHighSurrogate()));
-
- if (in == positiveSign() || in == u"+")
- return '+';
-
- if (in == negativeSign() || in == u"-" || in == u"\x2212")
- return '-';
-
- if (in == decimalPoint())
- return '.';
+// Also used to merely skip over an escape in a format string, advancint idx to
+// point after it (so not [[nodiscard]]):
+QString qt_readEscapedFormatString(QStringView format, qsizetype *idx);
+[[nodiscard]] bool qt_splitLocaleName(QStringView name, QStringView *lang = nullptr,
+ QStringView *script = nullptr, QStringView *cntry = nullptr);
+[[nodiscard]] qsizetype qt_repeatCount(QStringView s);
- if (in.compare(exponentSeparator(), Qt::CaseInsensitive) == 0)
- return 'e';
-
- const QString group = groupSeparator();
- if (in == group)
- return ',';
-
- // In several languages group() is a non-breaking space (U+00A0) or its thin
- // version (U+202f), which look like spaces. People (and thus some of our
- // tests) use a regular space instead and complain if it doesn't work.
- // Should this be extended generally to any case where group is a space ?
- if ((group == u"\xa0" || group == u"\x202f") && in == u" ")
- return ',';
-
- const uint zeroUcs4 = zeroUcs();
- const uint tenUcs4 = zeroUcs4 + 10;
- const uint inUcs4 = in.size() == 2
- ? QChar::surrogateToUcs4(in.at(0), in.at(1)) : in.at(0).unicode();
-
- if (zeroUcs4 <= inUcs4 && inUcs4 < tenUcs4)
- return '0' + inUcs4 - zeroUcs4;
-
- if ('0' <= inUcs4 && inUcs4 <= '9')
- return inUcs4;
-
- return 0;
-}
-
-QString qt_readEscapedFormatString(QStringView format, int *idx);
-bool qt_splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry);
-int qt_repeatCount(QStringView s);
-
-enum { AsciiSpaceMask = (1u << (' ' - 1)) |
- (1u << ('\t' - 1)) | // 9: HT - horizontal tab
- (1u << ('\n' - 1)) | // 10: LF - line feed
- (1u << ('\v' - 1)) | // 11: VT - vertical tab
- (1u << ('\f' - 1)) | // 12: FF - form feed
- (1u << ('\r' - 1)) }; // 13: CR - carriage return
-Q_DECL_CONSTEXPR inline bool ascii_isspace(uchar c)
+[[nodiscard]] constexpr inline bool ascii_isspace(uchar c)
{
- return c >= 1u && c <= 32u && (AsciiSpaceMask >> uint(c - 1)) & 1u;
+ constexpr auto matcher = QtPrivate::makeCharacterSetMatch<QtPrivate::ascii_space_chars>();
+ return matcher.matches(c);
}
-#if defined(Q_COMPILER_CONSTEXPR)
-static_assert(ascii_isspace(' '));
-static_assert(ascii_isspace('\t'));
-static_assert(ascii_isspace('\n'));
-static_assert(ascii_isspace('\v'));
-static_assert(ascii_isspace('\f'));
-static_assert(ascii_isspace('\r'));
-static_assert(!ascii_isspace('\0'));
-static_assert(!ascii_isspace('\a'));
-static_assert(!ascii_isspace('a'));
-static_assert(!ascii_isspace('\177'));
-static_assert(!ascii_isspace(uchar('\200')));
-static_assert(!ascii_isspace(uchar('\xA0')));
-static_assert(!ascii_isspace(uchar('\377')));
-#endif
-
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QStringView)
-Q_DECLARE_METATYPE(QList<Qt::DayOfWeek>)
+// ### move to qnamespace.h
+QT_DECL_METATYPE_EXTERN_TAGGED(QList<Qt::DayOfWeek>, QList_Qt__DayOfWeek, Q_CORE_EXPORT)
#ifndef QT_NO_SYSTEMLOCALE
-Q_DECLARE_METATYPE(QSystemLocale::CurrencyToStringArgument)
+QT_DECL_METATYPE_EXTERN_TAGGED(QSystemLocale::CurrencyToStringArgument,
+ QSystemLocale__CurrencyToStringArgument, Q_CORE_EXPORT)
#endif
#endif // QLOCALE_P_H
diff --git a/src/corelib/text/qlocale_tools.cpp b/src/corelib/text/qlocale_tools.cpp
index a1838add72..b6639bcb71 100644
--- a/src/corelib/text/qlocale_tools.cpp
+++ b/src/corelib/text/qlocale_tools.cpp
@@ -1,48 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qlocale_tools_p.h"
#include "qdoublescanprint_p.h"
#include "qlocale_p.h"
#include "qstring.h"
+#include <private/qtools_p.h>
#include <private/qnumeric_p.h>
#include <ctype.h>
@@ -53,6 +18,9 @@
#include <stdlib.h>
#include <time.h>
+#include <limits>
+#include <charconv>
+
#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
# include <fenv.h>
#endif
@@ -70,12 +38,12 @@
QT_BEGIN_NAMESPACE
-#include "../../3rdparty/freebsd/strtoull.c"
-#include "../../3rdparty/freebsd/strtoll.c"
+using namespace QtMiscUtils;
QT_CLOCALE_HOLDER
-void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
+void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision,
+ char *buf, qsizetype bufSize,
bool &sign, int &length, int &decpt)
{
if (bufSize == 0) {
@@ -86,9 +54,10 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
}
// Detect special numbers (nan, +/-inf)
- // We cannot use the high-level API of libdouble-conversion as we need to apply locale-specific
- // formatting, such as decimal points, thousands-separators, etc. Because of this, we have to
- // check for infinity and NaN before calling DoubleToAscii.
+ // We cannot use the high-level API of libdouble-conversion as we need to
+ // apply locale-specific formatting, such as decimal points, grouping
+ // separators, etc. Because of this, we have to check for infinity and NaN
+ // before calling DoubleToAscii.
if (qt_is_inf(d)) {
sign = d < 0;
if (bufSize >= 3) {
@@ -128,7 +97,12 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
} else {
mode = double_conversion::DoubleToStringConverter::FIXED;
}
- double_conversion::DoubleToStringConverter::DoubleToAscii(d, mode, precision, buf, bufSize,
+ // libDoubleConversion is limited to 32-bit lengths. It's ok to cap the buffer size,
+ // though, because the library will never write 2GiB of chars as output
+ // (the length out-parameter is just an int, too).
+ const auto boundedBufferSize = static_cast<int>((std::min)(bufSize, qsizetype(INT_MAX)));
+ double_conversion::DoubleToStringConverter::DoubleToAscii(d, mode, precision, buf,
+ boundedBufferSize,
&sign, &length, &decpt);
#else // QT_NO_DOUBLECONVERSION || QT_BOOTSTRAPPED
@@ -139,7 +113,7 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
if (precision > 999)
precision = 999;
else if (precision == QLocale::FloatingPointShortest)
- precision = QLocaleData::DoubleMaxSignificant; // "shortest" mode not supported by snprintf
+ precision = std::numeric_limits<double>::max_digits10; // snprintf lacks "shortest" mode
if (isZero(d)) {
// Negative zero is expected as simple "0", not "-0". We cannot do d < 0, though.
@@ -167,8 +141,8 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
switch (form) {
case QLocaleData::DFDecimal:
format[formatLength - 2] = 'f';
- // <anything> '.' <precision> '\0' - optimize for numbers smaller than 512k
- extraChars = (d > (1 << 19) ? QLocaleData::DoubleMaxDigitsBeforeDecimal : 6) + 2;
+ // <anything> '.' <precision> '\0'
+ extraChars = wholePartSpace(d) + 2;
break;
case QLocaleData::DFExponent:
format[formatLength - 2] = 'e';
@@ -220,11 +194,10 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
// which case the missing digits are zeroes. In the 'e' case decptInTarget is always 1,
// as variants of snprintf always generate numbers with one digit before the '.' then.
// This is why the final decimal point is offset by 1, relative to the number after 'e'.
- bool ok;
- const char *endptr;
- decpt = qstrtoll(target.data() + eSign + 1, &endptr, 10, &ok) + 1;
- Q_ASSERT(ok);
- Q_ASSERT(endptr - target.data() <= length);
+ auto r = qstrntoll(target.data() + eSign + 1, length - eSign - 1, 10);
+ decpt = r.result + 1;
+ Q_ASSERT(r.ok());
+ Q_ASSERT(r.used + eSign + 1 <= length);
} else {
// No 'e' found, so it's the 'f' form. Variants of snprintf generate numbers with
// potentially multiple digits before the '.', but without decimal exponent then. So we
@@ -277,43 +250,50 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
--length;
}
-double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
- StrayCharacterMode strayCharMode)
+QSimpleParsedNumber<double> qt_asciiToDouble(const char *num, qsizetype numLen,
+ StrayCharacterMode strayCharMode)
{
- if (*num == '\0') {
- ok = false;
- processed = 0;
- return 0.0;
- }
-
- ok = true;
+ if (numLen <= 0)
+ return {};
// We have to catch NaN before because we need NaN as marker for "garbage" in the
// libdouble-conversion case and, in contrast to libdouble-conversion or sscanf, we don't allow
// "-nan" or "+nan"
- if (qstrcmp(num, "nan") == 0) {
- processed = 3;
- return qt_qnan();
- } else if ((num[0] == '-' || num[0] == '+') && qstrcmp(num + 1, "nan") == 0) {
- processed = 0;
- ok = false;
- return 0.0;
- }
+ if (char c = *num; numLen >= 3
+ && (c == '-' || c == '+' || c == 'I' || c == 'i' || c == 'N' || c == 'n')) {
+ bool negative = (c == '-');
+ bool hasSign = negative || (c == '+');
+ qptrdiff offset = 0;
+ if (hasSign) {
+ offset = 1;
+ c = num[offset];
+ }
- // Infinity values are implementation defined in the sscanf case. In the libdouble-conversion
- // case we need infinity as overflow marker.
- if (qstrcmp(num, "+inf") == 0) {
- processed = 4;
- return qt_inf();
- } else if (qstrcmp(num, "inf") == 0) {
- processed = 3;
- return qt_inf();
- } else if (qstrcmp(num, "-inf") == 0) {
- processed = 4;
- return -qt_inf();
+ if (c > '9') {
+ auto lowered = [](char c) {
+ // this will mangle non-letters, but none can become a letter
+ return c | 0x20;
+ };
+
+ // Found a non-digit, so this MUST be either "inf", "+inf", "-inf"
+ // or "nan". Anything else is an invalid parse and we don't need to
+ // feed it to the converter below.
+ if (numLen != offset + 3)
+ return {};
+
+ c = lowered(c);
+ char c2 = lowered(num[offset + 1]);
+ char c3 = lowered(num[offset + 2]);
+ if (c == 'i' && c2 == 'n' && c3 == 'f')
+ return { negative ? -qt_inf() : qt_inf(), offset + 3 };
+ else if (c == 'n' && c2 == 'a' && c3 == 'n' && !hasSign)
+ return { qt_qnan(), 3 };
+ return {};
+ }
}
double d = 0.0;
+ int processed;
#if !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
int conv_flags = double_conversion::StringToDoubleConverter::NO_FLAGS;
if (strayCharMode == TrailingJunkAllowed) {
@@ -323,44 +303,49 @@ double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
| double_conversion::StringToDoubleConverter::ALLOW_TRAILING_SPACES;
}
double_conversion::StringToDoubleConverter conv(conv_flags, 0.0, qt_qnan(), nullptr, nullptr);
- d = conv.StringToDouble(num, numLen, &processed);
+ if (int(numLen) != numLen) {
+ // a number over 2 GB in length is silly, just assume it isn't valid
+ return {};
+ } else {
+ d = conv.StringToDouble(num, int(numLen), &processed);
+ }
- if (!qIsFinite(d)) {
- ok = false;
- if (qIsNaN(d)) {
+ if (!qt_is_finite(d)) {
+ if (qt_is_nan(d)) {
// Garbage found. We don't accept it and return 0.
- processed = 0;
- return 0.0;
+ return {};
} else {
// Overflow. That's not OK, but we still return infinity.
- return d;
+ return { d, -processed };
}
}
#else
- if (qDoubleSscanf(num, QT_CLOCALE, "%lf%n", &d, &processed) < 1)
+ // ::digits10 is 19, but ::max() is 18'446'744'073'709'551'615ULL - go, figure...
+ constexpr auto maxDigitsForULongLong = 1 + std::numeric_limits<unsigned long long>::digits10;
+ // need to ensure that we don't read more than numLen of input:
+ char fmt[1 + maxDigitsForULongLong + 4 + 1];
+ qsnprintf(fmt, sizeof fmt, "%s%llu%s", "%", static_cast<unsigned long long>(numLen), "lf%n");
+
+ if (qDoubleSscanf(num, QT_CLOCALE, fmt, &d, &processed) < 1)
processed = 0;
- if ((strayCharMode == TrailingJunkProhibited && processed != numLen) || qIsNaN(d)) {
+ if ((strayCharMode == TrailingJunkProhibited && processed != numLen) || qt_is_nan(d)) {
// Implementation defined nan symbol or garbage found. We don't accept it.
- processed = 0;
- ok = false;
- return 0.0;
+ return {};
}
- if (!qIsFinite(d)) {
+ if (!qt_is_finite(d)) {
// Overflow. Check for implementation-defined infinity symbols and reject them.
// We assume that any infinity symbol has to contain a character that cannot be part of a
// "normal" number (that is 0-9, ., -, +, e).
- ok = false;
for (int i = 0; i < processed; ++i) {
char c = num[i];
if ((c < '0' || c > '9') && c != '.' && c != '-' && c != '+' && c != 'e' && c != 'E') {
// Garbage found
- processed = 0;
- return 0.0;
+ return {};
}
}
- return d;
+ return { d, -processed };
}
#endif // !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
@@ -372,60 +357,164 @@ double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
for (int i = 0; i < processed; ++i) {
if (num[i] >= '1' && num[i] <= '9') {
// if a digit before any 'e' is not 0, then a non-zero number was intended.
- ok = false;
- return 0.0;
+ return {d, -processed};
} else if (num[i] == 'e' || num[i] == 'E') {
break;
}
}
}
- return d;
+ return { d, processed };
+}
+
+/* Detect base if 0 and, if base is hex or bin, skip over 0x/0b prefixes */
+static auto scanPrefix(const char *p, const char *stop, int base)
+{
+ struct R
+ {
+ const char *next;
+ int base;
+ };
+ if (p < stop && isAsciiDigit(*p)) {
+ if (*p == '0') {
+ const char *x_or_b = p + 1;
+ if (x_or_b < stop) {
+ switch (*x_or_b) {
+ case 'b':
+ case 'B':
+ if (base == 0)
+ base = 2;
+ if (base == 2)
+ p += 2;
+ return R{p, base};
+ case 'x':
+ case 'X':
+ if (base == 0)
+ base = 16;
+ if (base == 16)
+ p += 2;
+ return R{p, base};
+ }
+ }
+ if (base == 0)
+ base = 8;
+ } else if (base == 0) {
+ base = 10;
+ }
+ Q_ASSERT(base);
+ }
+ return R{p, base};
}
-unsigned long long
-qstrtoull(const char * nptr, const char **endptr, int base, bool *ok)
+static bool isDigitForBase(char d, int base)
{
- // strtoull accepts negative numbers. We don't.
- // Use a different variable so we pass the original nptr to strtoul
- // (we need that so endptr may be nptr in case of failure)
- const char *begin = nptr;
- while (ascii_isspace(*begin))
- ++begin;
- if (*begin == '-') {
- *ok = false;
- return 0;
+ if (d < '0')
+ return false;
+ if (d - '0' < qMin(base, 10))
+ return true;
+ if (base > 10) {
+ d |= 0x20; // tolower
+ return d >= 'a' && d < 'a' + base - 10;
}
+ return false;
+}
- *ok = true;
- errno = 0;
- char *endptr2 = nullptr;
- unsigned long long result = qt_strtoull(nptr, &endptr2, base);
- if (endptr)
- *endptr = endptr2;
- if ((result == 0 || result == std::numeric_limits<unsigned long long>::max())
- && (errno || endptr2 == nptr)) {
- *ok = false;
- return 0;
+QSimpleParsedNumber<qulonglong> qstrntoull(const char *begin, qsizetype size, int base)
+{
+ const char *p = begin, *const stop = begin + size;
+ while (p < stop && ascii_isspace(*p))
+ ++p;
+ unsigned long long result = 0;
+ if (p >= stop || *p == '-')
+ return { };
+ const auto prefix = scanPrefix(*p == '+' ? p + 1 : p, stop, base);
+ if (!prefix.base || prefix.next >= stop)
+ return { };
+
+ const auto res = std::from_chars(prefix.next, stop, result, prefix.base);
+ if (res.ec != std::errc{})
+ return { };
+ return { result, res.ptr == prefix.next ? 0 : res.ptr - begin };
+}
+
+QSimpleParsedNumber<qlonglong> qstrntoll(const char *begin, qsizetype size, int base)
+{
+ const char *p = begin, *const stop = begin + size;
+ while (p < stop && ascii_isspace(*p))
+ ++p;
+ // Frustratingly, std::from_chars() doesn't cope with a 0x prefix that might
+ // be between the sign and digits, so we have to handle that for it, which
+ // means we can't use its ability to read LLONG_MIN directly; see below.
+ const bool negate = p < stop && *p == '-';
+ if (negate || (p < stop && *p == '+'))
+ ++p;
+
+ const auto prefix = scanPrefix(p, stop, base);
+ // Must check for digit, as from_chars() will accept a sign, which would be
+ // a second sign, that we should reject.
+ if (!prefix.base || prefix.next >= stop || !isDigitForBase(*prefix.next, prefix.base))
+ return { };
+
+ long long result = 0;
+ auto res = std::from_chars(prefix.next, stop, result, prefix.base);
+ if (negate && res.ec == std::errc::result_out_of_range) {
+ // Maybe LLONG_MIN:
+ unsigned long long check = 0;
+ res = std::from_chars(prefix.next, stop, check, prefix.base);
+ if (res.ec == std::errc{} && check + std::numeric_limits<long long>::min() == 0)
+ return { std::numeric_limits<long long>::min(), res.ptr - begin };
+ return { };
}
- return result;
+ if (res.ec != std::errc{})
+ return { };
+ return { negate ? -result : result, res.ptr - begin };
}
-long long
-qstrtoll(const char * nptr, const char **endptr, int base, bool *ok)
+template <typename Char>
+static Q_ALWAYS_INLINE void qulltoString_helper(qulonglong number, int base, Char *&p)
{
- *ok = true;
- errno = 0;
- char *endptr2 = nullptr;
- long long result = qt_strtoll(nptr, &endptr2, base);
- if (endptr)
- *endptr = endptr2;
- if ((result == 0 || result == std::numeric_limits<long long>::min()
- || result == std::numeric_limits<long long>::max())
- && (errno || nptr == endptr2)) {
- *ok = false;
- return 0;
+ // Performance-optimized code. Compiler can generate faster code when base is known.
+ switch (base) {
+#define BIG_BASE_LOOP(b) \
+ do { \
+ const int r = number % b; \
+ *--p = Char((r < 10 ? '0' : 'a' - 10) + r); \
+ number /= b; \
+ } while (number)
+#ifndef __OPTIMIZE_SIZE__
+# define SMALL_BASE_LOOP(b) \
+ do { \
+ *--p = Char('0' + number % b); \
+ number /= b; \
+ } while (number)
+
+ case 2: SMALL_BASE_LOOP(2); break;
+ case 8: SMALL_BASE_LOOP(8); break;
+ case 10: SMALL_BASE_LOOP(10); break;
+ case 16: BIG_BASE_LOOP(16); break;
+#undef SMALL_BASE_LOOP
+#endif
+ default: BIG_BASE_LOOP(base); break;
+#undef BIG_BASE_LOOP
}
- return result;
+}
+
+// This is technically "qulonglong to ascii", but that name's taken
+QString qulltoBasicLatin(qulonglong number, int base, bool negative)
+{
+ if (number == 0)
+ return QStringLiteral("0");
+ // Length of MIN_LLONG with the sign in front is 65; we never need surrogate pairs.
+ // We do not need a terminator.
+ const unsigned maxlen = 65;
+ static_assert(CHAR_BIT * sizeof(number) + 1 <= maxlen);
+ char16_t buff[maxlen];
+ char16_t *const end = buff + maxlen, *p = end;
+
+ qulltoString_helper<char16_t>(number, base, p);
+ if (negative)
+ *--p = u'-';
+
+ return QString(reinterpret_cast<QChar *>(p), end - p);
}
QString qulltoa(qulonglong number, int base, const QStringView zero)
@@ -434,144 +523,50 @@ QString qulltoa(qulonglong number, int base, const QStringView zero)
// per digit. We do not need a terminator.
const unsigned maxlen = 128;
static_assert(CHAR_BIT * sizeof(number) <= maxlen);
- ushort buff[maxlen];
- ushort *const end = buff + maxlen, *p = end;
+ char16_t buff[maxlen];
+ char16_t *const end = buff + maxlen, *p = end;
if (base != 10 || zero == u"0") {
- while (number != 0) {
- int c = number % base;
- *--p = c < 10 ? '0' + c : c - 10 + 'a';
- number /= base;
- }
+ qulltoString_helper<char16_t>(number, base, p);
} else if (zero.size() && !zero.at(0).isSurrogate()) {
- const ushort zeroUcs4 = zero.at(0).unicode();
+ const char16_t zeroUcs2 = zero.at(0).unicode();
while (number != 0) {
- *(--p) = zeroUcs4 + number % base;
+ *(--p) = unicodeForDigit(number % base, zeroUcs2);
number /= base;
}
} else if (zero.size() == 2 && zero.at(0).isHighSurrogate()) {
- const uint zeroUcs4 = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
+ const char32_t zeroUcs4 = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
while (number != 0) {
- const uint digit = zeroUcs4 + number % base;
+ const char32_t digit = unicodeForDigit(number % base, zeroUcs4);
*(--p) = QChar::lowSurrogate(digit);
*(--p) = QChar::highSurrogate(digit);
number /= base;
}
- } else {
- return QString();
+ } else { // zero should always be either a non-surrogate or a surrogate pair:
+ Q_UNREACHABLE_RETURN(QString());
}
return QString(reinterpret_cast<QChar *>(p), end - p);
}
-QString &decimalForm(const QString &zero, const QString &decimal, const QString &group,
- QString &digits, int decpt, int precision,
- PrecisionMode pm,
- bool always_show_decpt,
- bool thousands_group)
-{
- const auto digitWidth = zero.size();
- Q_ASSERT(digitWidth == 1 || digitWidth == 2);
- Q_ASSERT(digits.size() % digitWidth == 0);
-
- if (decpt < 0) {
- for (int i = 0; i < -decpt; ++i)
- digits.prepend(zero);
- decpt = 0;
- } else {
- for (int i = digits.length() / digitWidth; i < decpt; ++i)
- digits.append(zero);
- }
-
- switch (pm) {
- case PMDecimalDigits:
- for (int i = digits.length() / digitWidth - decpt; i < precision; ++i)
- digits.append(zero);
- break;
- case PMSignificantDigits:
- for (int i = digits.length() / digitWidth; i < precision; ++i)
- digits.append(zero);
- break;
- case PMChopTrailingZeros:
- break;
- }
-
- if (always_show_decpt || decpt < digits.length() / digitWidth)
- digits.insert(decpt * digitWidth, decimal);
-
- // FIXME: they're not simply thousands separators !
- // Need to mirror IndianNumberGrouping code in QLocaleData::longLongToString()
- if (thousands_group) {
- for (int i = decpt - 3; i > 0; i -= 3)
- digits.insert(i * digitWidth, group);
- }
-
- if (decpt == 0)
- digits.prepend(zero);
-
- return digits;
-}
-
-QString &exponentForm(const QString &zero, const QString &decimal, const QString &exponential,
- const QString &group, const QString &plus, const QString &minus,
- QString &digits, int decpt, int precision,
- PrecisionMode pm,
- bool always_show_decpt,
- bool leading_zero_in_exponent)
-{
- const auto digitWidth = zero.size();
- Q_ASSERT(digitWidth == 1 || digitWidth == 2);
- Q_ASSERT(digits.size() % digitWidth == 0);
-
- switch (pm) {
- case PMDecimalDigits:
- for (int i = digits.length() / digitWidth; i < precision + 1; ++i)
- digits.append(zero);
- break;
- case PMSignificantDigits:
- for (int i = digits.length() / digitWidth; i < precision; ++i)
- digits.append(zero);
- break;
- case PMChopTrailingZeros:
- break;
- }
-
- if (always_show_decpt || digits.length() > digitWidth)
- digits.insert(digitWidth, decimal);
-
- digits.append(exponential);
- digits.append(QLocaleData::longLongToString(zero, group, plus, minus, decpt - 1,
- leading_zero_in_exponent ? 2 : 1,
- 10, -1, QLocaleData::AlwaysShowSign));
-
- return digits;
-}
-
-double qstrtod(const char *s00, const char **se, bool *ok)
-{
- const int len = static_cast<int>(strlen(s00));
- Q_ASSERT(len >= 0);
- return qstrntod(s00, len, se, ok);
-}
-
/*!
\internal
- Converts the initial portion of the string pointed to by \a s00 to a double, using the 'C' locale.
+ Converts the initial portion of the string pointed to by \a s00 to a double,
+ using the 'C' locale. The function sets the pointer pointed to by \a se to
+ point to the character past the last character converted.
*/
-double qstrntod(const char *s00, int len, const char **se, bool *ok)
+double qstrntod(const char *s00, qsizetype len, const char **se, bool *ok)
{
- int processed = 0;
- bool nonNullOk = false;
- double d = qt_asciiToDouble(s00, len, nonNullOk, processed, TrailingJunkAllowed);
+ auto r = qt_asciiToDouble(s00, len, TrailingJunkAllowed);
if (se)
- *se = s00 + processed;
+ *se = s00 + (r.used < 0 ? -r.used : r.used);
if (ok)
- *ok = nonNullOk;
- return d;
+ *ok = r.ok();
+ return r.result;
}
QString qdtoa(qreal d, int *decpt, int *sign)
@@ -581,16 +576,223 @@ QString qdtoa(qreal d, int *decpt, int *sign)
int length = 0;
// Some versions of libdouble-conversion like an extra digit, probably for '\0'
- char result[QLocaleData::DoubleMaxSignificant + 1];
- qt_doubleToAscii(d, QLocaleData::DFSignificantDigits, QLocale::FloatingPointShortest, result,
- QLocaleData::DoubleMaxSignificant + 1, nonNullSign, length, nonNullDecpt);
+ constexpr qsizetype digits = std::numeric_limits<double>::max_digits10 + 1;
+ char result[digits];
+ qt_doubleToAscii(d, QLocaleData::DFSignificantDigits, QLocale::FloatingPointShortest,
+ result, digits, nonNullSign, length, nonNullDecpt);
if (sign)
*sign = nonNullSign ? 1 : 0;
if (decpt)
*decpt = nonNullDecpt;
- return QLatin1String(result, length);
+ return QLatin1StringView(result, length);
+}
+
+static QLocaleData::DoubleForm resolveFormat(int precision, int decpt, qsizetype length)
+{
+ bool useDecimal;
+ if (precision == QLocale::FloatingPointShortest) {
+ // Find out which representation is shorter.
+ // Set bias to everything added to exponent form but not
+ // decimal, minus the converse.
+
+ // Exponent adds separator, sign and two exponents:
+ int bias = 2 + 2;
+ if (length <= decpt && length > 1)
+ ++bias;
+ else if (length == 1 && decpt <= 0)
+ --bias;
+
+ // When 0 < decpt <= length, the forms have equal digit
+ // counts, plus things bias has taken into account;
+ // otherwise decimal form's digit count is right-padded with
+ // zeros to decpt, when decpt is positive, otherwise it's
+ // left-padded with 1 - decpt zeros.
+ if (decpt <= 0)
+ useDecimal = 1 - decpt <= bias;
+ else if (decpt <= length)
+ useDecimal = true;
+ else
+ useDecimal = decpt <= length + bias;
+ } else {
+ // X == decpt - 1, POSIX's P; -4 <= X < P iff -4 < decpt <= P
+ Q_ASSERT(precision >= 0);
+ useDecimal = decpt > -4 && decpt <= (precision ? precision : 1);
+ }
+ return useDecimal ? QLocaleData::DFDecimal : QLocaleData::DFExponent;
+}
+
+static constexpr int digits(int number)
+{
+ Q_ASSERT(number >= 0);
+ if (Q_LIKELY(number < 1000))
+ return number < 10 ? 1 : number < 100 ? 2 : 3;
+ int i = 3;
+ for (number /= 1000; number; number /= 10)
+ ++i;
+ return i;
+}
+
+// Used generically for both QString and QByteArray
+template <typename T>
+static T dtoString(double d, QLocaleData::DoubleForm form, int precision, bool uppercase)
+{
+ // Undocumented: aside from F.P.Shortest, precision < 0 is treated as
+ // default, 6 - same as printf().
+ if (precision != QLocale::FloatingPointShortest && precision < 0)
+ precision = 6;
+
+ using D = std::numeric_limits<double>;
+ // 1 is for the null-terminator
+ constexpr int MaxDigits = 1 + qMax(D::max_exponent10, D::digits10 - D::min_exponent10);
+
+ // "maxDigits" above is a reasonable estimate, though we may need more due to extra precision
+ int bufSize = 1;
+ if (precision == QLocale::FloatingPointShortest)
+ bufSize += D::max_digits10;
+ else if (form == QLocaleData::DFDecimal && qt_is_finite(d))
+ bufSize += wholePartSpace(qAbs(d)) + precision;
+ else // Add extra digit due to different interpretations of precision.
+ bufSize += qMax(2, precision) + 1; // Must also be big enough for "nan" or "inf"
+
+ // Reserve `MaxDigits` on the stack, which is a reasonable estimate;
+ // but we may need more due to extra precision, which we cannot know at compile-time.
+ QVarLengthArray<char, MaxDigits> buffer(bufSize);
+ bool negative = false;
+ int length = 0;
+ int decpt = 0;
+ qt_doubleToAscii(d, form, precision, buffer.data(), buffer.size(), negative, length, decpt);
+ QLatin1StringView view(buffer.data(), length);
+ const bool succinct = form == QLocaleData::DFSignificantDigits;
+ qsizetype total = (negative ? 1 : 0) + length;
+ if (qt_is_finite(d)) {
+ if (succinct)
+ form = resolveFormat(precision, decpt, view.size());
+
+ switch (form) {
+ case QLocaleData::DFExponent:
+ total += 3; // (.e+) The '.' may not be needed, but we would only overestimate by 1 char
+ // Exponents: we guarantee at least 2
+ total += std::max(2, digits(std::abs(decpt - 1)));
+ // "length - 1" because one of the digits will always be before the decimal point
+ if (int extraPrecision = precision - (length - 1); extraPrecision > 0 && !succinct)
+ total += extraPrecision; // some requested zero-padding
+ break;
+ case QLocaleData::DFDecimal:
+ if (decpt <= 0) // leading "0." and zeros
+ total += 2 - decpt;
+ else if (decpt < length) // just the dot
+ total += 1;
+ else // trailing zeros (and no dot, unless we require extra precision):
+ total += decpt - length;
+
+ if (precision > 0 && !succinct) {
+ // May need trailing zeros to satisfy precision:
+ if (decpt < length)
+ total += std::max(0, precision - length + decpt);
+ else // and a dot to separate them:
+ total += 1 + precision;
+ }
+ break;
+ case QLocaleData::DFSignificantDigits:
+ Q_UNREACHABLE(); // Handled earlier
+ }
+ }
+
+ constexpr bool IsQString = std::is_same_v<T, QString>;
+ using Char = std::conditional_t<IsQString, char16_t, char>;
+
+ T result;
+ result.reserve(total);
+
+ if (negative && !isZero(d)) // We don't return "-0"
+ result.append(Char('-'));
+ if (!qt_is_finite(d)) {
+ result.append(view);
+ if (uppercase)
+ result = std::move(result).toUpper();
+ } else {
+ switch (form) {
+ case QLocaleData::DFExponent: {
+ result.append(view.first(1));
+ view = view.sliced(1);
+ if (!view.isEmpty() || (!succinct && precision > 0)) {
+ result.append(Char('.'));
+ result.append(view);
+ if (qsizetype pad = precision - view.size(); !succinct && pad > 0) {
+ for (int i = 0; i < pad; ++i)
+ result.append(Char('0'));
+ }
+ }
+ int exponent = decpt - 1;
+ result.append(Char(uppercase ? 'E' : 'e'));
+ result.append(Char(exponent < 0 ? '-' : '+'));
+ exponent = std::abs(exponent);
+ Q_ASSERT(exponent <= D::max_exponent10 + D::max_digits10);
+ int exponentDigits = digits(exponent);
+ // C's printf guarantees a two-digit exponent, and so do we:
+ if (exponentDigits == 1)
+ result.append(Char('0'));
+ result.resize(result.size() + exponentDigits);
+ auto location = reinterpret_cast<Char *>(result.end());
+ qulltoString_helper<Char>(exponent, 10, location);
+ break;
+ }
+ case QLocaleData::DFDecimal:
+ if (decpt < 0) {
+ if constexpr (IsQString)
+ result.append(u"0.0");
+ else
+ result.append("0.0");
+ while (++decpt < 0)
+ result.append(Char('0'));
+ result.append(view);
+ if (!succinct) {
+ auto numDecimals = result.size() - 2 - (negative ? 1 : 0);
+ for (qsizetype i = numDecimals; i < precision; ++i)
+ result.append(Char('0'));
+ }
+ } else {
+ if (decpt > view.size()) {
+ result.append(view);
+ const int sign = negative ? 1 : 0;
+ while (result.size() - sign < decpt)
+ result.append(Char('0'));
+ view = {};
+ } else if (decpt) {
+ result.append(view.first(decpt));
+ view = view.sliced(decpt);
+ } else {
+ result.append(Char('0'));
+ }
+ if (!view.isEmpty() || (!succinct && view.size() < precision)) {
+ result.append(Char('.'));
+ result.append(view);
+ if (!succinct) {
+ for (qsizetype i = view.size(); i < precision; ++i)
+ result.append(Char('0'));
+ }
+ }
+ }
+ break;
+ case QLocaleData::DFSignificantDigits:
+ Q_UNREACHABLE(); // taken care of earlier
+ break;
+ }
+ }
+ Q_ASSERT(total >= result.size()); // No reallocations are needed
+ return result;
+}
+
+QString qdtoBasicLatin(double d, QLocaleData::DoubleForm form, int precision, bool uppercase)
+{
+ return dtoString<QString>(d, form, precision, uppercase);
+}
+
+QByteArray qdtoAscii(double d, QLocaleData::DoubleForm form, int precision, bool uppercase)
+{
+ return dtoString<QByteArray>(d, form, precision, uppercase);
}
QT_END_NAMESPACE
diff --git a/src/corelib/text/qlocale_tools_p.h b/src/corelib/text/qlocale_tools_p.h
index f04c4512c0..9b02403ea4 100644
--- a/src/corelib/text/qlocale_tools_p.h
+++ b/src/corelib/text/qlocale_tools_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOCALE_TOOLS_P_H
#define QLOCALE_TOOLS_P_H
@@ -62,46 +26,65 @@ enum StrayCharacterMode {
WhitespacesAllowed
};
-double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
- StrayCharacterMode strayCharMode = TrailingJunkProhibited);
-void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
+// API note: this function can't process a number with more than 2.1 billion digits
+[[nodiscard]] QSimpleParsedNumber<double>
+qt_asciiToDouble(const char *num, qsizetype numLen,
+ StrayCharacterMode strayCharMode = TrailingJunkProhibited);
+void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision,
+ char *buf, qsizetype bufSize,
bool &sign, int &length, int &decpt);
-QString qulltoa(qulonglong l, int base, const QStringView zero);
-Q_CORE_EXPORT QString qdtoa(qreal d, int *decpt, int *sign);
+[[nodiscard]] QString qulltoBasicLatin(qulonglong l, int base, bool negative);
+[[nodiscard]] QString qulltoa(qulonglong l, int base, const QStringView zero);
+[[nodiscard]] Q_CORE_EXPORT QString qdtoa(qreal d, int *decpt, int *sign);
+[[nodiscard]] QString qdtoBasicLatin(double d, QLocaleData::DoubleForm form,
+ int precision, bool uppercase);
+[[nodiscard]] QByteArray qdtoAscii(double d, QLocaleData::DoubleForm form,
+ int precision, bool uppercase);
-enum PrecisionMode {
- PMDecimalDigits = 0x01,
- PMSignificantDigits = 0x02,
- PMChopTrailingZeros = 0x03
-};
+[[nodiscard]] constexpr inline bool isZero(double d)
+{
+ return d == 0; // Amusingly, compilers do not grumble.
+}
+
+// Enough space for the digits before the decimal separator:
+[[nodiscard]] inline int wholePartSpace(double d)
+{
+ Q_ASSERT(d >= 0); // caller should call qAbs() if needed
+ // Optimize for numbers between -512k and 512k - otherwise, use the
+ // maximum number of digits in the whole number part of a double:
+ return d > (1 << 19) ? std::numeric_limits<double>::max_exponent10 + 1 : 6;
+}
+
+// Returns code-point of same kind (UCS2 or UCS4) as zero; digit is 0 through 9
+template <typename UcsInt>
+[[nodiscard]] inline UcsInt unicodeForDigit(uint digit, UcsInt zero)
+{
+ // Must match qlocale.cpp's NumberTokenizer's digit-digestion.
+ Q_ASSERT(digit < 10);
+ if (!digit)
+ return zero;
+
+ // See QTBUG-85409: Suzhou's digits are U+3007, U+3021, ..., U+3029
+ if (zero == u'\u3007')
+ return u'\u3020' + digit;
+ // In util/locale_database/ldml.py, LocaleScanner.numericData() asserts no
+ // other number system in CLDR has discontinuous digits.
+
+ return zero + digit;
+}
-QString &decimalForm(const QString &zero, const QString &decimal, const QString &group,
- QString &digits, int decpt, int precision,
- PrecisionMode pm,
- bool always_show_decpt,
- bool thousands_group);
-QString &exponentForm(const QString &zero, const QString &decimal, const QString &exponential,
- const QString &group, const QString &plus, const QString &minus,
- QString &digits, int decpt, int precision,
- PrecisionMode pm,
- bool always_show_decpt,
- bool leading_zero_in_exponent);
-
-inline bool isZero(double d)
+[[nodiscard]] Q_CORE_EXPORT double qstrntod(const char *s00, qsizetype len,
+ char const **se, bool *ok);
+[[nodiscard]] inline double qstrtod(const char *s00, char const **se, bool *ok)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return !(ch[0] & 0x7F || ch[1] || ch[2] || ch[3] || ch[4] || ch[5] || ch[6] || ch[7]);
- } else {
- return !(ch[7] & 0x7F || ch[6] || ch[5] || ch[4] || ch[3] || ch[2] || ch[1] || ch[0]);
- }
+ qsizetype len = qsizetype(strlen(s00));
+ return qstrntod(s00, len, se, ok);
}
-Q_CORE_EXPORT double qstrtod(const char *s00, char const **se, bool *ok);
-Q_CORE_EXPORT double qstrntod(const char *s00, int len, char const **se, bool *ok);
-qlonglong qstrtoll(const char *nptr, const char **endptr, int base, bool *ok);
-qulonglong qstrtoull(const char *nptr, const char **endptr, int base, bool *ok);
+[[nodiscard]] Q_AUTOTEST_EXPORT
+QSimpleParsedNumber<qlonglong> qstrntoll(const char *nptr, qsizetype size, int base);
+[[nodiscard]] QSimpleParsedNumber<qulonglong> qstrntoull(const char *nptr, qsizetype size, int base);
QT_END_NAMESPACE
diff --git a/src/corelib/text/qlocale_unix.cpp b/src/corelib/text/qlocale_unix.cpp
index 51b23f1559..a934f24c01 100644
--- a/src/corelib/text/qlocale_unix.cpp
+++ b/src/corelib/text/qlocale_unix.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qlocale_p.h"
@@ -47,6 +11,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
#ifndef QT_NO_SYSTEMLOCALE
struct QSystemLocaleData
{
@@ -77,6 +43,8 @@ void QSystemLocaleData::readEnvironment()
{
QWriteLocker locker(&lock);
+ // See https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_02
+ // for the semantics of each of these:
QByteArray all = qgetenv("LC_ALL");
QByteArray numeric = all.isEmpty() ? qgetenv("LC_NUMERIC") : all;
QByteArray time = all.isEmpty() ? qgetenv("LC_TIME") : all;
@@ -111,7 +79,7 @@ Q_GLOBAL_STATIC(QSystemLocaleData, qSystemLocaleData)
#ifndef QT_NO_SYSTEMLOCALE
-static bool contradicts(const QString &maybe, const QString &known)
+static bool contradicts(QStringView maybe, const QString &known)
{
if (maybe.isEmpty())
return false;
@@ -128,17 +96,12 @@ static bool contradicts(const QString &maybe, const QString &known)
Belarusian. There are many more such prefixings between two- and
three-letter codes.)
*/
- QLocale::Language langm, langk;
- QLocale::Script scriptm, scriptk;
- QLocale::Country landm, landk;
- QLocalePrivate::getLangAndCountry(maybe, langm, scriptm, landm);
- QLocalePrivate::getLangAndCountry(known, langk, scriptk, landk);
- return (langm != QLocale::AnyLanguage && langm != langk)
- || (scriptm != QLocale::AnyScript && scriptm != scriptk)
- || (landm != QLocale::AnyCountry && landm != landk);
+ QLocaleId knownId = QLocaleId::fromName(known);
+ QLocaleId maybeId = QLocaleId::fromName(maybe);
+ return !(maybeId.acceptLanguage(knownId.language_id) && maybeId.acceptScriptTerritory(knownId));
}
-QLocale QSystemLocale::fallbackUiLocale() const
+QLocale QSystemLocale::fallbackLocale() const
{
// See man 7 locale for precedence - LC_ALL beats LC_MESSAGES beats LANG:
QString lang = qEnvironmentVariable("LC_ALL");
@@ -147,22 +110,21 @@ QLocale QSystemLocale::fallbackUiLocale() const
if (lang.isEmpty())
lang = qEnvironmentVariable("LANG");
// if the locale is the "C" locale, then we can return the language we found here:
- if (lang.isEmpty() || lang == QLatin1String("C") || lang == QLatin1String("POSIX"))
+ if (lang.isEmpty() || lang == "C"_L1 || lang == "POSIX"_L1)
return QLocale(lang);
// ... otherwise, if the first part of LANGUAGE says more than or
// contradicts what we have, use that:
- QString language = qEnvironmentVariable("LANGUAGE");
- if (!language.isEmpty()) {
- language = language.split(QLatin1Char(':')).constFirst();
+ for (const auto &language : qEnvironmentVariable("LANGUAGE").tokenize(u':')) {
if (contradicts(language, lang))
return QLocale(language);
+ break; // We only look at the first entry.
}
return QLocale(lang);
}
-QVariant QSystemLocale::query(QueryType type, QVariant in) const
+QVariant QSystemLocale::query(QueryType type, QVariant &&in) const
{
QSystemLocaleData *d = qSystemLocaleData();
@@ -199,14 +161,26 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
return lc_time.dayName(in.toInt(), QLocale::LongFormat);
case DayNameShort:
return lc_time.dayName(in.toInt(), QLocale::ShortFormat);
+ case DayNameNarrow:
+ return lc_time.dayName(in.toInt(), QLocale::NarrowFormat);
+ case StandaloneDayNameLong:
+ return lc_time.standaloneDayName(in.toInt(), QLocale::LongFormat);
+ case StandaloneDayNameShort:
+ return lc_time.standaloneDayName(in.toInt(), QLocale::ShortFormat);
+ case StandaloneDayNameNarrow:
+ return lc_time.standaloneDayName(in.toInt(), QLocale::NarrowFormat);
case MonthNameLong:
return lc_time.monthName(in.toInt(), QLocale::LongFormat);
case MonthNameShort:
return lc_time.monthName(in.toInt(), QLocale::ShortFormat);
+ case MonthNameNarrow:
+ return lc_time.monthName(in.toInt(), QLocale::NarrowFormat);
case StandaloneMonthNameLong:
return lc_time.standaloneMonthName(in.toInt(), QLocale::LongFormat);
case StandaloneMonthNameShort:
return lc_time.standaloneMonthName(in.toInt(), QLocale::ShortFormat);
+ case StandaloneMonthNameNarrow:
+ return lc_time.standaloneMonthName(in.toInt(), QLocale::NarrowFormat);
case DateToStringLong:
return lc_time.toString(in.toDate(), QLocale::LongFormat);
case DateToStringShort:
@@ -252,9 +226,9 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
}
case MeasurementSystem: {
const QString meas_locale = QString::fromLatin1(d->lc_measurement_var);
- if (meas_locale.compare(QLatin1String("Metric"), Qt::CaseInsensitive) == 0)
+ if (meas_locale.compare("Metric"_L1, Qt::CaseInsensitive) == 0)
return QLocale::MetricSystem;
- if (meas_locale.compare(QLatin1String("Other"), Qt::CaseInsensitive) == 0)
+ if (meas_locale.compare("Other"_L1, Qt::CaseInsensitive) == 0)
return QLocale::MetricSystem;
return QVariant((int)QLocale(meas_locale).measurementSystem());
}
@@ -268,28 +242,31 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
if (languages.isEmpty())
lst.append(QString::fromLatin1(d->lc_messages_var));
else
- lst = languages.split(QLatin1Char(':'));
+ lst = languages.split(u':');
- for (int i = 0; i < lst.size(); ++i) {
- const QString &name = lst.at(i);
- QString lang, script, cntry;
- if (qt_splitLocaleName(name, lang, script, cntry)) {
- if (!cntry.length())
- d->uiLanguages.append(lang);
- else
- d->uiLanguages.append(lang % QLatin1Char('-') % cntry);
+ for (const QString &e : std::as_const(lst)) {
+ QStringView language, script, territory;
+ if (qt_splitLocaleName(e, &language, &script, &territory)) {
+ QString joined = language.isEmpty() ? u"und"_s : language.toString();
+ if (!script.isEmpty())
+ joined += u'-' + script;
+ if (!territory.isEmpty())
+ joined += u'-' + territory;
+ d->uiLanguages.append(joined);
}
}
return d->uiLanguages.isEmpty() ? QVariant() : QVariant(d->uiLanguages);
}
case StringToStandardQuotation:
- return lc_messages.quoteString(qvariant_cast<QStringView>(in));
+ return lc_messages.quoteString(qvariant_cast<QStringView>(std::move(in)));
case StringToAlternateQuotation:
- return lc_messages.quoteString(qvariant_cast<QStringView>(in), QLocale::AlternateQuotation);
+ return lc_messages.quoteString(qvariant_cast<QStringView>(std::move(in)),
+ QLocale::AlternateQuotation);
case ListToSeparatedString:
return lc_messages.createSeparatedList(in.toStringList());
case LocaleChanged:
Q_ASSERT(false);
+ [[fallthrough]];
default:
break;
}
diff --git a/src/corelib/text/qlocale_wasm.cpp b/src/corelib/text/qlocale_wasm.cpp
new file mode 100644
index 0000000000..6b011af4a7
--- /dev/null
+++ b/src/corelib/text/qlocale_wasm.cpp
@@ -0,0 +1,54 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qlocale_p.h"
+
+#include <emscripten/val.h>
+
+#include <string>
+#include <vector>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_SYSTEMLOCALE
+
+namespace {
+
+QStringList navigatorLanguages()
+{
+ using emscripten::val;
+ const val navigator = val::global("navigator");
+ const auto languages = emscripten::vecFromJSArray<std::string>(navigator["languages"]);
+ QStringList qtLanguages;
+ for (const std::string& language : languages)
+ qtLanguages.append(QString::fromStdString(language));
+ return qtLanguages;
+}
+
+}
+
+QVariant QSystemLocale::query(QueryType query, QVariant &&in) const
+{
+ Q_UNUSED(in);
+
+ switch (query) {
+ case QSystemLocale::UILanguages:
+ return QVariant(navigatorLanguages());
+ default:
+ break;
+ }
+
+ return QVariant();
+}
+
+QLocale QSystemLocale::fallbackLocale() const
+{
+ const QStringList languages = navigatorLanguages();
+ if (languages.isEmpty())
+ return QLocale(u"en-US");
+ return QLocale(languages[0]);
+}
+
+#endif // QT_NO_SYSTEMLOCALE
+
+QT_END_NAMESPACE
diff --git a/src/corelib/text/qlocale_win.cpp b/src/corelib/text/qlocale_win.cpp
index 9af37cb8d0..9fdb46a4c9 100644
--- a/src/corelib/text/qlocale_win.cpp
+++ b/src/corelib/text/qlocale_win.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qlocale_p.h"
#include "qlocale_tools_p.h"
@@ -46,16 +10,62 @@
#include "qdatetime.h"
#include "qdebug.h"
-#ifdef Q_OS_WIN
-# include <qt_windows.h>
-# include <time.h>
-#endif
+#include "QtCore/private/qgregoriancalendar_p.h" // for yearSharingWeekDays()
+
+#include <q20algorithm.h>
+
+// TODO QTBUG-121193: port away from the use of LCID to always use names.
+#include <qt_windows.h>
+#include <time.h>
+
+#if QT_CONFIG(cpp_winrt)
+# include <QtCore/private/qt_winrtbase_p.h>
+
+# include <winrt/Windows.Foundation.h>
+# include <winrt/Windows.Foundation.Collections.h>
+# include <winrt/Windows.System.UserProfile.h>
+#endif // QT_CONFIG(cpp_winrt)
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+// Shared interpretation of %LANG%
+static auto scanLangEnv()
+{
+ struct R
+ {
+ QByteArray name; // empty means unknown; lookup from id may work
+ LCID id = 0; // 0 means unknown; lookup from name may work
+ } result;
+ const QByteArray lang = qgetenv("LANG");
+ if (lang.size() && (lang == "C" || qt_splitLocaleName(QString::fromLocal8Bit(lang)))) {
+ // See if we have a Windows locale code instead of a locale name:
+ const auto [id, used] = qstrntoll(lang.data(), lang.size(), 0);
+ if (used > 0 && id && INT_MIN <= id && id <= INT_MAX)
+ return R {QByteArray(), static_cast<LCID>(id)};
+ return R {lang, 0};
+ }
+ return R{};
+}
+
+static auto getDefaultWinId()
+{
+ const auto [name, id] = scanLangEnv();
+ if (id)
+ return id;
+
+ if (!name.isEmpty()) {
+ LCID id = LocaleNameToLCID(static_cast<LPCWSTR>(
+ QString::fromUtf8(name).toStdWString().data()), 0);
+ if (id)
+ return id;
+ }
+
+ return GetUserDefaultLCID();
+}
+
static QByteArray getWinLocaleName(LCID id = LOCALE_USER_DEFAULT);
-static QString winIso639LangName(LCID id = LOCALE_USER_DEFAULT);
-static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
#ifndef QT_NO_SYSTEMLOCALE
@@ -81,6 +91,17 @@ static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
# define LOCALE_SSHORTTIME 0x00000079
#endif
+namespace {
+template <typename T>
+static QVariant nullIfEmpty(T &&value)
+{
+ // For use where we should fall back to CLDR if we got an empty value.
+ if (value.isEmpty())
+ return {};
+ return std::move(value);
+}
+}
+
struct QSystemLocalePrivate
{
QSystemLocalePrivate();
@@ -94,6 +115,7 @@ struct QSystemLocalePrivate
QVariant timeFormat(QLocale::FormatType);
QVariant dateTimeFormat(QLocale::FormatType);
QVariant dayName(int, QLocale::FormatType);
+ QVariant standaloneMonthName(int, QLocale::FormatType);
QVariant monthName(int, QLocale::FormatType);
QVariant toString(QDate, QLocale::FormatType);
QVariant toString(QTime, QLocale::FormatType);
@@ -107,7 +129,7 @@ struct QSystemLocalePrivate
QVariant toCurrencyString(const QSystemLocale::CurrencyToStringArgument &);
QVariant uiLanguages();
QVariant nativeLanguageName();
- QVariant nativeCountryName();
+ QVariant nativeTerritoryName();
void update();
@@ -121,21 +143,21 @@ private:
// cached values:
LCID lcid;
- SubstitutionType substitutionType;
+ SubstitutionType substitutionType = SUnknown;
QString zero; // cached value for zeroDigit()
int getLocaleInfo(LCTYPE type, LPWSTR data, int size);
- // Need to distinguish empty QString packaged as (non-null) QVariant from null QVariant:
- template <typename T = QString>
- T getLocaleInfo(LCTYPE type, int maxlen = 0);
- int getLocaleInfo_int(LCTYPE type, int maxlen = 0);
+ QVariant getLocaleInfo(LCTYPE type);
+ int getLocaleInfo_int(LCTYPE type);
int getCurrencyFormat(DWORD flags, LPCWSTR value, const CURRENCYFMTW *format, LPWSTR data, int size);
int getDateFormat(DWORD flags, const SYSTEMTIME * date, LPCWSTR format, LPWSTR data, int size);
int getTimeFormat(DWORD flags, const SYSTEMTIME *date, LPCWSTR format, LPWSTR data, int size);
SubstitutionType substitution();
- QString &substituteDigits(QString &string);
+ QString substituteDigits(QString &&string);
+ QString correctDigits(QString &&string);
+ QString yearFix(int year, int fakeYear, QString &&formatted);
static QString winToQtFormat(QStringView sys_fmt);
@@ -143,9 +165,8 @@ private:
Q_GLOBAL_STATIC(QSystemLocalePrivate, systemLocalePrivate)
QSystemLocalePrivate::QSystemLocalePrivate()
- : substitutionType(SUnknown)
+ : lcid(getDefaultWinId())
{
- lcid = GetUserDefaultLCID();
}
inline int QSystemLocalePrivate::getCurrencyFormat(DWORD flags, LPCWSTR value, const CURRENCYFMTW *format, LPWSTR data, int size)
@@ -168,15 +189,15 @@ inline int QSystemLocalePrivate::getLocaleInfo(LCTYPE type, LPWSTR data, int siz
return GetLocaleInfo(lcid, type, data, size);
}
-template<typename T>
-T QSystemLocalePrivate::getLocaleInfo(LCTYPE type, int maxlen)
+QVariant QSystemLocalePrivate::getLocaleInfo(LCTYPE type)
{
// https://docs.microsoft.com/en-us/windows/win32/intl/locale-spositivesign
// says empty for LOCALE_SPOSITIVESIGN means "+", although GetLocaleInfo()
// is documented to return 0 only on failure, so it's not clear how it
// returns empty to mean this; hence the two checks for it below.
const QString plus = QStringLiteral("+");
- QVarLengthArray<wchar_t, 64> buf(maxlen ? maxlen : 64);
+ QVarLengthArray<wchar_t, 64> buf(64);
+ // Need to distinguish empty QString packaged as (non-null) QVariant from null QVariant:
if (!getLocaleInfo(type, buf.data(), buf.size())) {
const auto lastError = GetLastError();
if (type == LOCALE_SPOSITIVESIGN && lastError == ERROR_SUCCESS)
@@ -195,12 +216,13 @@ T QSystemLocalePrivate::getLocaleInfo(LCTYPE type, int maxlen)
return QString::fromWCharArray(buf.data());
}
-int QSystemLocalePrivate::getLocaleInfo_int(LCTYPE type, int maxlen)
+int QSystemLocalePrivate::getLocaleInfo_int(LCTYPE type)
{
- QString str = getLocaleInfo(type, maxlen);
- bool ok = false;
- int v = str.toInt(&ok);
- return ok ? v : 0;
+ DWORD value;
+ int r = GetLocaleInfo(lcid, type | LOCALE_RETURN_NUMBER,
+ reinterpret_cast<wchar_t *>(&value),
+ sizeof(value) / sizeof(wchar_t));
+ return r == sizeof(value) / sizeof(wchar_t) ? value : 0;
}
QSystemLocalePrivate::SubstitutionType QSystemLocalePrivate::substitution()
@@ -208,52 +230,53 @@ QSystemLocalePrivate::SubstitutionType QSystemLocalePrivate::substitution()
if (substitutionType == SUnknown) {
wchar_t buf[8];
if (!getLocaleInfo(LOCALE_IDIGITSUBSTITUTION, buf, 8)) {
- substitutionType = QSystemLocalePrivate::SNever;
+ substitutionType = SNever;
return substitutionType;
}
if (buf[0] == '1')
- substitutionType = QSystemLocalePrivate::SNever;
+ substitutionType = SNever;
else if (buf[0] == '0')
- substitutionType = QSystemLocalePrivate::SContext;
+ substitutionType = SContext;
else if (buf[0] == '2')
- substitutionType = QSystemLocalePrivate::SAlways;
+ substitutionType = SAlways;
else {
wchar_t digits[11]; // See zeroDigit() for why 11.
if (!getLocaleInfo(LOCALE_SNATIVEDIGITS, digits, 11)) {
- substitutionType = QSystemLocalePrivate::SNever;
+ substitutionType = SNever;
return substitutionType;
}
if (buf[0] == digits[0] + 2)
- substitutionType = QSystemLocalePrivate::SAlways;
+ substitutionType = SAlways;
else
- substitutionType = QSystemLocalePrivate::SNever;
+ substitutionType = SNever;
}
}
return substitutionType;
}
-QString &QSystemLocalePrivate::substituteDigits(QString &string)
+QString QSystemLocalePrivate::substituteDigits(QString &&string)
{
zeroDigit(); // Ensure zero is set.
switch (zero.size()) {
case 1: {
- const ushort offset = zero.at(0).unicode() - '0';
- if (!offset) // Nothing to do
+ ushort z = zero.at(0).unicode();
+ if (z == '0') // Nothing to do
break;
- Q_ASSERT(offset > 9);
+ Q_ASSERT(z > '9');
ushort *const qch = reinterpret_cast<ushort *>(string.data());
- for (int i = 0, stop = string.size(); i < stop; ++i) {
+ for (qsizetype i = 0, stop = string.size(); i < stop; ++i) {
ushort &ch = qch[i];
if (ch >= '0' && ch <= '9')
- ch += offset;
+ ch = unicodeForDigit(ch - '0', z);
}
break;
}
case 2: {
// Surrogate pair (high, low):
- uint digit = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
+ char32_t z = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
for (int i = 0; i < 10; i++) {
- const QChar s[2] = { QChar::highSurrogate(digit + i), QChar::lowSurrogate(digit + i) };
+ char32_t digit = unicodeForDigit(i, z);
+ const QChar s[2] = { QChar::highSurrogate(digit), QChar::lowSurrogate(digit) };
string.replace(QString(QLatin1Char('0' + i)), QString(s, 2));
}
break;
@@ -263,7 +286,12 @@ QString &QSystemLocalePrivate::substituteDigits(QString &string)
case 0: // Apparently this locale info was not available.
break;
}
- return string;
+ return std::move(string);
+}
+
+QString QSystemLocalePrivate::correctDigits(QString &&string)
+{
+ return substitution() == SAlways ? substituteDigits(std::move(string)) : std::move(string);
}
QVariant QSystemLocalePrivate::zeroDigit()
@@ -278,40 +306,41 @@ QVariant QSystemLocalePrivate::zeroDigit()
*/
wchar_t digits[11];
if (getLocaleInfo(LOCALE_SNATIVEDIGITS, digits, 11)) {
- // assert all(digits[i] == i + digits[0] for i in range(1, 10)), assumed above
+ // assert all(digits[i] == i + digits[0] for i in range(1, 10)),
+ // assumed above (unless digits[0] is 0x3007; see QTBUG-85409).
zero = QString::fromWCharArray(digits, 1);
}
}
- return zero;
+ return nullIfEmpty(zero); // Do not std::move().
}
QVariant QSystemLocalePrivate::decimalPoint()
{
- return getLocaleInfo<QVariant>(LOCALE_SDECIMAL);
+ return nullIfEmpty(getLocaleInfo(LOCALE_SDECIMAL).toString());
}
QVariant QSystemLocalePrivate::groupSeparator()
{
- return getLocaleInfo<QVariant>(LOCALE_STHOUSAND);
+ return getLocaleInfo(LOCALE_STHOUSAND); // Empty means don't group digits.
}
QVariant QSystemLocalePrivate::negativeSign()
{
- return getLocaleInfo<QVariant>(LOCALE_SNEGATIVESIGN);
+ return nullIfEmpty(getLocaleInfo(LOCALE_SNEGATIVESIGN).toString());
}
QVariant QSystemLocalePrivate::positiveSign()
{
- return getLocaleInfo<QVariant>(LOCALE_SPOSITIVESIGN);
+ return nullIfEmpty(getLocaleInfo(LOCALE_SPOSITIVESIGN).toString());
}
QVariant QSystemLocalePrivate::dateFormat(QLocale::FormatType type)
{
switch (type) {
case QLocale::ShortFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_SSHORTDATE));
+ return nullIfEmpty(winToQtFormat(getLocaleInfo(LOCALE_SSHORTDATE).toString()));
case QLocale::LongFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_SLONGDATE));
+ return nullIfEmpty(winToQtFormat(getLocaleInfo(LOCALE_SLONGDATE).toString()));
case QLocale::NarrowFormat:
break;
}
@@ -322,96 +351,173 @@ QVariant QSystemLocalePrivate::timeFormat(QLocale::FormatType type)
{
switch (type) {
case QLocale::ShortFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_SSHORTTIME));
+ return nullIfEmpty(winToQtFormat(getLocaleInfo(LOCALE_SSHORTTIME).toString()));
case QLocale::LongFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_STIMEFORMAT));
+ return nullIfEmpty(winToQtFormat(getLocaleInfo(LOCALE_STIMEFORMAT).toString()));
case QLocale::NarrowFormat:
break;
}
- return QVariant();
+ return {};
}
QVariant QSystemLocalePrivate::dateTimeFormat(QLocale::FormatType type)
{
- return QString(dateFormat(type).toString() + QLatin1Char(' ') + timeFormat(type).toString());
+ QVariant d = dateFormat(type), t = timeFormat(type);
+ if (d.typeId() == QMetaType::QString && t.typeId() == QMetaType::QString)
+ return QString(d.toString() + u' ' + t.toString());
+ return {};
}
QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type)
{
if (day < 1 || day > 7)
- return QString();
+ return {};
- static const LCTYPE short_day_map[]
+ static constexpr LCTYPE short_day_map[]
= { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5,
LOCALE_SABBREVDAYNAME6, LOCALE_SABBREVDAYNAME7 };
- static const LCTYPE long_day_map[]
+ static constexpr LCTYPE long_day_map[]
= { LOCALE_SDAYNAME1, LOCALE_SDAYNAME2,
LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, LOCALE_SDAYNAME5,
LOCALE_SDAYNAME6, LOCALE_SDAYNAME7 };
- static const LCTYPE narrow_day_map[]
+ static constexpr LCTYPE narrow_day_map[]
= { LOCALE_SSHORTESTDAYNAME1, LOCALE_SSHORTESTDAYNAME2,
LOCALE_SSHORTESTDAYNAME3, LOCALE_SSHORTESTDAYNAME4,
LOCALE_SSHORTESTDAYNAME5, LOCALE_SSHORTESTDAYNAME6,
LOCALE_SSHORTESTDAYNAME7 };
- day -= 1;
-
- if (type == QLocale::LongFormat)
- return getLocaleInfo<QVariant>(long_day_map[day]);
- if (type == QLocale::NarrowFormat)
- return getLocaleInfo<QVariant>(narrow_day_map[day]);
- return getLocaleInfo<QVariant>(short_day_map[day]);
+ return nullIfEmpty(getLocaleInfo(
+ (type == QLocale::LongFormat ? long_day_map
+ : type == QLocale::NarrowFormat ? narrow_day_map
+ : short_day_map)[day - 1]).toString());
}
-QVariant QSystemLocalePrivate::monthName(int month, QLocale::FormatType type)
+QVariant QSystemLocalePrivate::standaloneMonthName(int month, QLocale::FormatType type)
{
- static const LCTYPE short_month_map[]
+ static constexpr LCTYPE short_month_map[]
= { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3,
LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6,
LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9,
LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 };
- static const LCTYPE long_month_map[]
+ static constexpr LCTYPE long_month_map[]
= { LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3,
LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6,
LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9,
LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12 };
- month -= 1;
- if (month < 0 || month > 11)
- return QString();
+ if (month < 1 || month > 12)
+ return {};
+
+ // Month is Jan = 1, ... Dec = 12; adjust by 1 to match array indexing from 0:
+ return nullIfEmpty(getLocaleInfo(
+ (type == QLocale::LongFormat ? long_month_map : short_month_map)[month - 1]).toString());
+}
+
+QVariant QSystemLocalePrivate::monthName(int month, QLocale::FormatType type)
+{
+ SYSTEMTIME st = {};
+ st.wYear = 2001;
+ st.wMonth = month;
+ st.wDay = 10;
+
+ const DWORD flags{}; // Must be clear when passing a format string.
+ // MS's docs for the LOCALE_SMONTHNAME* say to include the day in a format.
+ // Educated guess: this works for the LOCALE_SABBREVMONTHNAME*, too, in so
+ // far as the abbreviated plain name might differ from abbreviated
+ // standalone one.
+ const wchar_t *const format = type == QLocale::LongFormat ? L"ddMMMM" : L"ddMMM";
+ wchar_t buf[255];
+ if (getDateFormat(flags, &st, format, buf, 255) > 2) {
+ // Elide the two digits of day number
+ return nullIfEmpty(correctDigits(QString::fromWCharArray(buf + 2)));
+ }
+ return {};
+}
+
+static QString fourDigitYear(int year)
+{
+ // Return year formatted as an (at least) four digit number:
+ return QStringLiteral("%1").arg(year, 4, 10, QChar(u'0'));
+}
- LCTYPE lctype = (type == QLocale::ShortFormat || type == QLocale::NarrowFormat)
- ? short_month_map[month] : long_month_map[month];
- return getLocaleInfo<QVariant>(lctype);
+QString QSystemLocalePrivate::yearFix(int year, int fakeYear, QString &&formatted)
+{
+ // Replace our ersatz fakeYear (that MS formats faithfully) with the correct
+ // form of year. We know the two-digit short form of fakeYear can not be
+ // mistaken for the month or day-of-month in the formatted date.
+ Q_ASSERT(fakeYear >= 1970 && fakeYear <= 2400);
+ const bool matchTwo = year >= 0 && year % 100 == fakeYear % 100;
+ auto yearUsed = fourDigitYear(fakeYear);
+ QString sign(year < 0 ? 1 : 0, u'-');
+ auto trueYear = fourDigitYear(year < 0 ? -year : year);
+ if (formatted.contains(yearUsed))
+ return std::move(formatted).replace(yearUsed, sign + trueYear);
+
+ auto tail = QStringView{yearUsed}.last(2);
+ Q_ASSERT(!matchTwo || tail == QString(sign + trueYear.last(2)));
+ if (formatted.contains(tail)) {
+ if (matchTwo)
+ return std::move(formatted);
+ return std::move(formatted).replace(tail.toString(), sign + trueYear.last(2));
+ }
+
+ // Localized digits (regardless of SAlways), perhaps ?
+ // First call to substituteDigits() ensures zero is initialized:
+ trueYear = substituteDigits(std::move(trueYear));
+ if (zero != u'0') {
+ yearUsed = substituteDigits(std::move(yearUsed));
+ if (year < 0)
+ sign = negativeSign().toString();
+
+ if (formatted.contains(yearUsed))
+ return std::move(formatted).replace(yearUsed, sign + trueYear);
+
+ const qsizetype twoDigits = 2 * zero.size();
+ tail = QStringView{yearUsed}.last(twoDigits);
+ if (formatted.contains(tail)) {
+ if (matchTwo)
+ return std::move(formatted);
+ return std::move(formatted).replace(tail.toString(), sign + trueYear.last(twoDigits));
+ }
+ }
+ qWarning("Failed to fix up year in formatted date-string using %d for %d", fakeYear, year);
+ return std::move(formatted);
}
QVariant QSystemLocalePrivate::toString(QDate date, QLocale::FormatType type)
{
- SYSTEMTIME st;
- memset(&st, 0, sizeof(SYSTEMTIME));
- st.wYear = date.year();
+ SYSTEMTIME st = {};
+ const int year = date.year();
+ // st.wYear is unsigned; and GetDateFormat() is documented to not handle
+ // dates before 1601.
+ const bool fixup = year < 1601;
+ st.wYear = fixup ? QGregorianCalendar::yearSharingWeekDays(date) : year;
st.wMonth = date.month();
st.wDay = date.day();
+ Q_ASSERT(!fixup || st.wYear % 100 != st.wMonth);
+ Q_ASSERT(!fixup || st.wYear % 100 != st.wDay);
+ // i.e. yearFix() can trust a match of its fakeYear's last two digits to not
+ // be the month or day part of the formatted date.
+
DWORD flags = (type == QLocale::LongFormat ? DATE_LONGDATE : DATE_SHORTDATE);
wchar_t buf[255];
if (getDateFormat(flags, &st, NULL, buf, 255)) {
- QString format = QString::fromWCharArray(buf);
- if (substitution() == SAlways)
- substituteDigits(format);
- return format;
+ QString text = QString::fromWCharArray(buf);
+ if (fixup)
+ text = yearFix(year, st.wYear, std::move(text));
+ return nullIfEmpty(correctDigits(std::move(text)));
}
- return QString();
+ return {};
}
QVariant QSystemLocalePrivate::toString(QTime time, QLocale::FormatType type)
{
- SYSTEMTIME st;
- memset(&st, 0, sizeof(SYSTEMTIME));
+ SYSTEMTIME st = {};
st.wHour = time.hour();
st.wMinute = time.minute();
st.wSecond = time.second();
@@ -419,22 +525,23 @@ QVariant QSystemLocalePrivate::toString(QTime time, QLocale::FormatType type)
DWORD flags = 0;
// keep the same conditional as timeFormat() above
- if (type == QLocale::ShortFormat)
- flags = TIME_NOSECONDS;
+ const QString format = type == QLocale::ShortFormat
+ ? getLocaleInfo(LOCALE_SSHORTTIME).toString()
+ : QString();
+ auto formatStr = reinterpret_cast<const wchar_t *>(format.isEmpty() ? nullptr : format.utf16());
wchar_t buf[255];
- if (getTimeFormat(flags, &st, NULL, buf, 255)) {
- QString format = QString::fromWCharArray(buf);
- if (substitution() == SAlways)
- substituteDigits(format);
- return format;
- }
- return QString();
+ if (getTimeFormat(flags, &st, formatStr, buf, int(std::size(buf))))
+ return nullIfEmpty(correctDigits(QString::fromWCharArray(buf)));
+ return {};
}
QVariant QSystemLocalePrivate::toString(const QDateTime &dt, QLocale::FormatType type)
{
- return QString(toString(dt.date(), type).toString() + QLatin1Char(' ') + toString(dt.time(), type).toString());
+ QVariant d = toString(dt.date(), type), t = toString(dt.time(), type);
+ if (d.typeId() == QMetaType::QString && t.typeId() == QMetaType::QString)
+ return QString(d.toString() + u' ' + t.toString());
+ return {};
}
QVariant QSystemLocalePrivate::measurementSystem()
@@ -442,10 +549,8 @@ QVariant QSystemLocalePrivate::measurementSystem()
wchar_t output[2];
if (getLocaleInfo(LOCALE_IMEASURE, output, 2)) {
- QString iMeasure = QString::fromWCharArray(output);
- if (iMeasure == QLatin1String("1")) {
+ if (output[0] == L'1' && !output[1])
return QLocale::ImperialSystem;
- }
}
return QLocale::MetricSystem;
@@ -453,16 +558,15 @@ QVariant QSystemLocalePrivate::measurementSystem()
QVariant QSystemLocalePrivate::collation()
{
- return getLocaleInfo<QVariant>(LOCALE_SSORTLOCALE);
+ return getLocaleInfo(LOCALE_SSORTLOCALE);
}
QVariant QSystemLocalePrivate::amText()
{
wchar_t output[15]; // maximum length including terminating zero character for Win2003+
- if (getLocaleInfo(LOCALE_S1159, output, 15)) {
- return QString::fromWCharArray(output);
- }
+ if (getLocaleInfo(LOCALE_S1159, output, 15))
+ return nullIfEmpty(QString::fromWCharArray(output));
return QVariant();
}
@@ -471,9 +575,8 @@ QVariant QSystemLocalePrivate::pmText()
{
wchar_t output[15]; // maximum length including terminating zero character for Win2003+
- if (getLocaleInfo(LOCALE_S2359, output, 15)) {
- return QString::fromWCharArray(output);
- }
+ if (getLocaleInfo(LOCALE_S2359, output, 15))
+ return nullIfEmpty(QString::fromWCharArray(output));
return QVariant();
}
@@ -493,12 +596,14 @@ QVariant QSystemLocalePrivate::currencySymbol(QLocale::CurrencySymbolFormat form
wchar_t buf[13];
switch (format) {
case QLocale::CurrencySymbol:
+ // Some locales do have empty currency symbol. All the same, fall back
+ // to CLDR for confirmation if MS claims that applies.
if (getLocaleInfo(LOCALE_SCURRENCY, buf, 13))
- return QString::fromWCharArray(buf);
+ return nullIfEmpty(QString::fromWCharArray(buf));
break;
case QLocale::CurrencyIsoCode:
if (getLocaleInfo(LOCALE_SINTLSYMBOL, buf, 9))
- return QString::fromWCharArray(buf);
+ return nullIfEmpty(QString::fromWCharArray(buf));
break;
case QLocale::CurrencyDisplayName: {
QVarLengthArray<wchar_t, 64> buf(64);
@@ -509,7 +614,7 @@ QVariant QSystemLocalePrivate::currencySymbol(QLocale::CurrencySymbolFormat form
if (!getLocaleInfo(LOCALE_SNATIVECURRNAME, buf.data(), buf.size()))
break;
}
- return QString::fromWCharArray(buf.data());
+ return nullIfEmpty(QString::fromWCharArray(buf.data()));
}
default:
break;
@@ -520,31 +625,25 @@ QVariant QSystemLocalePrivate::currencySymbol(QLocale::CurrencySymbolFormat form
QVariant QSystemLocalePrivate::toCurrencyString(const QSystemLocale::CurrencyToStringArgument &arg)
{
QString value;
- switch (arg.value.type()) {
- case QVariant::Int:
- value = QLocaleData::longLongToString(
- QStringLiteral("0"), QStringLiteral(","), QStringLiteral("+"), QStringLiteral("-"),
+ switch (arg.value.typeId()) {
+ case QMetaType::Int:
+ value = QLocaleData::c()->longLongToString(
arg.value.toInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
break;
- case QVariant::UInt:
- value = QLocaleData::unsLongLongToString(
- QStringLiteral("0"), QStringLiteral(","), QStringLiteral("+"),
+ case QMetaType::UInt:
+ value = QLocaleData::c()->unsLongLongToString(
arg.value.toUInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
break;
- case QVariant::Double:
- value = QLocaleData::doubleToString(
- QStringLiteral("0"), QStringLiteral("+"), QStringLiteral("-"),
- QStringLiteral(" "), QStringLiteral(","), QStringLiteral("."),
+ case QMetaType::Double:
+ value = QLocaleData::c()->doubleToString(
arg.value.toDouble(), -1, QLocaleData::DFDecimal, -1, QLocale::OmitGroupSeparator);
break;
- case QVariant::LongLong:
- value = QLocaleData::longLongToString(
- QStringLiteral("0"), QStringLiteral(","), QStringLiteral("+"), QStringLiteral("-"),
+ case QMetaType::LongLong:
+ value = QLocaleData::c()->longLongToString(
arg.value.toLongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
break;
- case QVariant::ULongLong:
- value = QLocaleData::unsLongLongToString(
- QStringLiteral("0"), QStringLiteral(","), QStringLiteral("+"),
+ case QMetaType::ULongLong:
+ value = QLocaleData::c()->unsLongLongToString(
arg.value.toULongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
break;
default:
@@ -560,9 +659,9 @@ QVariant QSystemLocalePrivate::toCurrencyString(const QSystemLocale::CurrencyToS
if (!arg.symbol.isEmpty()) {
format.NumDigits = getLocaleInfo_int(LOCALE_ICURRDIGITS);
format.LeadingZero = getLocaleInfo_int(LOCALE_ILZERO);
- decimalSep = getLocaleInfo(LOCALE_SMONDECIMALSEP);
+ decimalSep = getLocaleInfo(LOCALE_SMONDECIMALSEP).toString();
format.lpDecimalSep = (wchar_t *)decimalSep.utf16();
- thousandSep = getLocaleInfo(LOCALE_SMONTHOUSANDSEP);
+ thousandSep = getLocaleInfo(LOCALE_SMONTHOUSANDSEP).toString();
format.lpThousandSep = (wchar_t *)thousandSep.utf16();
format.NegativeOrder = getLocaleInfo_int(LOCALE_INEGCURR);
format.PositiveOrder = getLocaleInfo_int(LOCALE_ICURRENCY);
@@ -574,8 +673,8 @@ QVariant QSystemLocalePrivate::toCurrencyString(const QSystemLocale::CurrencyToS
// int(30) == "123456,789.00" == string("3;0;0")
// int(32) == "12,34,56,789.00" == string("3;2;0")
// int(320)== "1234,56,789.00" == string("3;2")
- QString groupingStr = getLocaleInfo(LOCALE_SMONGROUPING);
- format.Grouping = groupingStr.remove(QLatin1Char(';')).toInt();
+ QString groupingStr = getLocaleInfo(LOCALE_SMONGROUPING).toString();
+ format.Grouping = groupingStr.remove(u';').toInt();
if (format.Grouping % 10 == 0) // magic
format.Grouping /= 10;
else
@@ -593,17 +692,29 @@ QVariant QSystemLocalePrivate::toCurrencyString(const QSystemLocale::CurrencyToS
pformat, out.data(), out.size());
}
- value = QString::fromWCharArray(out.data());
- if (substitution() == SAlways)
- substituteDigits( value);
- return value;
+ return nullIfEmpty(correctDigits(QString::fromWCharArray(out.data())));
}
QVariant QSystemLocalePrivate::uiLanguages()
{
+ QStringList result;
+#if QT_CONFIG(cpp_winrt)
+ using namespace winrt;
+ using namespace Windows::System::UserProfile;
+ QT_TRY {
+ auto languages = GlobalizationPreferences::Languages();
+ for (const auto &lang : languages)
+ result << QString::fromStdString(winrt::to_string(lang));
+ } QT_CATCH(...) {
+ // pass, just fall back to WIN32 API implementation
+ }
+ if (!result.isEmpty())
+ return result; // else just fall back to WIN32 API implementation
+#endif // QT_CONFIG(cpp_winrt)
+ // mingw and clang still have to use Win32 API
unsigned long cnt = 0;
QVarLengthArray<wchar_t, 64> buf(64);
-# if !defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE) // Not present in MinGW 4.9/bootstrap builds.
+# if !defined(QT_BOOTSTRAPPED) // Not present in MinGW 4.9/bootstrap builds.
unsigned long size = buf.size();
if (!GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size)) {
size = 0;
@@ -611,11 +722,10 @@ QVariant QSystemLocalePrivate::uiLanguages()
GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &cnt, NULL, &size)) {
buf.resize(size);
if (!GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size))
- return QStringList();
+ return {};
}
}
-# endif // !QT_BOOTSTRAPPED && !QT_BUILD_QMAKE
- QStringList result;
+# endif // !QT_BOOTSTRAPPED
result.reserve(cnt);
const wchar_t *str = buf.constData();
for (; cnt > 0; --cnt) {
@@ -625,23 +735,23 @@ QVariant QSystemLocalePrivate::uiLanguages()
result.append(s);
str += s.size() + 1;
}
- return result;
+ return nullIfEmpty(std::move(result));
}
QVariant QSystemLocalePrivate::nativeLanguageName()
{
- return getLocaleInfo<QVariant>(LOCALE_SNATIVELANGUAGENAME);
+ return getLocaleInfo(LOCALE_SNATIVELANGUAGENAME);
}
-QVariant QSystemLocalePrivate::nativeCountryName()
+QVariant QSystemLocalePrivate::nativeTerritoryName()
{
- return getLocaleInfo<QVariant>(LOCALE_SNATIVECOUNTRYNAME);
+ return getLocaleInfo(LOCALE_SNATIVECOUNTRYNAME);
}
void QSystemLocalePrivate::update()
{
- lcid = GetUserDefaultLCID();
+ lcid = getDefaultWinId();
substitutionType = SUnknown;
zero.resize(0);
}
@@ -649,20 +759,20 @@ void QSystemLocalePrivate::update()
QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt)
{
QString result;
- int i = 0;
+ qsizetype i = 0;
while (i < sys_fmt.size()) {
- if (sys_fmt.at(i).unicode() == QLatin1Char('\'')) {
+ if (sys_fmt.at(i).unicode() == u'\'') {
QString text = qt_readEscapedFormatString(sys_fmt, &i);
- if (text == QLatin1String("'"))
- result += QLatin1String("''");
+ if (text == "'"_L1)
+ result += "''"_L1;
else
- result += QLatin1Char('\'') + text + QLatin1Char('\'');
+ result += u'\'' + text + u'\'';
continue;
}
QChar c = sys_fmt.at(i);
- int repeat = qt_repeatCount(sys_fmt.mid(i));
+ qsizetype repeat = qt_repeatCount(sys_fmt.mid(i));
switch (c.unicode()) {
// Date
@@ -673,13 +783,13 @@ QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt)
repeat = 2;
switch (repeat) {
case 1:
- result += QLatin1String("yy"); // "y" unsupported by Qt, use "yy"
+ result += "yy"_L1; // "y" unsupported by Qt, use "yy"
break;
case 5:
- result += QLatin1String("yyyy"); // "yyyyy" same as "yyyy" on Windows
+ result += "yyyy"_L1; // "yyyyy" same as "yyyy" on Windows
break;
default:
- result += QString(repeat, QLatin1Char('y'));
+ result += QString(repeat, u'y');
break;
}
break;
@@ -690,14 +800,14 @@ QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt)
case 2:
break; // no equivalent of "gg" in Qt
default:
- result += QLatin1Char('g');
+ result += u'g';
break;
}
break;
case 't':
if (repeat > 2)
repeat = 2;
- result += QLatin1String("AP"); // "t" unsupported, use "AP"
+ result += "AP"_L1; // "t" unsupported, use "AP"
break;
default:
result += QString(repeat, c);
@@ -710,12 +820,12 @@ QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt)
return result;
}
-QLocale QSystemLocale::fallbackUiLocale() const
+QLocale QSystemLocale::fallbackLocale() const
{
return QLocale(QString::fromLatin1(getWinLocaleName()));
}
-QVariant QSystemLocale::query(QueryType type, QVariant in) const
+QVariant QSystemLocale::query(QueryType type, QVariant &&in) const
{
QSystemLocalePrivate *d = systemLocalePrivate();
switch(type) {
@@ -743,12 +853,25 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
return d->dayName(in.toInt(), QLocale::LongFormat);
case DayNameShort:
return d->dayName(in.toInt(), QLocale::ShortFormat);
+ case DayNameNarrow:
+ return d->dayName(in.toInt(), QLocale::NarrowFormat);
+ case StandaloneDayNameLong:
+ case StandaloneDayNameShort:
+ case StandaloneDayNameNarrow:
+ // Windows does not provide standalone day names, so fall back to CLDR
+ return QVariant();
case MonthNameLong:
- case StandaloneMonthNameLong:
return d->monthName(in.toInt(), QLocale::LongFormat);
+ case StandaloneMonthNameLong:
+ return d->standaloneMonthName(in.toInt(), QLocale::LongFormat);
case MonthNameShort:
- case StandaloneMonthNameShort:
return d->monthName(in.toInt(), QLocale::ShortFormat);
+ case StandaloneMonthNameShort:
+ return d->standaloneMonthName(in.toInt(), QLocale::ShortFormat);
+ case MonthNameNarrow:
+ case StandaloneMonthNameNarrow:
+ // Windows provides no narrow month names, so we fall back to CLDR
+ return QVariant();
case DateToStringShort:
return d->toString(in.toDate(), QLocale::ShortFormat);
case DateToStringLong:
@@ -765,17 +888,13 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
return d->zeroDigit();
case LanguageId:
case ScriptId:
- case CountryId: {
- QString locale = QString::fromLatin1(getWinLocaleName());
- QLocale::Language lang;
- QLocale::Script script;
- QLocale::Country cntry;
- QLocalePrivate::getLangAndCountry(locale, lang, script, cntry);
+ case TerritoryId: {
+ QLocaleId lid = QLocaleId::fromName(QString::fromLatin1(getWinLocaleName()));
if (type == LanguageId)
- return lang;
+ return lid.language_id;
if (type == ScriptId)
- return script == QLocale::AnyScript ? fallbackUiLocale().script() : script;
- return cntry == QLocale::AnyCountry ? fallbackUiLocale().country() : cntry;
+ return lid.script_id ? lid.script_id : ushort(fallbackLocale().script());
+ return lid.territory_id ? lid.territory_id : ushort(fallbackLocale().territory());
}
case MeasurementSystem:
return d->measurementSystem();
@@ -790,7 +909,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
case CurrencySymbol:
return d->currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
case CurrencyToString:
- return d->toCurrencyString(in.value<QSystemLocale::CurrencyToStringArgument>());
+ return d->toCurrencyString(in.value<CurrencyToStringArgument>());
case UILanguages:
return d->uiLanguages();
case LocaleChanged:
@@ -798,8 +917,8 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
break;
case NativeLanguageName:
return d->nativeLanguageName();
- case NativeCountryName:
- return d->nativeCountryName();
+ case NativeTerritoryName:
+ return d->nativeTerritoryName();
default:
break;
}
@@ -812,8 +931,18 @@ struct WindowsToISOListElt {
char iso_name[6];
};
-/* NOTE: This array should be sorted by the first column! */
-static const WindowsToISOListElt windows_to_iso_list[] = {
+namespace {
+struct ByWindowsCode {
+ constexpr bool operator()(int lhs, WindowsToISOListElt rhs) const noexcept
+ { return lhs < int(rhs.windows_code); }
+ constexpr bool operator()(WindowsToISOListElt lhs, int rhs) const noexcept
+ { return int(lhs.windows_code) < rhs; }
+ constexpr bool operator()(WindowsToISOListElt lhs, WindowsToISOListElt rhs) const noexcept
+ { return lhs.windows_code < rhs.windows_code; }
+};
+} // unnamed namespace
+
+static constexpr WindowsToISOListElt windows_to_iso_list[] = {
{ 0x0401, "ar_SA" },
{ 0x0402, "bg\0 " },
{ 0x0403, "ca\0 " },
@@ -924,40 +1053,33 @@ static const WindowsToISOListElt windows_to_iso_list[] = {
{ 0x500a, "es_PR" }
};
-static const int windows_to_iso_count
- = sizeof(windows_to_iso_list)/sizeof(WindowsToISOListElt);
+static_assert(q20::is_sorted(std::begin(windows_to_iso_list), std::end(windows_to_iso_list),
+ ByWindowsCode{}));
static const char *winLangCodeToIsoName(int code)
{
int cmp = code - windows_to_iso_list[0].windows_code;
if (cmp < 0)
- return 0;
+ return nullptr;
if (cmp == 0)
return windows_to_iso_list[0].iso_name;
- int begin = 0;
- int end = windows_to_iso_count;
+ const auto it = std::lower_bound(std::begin(windows_to_iso_list),
+ std::end(windows_to_iso_list),
+ code,
+ ByWindowsCode{});
+ if (it != std::end(windows_to_iso_list) && !ByWindowsCode{}(code, *it))
+ return it->iso_name;
- while (end - begin > 1) {
- uint mid = (begin + end)/2;
-
- const WindowsToISOListElt *elt = windows_to_iso_list + mid;
- int cmp = code - elt->windows_code;
- if (cmp < 0)
- end = mid;
- else if (cmp > 0)
- begin = mid;
- else
- return elt->iso_name;
- }
-
- return 0;
+ return nullptr;
}
LCID qt_inIsoNametoLCID(const char *name)
{
+ if (!name)
+ return LOCALE_USER_DEFAULT;
// handle norwegian manually, the list above will fail
if (!strncmp(name, "nb", 2))
return 0x0414;
@@ -994,14 +1116,12 @@ static QString winIso639LangName(LCID id)
lang_code = QString::fromWCharArray(out);
if (!lang_code.isEmpty()) {
- const char *endptr;
- bool ok;
- QByteArray latin1_lang_code = std::move(lang_code).toLatin1();
- int i = qstrtoull(latin1_lang_code, &endptr, 16, &ok);
- if (ok && *endptr == '\0') {
+ const QByteArray latin1 = std::move(lang_code).toLatin1();
+ const auto [i, used] = qstrntoull(latin1.data(), latin1.size(), 16);
+ if (used >= latin1.size() || (used > 0 && latin1[used] == '\0')) {
switch (i) {
case 0x814:
- result = QLatin1String("nn"); // Nynorsk
+ result = u"nn"_s; // Nynorsk
break;
default:
break;
@@ -1034,30 +1154,24 @@ static QByteArray getWinLocaleName(LCID id)
{
QByteArray result;
if (id == LOCALE_USER_DEFAULT) {
- static QByteArray langEnvVar = qgetenv("LANG");
- result = langEnvVar;
- QString lang, script, cntry;
- if ( result == "C" || (!result.isEmpty()
- && qt_splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) ) {
- long id = 0;
- bool ok = false;
- id = qstrtoll(result.data(), 0, 0, &ok);
- if ( !ok || id == 0 || id < INT_MIN || id > INT_MAX )
- return result;
- return winLangCodeToIsoName(int(id));
- }
- }
+ const auto [name, lcid] = scanLangEnv();
+ if (!name.isEmpty())
+ return name;
+ if (lcid)
+ return winLangCodeToIsoName(lcid);
- if (id == LOCALE_USER_DEFAULT)
id = GetUserDefaultLCID();
+ }
+
QString resultusage = winIso639LangName(id);
QString country = winIso3116CtryName(id);
if (!country.isEmpty())
- resultusage += QLatin1Char('_') + country;
+ resultusage += u'_' + country;
return std::move(resultusage).toLatin1();
}
+// Helper for plugins/platforms/windows/
Q_CORE_EXPORT QLocale qt_localeFromLCID(LCID id)
{
return QLocale(QString::fromLatin1(getWinLocaleName(id)));
diff --git a/src/corelib/text/qregexp.cpp b/src/corelib/text/qregexp.cpp
deleted file mode 100644
index d7a2434b52..0000000000
--- a/src/corelib/text/qregexp.cpp
+++ /dev/null
@@ -1,5039 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qregexp.h"
-
-#include "qalgorithms.h"
-#include "qbitarray.h"
-#include "qcache.h"
-#include "qdatastream.h"
-#include "qdebug.h"
-#include "qhashfunctions.h"
-#include "qlist.h"
-#include "qmap.h"
-#include "qmutex.h"
-#include "qstring.h"
-#include "qstringlist.h"
-#include "qstringmatcher.h"
-#include "private/qlocking_p.h"
-
-#include <limits.h>
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-// error strings for the regexp parser
-#define RXERR_OK QT_TRANSLATE_NOOP("QRegExp", "no error occurred")
-#define RXERR_DISABLED QT_TRANSLATE_NOOP("QRegExp", "disabled feature used")
-#define RXERR_CHARCLASS QT_TRANSLATE_NOOP("QRegExp", "bad char class syntax")
-#define RXERR_LOOKAHEAD QT_TRANSLATE_NOOP("QRegExp", "bad lookahead syntax")
-#define RXERR_LOOKBEHIND QT_TRANSLATE_NOOP("QRegExp", "lookbehinds not supported, see QTBUG-2371")
-#define RXERR_REPETITION QT_TRANSLATE_NOOP("QRegExp", "bad repetition syntax")
-#define RXERR_OCTAL QT_TRANSLATE_NOOP("QRegExp", "invalid octal value")
-#define RXERR_LEFTDELIM QT_TRANSLATE_NOOP("QRegExp", "missing left delim")
-#define RXERR_END QT_TRANSLATE_NOOP("QRegExp", "unexpected end")
-#define RXERR_LIMIT QT_TRANSLATE_NOOP("QRegExp", "met internal limit")
-#define RXERR_INTERVAL QT_TRANSLATE_NOOP("QRegExp", "invalid interval")
-#define RXERR_CATEGORY QT_TRANSLATE_NOOP("QRegExp", "invalid category")
-
-/*!
- \class QRegExp
- \inmodule QtCore
- \obsolete Use QRegularExpression instead
- \reentrant
- \brief The QRegExp class provides pattern matching using regular expressions.
-
- \ingroup tools
- \ingroup shared
-
- \keyword regular expression
-
- This class is deprecated in Qt 6. Please use QRegularExpression instead
- for all new code. For guidelines on porting old code from QRegExp to
- QRegularExpression, see {Porting to QRegularExpression}
-
- A regular expression, or "regexp", is a pattern for matching
- substrings in a text. This is useful in many contexts, e.g.,
-
- \table
- \row \li Validation
- \li A regexp can test whether a substring meets some criteria,
- e.g. is an integer or contains no whitespace.
- \row \li Searching
- \li A regexp provides more powerful pattern matching than
- simple substring matching, e.g., match one of the words
- \e{mail}, \e{letter} or \e{correspondence}, but none of the
- words \e{email}, \e{mailman}, \e{mailer}, \e{letterbox}, etc.
- \row \li Search and Replace
- \li A regexp can replace all occurrences of a substring with a
- different substring, e.g., replace all occurrences of \e{&}
- with \e{\&amp;} except where the \e{&} is already followed by
- an \e{amp;}.
- \row \li String Splitting
- \li A regexp can be used to identify where a string should be
- split apart, e.g. splitting tab-delimited strings.
- \endtable
-
- A brief introduction to regexps is presented, a description of
- Qt's regexp language, some examples, and the function
- documentation itself. QRegExp is modeled on Perl's regexp
- language. It fully supports Unicode. QRegExp can also be used in a
- simpler, \e{wildcard mode} that is similar to the functionality
- found in command shells. The syntax rules used by QRegExp can be
- changed with setPatternSyntax(). In particular, the pattern syntax
- can be set to QRegExp::FixedString, which means the pattern to be
- matched is interpreted as a plain string, i.e., special characters
- (e.g., backslash) are not escaped.
-
- A good text on regexps is \e {Mastering Regular Expressions}
- (Third Edition) by Jeffrey E. F. Friedl, ISBN 0-596-52812-4.
-
- \note In Qt 5, the new QRegularExpression class provides a Perl
- compatible implementation of regular expressions and is recommended
- in place of QRegExp.
-
- \tableofcontents
-
- \section1 Introduction
-
- Regexps are built up from expressions, quantifiers, and
- assertions. The simplest expression is a character, e.g. \b{x}
- or \b{5}. An expression can also be a set of characters
- enclosed in square brackets. \b{[ABCD]} will match an \b{A}
- or a \b{B} or a \b{C} or a \b{D}. We can write this same
- expression as \b{[A-D]}, and an expression to match any
- capital letter in the English alphabet is written as
- \b{[A-Z]}.
-
- A quantifier specifies the number of occurrences of an expression
- that must be matched. \b{x{1,1}} means match one and only one
- \b{x}. \b{x{1,5}} means match a sequence of \b{x}
- characters that contains at least one \b{x} but no more than
- five.
-
- Note that in general regexps cannot be used to check for balanced
- brackets or tags. For example, a regexp can be written to match an
- opening html \c{<b>} and its closing \c{</b>}, if the \c{<b>} tags
- are not nested, but if the \c{<b>} tags are nested, that same
- regexp will match an opening \c{<b>} tag with the wrong closing
- \c{</b>}. For the fragment \c{<b>bold <b>bolder</b></b>}, the
- first \c{<b>} would be matched with the first \c{</b>}, which is
- not correct. However, it is possible to write a regexp that will
- match nested brackets or tags correctly, but only if the number of
- nesting levels is fixed and known. If the number of nesting levels
- is not fixed and known, it is impossible to write a regexp that
- will not fail.
-
- Suppose we want a regexp to match integers in the range 0 to 99.
- At least one digit is required, so we start with the expression
- \b{[0-9]{1,1}}, which matches a single digit exactly once. This
- regexp matches integers in the range 0 to 9. To match integers up
- to 99, increase the maximum number of occurrences to 2, so the
- regexp becomes \b{[0-9]{1,2}}. This regexp satisfies the
- original requirement to match integers from 0 to 99, but it will
- also match integers that occur in the middle of strings. If we
- want the matched integer to be the whole string, we must use the
- anchor assertions, \b{^} (caret) and \b{$} (dollar). When
- \b{^} is the first character in a regexp, it means the regexp
- must match from the beginning of the string. When \b{$} is the
- last character of the regexp, it means the regexp must match to
- the end of the string. The regexp becomes \b{^[0-9]{1,2}$}.
- Note that assertions, e.g. \b{^} and \b{$}, do not match
- characters but locations in the string.
-
- If you have seen regexps described elsewhere, they may have looked
- different from the ones shown here. This is because some sets of
- characters and some quantifiers are so common that they have been
- given special symbols to represent them. \b{[0-9]} can be
- replaced with the symbol \b{\\d}. The quantifier to match
- exactly one occurrence, \b{{1,1}}, can be replaced with the
- expression itself, i.e. \b{x{1,1}} is the same as \b{x}. So
- our 0 to 99 matcher could be written as \b{^\\d{1,2}$}. It can
- also be written \b{^\\d\\d{0,1}$}, i.e. \e{From the start of
- the string, match a digit, followed immediately by 0 or 1 digits}.
- In practice, it would be written as \b{^\\d\\d?$}. The \b{?}
- is shorthand for the quantifier \b{{0,1}}, i.e. 0 or 1
- occurrences. \b{?} makes an expression optional. The regexp
- \b{^\\d\\d?$} means \e{From the beginning of the string, match
- one digit, followed immediately by 0 or 1 more digit, followed
- immediately by end of string}.
-
- To write a regexp that matches one of the words 'mail' \e or
- 'letter' \e or 'correspondence' but does not match words that
- contain these words, e.g., 'email', 'mailman', 'mailer', and
- 'letterbox', start with a regexp that matches 'mail'. Expressed
- fully, the regexp is \b{m{1,1}a{1,1}i{1,1}l{1,1}}, but because
- a character expression is automatically quantified by
- \b{{1,1}}, we can simplify the regexp to \b{mail}, i.e., an
- 'm' followed by an 'a' followed by an 'i' followed by an 'l'. Now
- we can use the vertical bar \b{|}, which means \b{or}, to
- include the other two words, so our regexp for matching any of the
- three words becomes \b{mail|letter|correspondence}. Match
- 'mail' \b{or} 'letter' \b{or} 'correspondence'. While this
- regexp will match one of the three words we want to match, it will
- also match words we don't want to match, e.g., 'email'. To
- prevent the regexp from matching unwanted words, we must tell it
- to begin and end the match at word boundaries. First we enclose
- our regexp in parentheses, \b{(mail|letter|correspondence)}.
- Parentheses group expressions together, and they identify a part
- of the regexp that we wish to \l{capturing text}{capture}.
- Enclosing the expression in parentheses allows us to use it as a
- component in more complex regexps. It also allows us to examine
- which of the three words was actually matched. To force the match
- to begin and end on word boundaries, we enclose the regexp in
- \b{\\b} \e{word boundary} assertions:
- \b{\\b(mail|letter|correspondence)\\b}. Now the regexp means:
- \e{Match a word boundary, followed by the regexp in parentheses,
- followed by a word boundary}. The \b{\\b} assertion matches a
- \e position in the regexp, not a \e character. A word boundary is
- any non-word character, e.g., a space, newline, or the beginning
- or ending of a string.
-
- If we want to replace ampersand characters with the HTML entity
- \b{\&amp;}, the regexp to match is simply \b{\&}. But this
- regexp will also match ampersands that have already been converted
- to HTML entities. We want to replace only ampersands that are not
- already followed by \b{amp;}. For this, we need the negative
- lookahead assertion, \b{(?!}__\b{)}. The regexp can then be
- written as \b{\&(?!amp;)}, i.e. \e{Match an ampersand that is}
- \b{not} \e{followed by} \b{amp;}.
-
- If we want to count all the occurrences of 'Eric' and 'Eirik' in a
- string, two valid solutions are \b{\\b(Eric|Eirik)\\b} and
- \b{\\bEi?ri[ck]\\b}. The word boundary assertion '\\b' is
- required to avoid matching words that contain either name,
- e.g. 'Ericsson'. Note that the second regexp matches more
- spellings than we want: 'Eric', 'Erik', 'Eiric' and 'Eirik'.
-
- Some of the examples discussed above are implemented in the
- \l{#code-examples}{code examples} section.
-
- \target characters-and-abbreviations-for-sets-of-characters
- \section1 Characters and Abbreviations for Sets of Characters
-
- \table
- \header \li Element \li Meaning
- \row \li \b{c}
- \li A character represents itself unless it has a special
- regexp meaning. e.g. \b{c} matches the character \e c.
- \row \li \b{\\c}
- \li A character that follows a backslash matches the character
- itself, except as specified below. e.g., To match a literal
- caret at the beginning of a string, write \b{\\^}.
- \row \li \b{\\a}
- \li Matches the ASCII bell (BEL, 0x07).
- \row \li \b{\\f}
- \li Matches the ASCII form feed (FF, 0x0C).
- \row \li \b{\\n}
- \li Matches the ASCII line feed (LF, 0x0A, Unix newline).
- \row \li \b{\\r}
- \li Matches the ASCII carriage return (CR, 0x0D).
- \row \li \b{\\t}
- \li Matches the ASCII horizontal tab (HT, 0x09).
- \row \li \b{\\v}
- \li Matches the ASCII vertical tab (VT, 0x0B).
- \row \li \b{\\x\e{hhhh}}
- \li Matches the Unicode character corresponding to the
- hexadecimal number \e{hhhh} (between 0x0000 and 0xFFFF).
- \row \li \b{\\0\e{ooo}} (i.e., \\zero \e{ooo})
- \li matches the ASCII/Latin1 character for the octal number
- \e{ooo} (between 0 and 0377).
- \row \li \b{. (dot)}
- \li Matches any character (including newline).
- \row \li \b{\\d}
- \li Matches a digit (QChar::isDigit()).
- \row \li \b{\\D}
- \li Matches a non-digit.
- \row \li \b{\\s}
- \li Matches a whitespace character (QChar::isSpace()).
- \row \li \b{\\S}
- \li Matches a non-whitespace character.
- \row \li \b{\\w}
- \li Matches a word character (QChar::isLetterOrNumber(), QChar::isMark(), or '_').
- \row \li \b{\\W}
- \li Matches a non-word character.
- \row \li \b{\\\e{n}}
- \li The \e{n}-th backreference, e.g. \\1, \\2, etc.
- \endtable
-
- \b{Note:} The C++ compiler transforms backslashes in strings.
- To include a \b{\\} in a regexp, enter it twice, i.e. \c{\\}.
- To match the backslash character itself, enter it four times, i.e.
- \c{\\\\}.
-
- \target sets-of-characters
- \section1 Sets of Characters
-
- Square brackets mean match any character contained in the square
- brackets. The character set abbreviations described above can
- appear in a character set in square brackets. Except for the
- character set abbreviations and the following two exceptions,
- characters do not have special meanings in square brackets.
-
- \table
- \row \li \b{^}
-
- \li The caret negates the character set if it occurs as the
- first character (i.e. immediately after the opening square
- bracket). \b{[abc]} matches 'a' or 'b' or 'c', but
- \b{[^abc]} matches anything \e but 'a' or 'b' or 'c'.
-
- \row \li \b{-}
-
- \li The dash indicates a range of characters. \b{[W-Z]}
- matches 'W' or 'X' or 'Y' or 'Z'.
-
- \endtable
-
- Using the predefined character set abbreviations is more portable
- than using character ranges across platforms and languages. For
- example, \b{[0-9]} matches a digit in Western alphabets but
- \b{\\d} matches a digit in \e any alphabet.
-
- Note: In other regexp documentation, sets of characters are often
- called "character classes".
-
- \target quantifiers
- \section1 Quantifiers
-
- By default, an expression is automatically quantified by
- \b{{1,1}}, i.e. it should occur exactly once. In the following
- list, \b{\e {E}} stands for expression. An expression is a
- character, or an abbreviation for a set of characters, or a set of
- characters in square brackets, or an expression in parentheses.
-
- \table
- \row \li \b{\e {E}?}
-
- \li Matches zero or one occurrences of \e E. This quantifier
- means \e{The previous expression is optional}, because it
- will match whether or not the expression is found. \b{\e
- {E}?} is the same as \b{\e {E}{0,1}}. e.g., \b{dents?}
- matches 'dent' or 'dents'.
-
- \row \li \b{\e {E}+}
-
- \li Matches one or more occurrences of \e E. \b{\e {E}+} is
- the same as \b{\e {E}{1,}}. e.g., \b{0+} matches '0',
- '00', '000', etc.
-
- \row \li \b{\e {E}*}
-
- \li Matches zero or more occurrences of \e E. It is the same
- as \b{\e {E}{0,}}. The \b{*} quantifier is often used
- in error where \b{+} should be used. For example, if
- \b{\\s*$} is used in an expression to match strings that
- end in whitespace, it will match every string because
- \b{\\s*$} means \e{Match zero or more whitespaces followed
- by end of string}. The correct regexp to match strings that
- have at least one trailing whitespace character is
- \b{\\s+$}.
-
- \row \li \b{\e {E}{n}}
-
- \li Matches exactly \e n occurrences of \e E. \b{\e {E}{n}}
- is the same as repeating \e E \e n times. For example,
- \b{x{5}} is the same as \b{xxxxx}. It is also the same
- as \b{\e {E}{n,n}}, e.g. \b{x{5,5}}.
-
- \row \li \b{\e {E}{n,}}
- \li Matches at least \e n occurrences of \e E.
-
- \row \li \b{\e {E}{,m}}
- \li Matches at most \e m occurrences of \e E. \b{\e {E}{,m}}
- is the same as \b{\e {E}{0,m}}.
-
- \row \li \b{\e {E}{n,m}}
- \li Matches at least \e n and at most \e m occurrences of \e E.
- \endtable
-
- To apply a quantifier to more than just the preceding character,
- use parentheses to group characters together in an expression. For
- example, \b{tag+} matches a 't' followed by an 'a' followed by
- at least one 'g', whereas \b{(tag)+} matches at least one
- occurrence of 'tag'.
-
- Note: Quantifiers are normally "greedy". They always match as much
- text as they can. For example, \b{0+} matches the first zero it
- finds and all the consecutive zeros after the first zero. Applied
- to '20005', it matches '2\underline{000}5'. Quantifiers can be made
- non-greedy, see setMinimal().
-
- \target capturing parentheses
- \target backreferences
- \section1 Capturing Text
-
- Parentheses allow us to group elements together so that we can
- quantify and capture them. For example if we have the expression
- \b{mail|letter|correspondence} that matches a string we know
- that \e one of the words matched but not which one. Using
- parentheses allows us to "capture" whatever is matched within
- their bounds, so if we used \b{(mail|letter|correspondence)}
- and matched this regexp against the string "I sent you some email"
- we can use the cap() or capturedTexts() functions to extract the
- matched characters, in this case 'mail'.
-
- We can use captured text within the regexp itself. To refer to the
- captured text we use \e backreferences which are indexed from 1,
- the same as for cap(). For example we could search for duplicate
- words in a string using \b{\\b(\\w+)\\W+\\1\\b} which means match a
- word boundary followed by one or more word characters followed by
- one or more non-word characters followed by the same text as the
- first parenthesized expression followed by a word boundary.
-
- If we want to use parentheses purely for grouping and not for
- capturing we can use the non-capturing syntax, e.g.
- \b{(?:green|blue)}. Non-capturing parentheses begin '(?:' and
- end ')'. In this example we match either 'green' or 'blue' but we
- do not capture the match so we only know whether or not we matched
- but not which color we actually found. Using non-capturing
- parentheses is more efficient than using capturing parentheses
- since the regexp engine has to do less book-keeping.
-
- Both capturing and non-capturing parentheses may be nested.
-
- \target greedy quantifiers
-
- For historical reasons, quantifiers (e.g. \b{*}) that apply to
- capturing parentheses are more "greedy" than other quantifiers.
- For example, \b{a*(a*)} will match "aaa" with cap(1) == "aaa".
- This behavior is different from what other regexp engines do
- (notably, Perl). To obtain a more intuitive capturing behavior,
- specify QRegExp::RegExp2 to the QRegExp constructor or call
- setPatternSyntax(QRegExp::RegExp2).
-
- \target cap_in_a_loop
-
- When the number of matches cannot be determined in advance, a
- common idiom is to use cap() in a loop. For example:
-
- \snippet code/src_corelib_text_qregexp.cpp 0
-
- \target assertions
- \section1 Assertions
-
- Assertions make some statement about the text at the point where
- they occur in the regexp but they do not match any characters. In
- the following list \b{\e {E}} stands for any expression.
-
- \table
- \row \li \b{^}
- \li The caret signifies the beginning of the string. If you
- wish to match a literal \c{^} you must escape it by
- writing \c{\\^}. For example, \b{^#include} will only
- match strings which \e begin with the characters '#include'.
- (When the caret is the first character of a character set it
- has a special meaning, see \l{#sets-of-characters}{Sets of Characters}.)
-
- \row \li \b{$}
- \li The dollar signifies the end of the string. For example
- \b{\\d\\s*$} will match strings which end with a digit
- optionally followed by whitespace. If you wish to match a
- literal \c{$} you must escape it by writing
- \c{\\$}.
-
- \row \li \b{\\b}
- \li A word boundary. For example the regexp
- \b{\\bOK\\b} means match immediately after a word
- boundary (e.g. start of string or whitespace) the letter 'O'
- then the letter 'K' immediately before another word boundary
- (e.g. end of string or whitespace). But note that the
- assertion does not actually match any whitespace so if we
- write \b{(\\bOK\\b)} and we have a match it will only
- contain 'OK' even if the string is "It's \underline{OK} now".
-
- \row \li \b{\\B}
- \li A non-word boundary. This assertion is true wherever
- \b{\\b} is false. For example if we searched for
- \b{\\Bon\\B} in "Left on" the match would fail (space
- and end of string aren't non-word boundaries), but it would
- match in "t\underline{on}ne".
-
- \row \li \b{(?=\e E)}
- \li Positive lookahead. This assertion is true if the
- expression matches at this point in the regexp. For example,
- \b{const(?=\\s+char)} matches 'const' whenever it is
- followed by 'char', as in 'static \underline{const} char *'.
- (Compare with \b{const\\s+char}, which matches 'static
- \underline{const char} *'.)
-
- \row \li \b{(?!\e E)}
- \li Negative lookahead. This assertion is true if the
- expression does not match at this point in the regexp. For
- example, \b{const(?!\\s+char)} matches 'const' \e except
- when it is followed by 'char'.
- \endtable
-
- \target QRegExp wildcard matching
- \section1 Wildcard Matching
-
- Most command shells such as \e bash or \e cmd.exe support "file
- globbing", the ability to identify a group of files by using
- wildcards. The setPatternSyntax() function is used to switch
- between regexp and wildcard mode. Wildcard matching is much
- simpler than full regexps and has only four features:
-
- \table
- \row \li \b{c}
- \li Any character represents itself apart from those mentioned
- below. Thus \b{c} matches the character \e c.
- \row \li \b{?}
- \li Matches any single character. It is the same as
- \b{.} in full regexps.
- \row \li \b{*}
- \li Matches zero or more of any characters. It is the
- same as \b{.*} in full regexps.
- \row \li \b{[...]}
- \li Sets of characters can be represented in square brackets,
- similar to full regexps. Within the character class, like
- outside, backslash has no special meaning.
- \endtable
-
- In the mode Wildcard, the wildcard characters cannot be
- escaped. In the mode WildcardUnix, the character '\\' escapes the
- wildcard.
-
- For example if we are in wildcard mode and have strings which
- contain filenames we could identify HTML files with \b{*.html}.
- This will match zero or more characters followed by a dot followed
- by 'h', 't', 'm' and 'l'.
-
- To test a string against a wildcard expression, use exactMatch().
- For example:
-
- \snippet code/src_corelib_text_qregexp.cpp 1
-
- \target perl-users
- \section1 Notes for Perl Users
-
- Most of the character class abbreviations supported by Perl are
- supported by QRegExp, see \l{#characters-and-abbreviations-for-sets-of-characters}
- {characters and abbreviations for sets of characters}.
-
- In QRegExp, apart from within character classes, \c{^} always
- signifies the start of the string, so carets must always be
- escaped unless used for that purpose. In Perl the meaning of caret
- varies automagically depending on where it occurs so escaping it
- is rarely necessary. The same applies to \c{$} which in
- QRegExp always signifies the end of the string.
-
- QRegExp's quantifiers are the same as Perl's greedy quantifiers
- (but see the \l{greedy quantifiers}{note above}). Non-greedy
- matching cannot be applied to individual quantifiers, but can be
- applied to all the quantifiers in the pattern. For example, to
- match the Perl regexp \b{ro+?m} requires:
-
- \snippet code/src_corelib_text_qregexp.cpp 2
-
- The equivalent of Perl's \c{/i} option is
- setCaseSensitivity(Qt::CaseInsensitive).
-
- Perl's \c{/g} option can be emulated using a \l{#cap_in_a_loop}{loop}.
-
- In QRegExp \b{.} matches any character, therefore all QRegExp
- regexps have the equivalent of Perl's \c{/s} option. QRegExp
- does not have an equivalent to Perl's \c{/m} option, but this
- can be emulated in various ways for example by splitting the input
- into lines or by looping with a regexp that searches for newlines.
-
- Because QRegExp is string oriented, there are no \\A, \\Z, or \\z
- assertions. The \\G assertion is not supported but can be emulated
- in a loop.
-
- Perl's $& is cap(0) or capturedTexts()[0]. There are no QRegExp
- equivalents for $`, $' or $+. Perl's capturing variables, $1, $2,
- ... correspond to cap(1) or capturedTexts()[1], cap(2) or
- capturedTexts()[2], etc.
-
- To substitute a pattern use QString::replace().
-
- Perl's extended \c{/x} syntax is not supported, nor are
- directives, e.g. (?i), or regexp comments, e.g. (?#comment). On
- the other hand, C++'s rules for literal strings can be used to
- achieve the same:
-
- \snippet code/src_corelib_text_qregexp.cpp 3
-
- Both zero-width positive and zero-width negative lookahead
- assertions (?=pattern) and (?!pattern) are supported with the same
- syntax as Perl. Perl's lookbehind assertions, "independent"
- subexpressions and conditional expressions are not supported.
-
- Non-capturing parentheses are also supported, with the same
- (?:pattern) syntax.
-
- See QString::split() and QStringList::join() for equivalents
- to Perl's split and join functions.
-
- Note: because C++ transforms \\'s they must be written \e twice in
- code, e.g. \b{\\b} must be written \b{\\\\b}.
-
- \target code-examples
- \section1 Code Examples
-
- \snippet code/src_corelib_text_qregexp.cpp 4
-
- The third string matches '\underline{6}'. This is a simple validation
- regexp for integers in the range 0 to 99.
-
- \snippet code/src_corelib_text_qregexp.cpp 5
-
- The second string matches '\underline{This_is-OK}'. We've used the
- character set abbreviation '\\S' (non-whitespace) and the anchors
- to match strings which contain no whitespace.
-
- In the following example we match strings containing 'mail' or
- 'letter' or 'correspondence' but only match whole words i.e. not
- 'email'
-
- \snippet code/src_corelib_text_qregexp.cpp 6
-
- The second string matches "Please write the \underline{letter}". The
- word 'letter' is also captured (because of the parentheses). We
- can see what text we've captured like this:
-
- \snippet code/src_corelib_text_qregexp.cpp 7
-
- This will capture the text from the first set of capturing
- parentheses (counting capturing left parentheses from left to
- right). The parentheses are counted from 1 since cap(0) is the
- whole matched regexp (equivalent to '&' in most regexp engines).
-
- \snippet code/src_corelib_text_qregexp.cpp 8
-
- Here we've passed the QRegExp to QString's replace() function to
- replace the matched text with new text.
-
- \snippet code/src_corelib_text_qregexp.cpp 9
-
- We've used the indexIn() function to repeatedly match the regexp in
- the string. Note that instead of moving forward by one character
- at a time \c pos++ we could have written \c {pos +=
- rx.matchedLength()} to skip over the already matched string. The
- count will equal 3, matching 'One \underline{Eric} another
- \underline{Eirik}, and an Ericsson. How many Eiriks, \underline{Eric}?'; it
- doesn't match 'Ericsson' or 'Eiriks' because they are not bounded
- by non-word boundaries.
-
- One common use of regexps is to split lines of delimited data into
- their component fields.
-
- \snippet code/src_corelib_text_qregexp.cpp 10
-
- In this example our input lines have the format company name, web
- address and country. Unfortunately the regexp is rather long and
- not very versatile -- the code will break if we add any more
- fields. A simpler and better solution is to look for the
- separator, '\\t' in this case, and take the surrounding text. The
- QString::split() function can take a separator string or regexp
- as an argument and split a string accordingly.
-
- \snippet code/src_corelib_text_qregexp.cpp 11
-
- Here field[0] is the company, field[1] the web address and so on.
-
- To imitate the matching of a shell we can use wildcard mode.
-
- \snippet code/src_corelib_text_qregexp.cpp 12
-
- Wildcard matching can be convenient because of its simplicity, but
- any wildcard regexp can be defined using full regexps, e.g.
- \b{.*\\.html$}. Notice that we can't match both \c .html and \c
- .htm files with a wildcard unless we use \b{*.htm*} which will
- also match 'test.html.bak'. A full regexp gives us the precision
- we need, \b{.*\\.html?$}.
-
- QRegExp can match case insensitively using setCaseSensitivity(),
- and can use non-greedy matching, see setMinimal(). By
- default QRegExp uses full regexps but this can be changed with
- setPatternSyntax(). Searching can be done forward with indexIn() or backward
- with lastIndexIn(). Captured text can be accessed using
- capturedTexts() which returns a string list of all captured
- strings, or using cap() which returns the captured string for the
- given index. The pos() function takes a match index and returns
- the position in the string where the match was made (or -1 if
- there was no match).
-
- \sa QString, QStringList, QSortFilterProxyModel,
- {tools/regexp}{Regular Expression Example}
-
-
- \section1 Porting to QRegularExpression
-
- The QRegularExpression class introduced in Qt 5 is a big improvement upon
- QRegExp, in terms of APIs offered, supported pattern syntax and speed of
- execution. The biggest difference is that QRegularExpression simply holds a
- regular expression, and it's \e{not} modified when a match is requested.
- Instead, a QRegularExpressionMatch object is returned, in order to check
- the result of a match and extract the captured substring. The same applies
- with global matching and QRegularExpressionMatchIterator.
-
- Other differences are outlined below.
-
- \section2 Different pattern syntax
-
- Porting a regular expression from QRegExp to QRegularExpression may require
- changes to the pattern itself.
-
- In certain scenarios, QRegExp was too lenient and accepted patterns that
- are simply invalid when using QRegularExpression. These are somehow easy
- to detect, because the QRegularExpression objects built with these patterns
- are not valid (cf. QRegularExpression::isValid()).
-
- In other cases, a pattern ported from QRegExp to QRegularExpression may
- silently change semantics. Therefore, it is necessary to review the
- patterns used. The most notable cases of silent incompatibility are:
-
- \list
-
- \li Curly braces are needed in order to use a hexadecimal escape like
- \c{\xHHHH} with more than 2 digits. A pattern like \c{\x2022} neeeds to
- be ported to \c{\x{2022}}, or it will match a space (\c{0x20}) followed
- by the string \c{"22"}. In general, it is highly recommended to always use
- curly braces with the \c{\x} escape, no matter the amount of digits
- specified.
-
- \li A 0-to-n quantification like \c{{,n}} needs to be ported to \c{{0,n}} to
- preserve semantics. Otherwise, a pattern such as \c{\d{,3}} would
- actually match a digit followed by the exact string \c{"{,3}"}.
-
- \li QRegExp by default does Unicode-aware matching, while
- QRegularExpression requires a separate option; see below for more details.
-
- \li c{.} in QRegExp does by default match all characters, including the
- newline character. QRegularExpression excludes the newline character by
- default. To include the newline character, set the
- QRegularExpression::DotMatchesEverythingOption pattern option.
-
- \endlist
-
- \section2 Porting from QRegExp::exactMatch()
-
- QRegExp::exactMatch() in Qt 4 served two purposes: it exactly matched
- a regular expression against a subject string, and it implemented partial
- matching.
-
- \section3 Porting from QRegExp's Exact Matching
-
- Exact matching indicates whether the regular expression matches the entire
- subject string. For example, the classes yield on the subject string \c{"abc123"}:
-
- \table
- \header \li \li QRegExp::exactMatch() \li QRegularExpressionMatch::hasMatch()
- \row \li \c{"\\d+"} \li \b false \li \b true
- \row \li \c{"[a-z]+\\d+"} \li \b true \li \b true
- \endtable
-
- Exact matching is not reflected in QRegularExpression. If you want
- to be sure that the subject string matches the regular expression
- exactly, you can wrap the pattern using the QRegularExpression::anchoredPattern()
- function:
-
- \snippet code/src_corelib_text_qregexp.cpp 21
-
- \section3 Porting from QRegExp's Partial Matching
-
- When using QRegExp::exactMatch(), if an exact match was not found, one
- could still find out how much of the subject string was matched by the
- regular expression by calling QRegExp::matchedLength(). If the returned length
- was equal to the subject string's length, then one could conclude that a partial
- match was found.
-
- QRegularExpression supports partial matching explicitly by means of the
- appropriate MatchType.
-
- \section2 Global matching
-
- Due to limitations of the QRegExp API it was impossible to implement global
- matching correctly (that is, like Perl does). In particular, patterns that
- can match 0 characters (like \c{"a*"}) are problematic.
-
- QRegularExpression::globalMatch() implements Perl global match correctly, and
- the returned iterator can be used to examine each result.
-
- \section2 Unicode properties support
-
- When using QRegExp, character classes such as \c{\w}, \c{\d}, etc. match
- characters with the corresponding Unicode property: for instance, \c{\d}
- matches any character with the Unicode Nd (decimal digit) property.
-
- Those character classes only match ASCII characters by default when using
- QRegularExpression: for instance, \c{\d} matches exactly a character in the
- \c{0-9} ASCII range. It is possible to change this behavior by using the
- UseUnicodePropertiesOption pattern option.
-
- \section2 Wildcard matching
-
- There is no direct way to do wildcard matching in QRegularExpression.
- However, the wildcardToRegularExpression method is provided to translate
- glob patterns into a Perl-compatible regular expression that can be used
- for that purpose.
-
- \section2 Other pattern syntaxes
-
- QRegularExpression supports only Perl-compatible regular expressions.
-
- \section2 Minimal matching
-
- QRegExp::setMinimal() implemented minimal matching by simply reversing the
- greediness of the quantifiers (QRegExp did not support lazy quantifiers,
- like \c{*?}, \c{+?}, etc.). QRegularExpression instead does support greedy,
- lazy and possessive quantifiers. The InvertedGreedinessOption
- pattern option can be useful to emulate the effects of QRegExp::setMinimal():
- if enabled, it inverts the greediness of quantifiers (greedy ones become
- lazy and vice versa).
-
- \section2 Caret modes
-
- The AnchorAtOffsetMatchOption match option can be used to emulate the
- QRegExp::CaretAtOffset behavior. There is no equivalent for the other
- QRegExp::CaretMode modes.
-*/
-
-#if defined(Q_OS_VXWORKS) && defined(EOS)
-# undef EOS
-#endif
-
-const int NumBadChars = 64;
-#define BadChar(ch) ((ch).unicode() % NumBadChars)
-
-const int NoOccurrence = INT_MAX;
-const int EmptyCapture = INT_MAX;
-const int InftyLen = INT_MAX;
-const int InftyRep = 1025;
-const int EOS = -1;
-
-static bool isWord(QChar ch)
-{
- return ch.isLetterOrNumber() || ch.isMark() || ch == QLatin1Char('_');
-}
-
-/*
- Merges two vectors of ints and puts the result into the first
- one.
-*/
-static void mergeInto(QList<int> *a, const QList<int> &b)
-{
- int asize = a->size();
- int bsize = b.size();
- if (asize == 0) {
- *a = b;
-#ifndef QT_NO_REGEXP_OPTIM
- } else if (bsize == 1 && a->at(asize - 1) < b.at(0)) {
- a->resize(asize + 1);
- (*a)[asize] = b.at(0);
-#endif
- } else if (bsize >= 1) {
- int csize = asize + bsize;
- QList<int> c(csize);
- int i = 0, j = 0, k = 0;
- while (i < asize) {
- if (j < bsize) {
- if (a->at(i) == b.at(j)) {
- ++i;
- --csize;
- } else if (a->at(i) < b.at(j)) {
- c[k++] = a->at(i++);
- } else {
- c[k++] = b.at(j++);
- }
- } else {
- memcpy(c.data() + k, a->constData() + i, (asize - i) * sizeof(int));
- break;
- }
- }
- c.resize(csize);
- if (j < bsize)
- memcpy(c.data() + k, b.constData() + j, (bsize - j) * sizeof(int));
- *a = c;
- }
-}
-
-#ifndef QT_NO_REGEXP_WILDCARD
-/*
- Translates a wildcard pattern to an equivalent regular expression
- pattern (e.g., *.cpp to .*\.cpp).
-
- If enableEscaping is true, it is possible to escape the wildcard
- characters with \
-*/
-static QString wc2rx(const QString &wc_str, const bool enableEscaping)
-{
- const int wclen = wc_str.length();
- QString rx;
- int i = 0;
- bool isEscaping = false; // the previous character is '\'
- const QChar *wc = wc_str.unicode();
-
- while (i < wclen) {
- const QChar c = wc[i++];
- switch (c.unicode()) {
- case '\\':
- if (enableEscaping) {
- if (isEscaping) {
- rx += QLatin1String("\\\\");
- } // we insert the \\ later if necessary
- if (i == wclen) { // the end
- rx += QLatin1String("\\\\");
- }
- } else {
- rx += QLatin1String("\\\\");
- }
- isEscaping = true;
- break;
- case '*':
- if (isEscaping) {
- rx += QLatin1String("\\*");
- isEscaping = false;
- } else {
- rx += QLatin1String(".*");
- }
- break;
- case '?':
- if (isEscaping) {
- rx += QLatin1String("\\?");
- isEscaping = false;
- } else {
- rx += QLatin1Char('.');
- }
-
- break;
- case '$':
- case '(':
- case ')':
- case '+':
- case '.':
- case '^':
- case '{':
- case '|':
- case '}':
- if (isEscaping) {
- isEscaping = false;
- rx += QLatin1String("\\\\");
- }
- rx += QLatin1Char('\\');
- rx += c;
- break;
- case '[':
- if (isEscaping) {
- isEscaping = false;
- rx += QLatin1String("\\[");
- } else {
- rx += c;
- if (wc[i] == QLatin1Char('^'))
- rx += wc[i++];
- if (i < wclen) {
- if (wc[i] == QLatin1Char(']'))
- rx += wc[i++];
- while (i < wclen && wc[i] != QLatin1Char(']')) {
- if (wc[i] == QLatin1Char('\\'))
- rx += QLatin1Char('\\');
- rx += wc[i++];
- }
- }
- }
- break;
-
- case ']':
- if(isEscaping){
- isEscaping = false;
- rx += QLatin1String("\\");
- }
- rx += c;
- break;
-
- default:
- if(isEscaping){
- isEscaping = false;
- rx += QLatin1String("\\\\");
- }
- rx += c;
- }
- }
- return rx;
-}
-#endif
-
-static int caretIndex(int offset, QRegExp::CaretMode caretMode)
-{
- if (caretMode == QRegExp::CaretAtZero) {
- return 0;
- } else if (caretMode == QRegExp::CaretAtOffset) {
- return offset;
- } else { // QRegExp::CaretWontMatch
- return -1;
- }
-}
-
-/*
- The QRegExpEngineKey struct uniquely identifies an engine.
-*/
-struct QRegExpEngineKey
-{
- QString pattern;
- QRegExp::PatternSyntax patternSyntax;
- Qt::CaseSensitivity cs;
-
- inline QRegExpEngineKey(const QString &pattern, QRegExp::PatternSyntax patternSyntax,
- Qt::CaseSensitivity cs)
- : pattern(pattern), patternSyntax(patternSyntax), cs(cs) {}
-
- inline void clear() {
- pattern.clear();
- patternSyntax = QRegExp::RegExp;
- cs = Qt::CaseSensitive;
- }
-};
-
-static bool operator==(const QRegExpEngineKey &key1, const QRegExpEngineKey &key2)
-{
- return key1.pattern == key2.pattern && key1.patternSyntax == key2.patternSyntax
- && key1.cs == key2.cs;
-}
-
-static size_t qHash(const QRegExpEngineKey &key, size_t seed = 0) noexcept
-{
- return qHashMulti(seed, key.pattern, key.patternSyntax, key.cs);
-}
-
-class QRegExpEngine;
-
-/*
- This is the engine state during matching.
-*/
-struct QRegExpMatchState
-{
- const QChar *in; // a pointer to the input string data
- int pos; // the current position in the string
- int caretPos;
- int len; // the length of the input string
- bool minimal; // minimal matching?
- int *bigArray; // big array holding the data for the next pointers
- int *inNextStack; // is state is nextStack?
- int *curStack; // stack of current states
- int *nextStack; // stack of next states
- int *curCapBegin; // start of current states' captures
- int *nextCapBegin; // start of next states' captures
- int *curCapEnd; // end of current states' captures
- int *nextCapEnd; // end of next states' captures
- int *tempCapBegin; // start of temporary captures
- int *tempCapEnd; // end of temporary captures
- int *capBegin; // start of captures for a next state
- int *capEnd; // end of captures for a next state
- int *slideTab; // bump-along slide table for bad-character heuristic
- int *captured; // what match() returned last
- int slideTabSize; // size of slide table
- int capturedSize;
-#ifndef QT_NO_REGEXP_BACKREF
- QList<QList<int>> sleeping; // list of back-reference sleepers
-#endif
- int matchLen; // length of match
- int oneTestMatchedLen; // length of partial match
-
- const QRegExpEngine *eng;
-
- inline QRegExpMatchState() : bigArray(nullptr), captured(nullptr) {}
- inline ~QRegExpMatchState() { free(bigArray); }
-
- void drain() { free(bigArray); bigArray = nullptr; captured = nullptr; } // to save memory
- void prepareForMatch(QRegExpEngine *eng);
- void match(const QChar *str, int len, int pos, bool minimal,
- bool oneTest, int caretIndex);
- bool matchHere();
- bool testAnchor(int i, int a, const int *capBegin);
-};
-
-/*
- The struct QRegExpAutomatonState represents one state in a modified NFA. The
- input characters matched are stored in the state instead of on
- the transitions, something possible for an automaton
- constructed from a regular expression.
-*/
-struct QRegExpAutomatonState
-{
-#ifndef QT_NO_REGEXP_CAPTURE
- int atom; // which atom does this state belong to?
-#endif
- int match; // what does it match? (see CharClassBit and BackRefBit)
- QList<int> outs; // out-transitions
- QMap<int, int> reenter; // atoms reentered when transiting out
- QMap<int, int> anchors; // anchors met when transiting out
-
- inline QRegExpAutomatonState() { }
-#ifndef QT_NO_REGEXP_CAPTURE
- inline QRegExpAutomatonState(int a, int m)
- : atom(a), match(m) { }
-#else
- inline QRegExpAutomatonState(int m)
- : match(m) { }
-#endif
-};
-
-Q_DECLARE_TYPEINFO(QRegExpAutomatonState, Q_MOVABLE_TYPE);
-
-/*
- The struct QRegExpCharClassRange represents a range of characters (e.g.,
- [0-9] denotes range 48 to 57).
-*/
-struct QRegExpCharClassRange
-{
- ushort from; // 48
- ushort len; // 10
-};
-
-Q_DECLARE_TYPEINFO(QRegExpCharClassRange, Q_PRIMITIVE_TYPE);
-
-#ifndef QT_NO_REGEXP_CAPTURE
-/*
- The struct QRegExpAtom represents one node in the hierarchy of regular
- expression atoms.
-*/
-struct QRegExpAtom
-{
- enum { NoCapture = -1, OfficialCapture = -2, UnofficialCapture = -3 };
-
- int parent; // index of parent in array of atoms
- int capture; // index of capture, from 1 to ncap - 1
-};
-
-Q_DECLARE_TYPEINFO(QRegExpAtom, Q_PRIMITIVE_TYPE);
-#endif
-
-struct QRegExpLookahead;
-
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
-/*
- The struct QRegExpAnchorAlternation represents a pair of anchors with
- OR semantics.
-*/
-struct QRegExpAnchorAlternation
-{
- int a; // this anchor...
- int b; // ...or this one
-};
-
-Q_DECLARE_TYPEINFO(QRegExpAnchorAlternation, Q_PRIMITIVE_TYPE);
-#endif
-
-#ifndef QT_NO_REGEXP_CCLASS
-
-#define FLAG(x) (1 << (x))
-/*
- The class QRegExpCharClass represents a set of characters, such as can
- be found in regular expressions (e.g., [a-z] denotes the set
- {a, b, ..., z}).
-*/
-class QRegExpCharClass
-{
-public:
- QRegExpCharClass();
-
- void clear();
- bool negative() const { return n; }
- void setNegative(bool negative);
- void addCategories(uint cats);
- void addRange(ushort from, ushort to);
- void addSingleton(ushort ch) { addRange(ch, ch); }
-
- bool in(QChar ch) const;
-#ifndef QT_NO_REGEXP_OPTIM
- const QList<int> &firstOccurrence() const { return occ1; }
-#endif
-
-#if defined(QT_DEBUG)
- void dump() const;
-#endif
-
-private:
- QList<QRegExpCharClassRange> r; // character ranges
-#ifndef QT_NO_REGEXP_OPTIM
- QList<int> occ1; // first-occurrence array
-#endif
- uint c; // character classes
- bool n; // negative?
-};
-#else
-struct QRegExpCharClass
-{
- int dummy;
-
-#ifndef QT_NO_REGEXP_OPTIM
- QRegExpCharClass() { occ1.fill(0, NumBadChars); }
-
- const QList<int> &firstOccurrence() const { return occ1; }
- QList<int> occ1;
-#endif
-};
-#endif
-
-Q_DECLARE_TYPEINFO(QRegExpCharClass, Q_MOVABLE_TYPE);
-
-/*
- The QRegExpEngine class encapsulates a modified nondeterministic
- finite automaton (NFA).
-*/
-class QRegExpEngine
-{
-public:
- QRegExpEngine(Qt::CaseSensitivity cs, bool greedyQuantifiers)
- : cs(cs), greedyQuantifiers(greedyQuantifiers) { setup(); }
-
- QRegExpEngine(const QRegExpEngineKey &key);
- ~QRegExpEngine();
-
- bool isValid() const { return valid; }
- const QString &errorString() const { return yyError; }
- int captureCount() const { return officialncap; }
-
- int createState(QChar ch);
- int createState(const QRegExpCharClass &cc);
-#ifndef QT_NO_REGEXP_BACKREF
- int createState(int bref);
-#endif
-
- void addCatTransitions(const QList<int> &from, const QList<int> &to);
-#ifndef QT_NO_REGEXP_CAPTURE
- void addPlusTransitions(const QList<int> &from, const QList<int> &to, int atom);
-#endif
-
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
- int anchorAlternation(int a, int b);
- int anchorConcatenation(int a, int b);
-#else
- int anchorAlternation(int a, int b) { return a & b; }
- int anchorConcatenation(int a, int b) { return a | b; }
-#endif
- void addAnchors(int from, int to, int a);
-
-#ifndef QT_NO_REGEXP_OPTIM
- void heuristicallyChooseHeuristic();
-#endif
-
-#if defined(QT_DEBUG)
- void dump() const;
-#endif
-
- QAtomicInt ref;
-
-private:
- enum { CharClassBit = 0x10000, BackRefBit = 0x20000 };
- enum { InitialState = 0, FinalState = 1 };
-
- void setup();
- int setupState(int match);
-
- /*
- Let's hope that 13 lookaheads and 14 back-references are
- enough.
- */
- enum { MaxLookaheads = 13, MaxBackRefs = 14 };
- enum { Anchor_Dollar = 0x00000001, Anchor_Caret = 0x00000002, Anchor_Word = 0x00000004,
- Anchor_NonWord = 0x00000008, Anchor_FirstLookahead = 0x00000010,
- Anchor_BackRef1Empty = Anchor_FirstLookahead << MaxLookaheads,
- Anchor_BackRef0Empty = Anchor_BackRef1Empty >> 1,
- Anchor_Alternation = unsigned(Anchor_BackRef1Empty) << MaxBackRefs,
-
- Anchor_LookaheadMask = (Anchor_FirstLookahead - 1) ^
- ((Anchor_FirstLookahead << MaxLookaheads) - 1) };
-#ifndef QT_NO_REGEXP_CAPTURE
- int startAtom(bool officialCapture);
- void finishAtom(int atom, bool needCapture);
-#endif
-
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- int addLookahead(QRegExpEngine *eng, bool negative);
-#endif
-
-#ifndef QT_NO_REGEXP_OPTIM
- bool goodStringMatch(QRegExpMatchState &matchState) const;
- bool badCharMatch(QRegExpMatchState &matchState) const;
-#else
- bool bruteMatch(QRegExpMatchState &matchState) const;
-#endif
-
- QList<QRegExpAutomatonState> s; // array of states
-#ifndef QT_NO_REGEXP_CAPTURE
- QList<QRegExpAtom> f; // atom hierarchy
- int nf; // number of atoms
- int cf; // current atom
- QList<int> captureForOfficialCapture;
-#endif
- int officialncap; // number of captures, seen from the outside
- int ncap; // number of captures, seen from the inside
-#ifndef QT_NO_REGEXP_CCLASS
- QList<QRegExpCharClass> cl; // array of character classes
-#endif
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- QList<QRegExpLookahead *> ahead; // array of lookaheads
-#endif
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
- QList<QRegExpAnchorAlternation> aa; // array of (a, b) pairs of anchors
-#endif
-#ifndef QT_NO_REGEXP_OPTIM
- bool caretAnchored; // does the regexp start with ^?
- bool trivial; // is the good-string all that needs to match?
-#endif
- bool valid; // is the regular expression valid?
- Qt::CaseSensitivity cs; // case sensitive?
- bool greedyQuantifiers; // RegExp2?
- bool xmlSchemaExtensions;
-#ifndef QT_NO_REGEXP_BACKREF
- int nbrefs; // number of back-references
-#endif
-
-#ifndef QT_NO_REGEXP_OPTIM
- bool useGoodStringHeuristic; // use goodStringMatch? otherwise badCharMatch
-
- int goodEarlyStart; // the index where goodStr can first occur in a match
- int goodLateStart; // the index where goodStr can last occur in a match
- QString goodStr; // the string that any match has to contain
-
- int minl; // the minimum length of a match
- QList<int> occ1; // first-occurrence array
-#endif
-
- /*
- The class Box is an abstraction for a regular expression
- fragment. It can also be seen as one node in the syntax tree of
- a regular expression with synthetized attributes.
-
- Its interface is ugly for performance reasons.
- */
- class Box
- {
- public:
- Box(QRegExpEngine *engine);
- Box(const Box &b) { operator=(b); }
-
- Box &operator=(const Box &b);
-
- void clear() { operator=(Box(eng)); }
- void set(QChar ch);
- void set(const QRegExpCharClass &cc);
-#ifndef QT_NO_REGEXP_BACKREF
- void set(int bref);
-#endif
-
- void cat(const Box &b);
- void orx(const Box &b);
- void plus(int atom);
- void opt();
- void catAnchor(int a);
-#ifndef QT_NO_REGEXP_OPTIM
- void setupHeuristics();
-#endif
-
-#if defined(QT_DEBUG)
- void dump() const;
-#endif
-
- private:
- void addAnchorsToEngine(const Box &to) const;
-
- QRegExpEngine *eng; // the automaton under construction
- QList<int> ls; // the left states (firstpos)
- QList<int> rs; // the right states (lastpos)
- QMap<int, int> lanchors; // the left anchors
- QMap<int, int> ranchors; // the right anchors
- int skipanchors; // the anchors to match if the box is skipped
-
-#ifndef QT_NO_REGEXP_OPTIM
- int earlyStart; // the index where str can first occur
- int lateStart; // the index where str can last occur
- QString str; // a string that has to occur in any match
- QString leftStr; // a string occurring at the left of this box
- QString rightStr; // a string occurring at the right of this box
- int maxl; // the maximum length of this box (possibly InftyLen)
-#endif
-
- int minl; // the minimum length of this box
-#ifndef QT_NO_REGEXP_OPTIM
- QList<int> occ1; // first-occurrence array
-#endif
- };
-
- friend class Box;
-
- /*
- This is the lexical analyzer for regular expressions.
- */
- enum { Tok_Eos, Tok_Dollar, Tok_LeftParen, Tok_MagicLeftParen, Tok_PosLookahead,
- Tok_NegLookahead, Tok_RightParen, Tok_CharClass, Tok_Caret, Tok_Quantifier, Tok_Bar,
- Tok_Word, Tok_NonWord, Tok_Char = 0x10000, Tok_BackRef = 0x20000 };
- int getChar();
- int getEscape();
-#ifndef QT_NO_REGEXP_INTERVAL
- int getRep(int def);
-#endif
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- void skipChars(int n);
-#endif
- void error(const char *msg);
- void startTokenizer(const QChar *rx, int len);
- int getToken();
-
- const QChar *yyIn; // a pointer to the input regular expression pattern
- int yyPos0; // the position of yyTok in the input pattern
- int yyPos; // the position of the next character to read
- int yyLen; // the length of yyIn
- int yyCh; // the last character read
- QScopedPointer<QRegExpCharClass> yyCharClass; // attribute for Tok_CharClass tokens
- int yyMinRep; // attribute for Tok_Quantifier
- int yyMaxRep; // ditto
- QString yyError; // syntax error or overflow during parsing?
-
- /*
- This is the syntactic analyzer for regular expressions.
- */
- int parse(const QChar *rx, int len);
- void parseAtom(Box *box);
- void parseFactor(Box *box);
- void parseTerm(Box *box);
- void parseExpression(Box *box);
-
- int yyTok; // the last token read
- bool yyMayCapture; // set this to false to disable capturing
-
- friend struct QRegExpMatchState;
-};
-
-#ifndef QT_NO_REGEXP_LOOKAHEAD
-/*
- The struct QRegExpLookahead represents a lookahead a la Perl (e.g.,
- (?=foo) and (?!bar)).
-*/
-struct QRegExpLookahead
-{
- QRegExpEngine *eng; // NFA representing the embedded regular expression
- bool neg; // negative lookahead?
-
- inline QRegExpLookahead(QRegExpEngine *eng0, bool neg0)
- : eng(eng0), neg(neg0) { }
- inline ~QRegExpLookahead() { delete eng; }
-};
-#endif
-
-/*!
- \internal
- convert the pattern string to the RegExp syntax.
-
- This is also used by QScriptEngine::newRegExp to convert to a pattern that JavaScriptCore can understan
- */
-Q_CORE_EXPORT QString qt_regexp_toCanonical(const QString &pattern, QRegExp::PatternSyntax patternSyntax)
-{
- switch (patternSyntax) {
-#ifndef QT_NO_REGEXP_WILDCARD
- case QRegExp::Wildcard:
- return wc2rx(pattern, false);
- case QRegExp::WildcardUnix:
- return wc2rx(pattern, true);
-#endif
- case QRegExp::FixedString:
- return QRegExp::escape(pattern);
- case QRegExp::W3CXmlSchema11:
- default:
- return pattern;
- }
-}
-
-QRegExpEngine::QRegExpEngine(const QRegExpEngineKey &key)
- : cs(key.cs), greedyQuantifiers(key.patternSyntax == QRegExp::RegExp2),
- xmlSchemaExtensions(key.patternSyntax == QRegExp::W3CXmlSchema11)
-{
- setup();
-
- QString rx = qt_regexp_toCanonical(key.pattern, key.patternSyntax);
-
- valid = (parse(rx.unicode(), rx.length()) == rx.length());
- if (!valid) {
-#ifndef QT_NO_REGEXP_OPTIM
- trivial = false;
-#endif
- error(RXERR_LEFTDELIM);
- }
-}
-
-QRegExpEngine::~QRegExpEngine()
-{
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- qDeleteAll(ahead);
-#endif
-}
-
-void QRegExpMatchState::prepareForMatch(QRegExpEngine *eng)
-{
- /*
- We use one QList<int> for all the big data used a lot in
- matchHere() and friends.
- */
- int ns = eng->s.size(); // number of states
- int ncap = eng->ncap;
-#ifndef QT_NO_REGEXP_OPTIM
- int newSlideTabSize = qMax(eng->minl + 1, 16);
-#else
- int newSlideTabSize = 0;
-#endif
- int numCaptures = eng->captureCount();
- int newCapturedSize = 2 + 2 * numCaptures;
- bigArray = q_check_ptr((int *)realloc(bigArray, ((3 + 4 * ncap) * ns + 4 * ncap + newSlideTabSize + newCapturedSize)*sizeof(int)));
-
- // set all internal variables only _after_ bigArray is realloc'ed
- // to prevent a broken regexp in oom case
-
- slideTabSize = newSlideTabSize;
- capturedSize = newCapturedSize;
- inNextStack = bigArray;
- memset(inNextStack, -1, ns * sizeof(int));
- curStack = inNextStack + ns;
- nextStack = inNextStack + 2 * ns;
-
- curCapBegin = inNextStack + 3 * ns;
- nextCapBegin = curCapBegin + ncap * ns;
- curCapEnd = curCapBegin + 2 * ncap * ns;
- nextCapEnd = curCapBegin + 3 * ncap * ns;
-
- tempCapBegin = curCapBegin + 4 * ncap * ns;
- tempCapEnd = tempCapBegin + ncap;
- capBegin = tempCapBegin + 2 * ncap;
- capEnd = tempCapBegin + 3 * ncap;
-
- slideTab = tempCapBegin + 4 * ncap;
- captured = slideTab + slideTabSize;
- memset(captured, -1, capturedSize*sizeof(int));
- this->eng = eng;
-}
-
-/*
- Tries to match in str and returns an array of (begin, length) pairs
- for captured text. If there is no match, all pairs are (-1, -1).
-*/
-void QRegExpMatchState::match(const QChar *str0, int len0, int pos0,
- bool minimal0, bool oneTest, int caretIndex)
-{
- bool matched = false;
- QChar char_null;
-
-#ifndef QT_NO_REGEXP_OPTIM
- if (eng->trivial && !oneTest) {
- // ### Qt6: qsizetype
- pos = int(QtPrivate::findString(QStringView(str0, len0), pos0, QStringView(eng->goodStr.unicode(), eng->goodStr.length()), eng->cs));
- matchLen = eng->goodStr.length();
- matched = (pos != -1);
- } else
-#endif
- {
- in = str0;
- if (in == nullptr)
- in = &char_null;
- pos = pos0;
- caretPos = caretIndex;
- len = len0;
- minimal = minimal0;
- matchLen = 0;
- oneTestMatchedLen = 0;
-
- if (eng->valid && pos >= 0 && pos <= len) {
-#ifndef QT_NO_REGEXP_OPTIM
- if (oneTest) {
- matched = matchHere();
- } else {
- if (pos <= len - eng->minl) {
- if (eng->caretAnchored) {
- matched = matchHere();
- } else if (eng->useGoodStringHeuristic) {
- matched = eng->goodStringMatch(*this);
- } else {
- matched = eng->badCharMatch(*this);
- }
- }
- }
-#else
- matched = oneTest ? matchHere() : eng->bruteMatch(*this);
-#endif
- }
- }
-
- if (matched) {
- int *c = captured;
- *c++ = pos;
- *c++ = matchLen;
-
- int numCaptures = (capturedSize - 2) >> 1;
-#ifndef QT_NO_REGEXP_CAPTURE
- for (int i = 0; i < numCaptures; ++i) {
- int j = eng->captureForOfficialCapture.at(i);
- if (capBegin[j] != EmptyCapture) {
- int len = capEnd[j] - capBegin[j];
- *c++ = (len > 0) ? pos + capBegin[j] : 0;
- *c++ = len;
- } else {
- *c++ = -1;
- *c++ = -1;
- }
- }
-#endif
- } else {
- // we rely on 2's complement here
- memset(captured, -1, capturedSize * sizeof(int));
- }
-}
-
-/*
- The three following functions add one state to the automaton and
- return the number of the state.
-*/
-
-int QRegExpEngine::createState(QChar ch)
-{
- return setupState(ch.unicode());
-}
-
-int QRegExpEngine::createState(const QRegExpCharClass &cc)
-{
-#ifndef QT_NO_REGEXP_CCLASS
- int n = cl.size();
- cl += QRegExpCharClass(cc);
- return setupState(CharClassBit | n);
-#else
- Q_UNUSED(cc);
- return setupState(CharClassBit);
-#endif
-}
-
-#ifndef QT_NO_REGEXP_BACKREF
-int QRegExpEngine::createState(int bref)
-{
- if (bref > nbrefs) {
- nbrefs = bref;
- if (nbrefs > MaxBackRefs) {
- error(RXERR_LIMIT);
- return 0;
- }
- }
- return setupState(BackRefBit | bref);
-}
-#endif
-
-/*
- The two following functions add a transition between all pairs of
- states (i, j) where i is found in from, and j is found in to.
-
- Cat-transitions are distinguished from plus-transitions for
- capturing.
-*/
-
-void QRegExpEngine::addCatTransitions(const QList<int> &from, const QList<int> &to)
-{
- for (int i = 0; i < from.size(); i++)
- mergeInto(&s[from.at(i)].outs, to);
-}
-
-#ifndef QT_NO_REGEXP_CAPTURE
-void QRegExpEngine::addPlusTransitions(const QList<int> &from, const QList<int> &to, int atom)
-{
- for (int i = 0; i < from.size(); i++) {
- QRegExpAutomatonState &st = s[from.at(i)];
- const QList<int> oldOuts = st.outs;
- mergeInto(&st.outs, to);
- if (f.at(atom).capture != QRegExpAtom::NoCapture) {
- for (int j = 0; j < to.size(); j++) {
- // ### st.reenter.contains(to.at(j)) check looks suspicious
- if (!st.reenter.contains(to.at(j)) &&
- !std::binary_search(oldOuts.constBegin(), oldOuts.constEnd(), to.at(j)))
- st.reenter.insert(to.at(j), atom);
- }
- }
- }
-}
-#endif
-
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
-/*
- Returns an anchor that means a OR b.
-*/
-int QRegExpEngine::anchorAlternation(int a, int b)
-{
- if (((a & b) == a || (a & b) == b) && ((a | b) & Anchor_Alternation) == 0)
- return a & b;
-
- int n = aa.size();
-#ifndef QT_NO_REGEXP_OPTIM
- if (n > 0 && aa.at(n - 1).a == a && aa.at(n - 1).b == b)
- return Anchor_Alternation | (n - 1);
-#endif
-
- QRegExpAnchorAlternation element = {a, b};
- aa.append(element);
- return Anchor_Alternation | n;
-}
-
-/*
- Returns an anchor that means a AND b.
-*/
-int QRegExpEngine::anchorConcatenation(int a, int b)
-{
- if (((a | b) & Anchor_Alternation) == 0)
- return a | b;
- if ((b & Anchor_Alternation) != 0)
- qSwap(a, b);
-
- int aprime = anchorConcatenation(aa.at(a ^ Anchor_Alternation).a, b);
- int bprime = anchorConcatenation(aa.at(a ^ Anchor_Alternation).b, b);
- return anchorAlternation(aprime, bprime);
-}
-#endif
-
-/*
- Adds anchor a on a transition caracterised by its from state and
- its to state.
-*/
-void QRegExpEngine::addAnchors(int from, int to, int a)
-{
- QRegExpAutomatonState &st = s[from];
- if (st.anchors.contains(to))
- a = anchorAlternation(st.anchors.value(to), a);
- st.anchors.insert(to, a);
-}
-
-#ifndef QT_NO_REGEXP_OPTIM
-/*
- This function chooses between the good-string and the bad-character
- heuristics. It computes two scores and chooses the heuristic with
- the highest score.
-
- Here are some common-sense constraints on the scores that should be
- respected if the formulas are ever modified: (1) If goodStr is
- empty, the good-string heuristic scores 0. (2) If the regular
- expression is trivial, the good-string heuristic should be used.
- (3) If the search is case insensitive, the good-string heuristic
- should be used, unless it scores 0. (Case insensitivity turns all
- entries of occ1 to 0.) (4) If (goodLateStart - goodEarlyStart) is
- big, the good-string heuristic should score less.
-*/
-void QRegExpEngine::heuristicallyChooseHeuristic()
-{
- if (minl == 0) {
- useGoodStringHeuristic = false;
- } else if (trivial) {
- useGoodStringHeuristic = true;
- } else {
- /*
- Magic formula: The good string has to constitute a good
- proportion of the minimum-length string, and appear at a
- more-or-less known index.
- */
- int goodStringScore = (64 * goodStr.length() / minl) -
- (goodLateStart - goodEarlyStart);
- /*
- Less magic formula: We pick some characters at random, and
- check whether they are good or bad.
- */
- int badCharScore = 0;
- int step = qMax(1, NumBadChars / 32);
- for (int i = 1; i < NumBadChars; i += step) {
- if (occ1.at(i) == NoOccurrence)
- badCharScore += minl;
- else
- badCharScore += occ1.at(i);
- }
- badCharScore /= minl;
- useGoodStringHeuristic = (goodStringScore > badCharScore);
- }
-}
-#endif
-
-#if defined(QT_DEBUG)
-void QRegExpEngine::dump() const
-{
- int i, j;
- qDebug("Case %ssensitive engine", cs ? "" : "in");
- qDebug(" States");
- for (i = 0; i < s.size(); i++) {
- qDebug(" %d%s", i, i == InitialState ? " (initial)" : i == FinalState ? " (final)" : "");
-#ifndef QT_NO_REGEXP_CAPTURE
- if (nf > 0)
- qDebug(" in atom %d", s[i].atom);
-#endif
- int m = s[i].match;
- if ((m & CharClassBit) != 0) {
- qDebug(" match character class %d", m ^ CharClassBit);
-#ifndef QT_NO_REGEXP_CCLASS
- cl[m ^ CharClassBit].dump();
-#else
- qDebug(" negative character class");
-#endif
- } else if ((m & BackRefBit) != 0) {
- qDebug(" match back-reference %d", m ^ BackRefBit);
- } else if (m >= 0x20 && m <= 0x7e) {
- qDebug(" match 0x%.4x (%c)", m, m);
- } else {
- qDebug(" match 0x%.4x", m);
- }
- for (j = 0; j < s[i].outs.size(); j++) {
- int next = s[i].outs[j];
- qDebug(" -> %d", next);
- if (s[i].reenter.contains(next))
- qDebug(" [reenter %d]", s[i].reenter[next]);
- if (s[i].anchors.value(next) != 0)
- qDebug(" [anchors 0x%.8x]", s[i].anchors[next]);
- }
- }
-#ifndef QT_NO_REGEXP_CAPTURE
- if (nf > 0) {
- qDebug(" Atom Parent Capture");
- for (i = 0; i < nf; i++) {
- if (f[i].capture == QRegExpAtom::NoCapture) {
- qDebug(" %6d %6d nil", i, f[i].parent);
- } else {
- int cap = f[i].capture;
- bool official = captureForOfficialCapture.contains(cap);
- qDebug(" %6d %6d %6d %s", i, f[i].parent, f[i].capture,
- official ? "official" : "");
- }
- }
- }
-#endif
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
- for (i = 0; i < aa.size(); i++)
- qDebug(" Anchor alternation 0x%.8x: 0x%.8x 0x%.9x", i, aa[i].a, aa[i].b);
-#endif
-}
-#endif
-
-void QRegExpEngine::setup()
-{
- ref.storeRelaxed(1);
-#ifndef QT_NO_REGEXP_CAPTURE
- f.resize(32);
- nf = 0;
- cf = -1;
-#endif
- officialncap = 0;
- ncap = 0;
-#ifndef QT_NO_REGEXP_OPTIM
- caretAnchored = true;
- trivial = true;
-#endif
- valid = false;
-#ifndef QT_NO_REGEXP_BACKREF
- nbrefs = 0;
-#endif
-#ifndef QT_NO_REGEXP_OPTIM
- useGoodStringHeuristic = true;
- minl = 0;
- occ1.fill(0, NumBadChars);
-#endif
-}
-
-int QRegExpEngine::setupState(int match)
-{
-#ifndef QT_NO_REGEXP_CAPTURE
- s += QRegExpAutomatonState(cf, match);
-#else
- s += QRegExpAutomatonState(match);
-#endif
- return s.size() - 1;
-}
-
-#ifndef QT_NO_REGEXP_CAPTURE
-/*
- Functions startAtom() and finishAtom() should be called to delimit
- atoms. When a state is created, it is assigned to the current atom.
- The information is later used for capturing.
-*/
-int QRegExpEngine::startAtom(bool officialCapture)
-{
- if ((nf & (nf + 1)) == 0 && nf + 1 >= f.size())
- f.resize((nf + 1) << 1);
- f[nf].parent = cf;
- cf = nf++;
- f[cf].capture = officialCapture ? QRegExpAtom::OfficialCapture : QRegExpAtom::NoCapture;
- return cf;
-}
-
-void QRegExpEngine::finishAtom(int atom, bool needCapture)
-{
- if (greedyQuantifiers && needCapture && f[atom].capture == QRegExpAtom::NoCapture)
- f[atom].capture = QRegExpAtom::UnofficialCapture;
- cf = f.at(atom).parent;
-}
-#endif
-
-#ifndef QT_NO_REGEXP_LOOKAHEAD
-/*
- Creates a lookahead anchor.
-*/
-int QRegExpEngine::addLookahead(QRegExpEngine *eng, bool negative)
-{
- int n = ahead.size();
- if (n == MaxLookaheads) {
- error(RXERR_LIMIT);
- return 0;
- }
- ahead += new QRegExpLookahead(eng, negative);
- return Anchor_FirstLookahead << n;
-}
-#endif
-
-#ifndef QT_NO_REGEXP_CAPTURE
-/*
- We want the longest leftmost captures.
-*/
-static bool isBetterCapture(int ncap, const int *begin1, const int *end1, const int *begin2,
- const int *end2)
-{
- for (int i = 0; i < ncap; i++) {
- int delta = begin2[i] - begin1[i]; // it has to start early...
- if (delta == 0)
- delta = end1[i] - end2[i]; // ...and end late
-
- if (delta != 0)
- return delta > 0;
- }
- return false;
-}
-#endif
-
-/*
- Returns \c true if anchor a matches at position pos + i in the input
- string, otherwise false.
-*/
-bool QRegExpMatchState::testAnchor(int i, int a, const int *capBegin)
-{
- int j;
-
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
- if ((a & QRegExpEngine::Anchor_Alternation) != 0)
- return testAnchor(i, eng->aa.at(a ^ QRegExpEngine::Anchor_Alternation).a, capBegin)
- || testAnchor(i, eng->aa.at(a ^ QRegExpEngine::Anchor_Alternation).b, capBegin);
-#endif
-
- if ((a & QRegExpEngine::Anchor_Caret) != 0) {
- if (pos + i != caretPos)
- return false;
- }
- if ((a & QRegExpEngine::Anchor_Dollar) != 0) {
- if (pos + i != len)
- return false;
- }
-#ifndef QT_NO_REGEXP_ESCAPE
- if ((a & (QRegExpEngine::Anchor_Word | QRegExpEngine::Anchor_NonWord)) != 0) {
- bool before = false;
- bool after = false;
- if (pos + i != 0)
- before = isWord(in[pos + i - 1]);
- if (pos + i != len)
- after = isWord(in[pos + i]);
- if ((a & QRegExpEngine::Anchor_Word) != 0 && (before == after))
- return false;
- if ((a & QRegExpEngine::Anchor_NonWord) != 0 && (before != after))
- return false;
- }
-#endif
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- if ((a & QRegExpEngine::Anchor_LookaheadMask) != 0) {
- const QList<QRegExpLookahead *> &ahead = eng->ahead;
- for (j = 0; j < ahead.size(); j++) {
- if ((a & (QRegExpEngine::Anchor_FirstLookahead << j)) != 0) {
- QRegExpMatchState matchState;
- matchState.prepareForMatch(ahead[j]->eng);
- matchState.match(in + pos + i, len - pos - i, 0,
- true, true, caretPos - pos - i);
- if ((matchState.captured[0] == 0) == ahead[j]->neg)
- return false;
- }
- }
- }
-#endif
-#ifndef QT_NO_REGEXP_CAPTURE
-#ifndef QT_NO_REGEXP_BACKREF
- for (j = 0; j < eng->nbrefs; j++) {
- if ((a & (QRegExpEngine::Anchor_BackRef1Empty << j)) != 0) {
- int i = eng->captureForOfficialCapture.at(j);
- if (capBegin[i] != EmptyCapture)
- return false;
- }
- }
-#endif
-#endif
- return true;
-}
-
-#ifndef QT_NO_REGEXP_OPTIM
-/*
- The three following functions are what Jeffrey Friedl would call
- transmissions (or bump-alongs). Using one or the other should make
- no difference except in performance.
-*/
-
-bool QRegExpEngine::goodStringMatch(QRegExpMatchState &matchState) const
-{
- int k = matchState.pos + goodEarlyStart;
- QStringMatcher matcher(goodStr.unicode(), goodStr.length(), cs);
- while ((k = matcher.indexIn(matchState.in, matchState.len, k)) != -1) {
- int from = k - goodLateStart;
- int to = k - goodEarlyStart;
- if (from > matchState.pos)
- matchState.pos = from;
-
- while (matchState.pos <= to) {
- if (matchState.matchHere())
- return true;
- ++matchState.pos;
- }
- ++k;
- }
- return false;
-}
-
-bool QRegExpEngine::badCharMatch(QRegExpMatchState &matchState) const
-{
- int slideHead = 0;
- int slideNext = 0;
- int i;
- int lastPos = matchState.len - minl;
- memset(matchState.slideTab, 0, matchState.slideTabSize * sizeof(int));
-
- /*
- Set up the slide table, used for the bad-character heuristic,
- using the table of first occurrence of each character.
- */
- for (i = 0; i < minl; i++) {
- int sk = occ1[BadChar(matchState.in[matchState.pos + i])];
- if (sk == NoOccurrence)
- sk = i + 1;
- if (sk > 0) {
- int k = i + 1 - sk;
- if (k < 0) {
- sk = i + 1;
- k = 0;
- }
- if (sk > matchState.slideTab[k])
- matchState.slideTab[k] = sk;
- }
- }
-
- if (matchState.pos > lastPos)
- return false;
-
- for (;;) {
- if (++slideNext >= matchState.slideTabSize)
- slideNext = 0;
- if (matchState.slideTab[slideHead] > 0) {
- if (matchState.slideTab[slideHead] - 1 > matchState.slideTab[slideNext])
- matchState.slideTab[slideNext] = matchState.slideTab[slideHead] - 1;
- matchState.slideTab[slideHead] = 0;
- } else {
- if (matchState.matchHere())
- return true;
- }
-
- if (matchState.pos == lastPos)
- break;
-
- /*
- Update the slide table. This code has much in common with
- the initialization code.
- */
- int sk = occ1[BadChar(matchState.in[matchState.pos + minl])];
- if (sk == NoOccurrence) {
- matchState.slideTab[slideNext] = minl;
- } else if (sk > 0) {
- int k = slideNext + minl - sk;
- if (k >= matchState.slideTabSize)
- k -= matchState.slideTabSize;
- if (sk > matchState.slideTab[k])
- matchState.slideTab[k] = sk;
- }
- slideHead = slideNext;
- ++matchState.pos;
- }
- return false;
-}
-#else
-bool QRegExpEngine::bruteMatch(QRegExpMatchState &matchState) const
-{
- while (matchState.pos <= matchState.len) {
- if (matchState.matchHere())
- return true;
- ++matchState.pos;
- }
- return false;
-}
-#endif
-
-/*
- Here's the core of the engine. It tries to do a match here and now.
-*/
-bool QRegExpMatchState::matchHere()
-{
- int ncur = 1, nnext = 0;
- int i = 0, j, k, m;
- bool stop = false;
-
- matchLen = -1;
- oneTestMatchedLen = -1;
- curStack[0] = QRegExpEngine::InitialState;
-
- int ncap = eng->ncap;
-#ifndef QT_NO_REGEXP_CAPTURE
- if (ncap > 0) {
- for (j = 0; j < ncap; j++) {
- curCapBegin[j] = EmptyCapture;
- curCapEnd[j] = EmptyCapture;
- }
- }
-#endif
-
-#ifndef QT_NO_REGEXP_BACKREF
- while ((ncur > 0 || !sleeping.isEmpty()) && i <= len - pos && !stop)
-#else
- while (ncur > 0 && i <= len - pos && !stop)
-#endif
- {
- int ch = (i < len - pos) ? in[pos + i].unicode() : 0;
- for (j = 0; j < ncur; j++) {
- int cur = curStack[j];
- const QRegExpAutomatonState &scur = eng->s.at(cur);
- const QList<int> &outs = scur.outs;
- for (k = 0; k < outs.size(); k++) {
- int next = outs.at(k);
- const QRegExpAutomatonState &snext = eng->s.at(next);
- bool inside = true;
-#if !defined(QT_NO_REGEXP_BACKREF) && !defined(QT_NO_REGEXP_CAPTURE)
- int needSomeSleep = 0;
-#endif
-
- /*
- First, check if the anchors are anchored properly.
- */
- int a = scur.anchors.value(next);
- if (a != 0 && !testAnchor(i, a, curCapBegin + j * ncap))
- inside = false;
-
- /*
- If indeed they are, check if the input character is
- correct for this transition.
- */
- if (inside) {
- m = snext.match;
- if ((m & (QRegExpEngine::CharClassBit | QRegExpEngine::BackRefBit)) == 0) {
- if (eng->cs)
- inside = (m == ch);
- else
- inside = (QChar(m).toLower() == QChar(ch).toLower());
- } else if (next == QRegExpEngine::FinalState) {
- matchLen = i;
- stop = minimal;
- inside = true;
- } else if ((m & QRegExpEngine::CharClassBit) != 0) {
-#ifndef QT_NO_REGEXP_CCLASS
- const QRegExpCharClass &cc = eng->cl.at(m ^ QRegExpEngine::CharClassBit);
- if (eng->cs)
- inside = cc.in(QChar(ch));
- else if (cc.negative())
- inside = cc.in(QChar(ch).toLower()) &&
- cc.in(QChar(ch).toUpper());
- else
- inside = cc.in(QChar(ch).toLower()) ||
- cc.in(QChar(ch).toUpper());
-#endif
-#if !defined(QT_NO_REGEXP_BACKREF) && !defined(QT_NO_REGEXP_CAPTURE)
- } else { /* ((m & QRegExpEngine::BackRefBit) != 0) */
- int bref = m ^ QRegExpEngine::BackRefBit;
- int ell = j * ncap + eng->captureForOfficialCapture.at(bref - 1);
-
- inside = bref <= ncap && curCapBegin[ell] != EmptyCapture;
- if (inside) {
- if (eng->cs)
- inside = (in[pos + curCapBegin[ell]] == QChar(ch));
- else
- inside = (in[pos + curCapBegin[ell]].toLower()
- == QChar(ch).toLower());
- }
-
- if (inside) {
- int delta;
- if (curCapEnd[ell] == EmptyCapture)
- delta = i - curCapBegin[ell];
- else
- delta = curCapEnd[ell] - curCapBegin[ell];
-
- inside = (delta <= len - (pos + i));
- if (inside && delta > 1) {
- int n = 1;
- if (eng->cs) {
- while (n < delta) {
- if (in[pos + curCapBegin[ell] + n]
- != in[pos + i + n])
- break;
- ++n;
- }
- } else {
- while (n < delta) {
- QChar a = in[pos + curCapBegin[ell] + n];
- QChar b = in[pos + i + n];
- if (a.toLower() != b.toLower())
- break;
- ++n;
- }
- }
- inside = (n == delta);
- if (inside)
- needSomeSleep = delta - 1;
- }
- }
-#endif
- }
- }
-
- /*
- We must now update our data structures.
- */
- if (inside) {
-#ifndef QT_NO_REGEXP_CAPTURE
- int *capBegin, *capEnd;
-#endif
- /*
- If the next state was not encountered yet, all
- is fine.
- */
- if ((m = inNextStack[next]) == -1) {
- m = nnext++;
- nextStack[m] = next;
- inNextStack[next] = m;
-#ifndef QT_NO_REGEXP_CAPTURE
- capBegin = nextCapBegin + m * ncap;
- capEnd = nextCapEnd + m * ncap;
-
- /*
- Otherwise, we'll first maintain captures in
- temporary arrays, and decide at the end whether
- it's best to keep the previous capture zones or
- the new ones.
- */
- } else {
- capBegin = tempCapBegin;
- capEnd = tempCapEnd;
-#endif
- }
-
-#ifndef QT_NO_REGEXP_CAPTURE
- /*
- Updating the capture zones is much of a task.
- */
- if (ncap > 0) {
- memcpy(capBegin, curCapBegin + j * ncap, ncap * sizeof(int));
- memcpy(capEnd, curCapEnd + j * ncap, ncap * sizeof(int));
- int c = scur.atom, n = snext.atom;
- int p = -1, q = -1;
- int cap;
-
- /*
- Lemma 1. For any x in the range [0..nf), we
- have f[x].parent < x.
-
- Proof. By looking at startAtom(), it is
- clear that cf < nf holds all the time, and
- thus that f[nf].parent < nf.
- */
-
- /*
- If we are reentering an atom, we empty all
- capture zones inside it.
- */
- if ((q = scur.reenter.value(next)) != 0) {
- QBitArray b(eng->nf, false);
- b.setBit(q, true);
- for (int ell = q + 1; ell < eng->nf; ell++) {
- if (b.testBit(eng->f.at(ell).parent)) {
- b.setBit(ell, true);
- cap = eng->f.at(ell).capture;
- if (cap >= 0) {
- capBegin[cap] = EmptyCapture;
- capEnd[cap] = EmptyCapture;
- }
- }
- }
- p = eng->f.at(q).parent;
-
- /*
- Otherwise, close the capture zones we are
- leaving. We are leaving f[c].capture,
- f[f[c].parent].capture,
- f[f[f[c].parent].parent].capture, ...,
- until f[x].capture, with x such that
- f[x].parent is the youngest common ancestor
- for c and n.
-
- We go up along c's and n's ancestry until
- we find x.
- */
- } else {
- p = c;
- q = n;
- while (p != q) {
- if (p > q) {
- cap = eng->f.at(p).capture;
- if (cap >= 0) {
- if (capBegin[cap] == i) {
- capBegin[cap] = EmptyCapture;
- capEnd[cap] = EmptyCapture;
- } else {
- capEnd[cap] = i;
- }
- }
- p = eng->f.at(p).parent;
- } else {
- q = eng->f.at(q).parent;
- }
- }
- }
-
- /*
- In any case, we now open the capture zones
- we are entering. We work upwards from n
- until we reach p (the parent of the atom we
- reenter or the youngest common ancestor).
- */
- while (n > p) {
- cap = eng->f.at(n).capture;
- if (cap >= 0) {
- capBegin[cap] = i;
- capEnd[cap] = EmptyCapture;
- }
- n = eng->f.at(n).parent;
- }
- /*
- If the next state was already in
- nextStack, we must choose carefully which
- capture zones we want to keep.
- */
- if (capBegin == tempCapBegin &&
- isBetterCapture(ncap, capBegin, capEnd, nextCapBegin + m * ncap,
- nextCapEnd + m * ncap)) {
- memcpy(nextCapBegin + m * ncap, capBegin, ncap * sizeof(int));
- memcpy(nextCapEnd + m * ncap, capEnd, ncap * sizeof(int));
- }
- }
-#ifndef QT_NO_REGEXP_BACKREF
- /*
- We are done with updating the capture zones.
- It's now time to put the next state to sleep,
- if it needs to, and to remove it from
- nextStack.
- */
- if (needSomeSleep > 0) {
- QList<int> zzZ(2 + 2 * ncap);
- zzZ[0] = i + needSomeSleep;
- zzZ[1] = next;
- if (ncap > 0) {
- memcpy(zzZ.data() + 2, capBegin, ncap * sizeof(int));
- memcpy(zzZ.data() + 2 + ncap, capEnd, ncap * sizeof(int));
- }
- inNextStack[nextStack[--nnext]] = -1;
- sleeping.append(zzZ);
- }
-#endif
-#endif
- }
- }
- }
-#ifndef QT_NO_REGEXP_CAPTURE
- /*
- If we reached the final state, hurray! Copy the captured
- zone.
- */
- if (ncap > 0 && (m = inNextStack[QRegExpEngine::FinalState]) != -1) {
- memcpy(capBegin, nextCapBegin + m * ncap, ncap * sizeof(int));
- memcpy(capEnd, nextCapEnd + m * ncap, ncap * sizeof(int));
- }
-#ifndef QT_NO_REGEXP_BACKREF
- /*
- It's time to wake up the sleepers.
- */
- j = 0;
- while (j < sleeping.count()) {
- if (sleeping.at(j)[0] == i) {
- const QList<int> &zzZ = sleeping.at(j);
- int next = zzZ[1];
- const int *capBegin = zzZ.data() + 2;
- const int *capEnd = zzZ.data() + 2 + ncap;
- bool copyOver = true;
-
- if ((m = inNextStack[next]) == -1) {
- m = nnext++;
- nextStack[m] = next;
- inNextStack[next] = m;
- } else {
- copyOver = isBetterCapture(ncap, nextCapBegin + m * ncap, nextCapEnd + m * ncap,
- capBegin, capEnd);
- }
- if (copyOver) {
- memcpy(nextCapBegin + m * ncap, capBegin, ncap * sizeof(int));
- memcpy(nextCapEnd + m * ncap, capEnd, ncap * sizeof(int));
- }
-
- sleeping.removeAt(j);
- } else {
- ++j;
- }
- }
-#endif
-#endif
- for (j = 0; j < nnext; j++)
- inNextStack[nextStack[j]] = -1;
-
- // avoid needless iteration that confuses oneTestMatchedLen
- if (nnext == 1 && nextStack[0] == QRegExpEngine::FinalState
-#ifndef QT_NO_REGEXP_BACKREF
- && sleeping.isEmpty()
-#endif
- )
- stop = true;
-
- qSwap(curStack, nextStack);
-#ifndef QT_NO_REGEXP_CAPTURE
- qSwap(curCapBegin, nextCapBegin);
- qSwap(curCapEnd, nextCapEnd);
-#endif
- ncur = nnext;
- nnext = 0;
- ++i;
- }
-
-#ifndef QT_NO_REGEXP_BACKREF
- /*
- If minimal matching is enabled, we might have some sleepers
- left.
- */
- if (!sleeping.isEmpty())
- sleeping.clear();
-#endif
-
- oneTestMatchedLen = i - 1;
- return (matchLen >= 0);
-}
-
-#ifndef QT_NO_REGEXP_CCLASS
-
-QRegExpCharClass::QRegExpCharClass()
- : c(0), n(false)
-{
-#ifndef QT_NO_REGEXP_OPTIM
- occ1.fill(NoOccurrence, NumBadChars);
-#endif
-}
-
-void QRegExpCharClass::clear()
-{
- c = 0;
- r.clear();
- n = false;
-}
-
-void QRegExpCharClass::setNegative(bool negative)
-{
- n = negative;
-#ifndef QT_NO_REGEXP_OPTIM
- occ1.fill(0, NumBadChars);
-#endif
-}
-
-void QRegExpCharClass::addCategories(uint cats)
-{
- static const int all_cats = FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing) |
- FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other) |
- FLAG(QChar::Separator_Space) |
- FLAG(QChar::Separator_Line) |
- FLAG(QChar::Separator_Paragraph) |
- FLAG(QChar::Other_Control) |
- FLAG(QChar::Other_Format) |
- FLAG(QChar::Other_Surrogate) |
- FLAG(QChar::Other_PrivateUse) |
- FLAG(QChar::Other_NotAssigned) |
- FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other) |
- FLAG(QChar::Punctuation_Connector) |
- FLAG(QChar::Punctuation_Dash) |
- FLAG(QChar::Punctuation_Open) |
- FLAG(QChar::Punctuation_Close) |
- FLAG(QChar::Punctuation_InitialQuote) |
- FLAG(QChar::Punctuation_FinalQuote) |
- FLAG(QChar::Punctuation_Other) |
- FLAG(QChar::Symbol_Math) |
- FLAG(QChar::Symbol_Currency) |
- FLAG(QChar::Symbol_Modifier) |
- FLAG(QChar::Symbol_Other);
- c |= (all_cats & cats);
-#ifndef QT_NO_REGEXP_OPTIM
- occ1.fill(0, NumBadChars);
-#endif
-}
-
-void QRegExpCharClass::addRange(ushort from, ushort to)
-{
- if (from > to)
- qSwap(from, to);
- int m = r.size();
- r.resize(m + 1);
- r[m].from = from;
- r[m].len = to - from + 1;
-
-#ifndef QT_NO_REGEXP_OPTIM
- int i;
-
- if (to - from < NumBadChars) {
- if (from % NumBadChars <= to % NumBadChars) {
- for (i = from % NumBadChars; i <= to % NumBadChars; i++)
- occ1[i] = 0;
- } else {
- for (i = 0; i <= to % NumBadChars; i++)
- occ1[i] = 0;
- for (i = from % NumBadChars; i < NumBadChars; i++)
- occ1[i] = 0;
- }
- } else {
- occ1.fill(0, NumBadChars);
- }
-#endif
-}
-
-bool QRegExpCharClass::in(QChar ch) const
-{
-#ifndef QT_NO_REGEXP_OPTIM
- if (occ1.at(BadChar(ch)) == NoOccurrence)
- return n;
-#endif
-
- if (c != 0 && (c & FLAG(ch.category())) != 0)
- return !n;
-
- const int uc = ch.unicode();
- int size = r.size();
-
- for (int i = 0; i < size; ++i) {
- const QRegExpCharClassRange &range = r.at(i);
- if (uint(uc - range.from) < uint(r.at(i).len))
- return !n;
- }
- return n;
-}
-
-#if defined(QT_DEBUG)
-void QRegExpCharClass::dump() const
-{
- int i;
- qDebug(" %stive character class", n ? "nega" : "posi");
-#ifndef QT_NO_REGEXP_CCLASS
- if (c != 0)
- qDebug(" categories 0x%.8x", c);
-#endif
- for (i = 0; i < r.size(); i++)
- qDebug(" 0x%.4x through 0x%.4x", r[i].from, r[i].from + r[i].len - 1);
-}
-#endif
-#endif
-
-QRegExpEngine::Box::Box(QRegExpEngine *engine)
- : eng(engine), skipanchors(0)
-#ifndef QT_NO_REGEXP_OPTIM
- , earlyStart(0), lateStart(0), maxl(0)
-#endif
-{
-#ifndef QT_NO_REGEXP_OPTIM
- occ1.fill(NoOccurrence, NumBadChars);
-#endif
- minl = 0;
-}
-
-QRegExpEngine::Box &QRegExpEngine::Box::operator=(const Box &b)
-{
- eng = b.eng;
- ls = b.ls;
- rs = b.rs;
- lanchors = b.lanchors;
- ranchors = b.ranchors;
- skipanchors = b.skipanchors;
-#ifndef QT_NO_REGEXP_OPTIM
- earlyStart = b.earlyStart;
- lateStart = b.lateStart;
- str = b.str;
- leftStr = b.leftStr;
- rightStr = b.rightStr;
- maxl = b.maxl;
- occ1 = b.occ1;
-#endif
- minl = b.minl;
- return *this;
-}
-
-void QRegExpEngine::Box::set(QChar ch)
-{
- ls.resize(1);
- ls[0] = eng->createState(ch);
- rs = ls;
-#ifndef QT_NO_REGEXP_OPTIM
- str = ch;
- leftStr = ch;
- rightStr = ch;
- maxl = 1;
- occ1[BadChar(ch)] = 0;
-#endif
- minl = 1;
-}
-
-void QRegExpEngine::Box::set(const QRegExpCharClass &cc)
-{
- ls.resize(1);
- ls[0] = eng->createState(cc);
- rs = ls;
-#ifndef QT_NO_REGEXP_OPTIM
- maxl = 1;
- occ1 = cc.firstOccurrence();
-#endif
- minl = 1;
-}
-
-#ifndef QT_NO_REGEXP_BACKREF
-void QRegExpEngine::Box::set(int bref)
-{
- ls.resize(1);
- ls[0] = eng->createState(bref);
- rs = ls;
- if (bref >= 1 && bref <= MaxBackRefs)
- skipanchors = Anchor_BackRef0Empty << bref;
-#ifndef QT_NO_REGEXP_OPTIM
- maxl = InftyLen;
-#endif
- minl = 0;
-}
-#endif
-
-void QRegExpEngine::Box::cat(const Box &b)
-{
- eng->addCatTransitions(rs, b.ls);
- addAnchorsToEngine(b);
- if (minl == 0) {
- lanchors.insert(b.lanchors);
- if (skipanchors != 0) {
- for (int i = 0; i < b.ls.size(); i++) {
- int a = eng->anchorConcatenation(lanchors.value(b.ls.at(i), 0), skipanchors);
- lanchors.insert(b.ls.at(i), a);
- }
- }
- mergeInto(&ls, b.ls);
- }
- if (b.minl == 0) {
- ranchors.insert(b.ranchors);
- if (b.skipanchors != 0) {
- for (int i = 0; i < rs.size(); i++) {
- int a = eng->anchorConcatenation(ranchors.value(rs.at(i), 0), b.skipanchors);
- ranchors.insert(rs.at(i), a);
- }
- }
- mergeInto(&rs, b.rs);
- } else {
- ranchors = b.ranchors;
- rs = b.rs;
- }
-
-#ifndef QT_NO_REGEXP_OPTIM
- if (maxl != InftyLen) {
- if (rightStr.length() + b.leftStr.length() >
- qMax(str.length(), b.str.length())) {
- earlyStart = minl - rightStr.length();
- lateStart = maxl - rightStr.length();
- str = rightStr + b.leftStr;
- } else if (b.str.length() > str.length()) {
- earlyStart = minl + b.earlyStart;
- lateStart = maxl + b.lateStart;
- str = b.str;
- }
- }
-
- if (leftStr.length() == maxl)
- leftStr += b.leftStr;
-
- if (b.rightStr.length() == b.maxl) {
- rightStr += b.rightStr;
- } else {
- rightStr = b.rightStr;
- }
-
- if (maxl == InftyLen || b.maxl == InftyLen) {
- maxl = InftyLen;
- } else {
- maxl += b.maxl;
- }
-
- for (int i = 0; i < NumBadChars; i++) {
- if (b.occ1.at(i) != NoOccurrence && minl + b.occ1.at(i) < occ1.at(i))
- occ1[i] = minl + b.occ1.at(i);
- }
-#endif
-
- minl += b.minl;
- if (minl == 0)
- skipanchors = eng->anchorConcatenation(skipanchors, b.skipanchors);
- else
- skipanchors = 0;
-}
-
-void QRegExpEngine::Box::orx(const Box &b)
-{
- mergeInto(&ls, b.ls);
- lanchors.insert(b.lanchors);
- mergeInto(&rs, b.rs);
- ranchors.insert(b.ranchors);
-
- if (b.minl == 0) {
- if (minl == 0)
- skipanchors = eng->anchorAlternation(skipanchors, b.skipanchors);
- else
- skipanchors = b.skipanchors;
- }
-
-#ifndef QT_NO_REGEXP_OPTIM
- for (int i = 0; i < NumBadChars; i++) {
- if (occ1.at(i) > b.occ1.at(i))
- occ1[i] = b.occ1.at(i);
- }
- earlyStart = 0;
- lateStart = 0;
- str = QString();
- leftStr = QString();
- rightStr = QString();
- if (b.maxl > maxl)
- maxl = b.maxl;
-#endif
- if (b.minl < minl)
- minl = b.minl;
-}
-
-void QRegExpEngine::Box::plus(int atom)
-{
-#ifndef QT_NO_REGEXP_CAPTURE
- eng->addPlusTransitions(rs, ls, atom);
-#else
- Q_UNUSED(atom);
- eng->addCatTransitions(rs, ls);
-#endif
- addAnchorsToEngine(*this);
-#ifndef QT_NO_REGEXP_OPTIM
- maxl = InftyLen;
-#endif
-}
-
-void QRegExpEngine::Box::opt()
-{
-#ifndef QT_NO_REGEXP_OPTIM
- earlyStart = 0;
- lateStart = 0;
- str = QString();
- leftStr = QString();
- rightStr = QString();
-#endif
- skipanchors = 0;
- minl = 0;
-}
-
-void QRegExpEngine::Box::catAnchor(int a)
-{
- if (a != 0) {
- for (int i = 0; i < rs.size(); i++) {
- a = eng->anchorConcatenation(ranchors.value(rs.at(i), 0), a);
- ranchors.insert(rs.at(i), a);
- }
- if (minl == 0)
- skipanchors = eng->anchorConcatenation(skipanchors, a);
- }
-}
-
-#ifndef QT_NO_REGEXP_OPTIM
-void QRegExpEngine::Box::setupHeuristics()
-{
- eng->goodEarlyStart = earlyStart;
- eng->goodLateStart = lateStart;
- eng->goodStr = eng->cs ? str : str.toLower();
-
- eng->minl = minl;
- if (eng->cs) {
- /*
- A regular expression such as 112|1 has occ1['2'] = 2 and minl =
- 1 at this point. An entry of occ1 has to be at most minl or
- infinity for the rest of the algorithm to go well.
-
- We waited until here before normalizing these cases (instead of
- doing it in Box::orx()) because sometimes things improve by
- themselves. Consider for example (112|1)34.
- */
- for (int i = 0; i < NumBadChars; i++) {
- if (occ1.at(i) != NoOccurrence && occ1.at(i) >= minl)
- occ1[i] = minl;
- }
- eng->occ1 = occ1;
- } else {
- eng->occ1.fill(0, NumBadChars);
- }
-
- eng->heuristicallyChooseHeuristic();
-}
-#endif
-
-#if defined(QT_DEBUG)
-void QRegExpEngine::Box::dump() const
-{
- int i;
- qDebug("Box of at least %d character%s", minl, minl == 1 ? "" : "s");
- qDebug(" Left states:");
- for (i = 0; i < ls.size(); i++) {
- if (lanchors.value(ls[i], 0) == 0)
- qDebug(" %d", ls[i]);
- else
- qDebug(" %d [anchors 0x%.8x]", ls[i], lanchors[ls[i]]);
- }
- qDebug(" Right states:");
- for (i = 0; i < rs.size(); i++) {
- if (ranchors.value(rs[i], 0) == 0)
- qDebug(" %d", rs[i]);
- else
- qDebug(" %d [anchors 0x%.8x]", rs[i], ranchors[rs[i]]);
- }
- qDebug(" Skip anchors: 0x%.8x", skipanchors);
-}
-#endif
-
-void QRegExpEngine::Box::addAnchorsToEngine(const Box &to) const
-{
- for (int i = 0; i < to.ls.size(); i++) {
- for (int j = 0; j < rs.size(); j++) {
- int a = eng->anchorConcatenation(ranchors.value(rs.at(j), 0),
- to.lanchors.value(to.ls.at(i), 0));
- eng->addAnchors(rs[j], to.ls[i], a);
- }
- }
-}
-
-#ifndef QT_NO_REGEXP_CCLASS
-// fast lookup hash for xml schema extensions
-// sorted by name for b-search
-static const struct CategoriesRangeMapEntry {
- const char name[40];
- uint first, second;
-} categoriesRangeMap[] = {
- { "AegeanNumbers", 0x10100, 0x1013F },
- { "AlphabeticPresentationForms", 0xFB00, 0xFB4F },
- { "AncientGreekMusicalNotation", 0x1D200, 0x1D24F },
- { "AncientGreekNumbers", 0x10140, 0x1018F },
- { "Arabic", 0x0600, 0x06FF },
- { "ArabicPresentationForms-A", 0xFB50, 0xFDFF },
- { "ArabicPresentationForms-B", 0xFE70, 0xFEFF },
- { "ArabicSupplement", 0x0750, 0x077F },
- { "Armenian", 0x0530, 0x058F },
- { "Arrows", 0x2190, 0x21FF },
- { "BasicLatin", 0x0000, 0x007F },
- { "Bengali", 0x0980, 0x09FF },
- { "BlockElements", 0x2580, 0x259F },
- { "Bopomofo", 0x3100, 0x312F },
- { "BopomofoExtended", 0x31A0, 0x31BF },
- { "BoxDrawing", 0x2500, 0x257F },
- { "BraillePatterns", 0x2800, 0x28FF },
- { "Buginese", 0x1A00, 0x1A1F },
- { "Buhid", 0x1740, 0x175F },
- { "ByzantineMusicalSymbols", 0x1D000, 0x1D0FF },
- { "CJKCompatibility", 0x3300, 0x33FF },
- { "CJKCompatibilityForms", 0xFE30, 0xFE4F },
- { "CJKCompatibilityIdeographs", 0xF900, 0xFAFF },
- { "CJKCompatibilityIdeographsSupplement", 0x2F800, 0x2FA1F },
- { "CJKRadicalsSupplement", 0x2E80, 0x2EFF },
- { "CJKStrokes", 0x31C0, 0x31EF },
- { "CJKSymbolsandPunctuation", 0x3000, 0x303F },
- { "CJKUnifiedIdeographs", 0x4E00, 0x9FFF },
- { "CJKUnifiedIdeographsExtensionA", 0x3400, 0x4DB5 },
- { "CJKUnifiedIdeographsExtensionB", 0x20000, 0x2A6DF },
- { "Cherokee", 0x13A0, 0x13FF },
- { "CombiningDiacriticalMarks", 0x0300, 0x036F },
- { "CombiningDiacriticalMarksSupplement", 0x1DC0, 0x1DFF },
- { "CombiningHalfMarks", 0xFE20, 0xFE2F },
- { "CombiningMarksforSymbols", 0x20D0, 0x20FF },
- { "ControlPictures", 0x2400, 0x243F },
- { "Coptic", 0x2C80, 0x2CFF },
- { "CurrencySymbols", 0x20A0, 0x20CF },
- { "CypriotSyllabary", 0x10800, 0x1083F },
- { "Cyrillic", 0x0400, 0x04FF },
- { "CyrillicSupplement", 0x0500, 0x052F },
- { "Deseret", 0x10400, 0x1044F },
- { "Devanagari", 0x0900, 0x097F },
- { "Dingbats", 0x2700, 0x27BF },
- { "EnclosedAlphanumerics", 0x2460, 0x24FF },
- { "EnclosedCJKLettersandMonths", 0x3200, 0x32FF },
- { "Ethiopic", 0x1200, 0x137F },
- { "EthiopicExtended", 0x2D80, 0x2DDF },
- { "EthiopicSupplement", 0x1380, 0x139F },
- { "GeneralPunctuation", 0x2000, 0x206F },
- { "GeometricShapes", 0x25A0, 0x25FF },
- { "Georgian", 0x10A0, 0x10FF },
- { "GeorgianSupplement", 0x2D00, 0x2D2F },
- { "Glagolitic", 0x2C00, 0x2C5F },
- { "Gothic", 0x10330, 0x1034F },
- { "Greek", 0x0370, 0x03FF },
- { "GreekExtended", 0x1F00, 0x1FFF },
- { "Gujarati", 0x0A80, 0x0AFF },
- { "Gurmukhi", 0x0A00, 0x0A7F },
- { "HalfwidthandFullwidthForms", 0xFF00, 0xFFEF },
- { "HangulCompatibilityJamo", 0x3130, 0x318F },
- { "HangulJamo", 0x1100, 0x11FF },
- { "HangulSyllables", 0xAC00, 0xD7A3 },
- { "Hanunoo", 0x1720, 0x173F },
- { "Hebrew", 0x0590, 0x05FF },
- { "Hiragana", 0x3040, 0x309F },
- { "IPAExtensions", 0x0250, 0x02AF },
- { "IdeographicDescriptionCharacters", 0x2FF0, 0x2FFF },
- { "Kanbun", 0x3190, 0x319F },
- { "KangxiRadicals", 0x2F00, 0x2FDF },
- { "Kannada", 0x0C80, 0x0CFF },
- { "Katakana", 0x30A0, 0x30FF },
- { "KatakanaPhoneticExtensions", 0x31F0, 0x31FF },
- { "Kharoshthi", 0x10A00, 0x10A5F },
- { "Khmer", 0x1780, 0x17FF },
- { "KhmerSymbols", 0x19E0, 0x19FF },
- { "Lao", 0x0E80, 0x0EFF },
- { "Latin-1Supplement", 0x0080, 0x00FF },
- { "LatinExtended-A", 0x0100, 0x017F },
- { "LatinExtended-B", 0x0180, 0x024F },
- { "LatinExtendedAdditional", 0x1E00, 0x1EFF },
- { "LetterlikeSymbols", 0x2100, 0x214F },
- { "Limbu", 0x1900, 0x194F },
- { "LinearBIdeograms", 0x10080, 0x100FF },
- { "LinearBSyllabary", 0x10000, 0x1007F },
- { "Malayalam", 0x0D00, 0x0D7F },
- { "MathematicalAlphanumericSymbols", 0x1D400, 0x1D7FF },
- { "MathematicalOperators", 0x2200, 0x22FF },
- { "MiscellaneousMathematicalSymbols-A", 0x27C0, 0x27EF },
- { "MiscellaneousMathematicalSymbols-B", 0x2980, 0x29FF },
- { "MiscellaneousSymbols", 0x2600, 0x26FF },
- { "MiscellaneousSymbolsandArrows", 0x2B00, 0x2BFF },
- { "MiscellaneousTechnical", 0x2300, 0x23FF },
- { "ModifierToneLetters", 0xA700, 0xA71F },
- { "Mongolian", 0x1800, 0x18AF },
- { "MusicalSymbols", 0x1D100, 0x1D1FF },
- { "Myanmar", 0x1000, 0x109F },
- { "NewTaiLue", 0x1980, 0x19DF },
- { "NumberForms", 0x2150, 0x218F },
- { "Ogham", 0x1680, 0x169F },
- { "OldItalic", 0x10300, 0x1032F },
- { "OldPersian", 0x103A0, 0x103DF },
- { "OpticalCharacterRecognition", 0x2440, 0x245F },
- { "Oriya", 0x0B00, 0x0B7F },
- { "Osmanya", 0x10480, 0x104AF },
- { "PhoneticExtensions", 0x1D00, 0x1D7F },
- { "PhoneticExtensionsSupplement", 0x1D80, 0x1DBF },
- { "PrivateUse", 0xE000, 0xF8FF },
- { "Runic", 0x16A0, 0x16FF },
- { "Shavian", 0x10450, 0x1047F },
- { "Sinhala", 0x0D80, 0x0DFF },
- { "SmallFormVariants", 0xFE50, 0xFE6F },
- { "SpacingModifierLetters", 0x02B0, 0x02FF },
- { "Specials", 0xFFF0, 0xFFFF },
- { "SuperscriptsandSubscripts", 0x2070, 0x209F },
- { "SupplementalArrows-A", 0x27F0, 0x27FF },
- { "SupplementalArrows-B", 0x2900, 0x297F },
- { "SupplementalMathematicalOperators", 0x2A00, 0x2AFF },
- { "SupplementalPunctuation", 0x2E00, 0x2E7F },
- { "SupplementaryPrivateUseArea-A", 0xF0000, 0xFFFFF },
- { "SupplementaryPrivateUseArea-B", 0x100000, 0x10FFFF },
- { "SylotiNagri", 0xA800, 0xA82F },
- { "Syriac", 0x0700, 0x074F },
- { "Tagalog", 0x1700, 0x171F },
- { "Tagbanwa", 0x1760, 0x177F },
- { "Tags", 0xE0000, 0xE007F },
- { "TaiLe", 0x1950, 0x197F },
- { "TaiXuanJingSymbols", 0x1D300, 0x1D35F },
- { "Tamil", 0x0B80, 0x0BFF },
- { "Telugu", 0x0C00, 0x0C7F },
- { "Thaana", 0x0780, 0x07BF },
- { "Thai", 0x0E00, 0x0E7F },
- { "Tibetan", 0x0F00, 0x0FFF },
- { "Tifinagh", 0x2D30, 0x2D7F },
- { "Ugaritic", 0x10380, 0x1039F },
- { "UnifiedCanadianAboriginalSyllabics", 0x1400, 0x167F },
- { "VariationSelectors", 0xFE00, 0xFE0F },
- { "VariationSelectorsSupplement", 0xE0100, 0xE01EF },
- { "VerticalForms", 0xFE10, 0xFE1F },
- { "YiRadicals", 0xA490, 0xA4CF },
- { "YiSyllables", 0xA000, 0xA48F },
- { "YijingHexagramSymbols", 0x4DC0, 0x4DFF }
-};
-
-inline bool operator<(const CategoriesRangeMapEntry &entry1, const CategoriesRangeMapEntry &entry2)
-{ return qstrcmp(entry1.name, entry2.name) < 0; }
-inline bool operator<(const char *name, const CategoriesRangeMapEntry &entry)
-{ return qstrcmp(name, entry.name) < 0; }
-inline bool operator<(const CategoriesRangeMapEntry &entry, const char *name)
-{ return qstrcmp(entry.name, name) < 0; }
-#endif // QT_NO_REGEXP_CCLASS
-
-int QRegExpEngine::getChar()
-{
- return (yyPos == yyLen) ? EOS : yyIn[yyPos++].unicode();
-}
-
-int QRegExpEngine::getEscape()
-{
-#ifndef QT_NO_REGEXP_ESCAPE
- const char tab[] = "afnrtv"; // no b, as \b means word boundary
- const char backTab[] = "\a\f\n\r\t\v";
- ushort low;
- int i;
-#endif
- ushort val;
- int prevCh = yyCh;
-
- if (prevCh == EOS) {
- error(RXERR_END);
- return Tok_Char | '\\';
- }
- yyCh = getChar();
-#ifndef QT_NO_REGEXP_ESCAPE
- if ((prevCh & ~0xff) == 0) {
- const char *p = strchr(tab, prevCh);
- if (p != nullptr)
- return Tok_Char | backTab[p - tab];
- }
-#endif
-
- switch (prevCh) {
-#ifndef QT_NO_REGEXP_ESCAPE
- case '0':
- val = 0;
- for (i = 0; i < 3; i++) {
- if (yyCh >= '0' && yyCh <= '7')
- val = (val << 3) | (yyCh - '0');
- else
- break;
- yyCh = getChar();
- }
- if ((val & ~0377) != 0)
- error(RXERR_OCTAL);
- return Tok_Char | val;
-#endif
-#ifndef QT_NO_REGEXP_ESCAPE
- case 'B':
- return Tok_NonWord;
-#endif
-#ifndef QT_NO_REGEXP_CCLASS
- case 'D':
- // see QChar::isDigit()
- yyCharClass->addCategories(uint(-1) ^ FLAG(QChar::Number_DecimalDigit));
- return Tok_CharClass;
- case 'S':
- // see QChar::isSpace()
- yyCharClass->addCategories(uint(-1) ^ (FLAG(QChar::Separator_Space) |
- FLAG(QChar::Separator_Line) |
- FLAG(QChar::Separator_Paragraph) |
- FLAG(QChar::Other_Control)));
- yyCharClass->addRange(0x0000, 0x0008);
- yyCharClass->addRange(0x000e, 0x001f);
- yyCharClass->addRange(0x007f, 0x0084);
- yyCharClass->addRange(0x0086, 0x009f);
- return Tok_CharClass;
- case 'W':
- // see QChar::isLetterOrNumber() and QChar::isMark()
- yyCharClass->addCategories(uint(-1) ^ (FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing) |
- FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other) |
- FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other) |
- FLAG(QChar::Punctuation_Connector)));
- yyCharClass->addRange(0x203f, 0x2040);
- yyCharClass->addSingleton(0x2040);
- yyCharClass->addSingleton(0x2054);
- yyCharClass->addSingleton(0x30fb);
- yyCharClass->addRange(0xfe33, 0xfe34);
- yyCharClass->addRange(0xfe4d, 0xfe4f);
- yyCharClass->addSingleton(0xff3f);
- yyCharClass->addSingleton(0xff65);
- return Tok_CharClass;
-#endif
-#ifndef QT_NO_REGEXP_ESCAPE
- case 'b':
- return Tok_Word;
-#endif
-#ifndef QT_NO_REGEXP_CCLASS
- case 'd':
- // see QChar::isDigit()
- yyCharClass->addCategories(FLAG(QChar::Number_DecimalDigit));
- return Tok_CharClass;
- case 's':
- // see QChar::isSpace()
- yyCharClass->addCategories(FLAG(QChar::Separator_Space) |
- FLAG(QChar::Separator_Line) |
- FLAG(QChar::Separator_Paragraph));
- yyCharClass->addRange(0x0009, 0x000d);
- yyCharClass->addSingleton(0x0085);
- return Tok_CharClass;
- case 'w':
- // see QChar::isLetterOrNumber() and QChar::isMark()
- yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing) |
- FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other) |
- FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other));
- yyCharClass->addSingleton(0x005f); // '_'
- return Tok_CharClass;
- case 'I':
- if (!xmlSchemaExtensions)
- break;
- yyCharClass->setNegative(!yyCharClass->negative());
- Q_FALLTHROUGH();
- case 'i':
- if (xmlSchemaExtensions) {
- yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing) |
- FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other) |
- FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other));
- yyCharClass->addSingleton(0x003a); // ':'
- yyCharClass->addSingleton(0x005f); // '_'
- yyCharClass->addRange(0x0041, 0x005a); // [A-Z]
- yyCharClass->addRange(0x0061, 0x007a); // [a-z]
- yyCharClass->addRange(0xc0, 0xd6);
- yyCharClass->addRange(0xd8, 0xf6);
- yyCharClass->addRange(0xf8, 0x2ff);
- yyCharClass->addRange(0x370, 0x37d);
- yyCharClass->addRange(0x37f, 0x1fff);
- yyCharClass->addRange(0x200c, 0x200d);
- yyCharClass->addRange(0x2070, 0x218f);
- yyCharClass->addRange(0x2c00, 0x2fef);
- yyCharClass->addRange(0x3001, 0xd7ff);
- yyCharClass->addRange(0xf900, 0xfdcf);
- yyCharClass->addRange(0xfdf0, 0xfffd);
- yyCharClass->addRange((ushort)0x10000, (ushort)0xeffff);
- return Tok_CharClass;
- } else {
- break;
- }
- case 'C':
- if (!xmlSchemaExtensions)
- break;
- yyCharClass->setNegative(!yyCharClass->negative());
- Q_FALLTHROUGH();
- case 'c':
- if (xmlSchemaExtensions) {
- yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing) |
- FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other) |
- FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other));
- yyCharClass->addSingleton(0x002d); // '-'
- yyCharClass->addSingleton(0x002e); // '.'
- yyCharClass->addSingleton(0x003a); // ':'
- yyCharClass->addSingleton(0x005f); // '_'
- yyCharClass->addSingleton(0xb7);
- yyCharClass->addRange(0x0030, 0x0039); // [0-9]
- yyCharClass->addRange(0x0041, 0x005a); // [A-Z]
- yyCharClass->addRange(0x0061, 0x007a); // [a-z]
- yyCharClass->addRange(0xc0, 0xd6);
- yyCharClass->addRange(0xd8, 0xf6);
- yyCharClass->addRange(0xf8, 0x2ff);
- yyCharClass->addRange(0x370, 0x37d);
- yyCharClass->addRange(0x37f, 0x1fff);
- yyCharClass->addRange(0x200c, 0x200d);
- yyCharClass->addRange(0x2070, 0x218f);
- yyCharClass->addRange(0x2c00, 0x2fef);
- yyCharClass->addRange(0x3001, 0xd7ff);
- yyCharClass->addRange(0xf900, 0xfdcf);
- yyCharClass->addRange(0xfdf0, 0xfffd);
- yyCharClass->addRange((ushort)0x10000, (ushort)0xeffff);
- yyCharClass->addRange(0x0300, 0x036f);
- yyCharClass->addRange(0x203f, 0x2040);
- return Tok_CharClass;
- } else {
- break;
- }
- case 'P':
- if (!xmlSchemaExtensions)
- break;
- yyCharClass->setNegative(!yyCharClass->negative());
- Q_FALLTHROUGH();
- case 'p':
- if (xmlSchemaExtensions) {
- if (yyCh != '{') {
- error(RXERR_CHARCLASS);
- return Tok_CharClass;
- }
-
- QByteArray category;
- yyCh = getChar();
- while (yyCh != '}') {
- if (yyCh == EOS) {
- error(RXERR_END);
- return Tok_CharClass;
- }
- category.append(yyCh);
- yyCh = getChar();
- }
- yyCh = getChar(); // skip closing '}'
-
- int catlen = category.length();
- if (catlen == 1 || catlen == 2) {
- switch (category.at(0)) {
- case 'M':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing));
- } else {
- switch (category.at(1)) {
- case 'n': yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing)); break; // Mn
- case 'c': yyCharClass->addCategories(FLAG(QChar::Mark_SpacingCombining)); break; // Mc
- case 'e': yyCharClass->addCategories(FLAG(QChar::Mark_Enclosing)); break; // Me
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'N':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other));
- } else {
- switch (category.at(1)) {
- case 'd': yyCharClass->addCategories(FLAG(QChar::Number_DecimalDigit)); break; // Nd
- case 'l': yyCharClass->addCategories(FLAG(QChar::Number_Letter)); break; // Hl
- case 'o': yyCharClass->addCategories(FLAG(QChar::Number_Other)); break; // No
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'Z':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Separator_Space) |
- FLAG(QChar::Separator_Line) |
- FLAG(QChar::Separator_Paragraph));
- } else {
- switch (category.at(1)) {
- case 's': yyCharClass->addCategories(FLAG(QChar::Separator_Space)); break; // Zs
- case 'l': yyCharClass->addCategories(FLAG(QChar::Separator_Line)); break; // Zl
- case 'p': yyCharClass->addCategories(FLAG(QChar::Separator_Paragraph)); break; // Zp
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'C':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Other_Control) |
- FLAG(QChar::Other_Format) |
- FLAG(QChar::Other_Surrogate) |
- FLAG(QChar::Other_PrivateUse) |
- FLAG(QChar::Other_NotAssigned));
- } else {
- switch (category.at(1)) {
- case 'c': yyCharClass->addCategories(FLAG(QChar::Other_Control)); break; // Cc
- case 'f': yyCharClass->addCategories(FLAG(QChar::Other_Format)); break; // Cf
- case 's': yyCharClass->addCategories(FLAG(QChar::Other_Surrogate)); break; // Cs
- case 'o': yyCharClass->addCategories(FLAG(QChar::Other_PrivateUse)); break; // Co
- case 'n': yyCharClass->addCategories(FLAG(QChar::Other_NotAssigned)); break; // Cn
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'L':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other));
- } else {
- switch (category.at(1)) {
- case 'u': yyCharClass->addCategories(FLAG(QChar::Letter_Uppercase)); break; // Lu
- case 'l': yyCharClass->addCategories(FLAG(QChar::Letter_Lowercase)); break; // Ll
- case 't': yyCharClass->addCategories(FLAG(QChar::Letter_Titlecase)); break; // Lt
- case 'm': yyCharClass->addCategories(FLAG(QChar::Letter_Modifier)); break; // Lm
- case 'o': yyCharClass->addCategories(FLAG(QChar::Letter_Other)); break; // Lo
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'P':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Punctuation_Connector) |
- FLAG(QChar::Punctuation_Dash) |
- FLAG(QChar::Punctuation_Open) |
- FLAG(QChar::Punctuation_Close) |
- FLAG(QChar::Punctuation_InitialQuote) |
- FLAG(QChar::Punctuation_FinalQuote) |
- FLAG(QChar::Punctuation_Other));
- } else {
- switch (category.at(1)) {
- case 'c': yyCharClass->addCategories(FLAG(QChar::Punctuation_Connector)); break; // Pc
- case 'd': yyCharClass->addCategories(FLAG(QChar::Punctuation_Dash)); break; // Pd
- case 's': yyCharClass->addCategories(FLAG(QChar::Punctuation_Open)); break; // Ps
- case 'e': yyCharClass->addCategories(FLAG(QChar::Punctuation_Close)); break; // Pe
- case 'i': yyCharClass->addCategories(FLAG(QChar::Punctuation_InitialQuote)); break; // Pi
- case 'f': yyCharClass->addCategories(FLAG(QChar::Punctuation_FinalQuote)); break; // Pf
- case 'o': yyCharClass->addCategories(FLAG(QChar::Punctuation_Other)); break; // Po
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'S':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Symbol_Math) |
- FLAG(QChar::Symbol_Currency) |
- FLAG(QChar::Symbol_Modifier) |
- FLAG(QChar::Symbol_Other));
- } else {
- switch (category.at(1)) {
- case 'm': yyCharClass->addCategories(FLAG(QChar::Symbol_Math)); break; // Sm
- case 'c': yyCharClass->addCategories(FLAG(QChar::Symbol_Currency)); break; // Sc
- case 'k': yyCharClass->addCategories(FLAG(QChar::Symbol_Modifier)); break; // Sk
- case 'o': yyCharClass->addCategories(FLAG(QChar::Symbol_Other)); break; // So
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- default:
- error(RXERR_CATEGORY);
- break;
- }
- } else if (catlen > 2 && category.at(0) == 'I' && category.at(1) == 's') {
- static const int N = sizeof(categoriesRangeMap) / sizeof(categoriesRangeMap[0]);
- const char * const categoryFamily = category.constData() + 2;
- const CategoriesRangeMapEntry *r = std::lower_bound(categoriesRangeMap, categoriesRangeMap + N, categoryFamily);
- if (r != categoriesRangeMap + N && qstrcmp(r->name, categoryFamily) == 0)
- yyCharClass->addRange(r->first, r->second);
- else
- error(RXERR_CATEGORY);
- } else {
- error(RXERR_CATEGORY);
- }
- return Tok_CharClass;
- } else {
- break;
- }
-#endif
-#ifndef QT_NO_REGEXP_ESCAPE
- case 'x':
- val = 0;
- for (i = 0; i < 4; i++) {
- low = QChar(yyCh).toLower().unicode();
- if (low >= '0' && low <= '9')
- val = (val << 4) | (low - '0');
- else if (low >= 'a' && low <= 'f')
- val = (val << 4) | (low - 'a' + 10);
- else
- break;
- yyCh = getChar();
- }
- return Tok_Char | val;
-#endif
- default:
- break;
- }
- if (prevCh >= '1' && prevCh <= '9') {
-#ifndef QT_NO_REGEXP_BACKREF
- val = prevCh - '0';
- while (yyCh >= '0' && yyCh <= '9') {
- val = (val * 10) + (yyCh - '0');
- yyCh = getChar();
- }
- return Tok_BackRef | val;
-#else
- error(RXERR_DISABLED);
-#endif
- }
- return Tok_Char | prevCh;
-}
-
-#ifndef QT_NO_REGEXP_INTERVAL
-int QRegExpEngine::getRep(int def)
-{
- if (yyCh >= '0' && yyCh <= '9') {
- int rep = 0;
- do {
- rep = 10 * rep + yyCh - '0';
- if (rep >= InftyRep) {
- error(RXERR_REPETITION);
- rep = def;
- }
- yyCh = getChar();
- } while (yyCh >= '0' && yyCh <= '9');
- return rep;
- } else {
- return def;
- }
-}
-#endif
-
-#ifndef QT_NO_REGEXP_LOOKAHEAD
-void QRegExpEngine::skipChars(int n)
-{
- if (n > 0) {
- yyPos += n - 1;
- yyCh = getChar();
- }
-}
-#endif
-
-void QRegExpEngine::error(const char *msg)
-{
- if (yyError.isEmpty())
- yyError = QLatin1String(msg);
-}
-
-void QRegExpEngine::startTokenizer(const QChar *rx, int len)
-{
- yyIn = rx;
- yyPos0 = 0;
- yyPos = 0;
- yyLen = len;
- yyCh = getChar();
- yyCharClass.reset(new QRegExpCharClass);
- yyMinRep = 0;
- yyMaxRep = 0;
- yyError = QString();
-}
-
-int QRegExpEngine::getToken()
-{
-#ifndef QT_NO_REGEXP_CCLASS
- ushort pendingCh = 0;
- bool charPending;
- bool rangePending;
- int tok;
-#endif
- int prevCh = yyCh;
-
- yyPos0 = yyPos - 1;
-#ifndef QT_NO_REGEXP_CCLASS
- yyCharClass->clear();
-#endif
- yyMinRep = 0;
- yyMaxRep = 0;
- yyCh = getChar();
-
- switch (prevCh) {
- case EOS:
- yyPos0 = yyPos;
- return Tok_Eos;
- case '$':
- return Tok_Dollar;
- case '(':
- if (yyCh == '?') {
- prevCh = getChar();
- yyCh = getChar();
- switch (prevCh) {
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- case '!':
- return Tok_NegLookahead;
- case '=':
- return Tok_PosLookahead;
-#endif
- case ':':
- return Tok_MagicLeftParen;
- case '<':
- error(RXERR_LOOKBEHIND);
- return Tok_MagicLeftParen;
- default:
- error(RXERR_LOOKAHEAD);
- return Tok_MagicLeftParen;
- }
- } else {
- return Tok_LeftParen;
- }
- case ')':
- return Tok_RightParen;
- case '*':
- yyMinRep = 0;
- yyMaxRep = InftyRep;
- return Tok_Quantifier;
- case '+':
- yyMinRep = 1;
- yyMaxRep = InftyRep;
- return Tok_Quantifier;
- case '.':
-#ifndef QT_NO_REGEXP_CCLASS
- yyCharClass->setNegative(true);
-#endif
- return Tok_CharClass;
- case '?':
- yyMinRep = 0;
- yyMaxRep = 1;
- return Tok_Quantifier;
- case '[':
-#ifndef QT_NO_REGEXP_CCLASS
- if (yyCh == '^') {
- yyCharClass->setNegative(true);
- yyCh = getChar();
- }
- charPending = false;
- rangePending = false;
- do {
- if (yyCh == '-' && charPending && !rangePending) {
- rangePending = true;
- yyCh = getChar();
- } else {
- if (charPending && !rangePending) {
- yyCharClass->addSingleton(pendingCh);
- charPending = false;
- }
- if (yyCh == '\\') {
- yyCh = getChar();
- tok = getEscape();
- if (tok == Tok_Word)
- tok = '\b';
- } else {
- tok = Tok_Char | yyCh;
- yyCh = getChar();
- }
- if (tok == Tok_CharClass) {
- if (rangePending) {
- yyCharClass->addSingleton('-');
- yyCharClass->addSingleton(pendingCh);
- charPending = false;
- rangePending = false;
- }
- } else if ((tok & Tok_Char) != 0) {
- if (rangePending) {
- yyCharClass->addRange(pendingCh, tok ^ Tok_Char);
- charPending = false;
- rangePending = false;
- } else {
- pendingCh = tok ^ Tok_Char;
- charPending = true;
- }
- } else {
- error(RXERR_CHARCLASS);
- }
- }
- } while (yyCh != ']' && yyCh != EOS);
- if (rangePending)
- yyCharClass->addSingleton('-');
- if (charPending)
- yyCharClass->addSingleton(pendingCh);
- if (yyCh == EOS)
- error(RXERR_END);
- else
- yyCh = getChar();
- return Tok_CharClass;
-#else
- error(RXERR_END);
- return Tok_Char | '[';
-#endif
- case '\\':
- return getEscape();
- case ']':
- error(RXERR_LEFTDELIM);
- return Tok_Char | ']';
- case '^':
- return Tok_Caret;
- case '{':
-#ifndef QT_NO_REGEXP_INTERVAL
- yyMinRep = getRep(0);
- yyMaxRep = yyMinRep;
- if (yyCh == ',') {
- yyCh = getChar();
- yyMaxRep = getRep(InftyRep);
- }
- if (yyMaxRep < yyMinRep)
- error(RXERR_INTERVAL);
- if (yyCh != '}')
- error(RXERR_REPETITION);
- yyCh = getChar();
- return Tok_Quantifier;
-#else
- error(RXERR_DISABLED);
- return Tok_Char | '{';
-#endif
- case '|':
- return Tok_Bar;
- case '}':
- error(RXERR_LEFTDELIM);
- return Tok_Char | '}';
- default:
- return Tok_Char | prevCh;
- }
-}
-
-int QRegExpEngine::parse(const QChar *pattern, int len)
-{
- valid = true;
- startTokenizer(pattern, len);
- yyTok = getToken();
-#ifndef QT_NO_REGEXP_CAPTURE
- yyMayCapture = true;
-#else
- yyMayCapture = false;
-#endif
-
-#ifndef QT_NO_REGEXP_CAPTURE
- int atom = startAtom(false);
-#endif
- QRegExpCharClass anything;
- Box box(this); // create InitialState
- box.set(anything);
- Box rightBox(this); // create FinalState
- rightBox.set(anything);
-
- Box middleBox(this);
- parseExpression(&middleBox);
-#ifndef QT_NO_REGEXP_CAPTURE
- finishAtom(atom, false);
-#endif
-#ifndef QT_NO_REGEXP_OPTIM
- middleBox.setupHeuristics();
-#endif
- box.cat(middleBox);
- box.cat(rightBox);
- yyCharClass.reset();
-
-#ifndef QT_NO_REGEXP_CAPTURE
- for (int i = 0; i < nf; ++i) {
- switch (f[i].capture) {
- case QRegExpAtom::NoCapture:
- break;
- case QRegExpAtom::OfficialCapture:
- f[i].capture = ncap;
- captureForOfficialCapture.append(ncap);
- ++ncap;
- ++officialncap;
- break;
- case QRegExpAtom::UnofficialCapture:
- f[i].capture = greedyQuantifiers ? ncap++ : QRegExpAtom::NoCapture;
- }
- }
-
-#ifndef QT_NO_REGEXP_BACKREF
-#ifndef QT_NO_REGEXP_OPTIM
- if (officialncap == 0 && nbrefs == 0) {
- ncap = nf = 0;
- f.clear();
- }
-#endif
- // handle the case where there's a \5 with no corresponding capture
- // (captureForOfficialCapture.size() != officialncap)
- for (int i = 0; i < nbrefs - officialncap; ++i) {
- captureForOfficialCapture.append(ncap);
- ++ncap;
- }
-#endif
-#endif
-
- if (!yyError.isEmpty())
- return -1;
-
-#ifndef QT_NO_REGEXP_OPTIM
- const QRegExpAutomatonState &sinit = s.at(InitialState);
- caretAnchored = !sinit.anchors.isEmpty();
- if (caretAnchored) {
- const QMap<int, int> &anchors = sinit.anchors;
- QMap<int, int>::const_iterator a;
- for (a = anchors.constBegin(); a != anchors.constEnd(); ++a) {
- if (
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
- (*a & Anchor_Alternation) != 0 ||
-#endif
- (*a & Anchor_Caret) == 0)
- {
- caretAnchored = false;
- break;
- }
- }
- }
-#endif
-
- // cleanup anchors
- int numStates = s.count();
- for (int i = 0; i < numStates; ++i) {
- QRegExpAutomatonState &state = s[i];
- if (!state.anchors.isEmpty()) {
- QMap<int, int>::iterator a = state.anchors.begin();
- while (a != state.anchors.end()) {
- if (a.value() == 0)
- a = state.anchors.erase(a);
- else
- ++a;
- }
- }
- }
-
- return yyPos0;
-}
-
-void QRegExpEngine::parseAtom(Box *box)
-{
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- QRegExpEngine *eng = nullptr;
- bool neg;
- int len;
-#endif
-
- if ((yyTok & Tok_Char) != 0) {
- box->set(QChar(yyTok ^ Tok_Char));
- } else {
-#ifndef QT_NO_REGEXP_OPTIM
- trivial = false;
-#endif
- switch (yyTok) {
- case Tok_Dollar:
- box->catAnchor(Anchor_Dollar);
- break;
- case Tok_Caret:
- box->catAnchor(Anchor_Caret);
- break;
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- case Tok_PosLookahead:
- case Tok_NegLookahead:
- neg = (yyTok == Tok_NegLookahead);
- eng = new QRegExpEngine(cs, greedyQuantifiers);
- len = eng->parse(yyIn + yyPos - 1, yyLen - yyPos + 1);
- if (len >= 0)
- skipChars(len);
- else
- error(RXERR_LOOKAHEAD);
- box->catAnchor(addLookahead(eng, neg));
- yyTok = getToken();
- if (yyTok != Tok_RightParen)
- error(RXERR_LOOKAHEAD);
- break;
-#endif
-#ifndef QT_NO_REGEXP_ESCAPE
- case Tok_Word:
- box->catAnchor(Anchor_Word);
- break;
- case Tok_NonWord:
- box->catAnchor(Anchor_NonWord);
- break;
-#endif
- case Tok_LeftParen:
- case Tok_MagicLeftParen:
- yyTok = getToken();
- parseExpression(box);
- if (yyTok != Tok_RightParen)
- error(RXERR_END);
- break;
- case Tok_CharClass:
- box->set(*yyCharClass);
- break;
- case Tok_Quantifier:
- error(RXERR_REPETITION);
- break;
- default:
-#ifndef QT_NO_REGEXP_BACKREF
- if ((yyTok & Tok_BackRef) != 0)
- box->set(yyTok ^ Tok_BackRef);
- else
-#endif
- error(RXERR_DISABLED);
- }
- }
- yyTok = getToken();
-}
-
-void QRegExpEngine::parseFactor(Box *box)
-{
-#ifndef QT_NO_REGEXP_CAPTURE
- int outerAtom = greedyQuantifiers ? startAtom(false) : -1;
- int innerAtom = startAtom(yyMayCapture && yyTok == Tok_LeftParen);
- bool magicLeftParen = (yyTok == Tok_MagicLeftParen);
-#else
- const int innerAtom = -1;
-#endif
-
-#ifndef QT_NO_REGEXP_INTERVAL
-#define YYREDO() \
- yyIn = in, yyPos0 = pos0, yyPos = pos, yyLen = len, yyCh = ch, \
- *yyCharClass = charClass, yyMinRep = 0, yyMaxRep = 0, yyTok = tok
-
- const QChar *in = yyIn;
- int pos0 = yyPos0;
- int pos = yyPos;
- int len = yyLen;
- int ch = yyCh;
- QRegExpCharClass charClass;
- if (yyTok == Tok_CharClass)
- charClass = *yyCharClass;
- int tok = yyTok;
- bool mayCapture = yyMayCapture;
-#endif
-
- parseAtom(box);
-#ifndef QT_NO_REGEXP_CAPTURE
- finishAtom(innerAtom, magicLeftParen);
-#endif
-
- bool hasQuantifier = (yyTok == Tok_Quantifier);
- if (hasQuantifier) {
-#ifndef QT_NO_REGEXP_OPTIM
- trivial = false;
-#endif
- if (yyMaxRep == InftyRep) {
- box->plus(innerAtom);
-#ifndef QT_NO_REGEXP_INTERVAL
- } else if (yyMaxRep == 0) {
- box->clear();
-#endif
- }
- if (yyMinRep == 0)
- box->opt();
-
-#ifndef QT_NO_REGEXP_INTERVAL
- yyMayCapture = false;
- int alpha = (yyMinRep == 0) ? 0 : yyMinRep - 1;
- int beta = (yyMaxRep == InftyRep) ? 0 : yyMaxRep - (alpha + 1);
-
- Box rightBox(this);
- int i;
-
- for (i = 0; i < beta; i++) {
- YYREDO();
- Box leftBox(this);
- parseAtom(&leftBox);
- leftBox.cat(rightBox);
- leftBox.opt();
- rightBox = leftBox;
- }
- for (i = 0; i < alpha; i++) {
- YYREDO();
- Box leftBox(this);
- parseAtom(&leftBox);
- leftBox.cat(rightBox);
- rightBox = leftBox;
- }
- rightBox.cat(*box);
- *box = rightBox;
-#endif
- yyTok = getToken();
-#ifndef QT_NO_REGEXP_INTERVAL
- yyMayCapture = mayCapture;
-#endif
- }
-#undef YYREDO
-#ifndef QT_NO_REGEXP_CAPTURE
- if (greedyQuantifiers)
- finishAtom(outerAtom, hasQuantifier);
-#endif
-}
-
-void QRegExpEngine::parseTerm(Box *box)
-{
-#ifndef QT_NO_REGEXP_OPTIM
- if (yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar)
- parseFactor(box);
-#endif
- while (yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar) {
- Box rightBox(this);
- parseFactor(&rightBox);
- box->cat(rightBox);
- }
-}
-
-void QRegExpEngine::parseExpression(Box *box)
-{
- parseTerm(box);
- while (yyTok == Tok_Bar) {
-#ifndef QT_NO_REGEXP_OPTIM
- trivial = false;
-#endif
- Box rightBox(this);
- yyTok = getToken();
- parseTerm(&rightBox);
- box->orx(rightBox);
- }
-}
-
-/*
- The struct QRegExpPrivate contains the private data of a regular
- expression other than the automaton. It makes it possible for many
- QRegExp objects to use the same QRegExpEngine object with different
- QRegExpPrivate objects.
-*/
-struct QRegExpPrivate
-{
- QRegExpEngine *eng;
- QRegExpEngineKey engineKey;
- bool minimal;
-#ifndef QT_NO_REGEXP_CAPTURE
- QString t; // last string passed to QRegExp::indexIn() or lastIndexIn()
- QStringList capturedCache; // what QRegExp::capturedTexts() returned last
-#endif
- QRegExpMatchState matchState;
-
- inline QRegExpPrivate()
- : eng(nullptr), engineKey(QString(), QRegExp::RegExp, Qt::CaseSensitive), minimal(false) { }
- inline QRegExpPrivate(const QRegExpEngineKey &key)
- : eng(nullptr), engineKey(key), minimal(false) {}
-};
-
-#if !defined(QT_NO_REGEXP_OPTIM)
-struct QRECache
-{
- typedef QHash<QRegExpEngineKey, QRegExpEngine *> EngineCache;
- typedef QCache<QRegExpEngineKey, QRegExpEngine> UnusedEngineCache;
- EngineCache usedEngines;
- UnusedEngineCache unusedEngines;
-};
-Q_GLOBAL_STATIC(QRECache, engineCache)
-static QBasicMutex engineCacheMutex;
-#endif // QT_NO_REGEXP_OPTIM
-
-static void derefEngine(QRegExpEngine *eng, const QRegExpEngineKey &key)
-{
-#if !defined(QT_NO_REGEXP_OPTIM)
- const auto locker = qt_scoped_lock(engineCacheMutex);
- if (!eng->ref.deref()) {
- if (QRECache *c = engineCache()) {
- c->unusedEngines.insert(key, eng, 4 + key.pattern.length() / 4);
- c->usedEngines.remove(key);
- } else {
- delete eng;
- }
- }
-#else
- Q_UNUSED(key);
- if (!eng->ref.deref())
- delete eng;
-#endif
-}
-
-static void prepareEngine_helper(QRegExpPrivate *priv)
-{
- Q_ASSERT(!priv->eng);
-
-#if !defined(QT_NO_REGEXP_OPTIM)
- const auto locker = qt_scoped_lock(engineCacheMutex);
- if (QRECache *c = engineCache()) {
- priv->eng = c->unusedEngines.take(priv->engineKey);
- if (!priv->eng)
- priv->eng = c->usedEngines.value(priv->engineKey);
- if (!priv->eng)
- priv->eng = new QRegExpEngine(priv->engineKey);
- else
- priv->eng->ref.ref();
-
- c->usedEngines.insert(priv->engineKey, priv->eng);
- return;
- }
-#endif // QT_NO_REGEXP_OPTIM
-
- priv->eng = new QRegExpEngine(priv->engineKey);
-}
-
-inline static void prepareEngine(QRegExpPrivate *priv)
-{
- if (priv->eng)
- return;
- prepareEngine_helper(priv);
- priv->matchState.prepareForMatch(priv->eng);
-}
-
-static void prepareEngineForMatch(QRegExpPrivate *priv, const QString &str)
-{
- prepareEngine(priv);
- priv->matchState.prepareForMatch(priv->eng);
-#ifndef QT_NO_REGEXP_CAPTURE
- priv->t = str;
- priv->capturedCache.clear();
-#else
- Q_UNUSED(str);
-#endif
-}
-
-static void invalidateEngine(QRegExpPrivate *priv)
-{
- if (priv->eng) {
- derefEngine(priv->eng, priv->engineKey);
- priv->eng = nullptr;
- priv->matchState.drain();
- }
-}
-
-/*!
- \enum QRegExp::CaretMode
-
- The CaretMode enum defines the different meanings of the caret
- (\b{^}) in a regular expression. The possible values are:
-
- \value CaretAtZero
- The caret corresponds to index 0 in the searched string.
-
- \value CaretAtOffset
- The caret corresponds to the start offset of the search.
-
- \value CaretWontMatch
- The caret never matches.
-*/
-
-/*!
- \enum QRegExp::PatternSyntax
-
- The syntax used to interpret the meaning of the pattern.
-
- \value RegExp A rich Perl-like pattern matching syntax. This is
- the default.
-
- \value RegExp2 Like RegExp, but with \l{greedy quantifiers}.
- (Introduced in Qt 4.2.)
-
- \value Wildcard This provides a simple pattern matching syntax
- similar to that used by shells (command interpreters) for "file
- globbing". See \l{QRegExp wildcard matching}.
-
- \value WildcardUnix This is similar to Wildcard but with the
- behavior of a Unix shell. The wildcard characters can be escaped
- with the character "\\".
-
- \value FixedString The pattern is a fixed string. This is
- equivalent to using the RegExp pattern on a string in
- which all metacharacters are escaped using escape().
-
- \value W3CXmlSchema11 The pattern is a regular expression as
- defined by the W3C XML Schema 1.1 specification.
-
- \sa setPatternSyntax()
-*/
-
-/*!
- Constructs an empty regexp.
-
- \sa isValid(), errorString()
-*/
-QRegExp::QRegExp()
-{
- priv = new QRegExpPrivate;
- prepareEngine(priv);
-}
-
-/*!
- Constructs a regular expression object for the given \a pattern
- string. The pattern must be given using wildcard notation if \a
- syntax is \l Wildcard; the default is \l RegExp. The pattern is
- case sensitive, unless \a cs is Qt::CaseInsensitive. Matching is
- greedy (maximal), but can be changed by calling
- setMinimal().
-
- \sa setPattern(), setCaseSensitivity(), setPatternSyntax()
-*/
-QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs, PatternSyntax syntax)
-{
- priv = new QRegExpPrivate(QRegExpEngineKey(pattern, syntax, cs));
- prepareEngine(priv);
-}
-
-/*!
- Constructs a regular expression as a copy of \a rx.
-
- \sa operator=()
-*/
-QRegExp::QRegExp(const QRegExp &rx)
-{
- priv = new QRegExpPrivate;
- operator=(rx);
-}
-
-/*!
- Destroys the regular expression and cleans up its internal data.
-*/
-QRegExp::~QRegExp()
-{
- invalidateEngine(priv);
- delete priv;
-}
-
-/*!
- Copies the regular expression \a rx and returns a reference to the
- copy. The case sensitivity, wildcard, and minimal matching options
- are also copied.
-*/
-QRegExp &QRegExp::operator=(const QRegExp &rx)
-{
- prepareEngine(rx.priv); // to allow sharing
- QRegExpEngine *otherEng = rx.priv->eng;
- if (otherEng)
- otherEng->ref.ref();
- invalidateEngine(priv);
- priv->eng = otherEng;
- priv->engineKey = rx.priv->engineKey;
- priv->minimal = rx.priv->minimal;
-#ifndef QT_NO_REGEXP_CAPTURE
- priv->t = rx.priv->t;
- priv->capturedCache = rx.priv->capturedCache;
-#endif
- if (priv->eng)
- priv->matchState.prepareForMatch(priv->eng);
- priv->matchState.captured = rx.priv->matchState.captured;
- return *this;
-}
-
-/*!
- \fn QRegExp &QRegExp::operator=(QRegExp &&other)
-
- Move-assigns \a other to this QRegExp instance.
-
- \since 5.2
-*/
-
-/*!
- \fn void QRegExp::swap(QRegExp &other)
- \since 4.8
-
- Swaps regular expression \a other with this regular
- expression. This operation is very fast and never fails.
-*/
-
-/*!
- Returns \c true if this regular expression is equal to \a rx;
- otherwise returns \c false.
-
- Two QRegExp objects are equal if they have the same pattern
- strings and the same settings for case sensitivity, wildcard and
- minimal matching.
-*/
-bool QRegExp::operator==(const QRegExp &rx) const
-{
- return priv->engineKey == rx.priv->engineKey && priv->minimal == rx.priv->minimal;
-}
-
-/*!
- \since 5.6
- \relates QRegExp
-
- Returns the hash value for \a key, using
- \a seed to seed the calculation.
-*/
-size_t qHash(const QRegExp &key, size_t seed) noexcept
-{
- QtPrivate::QHashCombine hash;
- seed = hash(seed, key.priv->engineKey);
- seed = hash(seed, key.priv->minimal);
- return seed;
-}
-
-/*!
- \fn bool QRegExp::operator!=(const QRegExp &rx) const
-
- Returns \c true if this regular expression is not equal to \a rx;
- otherwise returns \c false.
-
- \sa operator==()
-*/
-
-/*!
- Returns \c true if the pattern string is empty; otherwise returns
- false.
-
- If you call exactMatch() with an empty pattern on an empty string
- it will return true; otherwise it returns \c false since it operates
- over the whole string. If you call indexIn() with an empty pattern
- on \e any string it will return the start offset (0 by default)
- because the empty pattern matches the 'emptiness' at the start of
- the string. In this case the length of the match returned by
- matchedLength() will be 0.
-
- See QString::isEmpty().
-*/
-
-bool QRegExp::isEmpty() const
-{
- return priv->engineKey.pattern.isEmpty();
-}
-
-/*!
- Returns \c true if the regular expression is valid; otherwise returns
- false. An invalid regular expression never matches.
-
- The pattern \b{[a-z} is an example of an invalid pattern, since
- it lacks a closing square bracket.
-
- Note that the validity of a regexp may also depend on the setting
- of the wildcard flag, for example \b{*.html} is a valid
- wildcard regexp but an invalid full regexp.
-
- \sa errorString()
-*/
-bool QRegExp::isValid() const
-{
- if (priv->engineKey.pattern.isEmpty()) {
- return true;
- } else {
- prepareEngine(priv);
- return priv->eng->isValid();
- }
-}
-
-/*!
- Returns the pattern string of the regular expression. The pattern
- has either regular expression syntax or wildcard syntax, depending
- on patternSyntax().
-
- \sa patternSyntax(), caseSensitivity()
-*/
-QString QRegExp::pattern() const
-{
- return priv->engineKey.pattern;
-}
-
-/*!
- Sets the pattern string to \a pattern. The case sensitivity,
- wildcard, and minimal matching options are not changed.
-
- \sa setPatternSyntax(), setCaseSensitivity()
-*/
-void QRegExp::setPattern(const QString &pattern)
-{
- if (priv->engineKey.pattern != pattern) {
- invalidateEngine(priv);
- priv->engineKey.pattern = pattern;
- }
-}
-
-/*!
- Returns Qt::CaseSensitive if the regexp is matched case
- sensitively; otherwise returns Qt::CaseInsensitive.
-
- \sa patternSyntax(), pattern(), isMinimal()
-*/
-Qt::CaseSensitivity QRegExp::caseSensitivity() const
-{
- return priv->engineKey.cs;
-}
-
-/*!
- Sets case sensitive matching to \a cs.
-
- If \a cs is Qt::CaseSensitive, \b{\\.txt$} matches
- \c{readme.txt} but not \c{README.TXT}.
-
- \sa setPatternSyntax(), setPattern(), setMinimal()
-*/
-void QRegExp::setCaseSensitivity(Qt::CaseSensitivity cs)
-{
- if ((bool)cs != (bool)priv->engineKey.cs) {
- invalidateEngine(priv);
- priv->engineKey.cs = cs;
- }
-}
-
-/*!
- Returns the syntax used by the regular expression. The default is
- QRegExp::RegExp.
-
- \sa pattern(), caseSensitivity()
-*/
-QRegExp::PatternSyntax QRegExp::patternSyntax() const
-{
- return priv->engineKey.patternSyntax;
-}
-
-/*!
- Sets the syntax mode for the regular expression. The default is
- QRegExp::RegExp.
-
- Setting \a syntax to QRegExp::Wildcard enables simple shell-like
- \l{QRegExp wildcard matching}. For example, \b{r*.txt} matches the
- string \c{readme.txt} in wildcard mode, but does not match
- \c{readme}.
-
- Setting \a syntax to QRegExp::FixedString means that the pattern
- is interpreted as a plain string. Special characters (e.g.,
- backslash) don't need to be escaped then.
-
- \sa setPattern(), setCaseSensitivity(), escape()
-*/
-void QRegExp::setPatternSyntax(PatternSyntax syntax)
-{
- if (syntax != priv->engineKey.patternSyntax) {
- invalidateEngine(priv);
- priv->engineKey.patternSyntax = syntax;
- }
-}
-
-/*!
- Returns \c true if minimal (non-greedy) matching is enabled;
- otherwise returns \c false.
-
- \sa caseSensitivity(), setMinimal()
-*/
-bool QRegExp::isMinimal() const
-{
- return priv->minimal;
-}
-
-/*!
- Enables or disables minimal matching. If \a minimal is false,
- matching is greedy (maximal) which is the default.
-
- For example, suppose we have the input string "We must be
- <b>bold</b>, very <b>bold</b>!" and the pattern
- \b{<b>.*</b>}. With the default greedy (maximal) matching,
- the match is "We must be \underline{<b>bold</b>, very
- <b>bold</b>}!". But with minimal (non-greedy) matching, the
- first match is: "We must be \underline{<b>bold</b>}, very
- <b>bold</b>!" and the second match is "We must be <b>bold</b>,
- very \underline{<b>bold</b>}!". In practice we might use the pattern
- \b{<b>[^<]*\</b>} instead, although this will still fail for
- nested tags.
-
- \sa setCaseSensitivity()
-*/
-void QRegExp::setMinimal(bool minimal)
-{
- priv->minimal = minimal;
-}
-
-// ### Qt 5: make non-const
-/*!
- Returns \c true if \a str is matched exactly by this regular
- expression; otherwise returns \c false. You can determine how much of
- the string was matched by calling matchedLength().
-
- For a given regexp string R, exactMatch("R") is the equivalent of
- indexIn("^R$") since exactMatch() effectively encloses the regexp
- in the start of string and end of string anchors, except that it
- sets matchedLength() differently.
-
- For example, if the regular expression is \b{blue}, then
- exactMatch() returns \c true only for input \c blue. For inputs \c
- bluebell, \c blutak and \c lightblue, exactMatch() returns \c false
- and matchedLength() will return 4, 3 and 0 respectively.
-
- Although const, this function sets matchedLength(),
- capturedTexts(), and pos().
-
- \sa indexIn(), lastIndexIn()
-*/
-bool QRegExp::exactMatch(const QString &str) const
-{
- prepareEngineForMatch(priv, str);
- priv->matchState.match(str.unicode(), str.length(), 0, priv->minimal, true, 0);
- if (priv->matchState.captured[1] == str.length()) {
- return true;
- } else {
- priv->matchState.captured[0] = 0;
- priv->matchState.captured[1] = priv->matchState.oneTestMatchedLen;
- return false;
- }
-}
-
-/*!
- Returns the regexp as a QVariant
-*/
-QRegExp::operator QVariant() const
-{
-QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
- QVariant v;
- v.setValue(*this);
- return v;
-QT_WARNING_POP
-}
-
-// ### Qt 5: make non-const
-/*!
- Attempts to find a match in \a str from position \a offset (0 by
- default). If \a offset is -1, the search starts at the last
- character; if -2, at the next to last character; etc.
-
- Returns the position of the first match, or -1 if there was no
- match.
-
- The \a caretMode parameter can be used to instruct whether \b{^}
- should match at index 0 or at \a offset.
-
- You might prefer to use QString::indexOf(), QString::contains(),
- or even QStringList::filter(). To replace matches use
- QString::replace().
-
- Example:
- \snippet code/src_corelib_text_qregexp.cpp 13
-
- Although const, this function sets matchedLength(),
- capturedTexts() and pos().
-
- If the QRegExp is a wildcard expression (see setPatternSyntax())
- and want to test a string against the whole wildcard expression,
- use exactMatch() instead of this function.
-
- \sa lastIndexIn(), exactMatch()
-*/
-
-int QRegExp::indexIn(const QString &str, int offset, CaretMode caretMode) const
-{
- prepareEngineForMatch(priv, str);
- if (offset < 0)
- offset += str.length();
- priv->matchState.match(str.unicode(), str.length(), offset,
- priv->minimal, false, caretIndex(offset, caretMode));
- return priv->matchState.captured[0];
-}
-
-// ### Qt 5: make non-const
-/*!
- Attempts to find a match backwards in \a str from position \a
- offset. If \a offset is -1 (the default), the search starts at the
- last character; if -2, at the next to last character; etc.
-
- Returns the position of the first match, or -1 if there was no
- match.
-
- The \a caretMode parameter can be used to instruct whether \b{^}
- should match at index 0 or at \a offset.
-
- Although const, this function sets matchedLength(),
- capturedTexts() and pos().
-
- \warning Searching backwards is much slower than searching
- forwards.
-
- \sa indexIn(), exactMatch()
-*/
-
-int QRegExp::lastIndexIn(const QString &str, int offset, CaretMode caretMode) const
-{
- prepareEngineForMatch(priv, str);
- if (offset < 0)
- offset += str.length();
- if (offset < 0 || offset > str.length()) {
- memset(priv->matchState.captured, -1, priv->matchState.capturedSize*sizeof(int));
- return -1;
- }
-
- while (offset >= 0) {
- priv->matchState.match(str.unicode(), str.length(), offset,
- priv->minimal, true, caretIndex(offset, caretMode));
- if (priv->matchState.captured[0] == offset)
- return offset;
- --offset;
- }
- return -1;
-}
-
-/*!
- Returns the length of the last matched string, or -1 if there was
- no match.
-
- \sa exactMatch(), indexIn(), lastIndexIn()
-*/
-int QRegExp::matchedLength() const
-{
- return priv->matchState.captured[1];
-}
-
-
-/*!
- Replaces every occurrence of this regular expression in
- \a str with \a after and returns the result.
-
- For regular expressions containing \l{capturing parentheses},
- occurrences of \b{\\1}, \b{\\2}, ..., in \a after are replaced
- with \a{rx}.cap(1), cap(2), ...
-
- \sa indexIn(), lastIndexIn(), QRegExp::cap()
-*/
-QString QRegExp::replaceIn(const QString &str, const QString &after) const
-{
- struct QStringCapture
- {
- int pos;
- int len;
- int no;
- };
-
- QRegExp rx2(*this);
-
- if (str.isEmpty() && rx2.indexIn(str) == -1)
- return str;
-
- QString s(str);
-
- int index = 0;
- int numCaptures = rx2.captureCount();
- int al = after.length();
- QRegExp::CaretMode caretMode = QRegExp::CaretAtZero;
-
- if (numCaptures > 0) {
- const QChar *uc = after.unicode();
- int numBackRefs = 0;
-
- for (int i = 0; i < al - 1; i++) {
- if (uc[i] == QLatin1Char('\\')) {
- int no = uc[i + 1].digitValue();
- if (no > 0 && no <= numCaptures)
- numBackRefs++;
- }
- }
-
- /*
- This is the harder case where we have back-references.
- */
- if (numBackRefs > 0) {
- QVarLengthArray<QStringCapture, 16> captures(numBackRefs);
- int j = 0;
-
- for (int i = 0; i < al - 1; i++) {
- if (uc[i] == QLatin1Char('\\')) {
- int no = uc[i + 1].digitValue();
- if (no > 0 && no <= numCaptures) {
- QStringCapture capture;
- capture.pos = i;
- capture.len = 2;
-
- if (i < al - 2) {
- int secondDigit = uc[i + 2].digitValue();
- if (secondDigit != -1 && ((no * 10) + secondDigit) <= numCaptures) {
- no = (no * 10) + secondDigit;
- ++capture.len;
- }
- }
-
- capture.no = no;
- captures[j++] = capture;
- }
- }
- }
-
- while (index <= s.length()) {
- index = rx2.indexIn(s, index, caretMode);
- if (index == -1)
- break;
-
- QString after2(after);
- for (j = numBackRefs - 1; j >= 0; j--) {
- const QStringCapture &capture = captures[j];
- after2.replace(capture.pos, capture.len, rx2.cap(capture.no));
- }
-
- s.replace(index, rx2.matchedLength(), after2);
- index += after2.length();
-
- // avoid infinite loop on 0-length matches (e.g., QRegExp("[a-z]*"))
- if (rx2.matchedLength() == 0)
- ++index;
-
- caretMode = QRegExp::CaretWontMatch;
- }
- return s;
- }
- }
-
- /*
- This is the simple and optimized case where we don't have
- back-references.
- */
- while (index != -1) {
- struct {
- int pos;
- int length;
- } replacements[2048];
-
- int pos = 0;
- int adjust = 0;
- while (pos < 2047) {
- index = rx2.indexIn(s, index, caretMode);
- if (index == -1)
- break;
- int ml = rx2.matchedLength();
- replacements[pos].pos = index;
- replacements[pos++].length = ml;
- index += ml;
- adjust += al - ml;
- // avoid infinite loop
- if (!ml)
- index++;
- }
- if (!pos)
- break;
- replacements[pos].pos = s.size();
- int newlen = s.size() + adjust;
-
- // to continue searching at the right position after we did
- // the first round of replacements
- if (index != -1)
- index += adjust;
- QString newstring;
- newstring.reserve(newlen + 1);
- QChar *newuc = newstring.data();
- QChar *uc = newuc;
- int copystart = 0;
- int i = 0;
- while (i < pos) {
- int copyend = replacements[i].pos;
- int size = copyend - copystart;
- memcpy(static_cast<void*>(uc), static_cast<const void *>(s.constData() + copystart), size * sizeof(QChar));
- uc += size;
- memcpy(static_cast<void *>(uc), static_cast<const void *>(after.constData()), al * sizeof(QChar));
- uc += al;
- copystart = copyend + replacements[i].length;
- i++;
- }
- memcpy(static_cast<void *>(uc), static_cast<const void *>(s.constData() + copystart), (s.size() - copystart) * sizeof(QChar));
- newstring.resize(newlen);
- s = newstring;
- caretMode = QRegExp::CaretWontMatch;
- }
- return s;
-
-}
-
-
-/*!
- \fn QString QRegExp::removeIn(const QString &str)
-
- Removes every occurrence of this regular expression \a str, and
- returns the result
-
- Does the same as replaceIn(str, QString()).
-
- \sa indexIn(), lastIndexIn(), replaceIn()
-*/
-
-
-/*!
- \fn QString QRegExp::countIn(const QString &str)
-
- Returns the number of times this regular expression matches
- in \a str.
-
- \sa indexIn(), lastIndexIn(), replaceIn()
-*/
-
-int QRegExp::countIn(const QString &str) const
-{
- QRegExp rx2(*this);
- int count = 0;
- int index = -1;
- int len = str.length();
- while (index < len - 1) { // count overlapping matches
- index = rx2.indexIn(str, index + 1);
- if (index == -1)
- break;
- count++;
- }
- return count;
-}
-
-/*!
- Splits \a str into substrings wherever this regular expression
- matches, and returns the list of those strings. If this regular
- expression does not match anywhere in the string, split() returns a
- single-element list containing \a str.
-
- \sa QStringList::join(), section(), QString::split()
-*/
-QStringList QRegExp::splitString(const QString &str, Qt::SplitBehavior behavior) const
-{
- QRegExp rx2(*this);
- QStringList list;
- int start = 0;
- int extra = 0;
- int end;
- while ((end = rx2.indexIn(str, start + extra)) != -1) {
- int matchedLen = rx2.matchedLength();
- if (start != end || behavior == Qt::KeepEmptyParts)
- list.append(str.mid(start, end - start));
- start = end + matchedLen;
- extra = (matchedLen == 0) ? 1 : 0;
- }
- if (start != str.size() || behavior == Qt::KeepEmptyParts)
- list.append(str.mid(start, -1));
- return list;
-}
-
-/*!
- \fn QStringList QStringList::filter(const QRegExp &rx) const
-
- \overload
-
- Returns a list of all the strings that match the regular
- expression \a rx.
-*/
-QStringList QRegExp::filterList(const QStringList &stringList) const
-{
- QStringList res;
- for (const QString &s : stringList) {
- if (containedIn(s))
- res << s;
- }
- return res;
-}
-
-/*!
- Replaces every occurrence of the regexp \a rx, in each of the
- string lists's strings, with \a after. Returns a reference to the
- string list.
-*/
-QStringList QRegExp::replaceIn(const QStringList &stringList, const QString &after) const
-{
- QStringList list;
- for (const QString &s : stringList)
- list << replaceIn(s, after);
- return list;
-}
-
-/*!
- Returns the index position of the first exact match of this regexp in
- \a list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- \sa lastIndexIn(), contains(), exactMatch()
-*/
-int QRegExp::indexIn(const QStringList &list, int from) const
-{
- QRegExp rx2(*this);
- if (from < 0)
- from = qMax(from + list.size(), 0);
- for (int i = from; i < list.size(); ++i) {
- if (rx2.exactMatch(list.at(i)))
- return i;
- }
- return -1;
-}
-
-/*!
- Returns the index position of the last exact match of this regexp in
- \a list, searching backward from index position \a from. If \a
- from is -1 (the default), the search starts at the last item.
- Returns -1 if no item matched.
-
- \sa indexOf(), contains(), QRegExp::exactMatch()
-*/
-int QRegExp::lastIndexIn(const QStringList &list, int from) const
-{
- QRegExp rx2(*this);
- if (from < 0)
- from += list.size();
- else if (from >= list.size())
- from = list.size() - 1;
- for (int i = from; i >= 0; --i) {
- if (rx2.exactMatch(list.at(i)))
- return i;
- }
- return -1;
-}
-
-#ifndef QT_NO_REGEXP_CAPTURE
-
-/*!
- \since 4.6
- Returns the number of captures contained in the regular expression.
- */
-int QRegExp::captureCount() const
-{
- prepareEngine(priv);
- return priv->eng->captureCount();
-}
-
-/*!
- Returns a list of the captured text strings.
-
- The first string in the list is the entire matched string. Each
- subsequent list element contains a string that matched a
- (capturing) subexpression of the regexp.
-
- For example:
- \snippet code/src_corelib_text_qregexp.cpp 14
-
- The above example also captures elements that may be present but
- which we have no interest in. This problem can be solved by using
- non-capturing parentheses:
-
- \snippet code/src_corelib_text_qregexp.cpp 15
-
- Note that if you want to iterate over the list, you should iterate
- over a copy, e.g.
- \snippet code/src_corelib_text_qregexp.cpp 16
-
- Some regexps can match an indeterminate number of times. For
- example if the input string is "Offsets: 12 14 99 231 7" and the
- regexp, \c{rx}, is \b{(\\d+)+}, we would hope to get a list of
- all the numbers matched. However, after calling
- \c{rx.indexIn(str)}, capturedTexts() will return the list ("12",
- "12"), i.e. the entire match was "12" and the first subexpression
- matched was "12". The correct approach is to use cap() in a
- \l{QRegExp#cap_in_a_loop}{loop}.
-
- The order of elements in the string list is as follows. The first
- element is the entire matching string. Each subsequent element
- corresponds to the next capturing open left parentheses. Thus
- capturedTexts()[1] is the text of the first capturing parentheses,
- capturedTexts()[2] is the text of the second and so on
- (corresponding to $1, $2, etc., in some other regexp languages).
-
- \sa cap(), pos()
-*/
-QStringList QRegExp::capturedTexts() const
-{
- if (priv->capturedCache.isEmpty()) {
- prepareEngine(priv);
- const int *captured = priv->matchState.captured;
- int n = priv->matchState.capturedSize;
-
- for (int i = 0; i < n; i += 2) {
- QString m;
- if (captured[i + 1] == 0)
- m = QLatin1String(""); // ### Qt 5: don't distinguish between null and empty
- else if (captured[i] >= 0)
- m = priv->t.mid(captured[i], captured[i + 1]);
- priv->capturedCache.append(m);
- }
- priv->t.clear();
- }
- return priv->capturedCache;
-}
-
-/*!
- \internal
-*/
-QStringList QRegExp::capturedTexts()
-{
- return const_cast<const QRegExp *>(this)->capturedTexts();
-}
-
-/*!
- Returns the text captured by the \a nth subexpression. The entire
- match has index 0 and the parenthesized subexpressions have
- indexes starting from 1 (excluding non-capturing parentheses).
-
- \snippet code/src_corelib_text_qregexp.cpp 17
-
- The order of elements matched by cap() is as follows. The first
- element, cap(0), is the entire matching string. Each subsequent
- element corresponds to the next capturing open left parentheses.
- Thus cap(1) is the text of the first capturing parentheses, cap(2)
- is the text of the second, and so on.
-
- \sa capturedTexts(), pos()
-*/
-QString QRegExp::cap(int nth) const
-{
- return capturedTexts().value(nth);
-}
-
-/*!
- \internal
-*/
-QString QRegExp::cap(int nth)
-{
- return const_cast<const QRegExp *>(this)->cap(nth);
-}
-
-/*!
- Returns the position of the \a nth captured text in the searched
- string. If \a nth is 0 (the default), pos() returns the position
- of the whole match.
-
- Example:
- \snippet code/src_corelib_text_qregexp.cpp 18
-
- For zero-length matches, pos() always returns -1. (For example, if
- cap(4) would return an empty string, pos(4) returns -1.) This is
- a feature of the implementation.
-
- \sa cap(), capturedTexts()
-*/
-int QRegExp::pos(int nth) const
-{
- if (nth < 0 || nth >= priv->matchState.capturedSize / 2)
- return -1;
- else
- return priv->matchState.captured[2 * nth];
-}
-
-/*!
- \internal
-*/
-int QRegExp::pos(int nth)
-{
- return const_cast<const QRegExp *>(this)->pos(nth);
-}
-
-/*!
- Returns a text string that explains why a regexp pattern is
- invalid the case being; otherwise returns "no error occurred".
-
- \sa isValid()
-*/
-QString QRegExp::errorString() const
-{
- if (isValid()) {
- return QString::fromLatin1(RXERR_OK);
- } else {
- return priv->eng->errorString();
- }
-}
-
-/*!
- \internal
-*/
-QString QRegExp::errorString()
-{
- return const_cast<const QRegExp *>(this)->errorString();
-}
-
-#endif
-
-/*!
- Returns the string \a str with every regexp special character
- escaped with a backslash. The special characters are $, (,), *, +,
- ., ?, [, \,], ^, {, | and }.
-
- Example:
-
- \snippet code/src_corelib_text_qregexp.cpp 19
-
- This function is useful to construct regexp patterns dynamically:
-
- \snippet code/src_corelib_text_qregexp.cpp 20
-
- \sa setPatternSyntax()
-*/
-QString QRegExp::escape(const QString &str)
-{
- QString quoted;
- const int count = str.count();
- quoted.reserve(count * 2);
- const QLatin1Char backslash('\\');
- for (int i = 0; i < count; i++) {
- switch (str.at(i).toLatin1()) {
- case '$':
- case '(':
- case ')':
- case '*':
- case '+':
- case '.':
- case '?':
- case '[':
- case '\\':
- case ']':
- case '^':
- case '{':
- case '|':
- case '}':
- quoted.append(backslash);
- }
- quoted.append(str.at(i));
- }
- return quoted;
-}
-
-
-#ifndef QT_NO_DATASTREAM
-/*!
- \relates QRegExp
-
- Writes the regular expression \a regExp to stream \a out.
-
- \sa {Serializing Qt Data Types}
-*/
-QDataStream &operator<<(QDataStream &out, const QRegExp &regExp)
-{
- return out << regExp.pattern() << (quint8)regExp.caseSensitivity()
- << (quint8)regExp.patternSyntax()
- << (quint8)!!regExp.isMinimal();
-}
-
-/*!
- \relates QRegExp
-
- Reads a regular expression from stream \a in into \a regExp.
-
- \sa {Serializing Qt Data Types}
-*/
-QDataStream &operator>>(QDataStream &in, QRegExp &regExp)
-{
- QString pattern;
- quint8 cs;
- quint8 patternSyntax;
- quint8 isMinimal;
-
- in >> pattern >> cs >> patternSyntax >> isMinimal;
-
- QRegExp newRegExp(pattern, Qt::CaseSensitivity(cs),
- QRegExp::PatternSyntax(patternSyntax));
-
- newRegExp.setMinimal(isMinimal);
- regExp = newRegExp;
- return in;
-}
-#endif // QT_NO_DATASTREAM
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug dbg, const QRegExp &r)
-{
- QDebugStateSaver saver(dbg);
- dbg.nospace() << "QRegExp(patternSyntax=" << r.patternSyntax()
- << ", pattern='"<< r.pattern() << "')";
- return dbg;
-}
-#endif
-
-QT_END_NAMESPACE
diff --git a/src/corelib/text/qregexp.h b/src/corelib/text/qregexp.h
deleted file mode 100644
index 0c117fd17f..0000000000
--- a/src/corelib/text/qregexp.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QREGEXP_H
-#define QREGEXP_H
-
-#include <QtCore/qglobal.h>
-
-#ifndef QT_NO_REGEXP
-
-#include <QtCore/qstring.h>
-#include <QtCore/qvariant.h>
-
-QT_BEGIN_NAMESPACE
-
-
-struct QRegExpPrivate;
-class QStringList;
-class QRegExp;
-
-Q_CORE_EXPORT size_t qHash(const QRegExp &key, size_t seed = 0) noexcept;
-
-class Q_CORE_EXPORT QRegExp
-{
-public:
- enum PatternSyntax {
- RegExp,
- Wildcard,
- FixedString,
- RegExp2,
- WildcardUnix,
- W3CXmlSchema11 };
- enum CaretMode { CaretAtZero, CaretAtOffset, CaretWontMatch };
-
- QRegExp();
- explicit QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive,
- PatternSyntax syntax = RegExp);
- QRegExp(const QRegExp &rx);
- ~QRegExp();
- QRegExp &operator=(const QRegExp &rx);
- QRegExp &operator=(QRegExp &&other) noexcept { swap(other); return *this; }
- void swap(QRegExp &other) noexcept { qSwap(priv, other.priv); }
-
- bool operator==(const QRegExp &rx) const;
- inline bool operator!=(const QRegExp &rx) const { return !operator==(rx); }
-
- bool isEmpty() const;
- bool isValid() const;
- QString pattern() const;
- void setPattern(const QString &pattern);
- Qt::CaseSensitivity caseSensitivity() const;
- void setCaseSensitivity(Qt::CaseSensitivity cs);
- PatternSyntax patternSyntax() const;
- void setPatternSyntax(PatternSyntax syntax);
-
- bool isMinimal() const;
- void setMinimal(bool minimal);
-
- bool exactMatch(const QString &str) const;
-
- operator QVariant() const;
-
- int indexIn(const QString &str, int offset = 0, CaretMode caretMode = CaretAtZero) const;
- int lastIndexIn(const QString &str, int offset = -1, CaretMode caretMode = CaretAtZero) const;
- int matchedLength() const;
-#ifndef QT_NO_REGEXP_CAPTURE
- int captureCount() const;
- QStringList capturedTexts() const;
- QStringList capturedTexts();
- QString cap(int nth = 0) const;
- QString cap(int nth = 0);
- int pos(int nth = 0) const;
- int pos(int nth = 0);
- QString errorString() const;
- QString errorString();
-#endif
-
- QString replaceIn(const QString &str, const QString &after) const;
- QString removeIn(const QString &str) const
- { return replaceIn(str, QString()); }
- bool containedIn(const QString &str) const
- { return indexIn(str) != -1; }
- int countIn(const QString &str) const;
-
- QStringList splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const;
-
- int indexIn(const QStringList &list, int from) const;
- int lastIndexIn(const QStringList &list, int from) const;
- QStringList replaceIn(const QStringList &stringList, const QString &after) const;
- QStringList filterList(const QStringList &stringList) const;
-
- static QString escape(const QString &str);
-
- friend Q_CORE_EXPORT size_t qHash(const QRegExp &key, size_t seed) noexcept;
-
-private:
- QRegExpPrivate *priv;
-};
-
-#ifndef QT_NO_DATASTREAM
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &out, const QRegExp &regExp);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &in, QRegExp &regExp);
-#endif
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_CORE_EXPORT QDebug operator<<(QDebug, const QRegExp &);
-#endif
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QRegExp)
-
-#endif // QT_NO_REGEXP
-
-#endif // QREGEXP_H
diff --git a/src/corelib/text/qregularexpression.cpp b/src/corelib/text/qregularexpression.cpp
index 44bdc2e463..95fd0e3d9a 100644
--- a/src/corelib/text/qregularexpression.cpp
+++ b/src/corelib/text/qregularexpression.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qregularexpression.h"
@@ -47,17 +11,22 @@
#include <QtCore/qmutex.h>
#include <QtCore/qstringlist.h>
#include <QtCore/qdebug.h>
-#include <QtCore/qthreadstorage.h>
#include <QtCore/qglobal.h>
#include <QtCore/qatomic.h>
#include <QtCore/qdatastream.h>
+#if defined(Q_OS_MACOS)
+#include <QtCore/private/qcore_mac_p.h>
+#endif
+
#define PCRE2_CODE_UNIT_WIDTH 16
#include <pcre2.h>
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
/*!
\class QRegularExpression
\inmodule QtCore
@@ -105,9 +74,9 @@ QT_BEGIN_NAMESPACE
\list
\li \e {Mastering Regular Expressions} (Third Edition) by Jeffrey E. F.
Friedl, ISBN 0-596-52812-4;
- \li the \l{http://pcre.org/pcre.txt} {pcrepattern(3)} man page, describing
- the pattern syntax supported by PCRE (the reference implementation of
- Perl-compatible regular expressions);
+ \li the \l{https://pcre.org/original/doc/html/pcrepattern.html}
+ {pcrepattern(3)} man page, describing the pattern syntax supported by PCRE
+ (the reference implementation of Perl-compatible regular expressions);
\li the \l{http://perldoc.perl.org/perlre.html} {Perl's regular expression
documentation} and the \l{http://perldoc.perl.org/perlretut.html} {Perl's
regular expression tutorial}.
@@ -140,6 +109,14 @@ QT_BEGIN_NAMESPACE
\snippet code/src_corelib_text_qregularexpression.cpp 2
+ Alternatively, you can use a
+ \l {https://en.cppreference.com/w/cpp/language/string_literal} {raw string literal},
+ in which case you don't need to escape backslashes in the pattern, all characters
+ between \c {R"(...)"} are considered raw characters. As you can see in the following
+ example, this simplifies writing patterns:
+
+ \snippet code/src_corelib_text_qregularexpression.cpp 35
+
The pattern() function returns the pattern that is currently set for a
QRegularExpression object:
@@ -260,6 +237,12 @@ QT_BEGIN_NAMESPACE
You can also use \l{QRegularExpressionMatchIterator::}{peekNext()} to get
the next result without advancing the iterator.
+ It is also possible to simply use the result of
+ QRegularExpression::globalMatch in a range-based for loop, for instance
+ like this:
+
+ \snippet code/src_corelib_text_qregularexpression.cpp 34
+
It is possible to pass a starting offset and one or more match options to
the globalMatch() function, exactly like normal matching with match().
@@ -535,6 +518,12 @@ QT_BEGIN_NAMESPACE
Moreover, QRegularExpressionMatchIterator offers a peekNext() function
to get the next result \e{without} advancing the iterator.
+ Starting with Qt 6.0, it is also possible to simply use the result of
+ QRegularExpression::globalMatch in a range-based for loop, for instance
+ like this:
+
+ \snippet code/src_corelib_text_qregularexpression.cpp 34
+
You can retrieve the QRegularExpression object the subject string was
matched against by calling the regularExpression() function; the
match type and the match options are available as well by calling
@@ -608,16 +597,6 @@ QT_BEGIN_NAMESPACE
\c{\w} to match any character with either the Unicode L (letter) or N
(digit) property, plus underscore, and so on. This option corresponds
to the \c{/u} modifier in Perl regular expressions.
-
- \value OptimizeOnFirstUsageOption
- This option is ignored. A regular expression is automatically optimized
- (including JIT compiling) the first time it is used. This enum value
- was introduced in Qt 5.4.
-
- \value DontAutomaticallyOptimizeOption
- This option is ignored. A regular expression is automatically optimized
- (including JIT compiling) the first time it is used. This enum value
- was introduced in Qt 5.4.
*/
/*!
@@ -738,7 +717,7 @@ struct QRegularExpressionPrivate : QSharedData
};
void doMatch(QRegularExpressionMatchPrivate *priv,
- int offset,
+ qsizetype offset,
CheckSubjectStringOption checkSubjectStringOption = CheckSubjectString,
const QRegularExpressionMatchPrivate *previous = nullptr) const;
@@ -758,7 +737,7 @@ struct QRegularExpressionPrivate : QSharedData
// it is set to nullptr
pcre2_code_16 *compiledPattern;
int errorCode;
- int errorOffset;
+ qsizetype errorOffset;
int capturingCount;
bool usingCrLfNewlines;
bool isDirty;
@@ -787,7 +766,7 @@ struct QRegularExpressionMatchPrivate : QSharedData
// the capturedOffsets vector contains pairs of (start, end) positions
// for each captured substring
- QList<int> capturedOffsets;
+ QList<qsizetype> capturedOffsets;
int capturedCount = 0;
@@ -812,6 +791,24 @@ struct QRegularExpressionMatchIteratorPrivate : QSharedData
/*!
\internal
+
+ Used to centralize the warning about using an invalid QRegularExpression.
+ In case the pattern is an illegal UTF-16 string, we can't pass print it
+ (pass it to qUtf16Printable, etc.), so we need to check for that.
+*/
+Q_DECL_COLD_FUNCTION
+void qtWarnAboutInvalidRegularExpression(const QString &pattern, const char *where)
+{
+ if (pattern.isValidUtf16()) {
+ qWarning("%s(): called on an invalid QRegularExpression object "
+ "(pattern is '%ls')", where, qUtf16Printable(pattern));
+ } else {
+ qWarning("%s(): called on an invalid QRegularExpression object", where);
+ }
+}
+
+/*!
+ \internal
*/
QRegularExpression::QRegularExpression(QRegularExpressionPrivate &dd)
: d(&dd)
@@ -896,15 +893,15 @@ void QRegularExpressionPrivate::compilePattern()
options |= PCRE2_UTF;
PCRE2_SIZE patternErrorOffset;
- compiledPattern = pcre2_compile_16(reinterpret_cast<PCRE2_SPTR16>(pattern.utf16()),
- pattern.length(),
+ compiledPattern = pcre2_compile_16(reinterpret_cast<PCRE2_SPTR16>(pattern.constData()),
+ pattern.size(),
options,
&errorCode,
&patternErrorOffset,
nullptr);
if (!compiledPattern) {
- errorOffset = static_cast<int>(patternErrorOffset);
+ errorOffset = qsizetype(patternErrorOffset);
return;
} else {
// ignore whatever PCRE2 wrote into errorCode -- leave it to 0 to mean "no error"
@@ -948,43 +945,24 @@ void QRegularExpressionPrivate::getPatternInfo()
Simple "smartpointer" wrapper around a pcre2_jit_stack_16, to be used with
QThreadStorage.
*/
-class QPcreJitStackPointer
+namespace {
+struct PcreJitStackFree
{
- Q_DISABLE_COPY(QPcreJitStackPointer)
-
-public:
- /*!
- \internal
- */
- QPcreJitStackPointer()
- {
- // The default JIT stack size in PCRE is 32K,
- // we allocate from 32K up to 512K.
- stack = pcre2_jit_stack_create_16(32 * 1024, 512 * 1024, nullptr);
- }
- /*!
- \internal
- */
- ~QPcreJitStackPointer()
+ void operator()(pcre2_jit_stack_16 *stack)
{
if (stack)
pcre2_jit_stack_free_16(stack);
}
-
- pcre2_jit_stack_16 *stack;
};
-
-Q_GLOBAL_STATIC(QThreadStorage<QPcreJitStackPointer *>, jitStacks)
+Q_CONSTINIT static thread_local std::unique_ptr<pcre2_jit_stack_16, PcreJitStackFree> jitStacks;
+}
/*!
\internal
*/
static pcre2_jit_stack_16 *qtPcreCallback(void *)
{
- if (jitStacks()->hasLocalData())
- return jitStacks()->localData()->stack;
-
- return nullptr;
+ return jitStacks.get();
}
/*!
@@ -1001,6 +979,8 @@ static bool isJitEnabled()
#ifdef QT_DEBUG
return false;
+#elif defined(Q_OS_MACOS)
+ return !qt_mac_runningUnderRosetta();
#else
return true;
#endif
@@ -1040,9 +1020,24 @@ int QRegularExpressionPrivate::captureIndexForName(QStringView name) const
if (!compiledPattern)
return -1;
- int index = pcre2_substring_number_from_name_16(compiledPattern, reinterpret_cast<PCRE2_SPTR16>(name.utf16()));
- if (index >= 0)
- return index;
+ // See the other usages of pcre2_pattern_info_16 for more details about this
+ PCRE2_SPTR16 *namedCapturingTable;
+ unsigned int namedCapturingTableEntryCount;
+ unsigned int namedCapturingTableEntrySize;
+
+ pcre2_pattern_info_16(compiledPattern, PCRE2_INFO_NAMETABLE, &namedCapturingTable);
+ pcre2_pattern_info_16(compiledPattern, PCRE2_INFO_NAMECOUNT, &namedCapturingTableEntryCount);
+ pcre2_pattern_info_16(compiledPattern, PCRE2_INFO_NAMEENTRYSIZE, &namedCapturingTableEntrySize);
+
+ for (unsigned int i = 0; i < namedCapturingTableEntryCount; ++i) {
+ const auto currentNamedCapturingTableRow =
+ reinterpret_cast<const char16_t *>(namedCapturingTable) + namedCapturingTableEntrySize * i;
+
+ if (name == (currentNamedCapturingTableRow + 1)) {
+ const int index = *currentNamedCapturingTableRow;
+ return index;
+ }
+ }
return -1;
}
@@ -1055,17 +1050,18 @@ int QRegularExpressionPrivate::captureIndexForName(QStringView name) const
and re-run pcre2_match_16.
*/
static int safe_pcre2_match_16(const pcre2_code_16 *code,
- PCRE2_SPTR16 subject, int length,
- int startOffset, int options,
+ PCRE2_SPTR16 subject, qsizetype length,
+ qsizetype startOffset, int options,
pcre2_match_data_16 *matchData,
pcre2_match_context_16 *matchContext)
{
int result = pcre2_match_16(code, subject, length,
startOffset, options, matchData, matchContext);
- if (result == PCRE2_ERROR_JIT_STACKLIMIT && !jitStacks()->hasLocalData()) {
- QPcreJitStackPointer *p = new QPcreJitStackPointer;
- jitStacks()->setLocalData(p);
+ if (result == PCRE2_ERROR_JIT_STACKLIMIT && !jitStacks) {
+ // The default JIT stack size in PCRE is 32K,
+ // we allocate from 32K up to 512K.
+ jitStacks.reset(pcre2_jit_stack_create_16(32 * 1024, 512 * 1024, NULL));
result = pcre2_match_16(code, subject, length,
startOffset, options, matchData, matchContext);
@@ -1103,14 +1099,14 @@ static int safe_pcre2_match_16(const pcre2_code_16 *code,
must advance over it.
*/
void QRegularExpressionPrivate::doMatch(QRegularExpressionMatchPrivate *priv,
- int offset,
+ qsizetype offset,
CheckSubjectStringOption checkSubjectStringOption,
const QRegularExpressionMatchPrivate *previous) const
{
Q_ASSERT(priv);
- Q_ASSUME(priv != previous);
+ Q_ASSERT(priv != previous);
- const int subjectLength = priv->subject.length();
+ const qsizetype subjectLength = priv->subject.size();
if (offset < 0)
offset += subjectLength;
@@ -1119,7 +1115,7 @@ void QRegularExpressionPrivate::doMatch(QRegularExpressionMatchPrivate *priv,
return;
if (Q_UNLIKELY(!compiledPattern)) {
- qWarning("QRegularExpressionPrivate::doMatch(): called on an invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(pattern, "QRegularExpressionPrivate::doMatch");
return;
}
@@ -1149,7 +1145,19 @@ void QRegularExpressionPrivate::doMatch(QRegularExpressionMatchPrivate *priv,
pcre2_jit_stack_assign_16(matchContext, &qtPcreCallback, nullptr);
pcre2_match_data_16 *matchData = pcre2_match_data_create_from_pattern_16(compiledPattern, nullptr);
- const char16_t * const subjectUtf16 = priv->subject.utf16();
+ // PCRE does not accept a null pointer as subject string, even if
+ // its length is zero. We however allow it in input: a QStringView
+ // subject may have data == nullptr. In this case, to keep PCRE
+ // happy, pass a pointer to a dummy character.
+ const char16_t dummySubject = 0;
+ const char16_t * const subjectUtf16 = [&]()
+ {
+ const auto subjectUtf16 = priv->subject.utf16();
+ if (subjectUtf16)
+ return subjectUtf16;
+ Q_ASSERT(subjectLength == 0);
+ return &dummySubject;
+ }();
int result;
@@ -1169,8 +1177,8 @@ void QRegularExpressionPrivate::doMatch(QRegularExpressionMatchPrivate *priv,
if (usingCrLfNewlines
&& offset < subjectLength
- && subjectUtf16[offset - 1] == QLatin1Char('\r')
- && subjectUtf16[offset] == QLatin1Char('\n')) {
+ && subjectUtf16[offset - 1] == u'\r'
+ && subjectUtf16[offset] == u'\n') {
++offset;
} else if (offset < subjectLength
&& QChar::isLowSurrogate(subjectUtf16[offset])) {
@@ -1220,10 +1228,16 @@ void QRegularExpressionPrivate::doMatch(QRegularExpressionMatchPrivate *priv,
// copy the captured substrings offsets, if any
if (priv->capturedCount) {
PCRE2_SIZE *ovector = pcre2_get_ovector_pointer_16(matchData);
- int * const capturedOffsets = priv->capturedOffsets.data();
+ qsizetype *const capturedOffsets = priv->capturedOffsets.data();
+
+ // We rely on the fact that capturing groups that did not
+ // capture anything have offset -1, but PCRE technically
+ // returns "PCRE2_UNSET". Test that out, better safe than
+ // sorry...
+ static_assert(qsizetype(PCRE2_UNSET) == qsizetype(-1), "Internal error: PCRE2 changed its API");
for (int i = 0; i < priv->capturedCount * 2; ++i)
- capturedOffsets[i] = static_cast<int>(ovector[i]);
+ capturedOffsets[i] = qsizetype(ovector[i]);
// For partial matches, PCRE2 and PCRE1 differ in behavior when lookbehinds
// are involved. PCRE2 reports the real begin of the match and the maximum
@@ -1340,10 +1354,21 @@ QRegularExpression::QRegularExpression(const QString &pattern, PatternOptions op
\sa operator=()
*/
-QRegularExpression::QRegularExpression(const QRegularExpression &re)
- : d(re.d)
-{
-}
+QRegularExpression::QRegularExpression(const QRegularExpression &re) noexcept = default;
+
+/*!
+ \fn QRegularExpression::QRegularExpression(QRegularExpression &&re)
+
+ \since 6.1
+
+ Constructs a QRegularExpression object by moving from \a re.
+
+ Note that a moved-from QRegularExpression can only be destroyed or
+ assigned to. The effect of calling other functions than the destructor
+ or one of the assignment operators is undefined.
+
+ \sa operator=()
+*/
/*!
Destroys the QRegularExpression object.
@@ -1352,15 +1377,13 @@ QRegularExpression::~QRegularExpression()
{
}
+QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QRegularExpressionPrivate)
+
/*!
Assigns the regular expression \a re to this object, and returns a reference
to the copy. Both the pattern and the pattern options are copied.
*/
-QRegularExpression &QRegularExpression::operator=(const QRegularExpression &re)
-{
- d = re.d;
- return *this;
-}
+QRegularExpression &QRegularExpression::operator=(const QRegularExpression &re) noexcept = default;
/*!
\fn void QRegularExpression::swap(QRegularExpression &other)
@@ -1387,6 +1410,8 @@ QString QRegularExpression::pattern() const
*/
void QRegularExpression::setPattern(const QString &pattern)
{
+ if (d->pattern == pattern)
+ return;
d.detach();
d->isDirty = true;
d->pattern = pattern;
@@ -1410,6 +1435,8 @@ QRegularExpression::PatternOptions QRegularExpression::patternOptions() const
*/
void QRegularExpression::setPatternOptions(PatternOptions options)
{
+ if (d->patternOptions == options)
+ return;
d.detach();
d->isDirty = true;
d->patternOptions = options;
@@ -1473,19 +1500,15 @@ QStringList QRegularExpression::namedCaptureGroups() const
pcre2_pattern_info_16(d->compiledPattern, PCRE2_INFO_NAMECOUNT, &namedCapturingTableEntryCount);
pcre2_pattern_info_16(d->compiledPattern, PCRE2_INFO_NAMEENTRYSIZE, &namedCapturingTableEntrySize);
- QStringList result;
-
- // no QList::resize nor fill is available. The +1 is for the implicit group #0
- result.reserve(d->capturingCount + 1);
- for (int i = 0; i < d->capturingCount + 1; ++i)
- result.append(QString());
+ // The +1 is for the implicit group #0
+ QStringList result(d->capturingCount + 1);
for (unsigned int i = 0; i < namedCapturingTableEntryCount; ++i) {
const auto currentNamedCapturingTableRow =
reinterpret_cast<const char16_t *>(namedCapturingTable) + namedCapturingTableEntrySize * i;
const int index = *currentNamedCapturingTableRow;
- result[index] = QString::fromUtf16(currentNamedCapturingTableRow + 1);
+ result[index] = QStringView(currentNamedCapturingTableRow + 1).toString();
}
return result;
@@ -1517,10 +1540,10 @@ QString QRegularExpression::errorString() const
QString errorString;
int errorStringLength;
do {
- errorString.resize(errorString.length() + 64);
+ errorString.resize(errorString.size() + 64);
errorStringLength = pcre2_get_error_message_16(d->errorCode,
reinterpret_cast<ushort *>(errorString.data()),
- errorString.length());
+ errorString.size());
} while (errorStringLength < 0);
errorString.resize(errorStringLength);
@@ -1531,7 +1554,7 @@ QString QRegularExpression::errorString() const
#endif
}
#ifdef QT_NO_TRANSLATION
- return QLatin1String("no error");
+ return u"no error"_s;
#else
return QCoreApplication::translate("QRegularExpression", "no error");
#endif
@@ -1544,7 +1567,7 @@ QString QRegularExpression::errorString() const
\sa pattern(), isValid(), errorString()
*/
-int QRegularExpression::patternErrorOffset() const
+qsizetype QRegularExpression::patternErrorOffset() const
{
d.data()->compilePattern();
return d->errorOffset;
@@ -1561,23 +1584,40 @@ int QRegularExpression::patternErrorOffset() const
\sa QRegularExpressionMatch, {normal matching}
*/
QRegularExpressionMatch QRegularExpression::match(const QString &subject,
- int offset,
+ qsizetype offset,
MatchType matchType,
MatchOptions matchOptions) const
{
d.data()->compilePattern();
auto priv = new QRegularExpressionMatchPrivate(*this,
subject,
- qToStringViewIgnoringNull(subject),
+ QStringView(subject),
matchType,
matchOptions);
d->doMatch(priv, offset);
return QRegularExpressionMatch(*priv);
}
+#if QT_DEPRECATED_SINCE(6, 8)
/*!
\since 6.0
\overload
+ \obsolete
+
+ Use matchView() instead.
+*/
+QRegularExpressionMatch QRegularExpression::match(QStringView subjectView,
+ qsizetype offset,
+ MatchType matchType,
+ MatchOptions matchOptions) const
+{
+ return matchView(subjectView, offset, matchType, matchOptions);
+}
+#endif // QT_DEPRECATED_SINCE(6, 8)
+
+/*!
+ \since 6.5
+ \overload
Attempts to match the regular expression against the given \a subjectView
string view, starting at the position \a offset inside the subject, using a
@@ -1591,10 +1631,10 @@ QRegularExpressionMatch QRegularExpression::match(const QString &subject,
\sa QRegularExpressionMatch, {normal matching}
*/
-QRegularExpressionMatch QRegularExpression::match(QStringView subjectView,
- int offset,
- MatchType matchType,
- MatchOptions matchOptions) const
+QRegularExpressionMatch QRegularExpression::matchView(QStringView subjectView,
+ qsizetype offset,
+ MatchType matchType,
+ MatchOptions matchOptions) const
{
d.data()->compilePattern();
auto priv = new QRegularExpressionMatchPrivate(*this,
@@ -1618,7 +1658,7 @@ QRegularExpressionMatch QRegularExpression::match(QStringView subjectView,
\sa QRegularExpressionMatchIterator, {global matching}
*/
QRegularExpressionMatchIterator QRegularExpression::globalMatch(const QString &subject,
- int offset,
+ qsizetype offset,
MatchType matchType,
MatchOptions matchOptions) const
{
@@ -1631,9 +1671,26 @@ QRegularExpressionMatchIterator QRegularExpression::globalMatch(const QString &s
return QRegularExpressionMatchIterator(*priv);
}
+#if QT_DEPRECATED_SINCE(6, 8)
/*!
\since 6.0
\overload
+ \obsolete
+
+ Use globalMatchView() instead.
+*/
+QRegularExpressionMatchIterator QRegularExpression::globalMatch(QStringView subjectView,
+ qsizetype offset,
+ MatchType matchType,
+ MatchOptions matchOptions) const
+{
+ return globalMatchView(subjectView, offset, matchType, matchOptions);
+}
+#endif // QT_DEPRECATED_SINCE(6, 8)
+
+/*!
+ \since 6.5
+ \overload
Attempts to perform a global match of the regular expression against the
given \a subjectView string view, starting at the position \a offset inside the
@@ -1649,16 +1706,16 @@ QRegularExpressionMatchIterator QRegularExpression::globalMatch(const QString &s
\sa QRegularExpressionMatchIterator, {global matching}
*/
-QRegularExpressionMatchIterator QRegularExpression::globalMatch(QStringView subjectView,
- int offset,
- MatchType matchType,
- MatchOptions matchOptions) const
+QRegularExpressionMatchIterator QRegularExpression::globalMatchView(QStringView subjectView,
+ qsizetype offset,
+ MatchType matchType,
+ MatchOptions matchOptions) const
{
QRegularExpressionMatchIteratorPrivate *priv =
new QRegularExpressionMatchIteratorPrivate(*this,
matchType,
matchOptions,
- match(subjectView, offset, matchType, matchOptions));
+ matchView(subjectView, offset, matchType, matchOptions));
return QRegularExpressionMatchIterator(*priv);
}
@@ -1692,8 +1749,12 @@ bool QRegularExpression::operator==(const QRegularExpression &re) const
/*!
\fn QRegularExpression & QRegularExpression::operator=(QRegularExpression && re)
- Move-assigns the regular expression \a re to this object, and returns a reference
- to the copy. Both the pattern and the pattern options are copied.
+ Move-assigns the regular expression \a re to this object, and returns a
+ reference to the result. Both the pattern and the pattern options are copied.
+
+ Note that a moved-from QRegularExpression can only be destroyed or
+ assigned to. The effect of calling other functions than the destructor
+ or one of the assignment operators is undefined.
*/
/*!
@@ -1717,12 +1778,10 @@ size_t qHash(const QRegularExpression &key, size_t seed) noexcept
return qHashMulti(seed, key.d->pattern, key.d->patternOptions);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QString QRegularExpression::escape(const QString &str)
\overload
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 5.15
@@ -1747,26 +1806,25 @@ size_t qHash(const QRegularExpression &key, size_t seed) noexcept
QString QRegularExpression::escape(QStringView str)
{
QString result;
- const int count = str.size();
+ const qsizetype count = str.size();
result.reserve(count * 2);
// everything but [a-zA-Z0-9_] gets escaped,
// cf. perldoc -f quotemeta
- for (int i = 0; i < count; ++i) {
+ for (qsizetype i = 0; i < count; ++i) {
const QChar current = str.at(i);
if (current == QChar::Null) {
// unlike Perl, a literal NUL must be escaped with
// "\\0" (backslash + 0) and not "\\\0" (backslash + NUL),
// because pcre16_compile uses a NUL-terminated string
- result.append(QLatin1Char('\\'));
- result.append(QLatin1Char('0'));
- } else if ( (current < QLatin1Char('a') || current > QLatin1Char('z')) &&
- (current < QLatin1Char('A') || current > QLatin1Char('Z')) &&
- (current < QLatin1Char('0') || current > QLatin1Char('9')) &&
- current != QLatin1Char('_') )
- {
- result.append(QLatin1Char('\\'));
+ result.append(u'\\');
+ result.append(u'0');
+ } else if ((current < u'a' || current > u'z') &&
+ (current < u'A' || current > u'Z') &&
+ (current < u'0' || current > u'9') &&
+ current != u'_') {
+ result.append(u'\\');
result.append(current);
if (current.isHighSurrogate() && i < (count - 1))
result.append(str.at(++i));
@@ -1779,13 +1837,11 @@ QString QRegularExpression::escape(QStringView str)
return result;
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\since 5.12
- \fn QString QRegularExpression::wildcardToRegularExpression(const QString &pattern, WildcardConversionType type)
+ \fn QString QRegularExpression::wildcardToRegularExpression(const QString &pattern, WildcardConversionOptions options)
\overload
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 6.0
@@ -1800,22 +1856,30 @@ QString QRegularExpression::escape(QStringView str)
\value UnanchoredWildcardConversion
The conversion will not anchor the pattern. This allows for partial string matches of
wildcard expressions.
+
+ \value [since 6.6] NonPathWildcardConversion
+ The conversion will \e{not} interpret the pattern as filepath globbing.
+
+ \sa QRegularExpression::wildcardToRegularExpression
*/
/*!
\since 5.15
Returns a regular expression representation of the given glob \a pattern.
- The transformation is targeting file path globbing, which means in particular
- that path separators receive special treatment. This implies that it is not
- just a basic translation from "*" to ".*".
+
+ There are two transformations possible, one that targets file path
+ globbing, and another one which is more generic.
+
+ By default, the transformation is targeting file path globbing,
+ which means in particular that path separators receive special
+ treatment. This implies that it is not just a basic translation
+ from "*" to ".*" and similar.
\snippet code/src_corelib_text_qregularexpression.cpp 31
- By default, the returned regular expression is fully anchored. In other
- words, there is no need of calling anchoredPattern() again on the
- result. To get an a regular expression that is not anchored, pass
- UnanchoredWildcardConversion as the conversion \a option.
+ The more generic globbing transformation is available by passing
+ \c NonPathWildcardConversion in the conversion \a options.
This implementation follows closely the definition
of wildcard for glob patterns:
@@ -1824,10 +1888,12 @@ QString QRegularExpression::escape(QStringView str)
\li Any character represents itself apart from those mentioned
below. Thus \b{c} matches the character \e c.
\row \li \b{?}
- \li Matches any single character. It is the same as
- \b{.} in full regexps.
+ \li Matches any single character, except for a path separator
+ (in case file path globbing has been selected). It is the
+ same as b{.} in full regexps.
\row \li \b{*}
- \li Matches zero or more of any characters. It is the
+ \li Matches zero or more of any characters, except for path
+ separators (in case file path globbing has been selected). It is the
same as \b{.*} in full regexps.
\row \li \b{[abc]}
\li Matches one character given in the bracket.
@@ -1841,9 +1907,10 @@ QString QRegularExpression::escape(QStringView str)
bracket. It is the same as \b{[^a-c]} in full regexp.
\endtable
- \note The backslash (\\) character is \e not an escape char in this context.
- In order to match one of the special characters, place it in square brackets
- (for example, \c{[?]}).
+ \note For historical reasons, a backslash (\\) character is \e not
+ an escape char in this context. In order to match one of the
+ special characters, place it in square brackets (for example,
+ \c{[?]}).
More information about the implementation can be found in:
\list
@@ -1851,39 +1918,66 @@ QString QRegularExpression::escape(QStringView str)
\li \c {man 7 glob}
\endlist
+ By default, the returned regular expression is fully anchored. In other
+ words, there is no need of calling anchoredPattern() again on the
+ result. To get a regular expression that is not anchored, pass
+ UnanchoredWildcardConversion in the conversion \a options.
+
\sa escape()
*/
QString QRegularExpression::wildcardToRegularExpression(QStringView pattern, WildcardConversionOptions options)
{
- const int wclen = pattern.length();
+ const qsizetype wclen = pattern.size();
QString rx;
rx.reserve(wclen + wclen / 16);
- int i = 0;
+ qsizetype i = 0;
const QChar *wc = pattern.data();
+ struct GlobSettings {
+ char16_t nativePathSeparator;
+ QStringView starEscape;
+ QStringView questionMarkEscape;
+ };
+
+ const GlobSettings settings = [options]() {
+ if (options.testFlag(NonPathWildcardConversion)) {
+ // using [\d\D] to mean "match everything";
+ // dot doesn't match newlines, unless in /s mode
+ return GlobSettings{ u'\0', u"[\\d\\D]*", u"[\\d\\D]" };
+ } else {
#ifdef Q_OS_WIN
- const QLatin1Char nativePathSeparator('\\');
- const QLatin1String starEscape("[^/\\\\]*");
- const QLatin1String questionMarkEscape("[^/\\\\]");
+ return GlobSettings{ u'\\', u"[^/\\\\]*", u"[^/\\\\]" };
#else
- const QLatin1Char nativePathSeparator('/');
- const QLatin1String starEscape("[^/]*");
- const QLatin1String questionMarkEscape("[^/]");
+ return GlobSettings{ u'/', u"[^/]*", u"[^/]" };
#endif
+ }
+ }();
while (i < wclen) {
const QChar c = wc[i++];
switch (c.unicode()) {
case '*':
- rx += starEscape;
+ rx += settings.starEscape;
break;
case '?':
- rx += questionMarkEscape;
+ rx += settings.questionMarkEscape;
break;
+ // When not using filepath globbing: \ is escaped, / is itself
+ // When using filepath globbing:
+ // * Unix: \ gets escaped. / is itself
+ // * Windows: \ and / can match each other -- they become [/\\] in regexp
case '\\':
#ifdef Q_OS_WIN
+ if (options.testFlag(NonPathWildcardConversion))
+ rx += u"\\\\";
+ else
+ rx += u"[/\\\\]";
+ break;
case '/':
- rx += QLatin1String("[/\\\\]");
+ if (options.testFlag(NonPathWildcardConversion))
+ rx += u'/';
+ else
+ rx += u"[/\\\\]";
break;
#endif
case '$':
@@ -1895,29 +1989,31 @@ QString QRegularExpression::wildcardToRegularExpression(QStringView pattern, Wil
case '{':
case '|':
case '}':
- rx += QLatin1Char('\\');
+ rx += u'\\';
rx += c;
break;
case '[':
rx += c;
// Support for the [!abc] or [!a-c] syntax
if (i < wclen) {
- if (wc[i] == QLatin1Char('!')) {
- rx += QLatin1Char('^');
+ if (wc[i] == u'!') {
+ rx += u'^';
++i;
}
- if (i < wclen && wc[i] == QLatin1Char(']'))
+ if (i < wclen && wc[i] == u']')
rx += wc[i++];
- while (i < wclen && wc[i] != QLatin1Char(']')) {
- // The '/' appearing in a character class invalidates the
- // regular expression parsing. It also concerns '\\' on
- // Windows OS types.
- if (wc[i] == QLatin1Char('/') || wc[i] == nativePathSeparator)
- return rx;
- if (wc[i] == QLatin1Char('\\'))
- rx += QLatin1Char('\\');
+ while (i < wclen && wc[i] != u']') {
+ if (!options.testFlag(NonPathWildcardConversion)) {
+ // The '/' appearing in a character class invalidates the
+ // regular expression parsing. It also concerns '\\' on
+ // Windows OS types.
+ if (wc[i] == u'/' || wc[i] == settings.nativePathSeparator)
+ return rx;
+ }
+ if (wc[i] == u'\\')
+ rx += u'\\';
rx += wc[i++];
}
}
@@ -1936,7 +2032,9 @@ QString QRegularExpression::wildcardToRegularExpression(QStringView pattern, Wil
/*!
\since 6.0
- Returns a regular expression of the glob pattern \a pattern.
+ Returns a regular expression of the glob pattern \a pattern. The regular expression
+ will be case sensitive if \a cs is \l{Qt::CaseSensitive}, and converted according to
+ \a options.
Equivalent to
\code
@@ -1945,21 +2043,19 @@ QString QRegularExpression::wildcardToRegularExpression(QStringView pattern, Wil
return QRegularExpression(wildcardToRegularExpression(str, options), reOptions);
\endcode
*/
-QRegularExpression QRegularExpression::fromWildcard(QStringView str, Qt::CaseSensitivity cs,
+QRegularExpression QRegularExpression::fromWildcard(QStringView pattern, Qt::CaseSensitivity cs,
WildcardConversionOptions options)
{
auto reOptions = cs == Qt::CaseSensitive ? QRegularExpression::NoPatternOption :
QRegularExpression::CaseInsensitiveOption;
- return QRegularExpression(wildcardToRegularExpression(str, options), reOptions);
+ return QRegularExpression(wildcardToRegularExpression(pattern, options), reOptions);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QRegularExpression::anchoredPattern(const QString &expression)
\since 5.12
\overload
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 5.15
@@ -1970,9 +2066,9 @@ QRegularExpression QRegularExpression::fromWildcard(QStringView str, Qt::CaseSen
QString QRegularExpression::anchoredPattern(QStringView expression)
{
return QString()
- + QLatin1String("\\A(?:")
+ + "\\A(?:"_L1
+ expression
- + QLatin1String(")\\z");
+ + ")\\z"_L1;
}
/*!
@@ -2003,6 +2099,8 @@ QRegularExpressionMatch::~QRegularExpressionMatch()
{
}
+QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QRegularExpressionMatchPrivate)
+
/*!
Constructs a match result by copying the result of the given \a match.
@@ -2014,6 +2112,20 @@ QRegularExpressionMatch::QRegularExpressionMatch(const QRegularExpressionMatch &
}
/*!
+ \fn QRegularExpressionMatch::QRegularExpressionMatch(QRegularExpressionMatch &&match)
+
+ \since 6.1
+
+ Constructs a match result by moving the result from the given \a match.
+
+ Note that a moved-from QRegularExpressionMatch can only be destroyed or
+ assigned to. The effect of calling other functions than the destructor
+ or one of the assignment operators is undefined.
+
+ \sa operator=()
+*/
+
+/*!
Assigns the match result \a match to this object, and returns a reference
to the copy.
*/
@@ -2026,8 +2138,12 @@ QRegularExpressionMatch &QRegularExpressionMatch::operator=(const QRegularExpres
/*!
\fn QRegularExpressionMatch &QRegularExpressionMatch::operator=(QRegularExpressionMatch &&match)
- Move-assigns the match result \a match to this object, and returns a reference
- to the copy.
+ Move-assigns the match result \a match to this object, and returns a
+ reference to the result.
+
+ Note that a moved-from QRegularExpressionMatch can only be destroyed or
+ assigned to. The effect of calling other functions than the destructor
+ or one of the assignment operators is undefined.
*/
/*!
@@ -2093,7 +2209,7 @@ QRegularExpression::MatchOptions QRegularExpressionMatch::matchOptions() const
If the regular expression did not match, this function returns -1.
- \sa captured(), capturedStart(), capturedEnd(), capturedLength()
+ \sa hasCaptured(), captured(), capturedStart(), capturedEnd(), capturedLength()
*/
int QRegularExpressionMatch::lastCapturedIndex() const
{
@@ -2101,6 +2217,63 @@ int QRegularExpressionMatch::lastCapturedIndex() const
}
/*!
+ \fn bool QRegularExpressionMatch::hasCaptured(const QString &name) const
+ \fn bool QRegularExpressionMatch::hasCaptured(QStringView name) const
+ \since 6.3
+
+ Returns true if the capturing group named \a name captured something
+ in the subject string, and false otherwise (or if there is no
+ capturing group called \a name).
+
+ \note Some capturing groups in a regular expression may not have
+ captured anything even if the regular expression matched. This may
+ happen, for instance, if a conditional operator is used in the
+ pattern:
+
+ \snippet code/src_corelib_text_qregularexpression.cpp 36
+
+ Similarly, a capturing group may capture a substring of length 0;
+ this function will return \c{true} for such a capturing group.
+
+ \sa captured(), hasMatch()
+*/
+bool QRegularExpressionMatch::hasCaptured(QStringView name) const
+{
+ const int nth = d->regularExpression.d->captureIndexForName(name);
+ return hasCaptured(nth);
+}
+
+/*!
+ \since 6.3
+
+ Returns true if the \a nth capturing group captured something
+ in the subject string, and false otherwise (or if there is no
+ such capturing group).
+
+ \note The implicit capturing group number 0 captures the substring
+ matched by the entire pattern.
+
+ \note Some capturing groups in a regular expression may not have
+ captured anything even if the regular expression matched. This may
+ happen, for instance, if a conditional operator is used in the
+ pattern:
+
+ \snippet code/src_corelib_text_qregularexpression.cpp 36
+
+ Similarly, a capturing group may capture a substring of length 0;
+ this function will return \c{true} for such a capturing group.
+
+ \sa captured(), lastCapturedIndex(), hasMatch()
+*/
+bool QRegularExpressionMatch::hasCaptured(int nth) const
+{
+ if (nth < 0 || nth > lastCapturedIndex())
+ return false;
+
+ return d->capturedOffsets.at(nth * 2) != -1;
+}
+
+/*!
Returns the substring captured by the \a nth capturing group.
If the \a nth capturing group did not capture a string, or if there is no
@@ -2133,10 +2306,10 @@ QString QRegularExpressionMatch::captured(int nth) const
*/
QStringView QRegularExpressionMatch::capturedView(int nth) const
{
- if (nth < 0 || nth > lastCapturedIndex())
+ if (!hasCaptured(nth))
return QStringView();
- int start = capturedStart(nth);
+ qsizetype start = capturedStart(nth);
if (start == -1) // didn't capture
return QStringView();
@@ -2144,8 +2317,8 @@ QStringView QRegularExpressionMatch::capturedView(int nth) const
return d->subject.mid(start, capturedLength(nth));
}
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
+/*! \fn QString QRegularExpressionMatch::captured(const QString &name) const
+
Returns the substring captured by the capturing group named \a name.
If the named capturing group \a name did not capture a string, or if
@@ -2154,11 +2327,6 @@ QStringView QRegularExpressionMatch::capturedView(int nth) const
\sa capturedView(), capturedStart(), capturedEnd(), capturedLength(),
QString::isNull()
*/
-QString QRegularExpressionMatch::captured(const QString &name) const
-{
- return captured(qToStringViewIgnoringNull(name));
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 5.10
@@ -2191,7 +2359,7 @@ QString QRegularExpressionMatch::captured(QStringView name) const
there is no capturing group named \a name, returns a null QStringView.
\sa captured(), capturedStart(), capturedEnd(), capturedLength(),
- QStringRef::isNull()
+ QStringView::isNull()
*/
QStringView QRegularExpressionMatch::capturedView(QStringView name) const
{
@@ -2228,9 +2396,9 @@ QStringList QRegularExpressionMatch::capturedTexts() const
\sa capturedEnd(), capturedLength(), captured()
*/
-int QRegularExpressionMatch::capturedStart(int nth) const
+qsizetype QRegularExpressionMatch::capturedStart(int nth) const
{
- if (nth < 0 || nth > lastCapturedIndex())
+ if (!hasCaptured(nth))
return -1;
return d->capturedOffsets.at(nth * 2);
@@ -2244,7 +2412,7 @@ int QRegularExpressionMatch::capturedStart(int nth) const
\sa capturedStart(), capturedEnd(), captured()
*/
-int QRegularExpressionMatch::capturedLength(int nth) const
+qsizetype QRegularExpressionMatch::capturedLength(int nth) const
{
// bound checking performed by these two functions
return capturedEnd(nth) - capturedStart(nth);
@@ -2257,16 +2425,16 @@ int QRegularExpressionMatch::capturedLength(int nth) const
\sa capturedStart(), capturedLength(), captured()
*/
-int QRegularExpressionMatch::capturedEnd(int nth) const
+qsizetype QRegularExpressionMatch::capturedEnd(int nth) const
{
- if (nth < 0 || nth > lastCapturedIndex())
+ if (!hasCaptured(nth))
return -1;
return d->capturedOffsets.at(nth * 2 + 1);
}
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
+/*! \fn qsizetype QRegularExpressionMatch::capturedStart(const QString &name) const
+
Returns the offset inside the subject string corresponding to the starting
position of the substring captured by the capturing group named \a name.
If the capturing group named \a name did not capture a string or doesn't
@@ -2274,12 +2442,9 @@ int QRegularExpressionMatch::capturedEnd(int nth) const
\sa capturedEnd(), capturedLength(), captured()
*/
-int QRegularExpressionMatch::capturedStart(const QString &name) const
-{
- return capturedStart(qToStringViewIgnoringNull(name));
-}
-/*!
+/*! \fn qsizetype QRegularExpressionMatch::capturedLength(const QString &name) const
+
Returns the length of the substring captured by the capturing group named
\a name.
@@ -2288,12 +2453,9 @@ int QRegularExpressionMatch::capturedStart(const QString &name) const
\sa capturedStart(), capturedEnd(), captured()
*/
-int QRegularExpressionMatch::capturedLength(const QString &name) const
-{
- return capturedLength(qToStringViewIgnoringNull(name));
-}
-/*!
+/*! \fn qsizetype QRegularExpressionMatch::capturedEnd(const QString &name) const
+
Returns the offset inside the subject string immediately after the ending
position of the substring captured by the capturing group named \a name. If
the capturing group named \a name did not capture a string or doesn't
@@ -2301,11 +2463,6 @@ int QRegularExpressionMatch::capturedLength(const QString &name) const
\sa capturedStart(), capturedLength(), captured()
*/
-int QRegularExpressionMatch::capturedEnd(const QString &name) const
-{
- return capturedEnd(qToStringViewIgnoringNull(name));
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 5.10
@@ -2317,7 +2474,7 @@ int QRegularExpressionMatch::capturedEnd(const QString &name) const
\sa capturedEnd(), capturedLength(), captured()
*/
-int QRegularExpressionMatch::capturedStart(QStringView name) const
+qsizetype QRegularExpressionMatch::capturedStart(QStringView name) const
{
if (name.isEmpty()) {
qWarning("QRegularExpressionMatch::capturedStart: empty capturing group name passed");
@@ -2340,7 +2497,7 @@ int QRegularExpressionMatch::capturedStart(QStringView name) const
\sa capturedStart(), capturedEnd(), captured()
*/
-int QRegularExpressionMatch::capturedLength(QStringView name) const
+qsizetype QRegularExpressionMatch::capturedLength(QStringView name) const
{
if (name.isEmpty()) {
qWarning("QRegularExpressionMatch::capturedLength: empty capturing group name passed");
@@ -2362,7 +2519,7 @@ int QRegularExpressionMatch::capturedLength(QStringView name) const
\sa capturedStart(), capturedLength(), captured()
*/
-int QRegularExpressionMatch::capturedEnd(QStringView name) const
+qsizetype QRegularExpressionMatch::capturedEnd(QStringView name) const
{
if (name.isEmpty()) {
qWarning("QRegularExpressionMatch::capturedEnd: empty capturing group name passed");
@@ -2447,6 +2604,8 @@ QRegularExpressionMatchIterator::~QRegularExpressionMatchIterator()
{
}
+QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QRegularExpressionMatchIteratorPrivate)
+
/*!
Constructs a QRegularExpressionMatchIterator object as a copy of \a
iterator.
@@ -2459,6 +2618,20 @@ QRegularExpressionMatchIterator::QRegularExpressionMatchIterator(const QRegularE
}
/*!
+ \fn QRegularExpressionMatchIterator::QRegularExpressionMatchIterator(QRegularExpressionMatchIterator &&iterator)
+
+ \since 6.1
+
+ Constructs a QRegularExpressionMatchIterator object by moving from \a iterator.
+
+ Note that a moved-from QRegularExpressionMatchIterator can only be destroyed
+ or assigned to. The effect of calling other functions than the destructor
+ or one of the assignment operators is undefined.
+
+ \sa operator=()
+*/
+
+/*!
Assigns the iterator \a iterator to this object, and returns a reference to
the copy.
*/
@@ -2471,7 +2644,12 @@ QRegularExpressionMatchIterator &QRegularExpressionMatchIterator::operator=(cons
/*!
\fn QRegularExpressionMatchIterator &QRegularExpressionMatchIterator::operator=(QRegularExpressionMatchIterator &&iterator)
- Move-assigns the \a iterator to this object.
+ Move-assigns the \a iterator to this object, and returns a reference to the
+ result.
+
+ Note that a moved-from QRegularExpressionMatchIterator can only be destroyed
+ or assigned to. The effect of calling other functions than the destructor
+ or one of the assignment operators is undefined.
*/
/*!
@@ -2529,12 +2707,11 @@ QRegularExpressionMatch QRegularExpressionMatchIterator::next()
{
if (!hasNext()) {
qWarning("QRegularExpressionMatchIterator::next() called on an iterator already at end");
- return d->next;
+ return d.constData()->next;
}
- QRegularExpressionMatch current = d->next;
- d->next = d->next.d.constData()->nextMatch();
- return current;
+ d.detach();
+ return std::exchange(d->next, d->next.d.constData()->nextMatch());
}
/*!
@@ -2572,6 +2749,19 @@ QRegularExpression::MatchOptions QRegularExpressionMatchIterator::matchOptions()
return d->matchOptions;
}
+/*!
+ \internal
+*/
+QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
+{
+ return QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator(iterator);
+}
+
+/*!
+ \fn QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIteratorSentinel end(const QRegularExpressionMatchIterator &)
+ \internal
+*/
+
#ifndef QT_NO_DATASTREAM
/*!
\relates QRegularExpression
@@ -2582,7 +2772,7 @@ QRegularExpression::MatchOptions QRegularExpressionMatchIterator::matchOptions()
*/
QDataStream &operator<<(QDataStream &out, const QRegularExpression &re)
{
- out << re.pattern() << quint32(re.patternOptions());
+ out << re.pattern() << quint32(re.patternOptions().toInt());
return out;
}
@@ -2599,7 +2789,7 @@ QDataStream &operator>>(QDataStream &in, QRegularExpression &re)
quint32 patternOptions;
in >> pattern >> patternOptions;
re.setPattern(pattern);
- re.setPatternOptions(QRegularExpression::PatternOptions(patternOptions));
+ re.setPatternOptions(QRegularExpression::PatternOptions::fromInt(patternOptions));
return in;
}
#endif
@@ -2651,13 +2841,6 @@ QDebug operator<<(QDebug debug, QRegularExpression::PatternOptions patternOption
flags.append("DontCaptureOption|");
if (patternOptions & QRegularExpression::UseUnicodePropertiesOption)
flags.append("UseUnicodePropertiesOption|");
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- if (patternOptions & QRegularExpression::OptimizeOnFirstUsageOption)
- flags.append("OptimizeOnFirstUsageOption|");
- if (patternOptions & QRegularExpression::DontAutomaticallyOptimizeOption)
- flags.append("DontAutomaticallyOptimizeOption|");
-QT_WARNING_POP
flags.chop(1);
}
@@ -2917,7 +3100,8 @@ static const char *pcreCompileErrorCodes[] =
QT_TRANSLATE_NOOP("QRegularExpression", "heap limit exceeded"),
QT_TRANSLATE_NOOP("QRegularExpression", "invalid syntax"),
QT_TRANSLATE_NOOP("QRegularExpression", "internal error - duplicate substitution match"),
- QT_TRANSLATE_NOOP("QRegularExpression", "PCRE2_MATCH_INVALID_UTF is not supported for DFA matching")
+ QT_TRANSLATE_NOOP("QRegularExpression", "PCRE2_MATCH_INVALID_UTF is not supported for DFA matching"),
+ QT_TRANSLATE_NOOP("QRegularExpression", "INTERNAL ERROR: invalid substring offset")
};
#endif // #if 0
diff --git a/src/corelib/text/qregularexpression.h b/src/corelib/text/qregularexpression.h
index 30bdcdd4de..ed838327ef 100644
--- a/src/corelib/text/qregularexpression.h
+++ b/src/corelib/text/qregularexpression.h
@@ -1,42 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QREGULAREXPRESSION_H
#define QREGULAREXPRESSION_H
@@ -47,18 +12,19 @@
#include <QtCore/qshareddata.h>
#include <QtCore/qvariant.h>
+#include <iterator>
+
QT_REQUIRE_CONFIG(regularexpression);
QT_BEGIN_NAMESPACE
-class QStringList;
-class QLatin1String;
-
class QRegularExpressionMatch;
class QRegularExpressionMatchIterator;
struct QRegularExpressionPrivate;
class QRegularExpression;
+QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QRegularExpressionPrivate, Q_CORE_EXPORT)
+
Q_CORE_EXPORT size_t qHash(const QRegularExpression &key, size_t seed = 0) noexcept;
class Q_CORE_EXPORT QRegularExpression
@@ -73,8 +39,9 @@ public:
InvertedGreedinessOption = 0x0010,
DontCaptureOption = 0x0020,
UseUnicodePropertiesOption = 0x0040,
- OptimizeOnFirstUsageOption Q_DECL_ENUMERATOR_DEPRECATED_X("This option does not have any effect since Qt 5.12") = 0x0080,
- DontAutomaticallyOptimizeOption Q_DECL_ENUMERATOR_DEPRECATED_X("This option does not have any effect since Qt 5.12") = 0x0100,
+ // Formerly (no-ops deprecated in 5.12, removed 6.0):
+ // OptimizeOnFirstUsageOption = 0x0080,
+ // DontAutomaticallyOptimizeOption = 0x0100,
};
Q_DECLARE_FLAGS(PatternOptions, PatternOption)
@@ -83,19 +50,20 @@ public:
QRegularExpression();
explicit QRegularExpression(const QString &pattern, PatternOptions options = NoPatternOption);
- QRegularExpression(const QRegularExpression &re);
+ QRegularExpression(const QRegularExpression &re) noexcept;
+ QRegularExpression(QRegularExpression &&re) = default;
~QRegularExpression();
- QRegularExpression &operator=(const QRegularExpression &re);
- QRegularExpression &operator=(QRegularExpression &&re) noexcept
- { d.swap(re.d); return *this; }
+ QRegularExpression &operator=(const QRegularExpression &re) noexcept;
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QRegularExpression)
void swap(QRegularExpression &other) noexcept { d.swap(other.d); }
QString pattern() const;
void setPattern(const QString &pattern);
+ [[nodiscard]]
bool isValid() const;
- int patternErrorOffset() const;
+ qsizetype patternErrorOffset() const;
QString errorString() const;
int captureCount() const;
@@ -110,41 +78,64 @@ public:
enum MatchOption {
NoMatchOption = 0x0000,
- AnchoredMatchOption Q_DECL_ENUMERATOR_DEPRECATED_X("Use AnchorAtOffsetMatchOption instead") = 0x0001,
AnchorAtOffsetMatchOption = 0x0001,
+ AnchoredMatchOption Q_DECL_ENUMERATOR_DEPRECATED_X(
+ "Use AnchorAtOffsetMatchOption instead") = AnchorAtOffsetMatchOption, // Rename@Qt6.0
DontCheckSubjectStringMatchOption = 0x0002
};
Q_DECLARE_FLAGS(MatchOptions, MatchOption)
+ [[nodiscard]]
QRegularExpressionMatch match(const QString &subject,
- int offset = 0,
+ qsizetype offset = 0,
MatchType matchType = NormalMatch,
MatchOptions matchOptions = NoMatchOption) const;
+#if QT_DEPRECATED_SINCE(6, 8)
+ [[nodiscard]]
+ QT_DEPRECATED_VERSION_X_6_8("Use matchView instead.")
QRegularExpressionMatch match(QStringView subjectView,
- int offset = 0,
+ qsizetype offset = 0,
MatchType matchType = NormalMatch,
MatchOptions matchOptions = NoMatchOption) const;
+#endif
+
+ [[nodiscard]]
+ QRegularExpressionMatch matchView(QStringView subjectView,
+ qsizetype offset = 0,
+ MatchType matchType = NormalMatch,
+ MatchOptions matchOptions = NoMatchOption) const;
+ [[nodiscard]]
QRegularExpressionMatchIterator globalMatch(const QString &subject,
- int offset = 0,
+ qsizetype offset = 0,
MatchType matchType = NormalMatch,
MatchOptions matchOptions = NoMatchOption) const;
+#if QT_DEPRECATED_SINCE(6, 8)
+ [[nodiscard]]
+ QT_DEPRECATED_VERSION_X_6_8("Use globalMatchView instead.")
QRegularExpressionMatchIterator globalMatch(QStringView subjectView,
- int offset = 0,
+ qsizetype offset = 0,
MatchType matchType = NormalMatch,
MatchOptions matchOptions = NoMatchOption) const;
+#endif
+
+ [[nodiscard]]
+ QRegularExpressionMatchIterator globalMatchView(QStringView subjectView,
+ qsizetype offset = 0,
+ MatchType matchType = NormalMatch,
+ MatchOptions matchOptions = NoMatchOption) const;
void optimize() const;
enum WildcardConversionOption {
DefaultWildcardConversion = 0x0,
- UnanchoredWildcardConversion = 0x1
+ UnanchoredWildcardConversion = 0x1,
+ NonPathWildcardConversion = 0x2,
};
Q_DECLARE_FLAGS(WildcardConversionOptions, WildcardConversionOption)
-#if QT_STRINGVIEW_LEVEL < 2
static QString escape(const QString &str)
{
return escape(qToStringViewIgnoringNull(str));
@@ -159,13 +150,12 @@ public:
{
return anchoredPattern(qToStringViewIgnoringNull(expression));
}
-#endif
static QString escape(QStringView str);
static QString wildcardToRegularExpression(QStringView str, WildcardConversionOptions options = DefaultWildcardConversion);
static QString anchoredPattern(QStringView expression);
- static QRegularExpression fromWildcard(QStringView str, Qt::CaseSensitivity cs = Qt::CaseInsensitive,
+ static QRegularExpression fromWildcard(QStringView pattern, Qt::CaseSensitivity cs = Qt::CaseInsensitive,
WildcardConversionOptions options = DefaultWildcardConversion);
bool operator==(const QRegularExpression &re) const;
@@ -185,6 +175,7 @@ private:
Q_DECLARE_SHARED(QRegularExpression)
Q_DECLARE_OPERATORS_FOR_FLAGS(QRegularExpression::PatternOptions)
Q_DECLARE_OPERATORS_FOR_FLAGS(QRegularExpression::MatchOptions)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QRegularExpression::WildcardConversionOptions)
#ifndef QT_NO_DATASTREAM
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &out, const QRegularExpression &re);
@@ -197,6 +188,7 @@ Q_CORE_EXPORT QDebug operator<<(QDebug debug, QRegularExpression::PatternOptions
#endif
struct QRegularExpressionMatchPrivate;
+QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QRegularExpressionMatchPrivate, Q_CORE_EXPORT)
class Q_CORE_EXPORT QRegularExpressionMatch
{
@@ -204,6 +196,7 @@ public:
QRegularExpressionMatch();
~QRegularExpressionMatch();
QRegularExpressionMatch(const QRegularExpressionMatch &match);
+ QRegularExpressionMatch(QRegularExpressionMatch &&match) = default;
QRegularExpressionMatch &operator=(const QRegularExpressionMatch &match);
QRegularExpressionMatch &operator=(QRegularExpressionMatch &&match) noexcept
{ d.swap(match.d); return *this; }
@@ -220,31 +213,35 @@ public:
int lastCapturedIndex() const;
+ bool hasCaptured(const QString &name) const
+ { return hasCaptured(QStringView(name)); }
+ bool hasCaptured(QStringView name) const;
+ bool hasCaptured(int nth) const;
+
QString captured(int nth = 0) const;
QStringView capturedView(int nth = 0) const;
-#if QT_STRINGVIEW_LEVEL < 2
- QString captured(const QString &name) const;
-#endif
-
+ QString captured(const QString &name) const
+ { return captured(QStringView(name)); }
QString captured(QStringView name) const;
QStringView capturedView(QStringView name) const;
QStringList capturedTexts() const;
- int capturedStart(int nth = 0) const;
- int capturedLength(int nth = 0) const;
- int capturedEnd(int nth = 0) const;
+ qsizetype capturedStart(int nth = 0) const;
+ qsizetype capturedLength(int nth = 0) const;
+ qsizetype capturedEnd(int nth = 0) const;
-#if QT_STRINGVIEW_LEVEL < 2
- int capturedStart(const QString &name) const;
- int capturedLength(const QString &name) const;
- int capturedEnd(const QString &name) const;
-#endif
+ qsizetype capturedStart(const QString &name) const
+ { return capturedStart(QStringView(name)); }
+ qsizetype capturedLength(const QString &name) const
+ { return capturedLength(QStringView(name)); }
+ qsizetype capturedEnd(const QString &name) const
+ { return capturedEnd(QStringView(name)); }
- int capturedStart(QStringView name) const;
- int capturedLength(QStringView name) const;
- int capturedEnd(QStringView name) const;
+ qsizetype capturedStart(QStringView name) const;
+ qsizetype capturedLength(QStringView name) const;
+ qsizetype capturedEnd(QStringView name) const;
private:
friend class QRegularExpression;
@@ -252,7 +249,7 @@ private:
friend class QRegularExpressionMatchIterator;
QRegularExpressionMatch(QRegularExpressionMatchPrivate &dd);
- QSharedDataPointer<QRegularExpressionMatchPrivate> d;
+ QExplicitlySharedDataPointer<QRegularExpressionMatchPrivate> d;
};
Q_DECLARE_SHARED(QRegularExpressionMatch)
@@ -261,7 +258,13 @@ Q_DECLARE_SHARED(QRegularExpressionMatch)
Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QRegularExpressionMatch &match);
#endif
+namespace QtPrivate {
+class QRegularExpressionMatchIteratorRangeBasedForIterator;
+class QRegularExpressionMatchIteratorRangeBasedForIteratorSentinel {};
+}
+
struct QRegularExpressionMatchIteratorPrivate;
+QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QRegularExpressionMatchIteratorPrivate, Q_CORE_EXPORT)
class Q_CORE_EXPORT QRegularExpressionMatchIterator
{
@@ -269,6 +272,7 @@ public:
QRegularExpressionMatchIterator();
~QRegularExpressionMatchIterator();
QRegularExpressionMatchIterator(const QRegularExpressionMatchIterator &iterator);
+ QRegularExpressionMatchIterator(QRegularExpressionMatchIterator &&iterator) = default;
QRegularExpressionMatchIterator &operator=(const QRegularExpressionMatchIterator &iterator);
QRegularExpressionMatchIterator &operator=(QRegularExpressionMatchIterator &&iterator) noexcept
{ d.swap(iterator.d); return *this; }
@@ -286,11 +290,100 @@ public:
private:
friend class QRegularExpression;
+ friend Q_CORE_EXPORT QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator);
+ friend QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIteratorSentinel end(const QRegularExpressionMatchIterator &) { return {}; }
QRegularExpressionMatchIterator(QRegularExpressionMatchIteratorPrivate &dd);
- QSharedDataPointer<QRegularExpressionMatchIteratorPrivate> d;
+ QExplicitlySharedDataPointer<QRegularExpressionMatchIteratorPrivate> d;
};
+namespace QtPrivate {
+
+// support for range-based for loop
+class QRegularExpressionMatchIteratorRangeBasedForIterator
+{
+public:
+ using value_type = QRegularExpressionMatch;
+ using difference_type = int;
+ using reference_type = const QRegularExpressionMatch &;
+ using pointer_type = const QRegularExpressionMatch *;
+ using iterator_category = std::forward_iterator_tag;
+
+ QRegularExpressionMatchIteratorRangeBasedForIterator()
+ : m_atEnd(true)
+ {
+ }
+
+ explicit QRegularExpressionMatchIteratorRangeBasedForIterator(const QRegularExpressionMatchIterator &iterator)
+ : m_matchIterator(iterator),
+ m_currentMatch(),
+ m_atEnd(false)
+ {
+ ++*this;
+ }
+
+ const QRegularExpressionMatch &operator*() const
+ {
+ Q_ASSERT_X(!m_atEnd, Q_FUNC_INFO, "operator* called on an iterator already at the end");
+ return m_currentMatch;
+ }
+
+ QRegularExpressionMatchIteratorRangeBasedForIterator &operator++()
+ {
+ Q_ASSERT_X(!m_atEnd, Q_FUNC_INFO, "operator++ called on an iterator already at the end");
+ if (m_matchIterator.hasNext()) {
+ m_currentMatch = m_matchIterator.next();
+ } else {
+ m_currentMatch = QRegularExpressionMatch();
+ m_atEnd = true;
+ }
+
+ return *this;
+ }
+
+ QRegularExpressionMatchIteratorRangeBasedForIterator operator++(int)
+ {
+ QRegularExpressionMatchIteratorRangeBasedForIterator i = *this;
+ ++*this;
+ return i;
+ }
+
+private:
+ // [input.iterators] imposes operator== on us. Unfortunately, it's not
+ // trivial to implement, so just do the bare minimum to satifisfy
+ // Cpp17EqualityComparable.
+ friend bool operator==(const QRegularExpressionMatchIteratorRangeBasedForIterator &lhs,
+ const QRegularExpressionMatchIteratorRangeBasedForIterator &rhs) noexcept
+ {
+ return (&lhs == &rhs);
+ }
+
+ friend bool operator!=(const QRegularExpressionMatchIteratorRangeBasedForIterator &lhs,
+ const QRegularExpressionMatchIteratorRangeBasedForIterator &rhs) noexcept
+ {
+ return !(lhs == rhs);
+ }
+
+ // This is what we really use in a range-based for.
+ friend bool operator==(const QRegularExpressionMatchIteratorRangeBasedForIterator &lhs,
+ QRegularExpressionMatchIteratorRangeBasedForIteratorSentinel) noexcept
+ {
+ return lhs.m_atEnd;
+ }
+
+ friend bool operator!=(const QRegularExpressionMatchIteratorRangeBasedForIterator &lhs,
+ QRegularExpressionMatchIteratorRangeBasedForIteratorSentinel) noexcept
+ {
+ return !lhs.m_atEnd;
+ }
+
+ QRegularExpressionMatchIterator m_matchIterator;
+ QRegularExpressionMatch m_currentMatch;
+ bool m_atEnd;
+};
+
+} // namespace QtPrivate
+
Q_DECLARE_SHARED(QRegularExpressionMatchIterator)
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstaticlatin1stringmatcher.h b/src/corelib/text/qstaticlatin1stringmatcher.h
new file mode 100644
index 0000000000..d80ebd8547
--- /dev/null
+++ b/src/corelib/text/qstaticlatin1stringmatcher.h
@@ -0,0 +1,140 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSTATICLATIN1STRINGMATCHER_H
+#define QSTATICLATIN1STRINGMATCHER_H
+
+#include <functional>
+#include <iterator>
+#include <limits>
+
+#include <QtCore/q20algorithm.h>
+#include <QtCore/qlatin1stringmatcher.h>
+#include <QtCore/qstring.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifdef Q_CC_GHS
+# define QT_STATIC_BOYER_MOORE_NOT_SUPPORTED
+#else
+namespace QtPrivate {
+template <class RandomIt1,
+ class Hash = std::hash<typename std::iterator_traits<RandomIt1>::value_type>,
+ class BinaryPredicate = std::equal_to<>>
+class q_boyer_moore_searcher
+{
+public:
+ constexpr q_boyer_moore_searcher(RandomIt1 pat_first, RandomIt1 pat_last) : m_skiptable{}
+ {
+ const size_t n = std::distance(pat_first, pat_last);
+ constexpr auto uchar_max = (std::numeric_limits<uchar>::max)();
+ uchar max = n > uchar_max ? uchar_max : uchar(n);
+ q20::fill(std::begin(m_skiptable), std::end(m_skiptable), max);
+ Hash hf;
+ RandomIt1 pattern = std::next(pat_first, n - max);
+ while (max--)
+ m_skiptable[hf(*pattern++)] = max;
+ }
+
+ template <class RandomIt2>
+ constexpr auto operator()(RandomIt2 first, RandomIt2 last, RandomIt1 pat_first,
+ RandomIt1 pat_last) const
+ {
+ struct R
+ {
+ RandomIt2 begin, end;
+ };
+ Hash hf;
+ BinaryPredicate pred;
+ auto pat_length = std::distance(pat_first, pat_last);
+ if (pat_length == 0)
+ return R{ first, first };
+
+ auto haystack_length = std::distance(first, last);
+ if (haystack_length < pat_length)
+ return R{ last, last };
+
+ const qsizetype pl_minus_one = qsizetype(pat_length - 1);
+ RandomIt2 current = first + pl_minus_one;
+
+ qsizetype skip = 0;
+ while (current < last - skip) {
+ current += skip;
+ skip = m_skiptable[hf(*current)];
+ if (!skip) {
+ // possible match
+ while (skip < pat_length) {
+ if (!pred(hf(*(current - skip)), hf(pat_first[pl_minus_one - skip])))
+ break;
+ skip++;
+ }
+ if (skip > pl_minus_one) { // we have a match
+ auto match = current + 1 - skip;
+ return R{ match, match + pat_length };
+ }
+
+ // If we don't have a match we are a bit inefficient as we only skip by one
+ // when we have the non matching char in the string.
+ if (m_skiptable[hf(*(current - skip))] == pat_length)
+ skip = pat_length - skip;
+ else
+ skip = 1;
+ }
+ }
+
+ return R{ last, last };
+ }
+
+private:
+ alignas(16) uchar m_skiptable[256];
+};
+} // namespace QtPrivate
+
+template <Qt::CaseSensitivity CS, size_t N>
+class QStaticLatin1StringMatcher
+{
+ static_assert(N > 2,
+ "QStaticLatin1StringMatcher makes no sense for finding a single-char pattern");
+
+ QLatin1StringView m_pattern;
+ using Hasher = std::conditional_t<CS == Qt::CaseSensitive, QtPrivate::QCaseSensitiveLatin1Hash,
+ QtPrivate::QCaseInsensitiveLatin1Hash>;
+ QtPrivate::q_boyer_moore_searcher<const char *, Hasher> m_searcher;
+
+public:
+ explicit constexpr QStaticLatin1StringMatcher(QLatin1StringView patternToMatch) noexcept
+ : m_pattern(patternToMatch),
+ m_searcher(patternToMatch.begin(), patternToMatch.begin() + N - 1)
+ {
+ }
+
+ constexpr qsizetype indexIn(QLatin1StringView haystack, qsizetype from = 0) const noexcept
+ {
+ if (from >= haystack.size())
+ return -1;
+ const char *begin = haystack.begin() + from;
+ const char *end = haystack.end();
+ const auto r = m_searcher(begin, end, m_pattern.begin(), m_pattern.end());
+ return r.begin == end ? -1 : std::distance(haystack.begin(), r.begin);
+ }
+};
+
+template <size_t N>
+constexpr auto qMakeStaticCaseSensitiveLatin1StringMatcher(const char (&patternToMatch)[N]) noexcept
+{
+ return QStaticLatin1StringMatcher<Qt::CaseSensitive, N>(
+ QLatin1StringView(patternToMatch, qsizetype(N) - 1));
+}
+
+template <size_t N>
+constexpr auto
+qMakeStaticCaseInsensitiveLatin1StringMatcher(const char (&patternToMatch)[N]) noexcept
+{
+ return QStaticLatin1StringMatcher<Qt::CaseInsensitive, N>(
+ QLatin1StringView(patternToMatch, qsizetype(N) - 1));
+}
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QSTATICLATIN1STRINGMATCHER_H
diff --git a/src/corelib/text/qstaticlatin1stringmatcher.qdoc b/src/corelib/text/qstaticlatin1stringmatcher.qdoc
new file mode 100644
index 0000000000..6577f985b2
--- /dev/null
+++ b/src/corelib/text/qstaticlatin1stringmatcher.qdoc
@@ -0,0 +1,86 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*! \class QStaticLatin1StringMatcher
+ \inmodule QtCore
+ \brief The QStaticLatin1StringMatcher class is a compile-time version
+ of QLatin1StringMatcher.
+
+ \since 6.7
+ \ingroup tools
+ \ingroup string-processing
+
+ This class is useful when your code needs to search efficiently
+ in Latin-1 strings for a substring that's known at compile-time.
+ This is common, for example, in parsers. Using a matcher
+ object's indexIn() is faster than using the indexOf() member method of
+ the string you are searching in, especially when the string to
+ be found will be searched for repeatedly or within a large
+ Latin-1 string that may contain many matches to prefixes of the
+ substring to be found.
+
+ Unlike QLatin1StringMatcher, this class calculates the internal
+ representation at \e{compile-time}, so it can be beneficial even if you
+ are doing one-off Latin-1 string matches.
+
+ Create the QStaticLatin1StringMatcher by calling
+ qMakeStaticCaseSensitiveLatin1StringMatcher() or
+ qMakeStaticCaseInsensitiveLatin1StringMatcher() passing the Latin-1
+ string to search for as a C string literal. Store the return value of
+ that function in a \c{static constexpr auto} variable, so you don't
+ need to pass the \c{N} template parameter explicitly.
+
+ Then call indexIn() on the QLatin1StringView in which you want to search,
+ just like with QLatin1StringMatcher.
+
+ Since this class is designed to do all the up-front calculations at
+ compile-time, it does not offer setPattern() or setCaseSensitivity()
+ methods.
+
+ \note INTEGRITY operating system is currently not supported.
+
+ \sa QLatin1StringMatcher, QStaticByteArrayMatcher, QByteArrayMatcher
+*/
+
+/*!
+ \fn template<Qt::CaseSensitivity CS, size_t N> constexpr qsizetype QStaticLatin1StringMatcher<CS, N>::indexIn(QLatin1StringView haystack, qsizetype from) const
+
+ Searches the QLatin1StringView \a haystack, from byte position \a from
+ (default 0, i.e. from the first byte), for QLatin1StringView pattern()
+ that was set in the constructor. Using the case sensitivity that was also
+ set in the constructor.
+
+ Returns the position where the pattern() matched in \a haystack, or -1 if no match was found.
+*/
+
+/*!
+ \fn template<size_t N> constexpr auto qMakeStaticCaseSensitiveLatin1StringMatcher(const char
+ (&patternToMatch)[N])
+
+ \since 6.7
+ \relates QStaticLatin1StringMatcher
+
+ Return a QStaticLatin1StringMatcher with the correct \c{N} determined
+ automatically from the \a patternToMatch passed, and with case sensitivity.
+
+ To take full advantage of this function, assign the result to a
+ \c{static constexpr auto} variable:
+
+ \snippet code/src_corelib_text_qstaticlatin1stringmatcher.cpp 0
+*/
+
+/*!
+ \fn template<size_t N> constexpr auto qMakeStaticCaseInsensitiveLatin1StringMatcher(const char
+ (&patternToMatch)[N])
+
+ \since 6.7
+ \relates QStaticLatin1StringMatcher
+
+ Return a QStaticLatin1StringMatcher with the correct \c{N} determined
+ automatically from the \a patternToMatch passed, and without case sensitivity.
+
+ To take full advantage of this function, assign the result to a
+ \c{static constexpr auto} variable:
+
+ \snippet code/src_corelib_text_qstaticlatin1stringmatcher.cpp 1
+*/
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp
index d327264218..f0bf0c50a3 100644
--- a/src/corelib/text/qstring.cpp
+++ b/src/corelib/text/qstring.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Copyright (C) 2019 Mail.ru Group.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// Copyright (C) 2019 Mail.ru Group.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstringlist.h"
#if QT_CONFIG(regularexpression)
@@ -45,6 +9,7 @@
#endif
#include "qunicodetables_p.h"
#include <private/qstringconverter_p.h>
+#include <private/qtools_p.h>
#include "qlocale_tools_p.h"
#include "private/qsimd_p.h"
#include <qnumeric.h>
@@ -52,14 +17,16 @@
#include <qlist.h>
#include "qlocale.h"
#include "qlocale_p.h"
+#include "qspan.h"
#include "qstringbuilder.h"
#include "qstringmatcher.h"
#include "qvarlengtharray.h"
#include "qdebug.h"
#include "qendian.h"
#include "qcollator.h"
+#include "qttypetraits.h"
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
#include <private/qcore_mac_p.h>
#endif
@@ -73,38 +40,286 @@
#include <wchar.h>
#include "qchar.cpp"
+#include "qlatin1stringmatcher.h"
#include "qstringmatcher.cpp"
#include "qstringiterator_p.h"
#include "qstringalgorithms_p.h"
#include "qthreadstorage.h"
+#include <algorithm>
+#include <functional>
+
#ifdef Q_OS_WIN
# include <qt_windows.h>
+# if !defined(QT_BOOTSTRAPPED) && (defined(QT_NO_CAST_FROM_ASCII) || defined(QT_NO_CAST_TO_ASCII))
+// MSVC requires this, but let's apply it to MinGW compilers too, just in case
+# error "This file cannot be compiled with QT_NO_CAST_{TO,FROM}_ASCII, " \
+ "otherwise some QString functions will not get exported."
+# endif
#endif
#ifdef truncate
# undef truncate
#endif
-#ifndef LLONG_MAX
-#define LLONG_MAX qint64_C(9223372036854775807)
-#endif
-#ifndef LLONG_MIN
-#define LLONG_MIN (-LLONG_MAX - qint64_C(1))
-#endif
-#ifndef ULLONG_MAX
-#define ULLONG_MAX quint64_C(18446744073709551615)
-#endif
-
-#define IS_RAW_DATA(d) ((d.d)->flags & QArrayData::RawDataType)
+#define REHASH(a) \
+ if (sl_minus_1 < sizeof(std::size_t) * CHAR_BIT) \
+ hashHaystack -= std::size_t(a) << sl_minus_1; \
+ hashHaystack <<= 1
QT_BEGIN_NAMESPACE
-template <typename T, typename Cmp = std::less<>>
-static constexpr bool points_into_range(const T *p, const T *b, const T *e, Cmp less = {}) noexcept
+using namespace Qt::StringLiterals;
+using namespace QtMiscUtils;
+
+const char16_t QString::_empty = 0;
+
+// in qstringmatcher.cpp
+qsizetype qFindStringBoyerMoore(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs);
+
+namespace {
+enum StringComparisonMode {
+ CompareStringsForEquality,
+ CompareStringsForOrdering
+};
+
+template <typename Pointer>
+char32_t foldCaseHelper(Pointer ch, Pointer start) = delete;
+
+template <>
+char32_t foldCaseHelper<const QChar*>(const QChar* ch, const QChar* start)
+{
+ return foldCase(reinterpret_cast<const char16_t*>(ch),
+ reinterpret_cast<const char16_t*>(start));
+}
+
+template <>
+char32_t foldCaseHelper<const char*>(const char* ch, const char*)
+{
+ return foldCase(char16_t(uchar(*ch)));
+}
+
+template <typename T>
+char16_t valueTypeToUtf16(T t) = delete;
+
+template <>
+char16_t valueTypeToUtf16<QChar>(QChar t)
+{
+ return t.unicode();
+}
+
+template <>
+char16_t valueTypeToUtf16<char>(char t)
+{
+ return char16_t{uchar(t)};
+}
+
+template <typename T>
+static inline bool foldAndCompare(const T a, const T b)
+{
+ return foldCase(a) == b;
+}
+
+/*!
+ \internal
+
+ Returns the index position of the first occurrence of the
+ character \a ch in the string given by \a str and \a len,
+ searching forward from index
+ position \a from. Returns -1 if \a ch could not be found.
+*/
+template <typename Haystack>
+static inline qsizetype qLastIndexOf(Haystack haystack, QChar needle,
+ qsizetype from, Qt::CaseSensitivity cs) noexcept
+{
+ if (haystack.size() == 0)
+ return -1;
+ if (from < 0)
+ from += haystack.size();
+ else if (std::size_t(from) > std::size_t(haystack.size()))
+ from = haystack.size() - 1;
+ if (from >= 0) {
+ char16_t c = needle.unicode();
+ const auto b = haystack.data();
+ auto n = b + from;
+ if (cs == Qt::CaseSensitive) {
+ for (; n >= b; --n)
+ if (valueTypeToUtf16(*n) == c)
+ return n - b;
+ } else {
+ c = foldCase(c);
+ for (; n >= b; --n)
+ if (foldCase(valueTypeToUtf16(*n)) == c)
+ return n - b;
+ }
+ }
+ return -1;
+}
+template <> qsizetype
+qLastIndexOf(QString, QChar, qsizetype, Qt::CaseSensitivity) noexcept = delete; // unwanted, would detach
+
+template<typename Haystack, typename Needle>
+static qsizetype qLastIndexOf(Haystack haystack0, qsizetype from,
+ Needle needle0, Qt::CaseSensitivity cs) noexcept
+{
+ const qsizetype sl = needle0.size();
+ if (sl == 1)
+ return qLastIndexOf(haystack0, needle0.front(), from, cs);
+
+ const qsizetype l = haystack0.size();
+ if (from < 0)
+ from += l;
+ if (from == l && sl == 0)
+ return from;
+ const qsizetype delta = l - sl;
+ if (std::size_t(from) > std::size_t(l) || delta < 0)
+ return -1;
+ if (from > delta)
+ from = delta;
+
+ auto sv = [sl](const typename Haystack::value_type *v) { return Haystack(v, sl); };
+
+ auto haystack = haystack0.data();
+ const auto needle = needle0.data();
+ const auto *end = haystack;
+ haystack += from;
+ const std::size_t sl_minus_1 = sl ? sl - 1 : 0;
+ const auto *n = needle + sl_minus_1;
+ const auto *h = haystack + sl_minus_1;
+ std::size_t hashNeedle = 0, hashHaystack = 0;
+
+ if (cs == Qt::CaseSensitive) {
+ for (qsizetype idx = 0; idx < sl; ++idx) {
+ hashNeedle = (hashNeedle << 1) + valueTypeToUtf16(*(n - idx));
+ hashHaystack = (hashHaystack << 1) + valueTypeToUtf16(*(h - idx));
+ }
+ hashHaystack -= valueTypeToUtf16(*haystack);
+
+ while (haystack >= end) {
+ hashHaystack += valueTypeToUtf16(*haystack);
+ if (hashHaystack == hashNeedle
+ && QtPrivate::compareStrings(needle0, sv(haystack), Qt::CaseSensitive) == 0)
+ return haystack - end;
+ --haystack;
+ REHASH(valueTypeToUtf16(haystack[sl]));
+ }
+ } else {
+ for (qsizetype idx = 0; idx < sl; ++idx) {
+ hashNeedle = (hashNeedle << 1) + foldCaseHelper(n - idx, needle);
+ hashHaystack = (hashHaystack << 1) + foldCaseHelper(h - idx, end);
+ }
+ hashHaystack -= foldCaseHelper(haystack, end);
+
+ while (haystack >= end) {
+ hashHaystack += foldCaseHelper(haystack, end);
+ if (hashHaystack == hashNeedle
+ && QtPrivate::compareStrings(sv(haystack), needle0, Qt::CaseInsensitive) == 0)
+ return haystack - end;
+ --haystack;
+ REHASH(foldCaseHelper(haystack + sl, end));
+ }
+ }
+ return -1;
+}
+
+template <typename Haystack, typename Needle>
+bool qt_starts_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) noexcept
+{
+ if (haystack.isNull())
+ return needle.isNull();
+ const auto haystackLen = haystack.size();
+ const auto needleLen = needle.size();
+ if (haystackLen == 0)
+ return needleLen == 0;
+ if (needleLen > haystackLen)
+ return false;
+
+ return QtPrivate::compareStrings(haystack.first(needleLen), needle, cs) == 0;
+}
+
+template <typename Haystack, typename Needle>
+bool qt_ends_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) noexcept
+{
+ if (haystack.isNull())
+ return needle.isNull();
+ const auto haystackLen = haystack.size();
+ const auto needleLen = needle.size();
+ if (haystackLen == 0)
+ return needleLen == 0;
+ if (haystackLen < needleLen)
+ return false;
+
+ return QtPrivate::compareStrings(haystack.last(needleLen), needle, cs) == 0;
+}
+
+template <typename T>
+static void append_helper(QString &self, T view)
+{
+ const auto strData = view.data();
+ const qsizetype strSize = view.size();
+ auto &d = self.data_ptr();
+ if (strData && strSize > 0) {
+ // the number of UTF-8 code units is always at a minimum equal to the number
+ // of equivalent UTF-16 code units
+ d.detachAndGrow(QArrayData::GrowsAtEnd, strSize, nullptr, nullptr);
+ Q_CHECK_PTR(d.data());
+ Q_ASSERT(strSize <= d.freeSpaceAtEnd());
+
+ auto dst = std::next(d.data(), d.size);
+ if constexpr (std::is_same_v<T, QUtf8StringView>) {
+ dst = QUtf8::convertToUnicode(dst, view);
+ } else if constexpr (std::is_same_v<T, QLatin1StringView>) {
+ QLatin1::convertToUnicode(dst, view);
+ dst += strSize;
+ } else {
+ static_assert(QtPrivate::type_dependent_false<T>(),
+ "Can only operate on UTF-8 and Latin-1");
+ }
+ self.resize(std::distance(d.begin(), dst));
+ } else if (d.isNull() && !view.isNull()) { // special case
+ self = QLatin1StringView("");
+ }
+}
+
+template <uint MaxCount> struct UnrollTailLoop
+{
+ template <typename RetType, typename Functor1, typename Functor2, typename Number>
+ static inline RetType exec(Number count, RetType returnIfExited, Functor1 loopCheck, Functor2 returnIfFailed, Number i = 0)
+ {
+ /* equivalent to:
+ * while (count--) {
+ * if (loopCheck(i))
+ * return returnIfFailed(i);
+ * }
+ * return returnIfExited;
+ */
+
+ if (!count)
+ return returnIfExited;
+
+ bool check = loopCheck(i);
+ if (check)
+ return returnIfFailed(i);
+
+ return UnrollTailLoop<MaxCount - 1>::exec(count - 1, returnIfExited, loopCheck, returnIfFailed, i + 1);
+ }
+
+ template <typename Functor, typename Number>
+ static inline void exec(Number count, Functor code)
+ {
+ /* equivalent to:
+ * for (Number i = 0; i < count; ++i)
+ * code(i);
+ */
+ exec(count, 0, [=](Number i) -> bool { code(i); return false; }, [](Number) { return 0; });
+ }
+};
+template <> template <typename RetType, typename Functor1, typename Functor2, typename Number>
+inline RetType UnrollTailLoop<0>::exec(Number, RetType returnIfExited, Functor1, Functor2, Number)
{
- return !less(p, b) && less(p, e);
+ return returnIfExited;
}
+} // unnamed namespace
/*
* Note on the use of SIMD in qstring.cpp:
@@ -143,32 +358,38 @@ extern "C" void qt_fromlatin1_mips_asm_unroll8 (char16_t*, const char*, uint);
extern "C" void qt_toLatin1_mips_dsp_asm(uchar *dst, const char16_t *src, int length);
#endif
-// internal
-qsizetype qFindStringBoyerMoore(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs);
-static inline qsizetype qFindChar(QStringView str, QChar ch, qsizetype from, Qt::CaseSensitivity cs) noexcept;
-template <typename Haystack>
-static inline qsizetype qLastIndexOf(Haystack haystack, QChar needle, qsizetype from, Qt::CaseSensitivity cs) noexcept;
-template <>
-inline qsizetype qLastIndexOf(QString haystack, QChar needle,
- qsizetype from, Qt::CaseSensitivity cs) noexcept = delete; // unwanted, would detach
-
-static inline bool qt_starts_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs);
-static inline bool qt_starts_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs);
-static inline bool qt_starts_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs);
-static inline bool qt_ends_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs);
-static inline bool qt_ends_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs);
-static inline bool qt_ends_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs);
-
-#if defined(__SSE2__) && defined(Q_CC_GNU) && !defined(Q_CC_INTEL)
+#if defined(__SSE2__) && defined(Q_CC_GNU)
// We may overrun the buffer, but that's a false positive:
// this won't crash nor produce incorrect results
-__attribute__((__no_sanitize_address__))
+# define ATTRIBUTE_NO_SANITIZE __attribute__((__no_sanitize_address__))
+#else
+# define ATTRIBUTE_NO_SANITIZE
#endif
-qsizetype QtPrivate::qustrlen(const char16_t *str) noexcept
+
+#ifdef __SSE2__
+static constexpr bool UseSse4_1 = bool(qCompilerCpuFeatures & CpuFeatureSSE4_1);
+static constexpr bool UseAvx2 = UseSse4_1 &&
+ (qCompilerCpuFeatures & CpuFeatureArchHaswell) == CpuFeatureArchHaswell;
+
+[[maybe_unused]]
+static Q_ALWAYS_INLINE __m128i mm_load8_zero_extend(const void *ptr)
{
- qsizetype result = 0;
+ const __m128i *dataptr = static_cast<const __m128i *>(ptr);
+ if constexpr (UseSse4_1) {
+ // use a MOVQ followed by PMOVZXBW
+ // if AVX2 is present, these should combine into a single VPMOVZXBW instruction
+ __m128i data = _mm_loadl_epi64(dataptr);
+ return _mm_cvtepu8_epi16(data);
+ }
+
+ // use MOVQ followed by PUNPCKLBW
+ __m128i data = _mm_loadl_epi64(dataptr);
+ return _mm_unpacklo_epi8(data, _mm_setzero_si128());
+}
-#if defined(__SSE2__) && !(defined(__SANITIZE_ADDRESS__) || QT_HAS_FEATURE(address_sanitizer))
+[[maybe_unused]] ATTRIBUTE_NO_SANITIZE
+static qsizetype qustrlen_sse2(const char16_t *str) noexcept
+{
// find the 16-byte alignment immediately prior or equal to str
quintptr misalignment = quintptr(str) & 0xf;
Q_ASSERT((misalignment & 1) == 0);
@@ -179,7 +400,7 @@ qsizetype QtPrivate::qustrlen(const char16_t *str) noexcept
const __m128i zeroes = _mm_setzero_si128();
__m128i data = _mm_load_si128(reinterpret_cast<const __m128i *>(ptr));
__m128i comparison = _mm_cmpeq_epi16(data, zeroes);
- quint32 mask = _mm_movemask_epi8(comparison);
+ uint mask = _mm_movemask_epi8(comparison);
// ignore the result prior to the beginning of str
mask >>= misalignment;
@@ -187,71 +408,272 @@ qsizetype QtPrivate::qustrlen(const char16_t *str) noexcept
// Have we found something in the first block? Need to handle it now
// because of the left shift above.
if (mask)
- return qCountTrailingZeroBits(quint32(mask)) / 2;
+ return qCountTrailingZeroBits(mask) / sizeof(char16_t);
+
+ constexpr qsizetype Step = sizeof(__m128i) / sizeof(char16_t);
+ qsizetype size = Step - misalignment / sizeof(char16_t);
+ size -= Step;
do {
- ptr += 8;
- data = _mm_load_si128(reinterpret_cast<const __m128i *>(ptr));
+ size += Step;
+ data = _mm_load_si128(reinterpret_cast<const __m128i *>(str + size));
comparison = _mm_cmpeq_epi16(data, zeroes);
mask = _mm_movemask_epi8(comparison);
} while (mask == 0);
// found a null
- uint idx = qCountTrailingZeroBits(quint32(mask));
- return ptr - str + idx / 2;
-#endif
+ return size + qCountTrailingZeroBits(mask) / sizeof(char16_t);
+}
- if (sizeof(wchar_t) == sizeof(char16_t))
- return wcslen(reinterpret_cast<const wchar_t *>(str));
+// Scans from \a ptr to \a end until \a maskval is non-zero. Returns true if
+// the no non-zero was found. Returns false and updates \a ptr to point to the
+// first 16-bit word that has any bit set (note: if the input is 8-bit, \a ptr
+// may be updated to one byte short).
+static bool simdTestMask(const char *&ptr, const char *end, quint32 maskval)
+{
+ auto updatePtr = [&](uint result) {
+ // found a character matching the mask
+ uint idx = qCountTrailingZeroBits(~result);
+ ptr += idx;
+ return false;
+ };
- while (*str++)
- ++result;
- return result;
+ if constexpr (UseSse4_1) {
+# ifndef Q_OS_QNX // compiler fails in the code below
+ __m128i mask;
+ auto updatePtrSimd = [&](__m128i data) -> bool {
+ __m128i masked = _mm_and_si128(mask, data);
+ __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
+ uint result = _mm_movemask_epi8(comparison);
+ return updatePtr(result);
+ };
+
+ if constexpr (UseAvx2) {
+ // AVX2 implementation: test 32 bytes at a time
+ const __m256i mask256 = _mm256_broadcastd_epi32(_mm_cvtsi32_si128(maskval));
+ while (ptr + 32 <= end) {
+ __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
+ if (!_mm256_testz_si256(mask256, data)) {
+ // found a character matching the mask
+ __m256i masked256 = _mm256_and_si256(mask256, data);
+ __m256i comparison256 = _mm256_cmpeq_epi16(masked256, _mm256_setzero_si256());
+ return updatePtr(_mm256_movemask_epi8(comparison256));
+ }
+ ptr += 32;
+ }
+
+ mask = _mm256_castsi256_si128(mask256);
+ } else {
+ // SSE 4.1 implementation: test 32 bytes at a time (two 16-byte
+ // comparisons, unrolled)
+ mask = _mm_set1_epi32(maskval);
+ while (ptr + 32 <= end) {
+ __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
+ __m128i data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr + 16));
+ if (!_mm_testz_si128(mask, data1))
+ return updatePtrSimd(data1);
+
+ ptr += 16;
+ if (!_mm_testz_si128(mask, data2))
+ return updatePtrSimd(data2);
+ ptr += 16;
+ }
+ }
+
+ // AVX2 and SSE4.1: final 16-byte comparison
+ if (ptr + 16 <= end) {
+ __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
+ if (!_mm_testz_si128(mask, data1))
+ return updatePtrSimd(data1);
+ ptr += 16;
+ }
+
+ // and final 8-byte comparison
+ if (ptr + 8 <= end) {
+ __m128i data1 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
+ if (!_mm_testz_si128(mask, data1))
+ return updatePtrSimd(data1);
+ ptr += 8;
+ }
+
+ return true;
+# endif // QNX
+ }
+
+ // SSE2 implementation: test 16 bytes at a time.
+ const __m128i mask = _mm_set1_epi32(maskval);
+ while (ptr + 16 <= end) {
+ __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
+ __m128i masked = _mm_and_si128(mask, data);
+ __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
+ quint16 result = _mm_movemask_epi8(comparison);
+ if (result != 0xffff)
+ return updatePtr(result);
+ ptr += 16;
+ }
+
+ // and one 8-byte comparison
+ if (ptr + 8 <= end) {
+ __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
+ __m128i masked = _mm_and_si128(mask, data);
+ __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
+ quint8 result = _mm_movemask_epi8(comparison);
+ if (result != 0xff)
+ return updatePtr(result);
+ ptr += 8;
+ }
+
+ return true;
}
-#if !defined(__OPTIMIZE_SIZE__)
-namespace {
-template <uint MaxCount> struct UnrollTailLoop
+template <StringComparisonMode Mode, typename Char> [[maybe_unused]]
+static int ucstrncmp_sse2(const char16_t *a, const Char *b, size_t l)
{
- template <typename RetType, typename Functor1, typename Functor2, typename Number>
- static inline RetType exec(Number count, RetType returnIfExited, Functor1 loopCheck, Functor2 returnIfFailed, Number i = 0)
- {
- /* equivalent to:
- * while (count--) {
- * if (loopCheck(i))
- * return returnIfFailed(i);
- * }
- * return returnIfExited;
- */
+ static_assert(std::is_unsigned_v<Char>);
- if (!count)
- return returnIfExited;
+ // Using the PMOVMSKB instruction, we get two bits for each UTF-16 character
+ // we compare. This lambda helps extract the code unit.
+ static const auto codeUnitAt = [](const auto *n, qptrdiff idx) -> int {
+ constexpr int Stride = 2;
+ // this is the same as:
+ // return n[idx / Stride];
+ // but using pointer arithmetic to avoid the compiler dividing by two
+ // and multiplying by two in the case of char16_t (we know idx is even,
+ // but the compiler does not). This is not UB.
- bool check = loopCheck(i);
- if (check)
- return returnIfFailed(i);
+ auto ptr = reinterpret_cast<const uchar *>(n);
+ ptr += idx / (Stride / sizeof(*n));
+ return *reinterpret_cast<decltype(n)>(ptr);
+ };
+ auto difference = [a, b](uint mask, qptrdiff offset) {
+ if (Mode == CompareStringsForEquality)
+ return 1;
+ uint idx = qCountTrailingZeroBits(mask);
+ return codeUnitAt(a + offset, idx) - codeUnitAt(b + offset, idx);
+ };
- return UnrollTailLoop<MaxCount - 1>::exec(count - 1, returnIfExited, loopCheck, returnIfFailed, i + 1);
- }
+ static const auto load8Chars = [](const auto *ptr) {
+ if (sizeof(*ptr) == 2)
+ return _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
+ __m128i chunk = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
+ return _mm_unpacklo_epi8(chunk, _mm_setzero_si128());
+ };
+ static const auto load4Chars = [](const auto *ptr) {
+ if (sizeof(*ptr) == 2)
+ return _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
+ __m128i chunk = _mm_cvtsi32_si128(qFromUnaligned<quint32>(ptr));
+ return _mm_unpacklo_epi8(chunk, _mm_setzero_si128());
+ };
- template <typename Functor, typename Number>
- static inline void exec(Number count, Functor code)
- {
- /* equivalent to:
- * for (Number i = 0; i < count; ++i)
- * code(i);
- */
- exec(count, 0, [=](Number i) -> bool { code(i); return false; }, [](Number) { return 0; });
+ // we're going to read a[0..15] and b[0..15] (32 bytes)
+ auto processChunk16Chars = [a, b](qptrdiff offset) -> uint {
+ if constexpr (UseAvx2) {
+ __m256i a_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(a + offset));
+ __m256i b_data;
+ if (sizeof(Char) == 1) {
+ // expand to UTF-16 via zero-extension
+ __m128i chunk = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
+ b_data = _mm256_cvtepu8_epi16(chunk);
+ } else {
+ b_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(b + offset));
+ }
+ __m256i result = _mm256_cmpeq_epi16(a_data, b_data);
+ return _mm256_movemask_epi8(result);
+ }
+
+ __m128i a_data1 = load8Chars(a + offset);
+ __m128i a_data2 = load8Chars(a + offset + 8);
+ __m128i b_data1, b_data2;
+ if (sizeof(Char) == 1) {
+ // expand to UTF-16 via unpacking
+ __m128i b_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
+ b_data1 = _mm_unpacklo_epi8(b_data, _mm_setzero_si128());
+ b_data2 = _mm_unpackhi_epi8(b_data, _mm_setzero_si128());
+ } else {
+ b_data1 = load8Chars(b + offset);
+ b_data2 = load8Chars(b + offset + 8);
+ }
+ __m128i result1 = _mm_cmpeq_epi16(a_data1, b_data1);
+ __m128i result2 = _mm_cmpeq_epi16(a_data2, b_data2);
+ return _mm_movemask_epi8(result1) | _mm_movemask_epi8(result2) << 16;
+ };
+
+ if (l >= sizeof(__m256i) / sizeof(char16_t)) {
+ qptrdiff offset = 0;
+ for ( ; l >= offset + sizeof(__m256i) / sizeof(char16_t); offset += sizeof(__m256i) / sizeof(char16_t)) {
+ uint mask = ~processChunk16Chars(offset);
+ if (mask)
+ return difference(mask, offset);
+ }
+
+ // maybe overlap the last 32 bytes
+ if (size_t(offset) < l) {
+ offset = l - sizeof(__m256i) / sizeof(char16_t);
+ uint mask = ~processChunk16Chars(offset);
+ return mask ? difference(mask, offset) : 0;
+ }
+ } else if (l >= 4) {
+ __m128i a_data1, b_data1;
+ __m128i a_data2, b_data2;
+ int width;
+ if (l >= 8) {
+ width = 8;
+ a_data1 = load8Chars(a);
+ b_data1 = load8Chars(b);
+ a_data2 = load8Chars(a + l - width);
+ b_data2 = load8Chars(b + l - width);
+ } else {
+ // we're going to read a[0..3] and b[0..3] (8 bytes)
+ width = 4;
+ a_data1 = load4Chars(a);
+ b_data1 = load4Chars(b);
+ a_data2 = load4Chars(a + l - width);
+ b_data2 = load4Chars(b + l - width);
+ }
+
+ __m128i result = _mm_cmpeq_epi16(a_data1, b_data1);
+ ushort mask = ~_mm_movemask_epi8(result);
+ if (mask)
+ return difference(mask, 0);
+
+ result = _mm_cmpeq_epi16(a_data2, b_data2);
+ mask = ~_mm_movemask_epi8(result);
+ if (mask)
+ return difference(mask, l - width);
+ } else {
+ // reset l
+ l &= 3;
+
+ const auto lambda = [=](size_t i) -> int {
+ return a[i] - b[i];
+ };
+ return UnrollTailLoop<3>::exec(l, 0, lambda, lambda);
}
-};
-template <> template <typename RetType, typename Functor1, typename Functor2, typename Number>
-inline RetType UnrollTailLoop<0>::exec(Number, RetType returnIfExited, Functor1, Functor2, Number)
+ return 0;
+}
+#endif
+
+Q_NEVER_INLINE
+qsizetype QtPrivate::qustrlen(const char16_t *str) noexcept
{
- return returnIfExited;
+#if defined(__SSE2__) && !(defined(__SANITIZE_ADDRESS__) || __has_feature(address_sanitizer))
+ return qustrlen_sse2(str);
+#endif
+
+ if (sizeof(wchar_t) == sizeof(char16_t))
+ return wcslen(reinterpret_cast<const wchar_t *>(str));
+
+ qsizetype result = 0;
+ while (*str++)
+ ++result;
+ return result;
}
+
+qsizetype QtPrivate::qustrnlen(const char16_t *str, qsizetype maxlen) noexcept
+{
+ return qustrchr({ str, maxlen }, u'\0') - str;
}
-#endif
/*!
* \internal
@@ -261,6 +683,7 @@ inline RetType UnrollTailLoop<0>::exec(Number, RetType returnIfExited, Functor1,
* character is not found, this function returns a pointer to the end of the
* string -- that is, \c{str.end()}.
*/
+Q_NEVER_INLINE
const char16_t *QtPrivate::qustrchr(QStringView str, char16_t c) noexcept
{
const char16_t *n = str.utf16();
@@ -270,23 +693,24 @@ const char16_t *QtPrivate::qustrchr(QStringView str, char16_t c) noexcept
bool loops = true;
// Using the PMOVMSKB instruction, we get two bits for each character
// we compare.
-# if defined(__AVX2__) && !defined(__OPTIMIZE_SIZE__)
- // we're going to read n[0..15] (32 bytes)
- __m256i mch256 = _mm256_set1_epi32(c | (c << 16));
- for (const char16_t *next = n + 16; next <= e; n = next, next += 16) {
- __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(n));
- __m256i result = _mm256_cmpeq_epi16(data, mch256);
- uint mask = uint(_mm256_movemask_epi8(result));
- if (mask) {
- uint idx = qCountTrailingZeroBits(mask);
- return n + idx / 2;
+ __m128i mch;
+ if constexpr (UseAvx2) {
+ // we're going to read n[0..15] (32 bytes)
+ __m256i mch256 = _mm256_set1_epi32(c | (c << 16));
+ for (const char16_t *next = n + 16; next <= e; n = next, next += 16) {
+ __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(n));
+ __m256i result = _mm256_cmpeq_epi16(data, mch256);
+ uint mask = uint(_mm256_movemask_epi8(result));
+ if (mask) {
+ uint idx = qCountTrailingZeroBits(mask);
+ return n + idx / 2;
+ }
}
+ loops = false;
+ mch = _mm256_castsi256_si128(mch256);
+ } else {
+ mch = _mm_set1_epi32(c | (c << 16));
}
- loops = false;
- __m128i mch = _mm256_castsi256_si128(mch256);
-# else
- __m128i mch = _mm_set1_epi32(c | (c << 16));
-# endif
auto hasMatch = [mch, &n](__m128i data, ushort validityMask) {
__m128i result = _mm_cmpeq_epi16(data, mch);
@@ -321,10 +745,10 @@ const char16_t *QtPrivate::qustrchr(QStringView str, char16_t c) noexcept
}
return UnrollTailLoop<3>::exec(e - n, e,
- [=](int i) { return n[i] == c; },
- [=](int i) { return n + i; });
+ [=](qsizetype i) { return n[i] == c; },
+ [=](qsizetype i) { return n + i; });
# endif
-#elif defined(__ARM_NEON__) && defined(Q_PROCESSOR_ARM_64) // vaddv is only available on Aarch64
+#elif defined(__ARM_NEON__)
const uint16x8_t vmask = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 };
const uint16x8_t ch_vec = vdupq_n_u16(c);
for (const char16_t *next = n + 8; next <= e; n = next, next += 8) {
@@ -337,128 +761,25 @@ const char16_t *QtPrivate::qustrchr(QStringView str, char16_t c) noexcept
}
#endif // aarch64
- --n;
- while (++n != e)
- if (*n == c)
- return n;
-
- return n;
+ return std::find(n, e, c);
}
-#ifdef __SSE2__
-// Scans from \a ptr to \a end until \a maskval is non-zero. Returns true if
-// the no non-zero was found. Returns false and updates \a ptr to point to the
-// first 16-bit word that has any bit set (note: if the input is 8-bit, \a ptr
-// may be updated to one byte short).
-static bool simdTestMask(const char *&ptr, const char *end, quint32 maskval)
-{
- auto updatePtr = [&](uint result) {
- // found a character matching the mask
- uint idx = qCountTrailingZeroBits(~result);
- ptr += idx;
- return false;
- };
-
-# if defined(__SSE4_1__)
- __m128i mask;
- auto updatePtrSimd = [&](__m128i data) {
- __m128i masked = _mm_and_si128(mask, data);
- __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
- uint result = _mm_movemask_epi8(comparison);
- return updatePtr(result);
- };
-
-# if defined(__AVX2__)
- // AVX2 implementation: test 32 bytes at a time
- const __m256i mask256 = _mm256_broadcastd_epi32(_mm_cvtsi32_si128(maskval));
- while (ptr + 32 <= end) {
- __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
- if (!_mm256_testz_si256(mask256, data)) {
- // found a character matching the mask
- __m256i masked256 = _mm256_and_si256(mask256, data);
- __m256i comparison256 = _mm256_cmpeq_epi16(masked256, _mm256_setzero_si256());
- return updatePtr(_mm256_movemask_epi8(comparison256));
- }
- ptr += 32;
- }
-
- mask = _mm256_castsi256_si128(mask256);
-# else
- // SSE 4.1 implementation: test 32 bytes at a time (two 16-byte
- // comparisons, unrolled)
- mask = _mm_set1_epi32(maskval);
- while (ptr + 32 <= end) {
- __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr + 16));
- if (!_mm_testz_si128(mask, data1))
- return updatePtrSimd(data1);
-
- ptr += 16;
- if (!_mm_testz_si128(mask, data2))
- return updatePtrSimd(data2);
- ptr += 16;
- }
-# endif
-
- // AVX2 and SSE4.1: final 16-byte comparison
- if (ptr + 16 <= end) {
- __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- if (!_mm_testz_si128(mask, data1))
- return updatePtrSimd(data1);
- ptr += 16;
- }
-
- // and final 8-byte comparison
- if (ptr + 8 <= end) {
- __m128i data1 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
- if (!_mm_testz_si128(mask, data1))
- return updatePtrSimd(data1);
- ptr += 8;
- }
-
-# else
- // SSE2 implementation: test 16 bytes at a time.
- const __m128i mask = _mm_set1_epi32(maskval);
- while (ptr + 16 <= end) {
- __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i masked = _mm_and_si128(mask, data);
- __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
- quint16 result = _mm_movemask_epi8(comparison);
- if (result != 0xffff)
- return updatePtr(result);
- ptr += 16;
- }
-
- // and one 8-byte comparison
- if (ptr + 8 <= end) {
- __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
- __m128i masked = _mm_and_si128(mask, data);
- __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
- quint8 result = _mm_movemask_epi8(comparison);
- if (result != 0xff)
- return updatePtr(result);
- ptr += 8;
- }
-# endif
-
- return true;
-}
-
-static Q_ALWAYS_INLINE __m128i mm_load8_zero_extend(const void *ptr)
+/*!
+ * \internal
+ *
+ * Searches case-insensitively for character \a c in the string \a str and
+ * returns a pointer to it. Iif the character is not found, this function
+ * returns a pointer to the end of the string -- that is, \c{str.end()}.
+ */
+Q_NEVER_INLINE
+const char16_t *QtPrivate::qustrcasechr(QStringView str, char16_t c) noexcept
{
- const __m128i *dataptr = static_cast<const __m128i *>(ptr);
-#if defined(__SSE4_1__)
- // use a MOVQ followed by PMOVZXBW
- // if AVX2 is present, these should combine into a single VPMOVZXBW instruction
- __m128i data = _mm_loadl_epi64(dataptr);
- return _mm_cvtepu8_epi16(data);
-# else
- // use MOVQ followed by PUNPCKLBW
- __m128i data = _mm_loadl_epi64(dataptr);
- return _mm_unpacklo_epi8(data, _mm_setzero_si128());
-# endif
+ const QChar *n = str.begin();
+ const QChar *e = str.end();
+ c = foldCase(c);
+ auto it = std::find_if(n, e, [c](auto ch) { return foldAndCompare(ch, QChar(c)); });
+ return reinterpret_cast<const char16_t *>(it);
}
-#endif
// Note: ptr on output may be off by one and point to a preceding US-ASCII
// character. Usually harmless.
@@ -466,18 +787,21 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
{
#if defined(__SSE2__)
// Testing for the high bit can be done efficiently with just PMOVMSKB
-# if defined(__AVX2__)
- while (ptr + 32 <= end) {
- __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
- quint32 mask = _mm256_movemask_epi8(data);
- if (mask) {
- uint idx = qCountTrailingZeroBits(mask);
- ptr += idx;
- return false;
+ bool loops = true;
+ if constexpr (UseAvx2) {
+ while (ptr + 32 <= end) {
+ __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
+ quint32 mask = _mm256_movemask_epi8(data);
+ if (mask) {
+ uint idx = qCountTrailingZeroBits(mask);
+ ptr += idx;
+ return false;
+ }
+ ptr += 32;
}
- ptr += 32;
+ loops = false;
}
-# endif
+
while (ptr + 16 <= end) {
__m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
quint32 mask = _mm_movemask_epi8(data);
@@ -487,6 +811,9 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
return false;
}
ptr += 16;
+
+ if (!loops)
+ break;
}
if (ptr + 8 <= end) {
__m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
@@ -503,11 +830,9 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
while (ptr + 4 <= end) {
quint32 data = qFromUnaligned<quint32>(ptr);
if (data &= 0x80808080U) {
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- uint idx = qCountLeadingZeroBits(data);
-#else
- uint idx = qCountTrailingZeroBits(data);
-#endif
+ uint idx = QSysInfo::ByteOrder == QSysInfo::BigEndian
+ ? qCountLeadingZeroBits(data)
+ : qCountTrailingZeroBits(data);
ptr += idx / 8;
return false;
}
@@ -522,7 +847,7 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
return true;
}
-bool QtPrivate::isAscii(QLatin1String s) noexcept
+bool QtPrivate::isAscii(QLatin1StringView s) noexcept
{
const char *ptr = s.begin();
const char *end = s.end();
@@ -530,19 +855,19 @@ bool QtPrivate::isAscii(QLatin1String s) noexcept
return qt_is_ascii(ptr, end);
}
-static bool isAscii(const QChar *&ptr, const QChar *end)
+static bool isAscii_helper(const char16_t *&ptr, const char16_t *end)
{
#ifdef __SSE2__
const char *ptr8 = reinterpret_cast<const char *>(ptr);
const char *end8 = reinterpret_cast<const char *>(end);
bool ok = simdTestMask(ptr8, end8, 0xff80ff80);
- ptr = reinterpret_cast<const QChar *>(ptr8);
+ ptr = reinterpret_cast<const char16_t *>(ptr8);
if (!ok)
return false;
#endif
while (ptr != end) {
- if (ptr->unicode() & 0xff80)
+ if (*ptr & 0xff80)
return false;
++ptr;
}
@@ -551,46 +876,27 @@ static bool isAscii(const QChar *&ptr, const QChar *end)
bool QtPrivate::isAscii(QStringView s) noexcept
{
- const QChar *ptr = s.begin();
- const QChar *end = s.end();
+ const char16_t *ptr = s.utf16();
+ const char16_t *end = ptr + s.size();
- return isAscii(ptr, end);
+ return isAscii_helper(ptr, end);
}
bool QtPrivate::isLatin1(QStringView s) noexcept
{
- const QChar *ptr = s.begin();
- const QChar *end = s.end();
+ const char16_t *ptr = s.utf16();
+ const char16_t *end = ptr + s.size();
-#if defined(__SSE4_1__)
+#ifdef __SSE2__
const char *ptr8 = reinterpret_cast<const char *>(ptr);
const char *end8 = reinterpret_cast<const char *>(end);
if (!simdTestMask(ptr8, end8, 0xff00ff00))
return false;
- ptr = reinterpret_cast<const QChar *>(ptr8);
-#elif defined(__SSE2__)
- // Testing if every other byte is non-zero can be done efficiently by
- // using PUNPCKHBW (unpack high order bytes) and comparing that to zero.
- while (ptr + 32 < end) {
- __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr + 16));
- __m128i high = _mm_unpackhi_epi8(data1, data2);
- __m128i comparison = _mm_cmpeq_epi16(high, _mm_setzero_si128());
- if (_mm_movemask_epi8(comparison))
- return false;
- ptr += 16;
- }
- if (ptr + 16 < end) {
- __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i high = _mm_unpackhi_epi8(data1, data1);
- __m128i comparison = _mm_cmpeq_epi16(high, _mm_setzero_si128());
- if (_mm_movemask_epi8(comparison))
- return false;
- }
+ ptr = reinterpret_cast<const char16_t *>(ptr8);
#endif
while (ptr != end) {
- if ((*ptr++).unicode() > 0xff)
+ if (*ptr++ > 0xff)
return false;
}
return true;
@@ -598,7 +904,7 @@ bool QtPrivate::isLatin1(QStringView s) noexcept
bool QtPrivate::isValidUtf16(QStringView s) noexcept
{
- Q_CONSTEXPR char32_t InvalidCodePoint = UINT_MAX;
+ constexpr char32_t InvalidCodePoint = UINT_MAX;
QStringIterator i(s);
while (i.hasNext()) {
@@ -619,46 +925,63 @@ Q_CORE_EXPORT void qt_from_latin1(char16_t *dst, const char *str, size_t size) n
* itself in exactly the same way as one would do it with intrinsics.
*/
#if defined(__SSE2__)
- const char *e = str + size;
- qptrdiff offset = 0;
-
// we're going to read str[offset..offset+15] (16 bytes)
- for ( ; str + offset + 15 < e; offset += 16) {
+ const __m128i nullMask = _mm_setzero_si128();
+ auto processOneChunk = [=](qptrdiff offset) {
const __m128i chunk = _mm_loadu_si128((const __m128i*)(str + offset)); // load
-#ifdef __AVX2__
- // zero extend to an YMM register
- const __m256i extended = _mm256_cvtepu8_epi16(chunk);
+ if constexpr (UseAvx2) {
+ // zero extend to an YMM register
+ const __m256i extended = _mm256_cvtepu8_epi16(chunk);
- // store
- _mm256_storeu_si256((__m256i*)(dst + offset), extended);
-#else
- const __m128i nullMask = _mm_set1_epi32(0);
-
- // unpack the first 8 bytes, padding with zeros
- const __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullMask);
- _mm_storeu_si128((__m128i*)(dst + offset), firstHalf); // store
+ // store
+ _mm256_storeu_si256((__m256i*)(dst + offset), extended);
+ } else {
+ // unpack the first 8 bytes, padding with zeros
+ const __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullMask);
+ _mm_storeu_si128((__m128i*)(dst + offset), firstHalf); // store
- // unpack the last 8 bytes, padding with zeros
- const __m128i secondHalf = _mm_unpackhi_epi8 (chunk, nullMask);
- _mm_storeu_si128((__m128i*)(dst + offset + 8), secondHalf); // store
-#endif
- }
+ // unpack the last 8 bytes, padding with zeros
+ const __m128i secondHalf = _mm_unpackhi_epi8 (chunk, nullMask);
+ _mm_storeu_si128((__m128i*)(dst + offset + 8), secondHalf); // store
+ }
+ };
- // we're going to read str[offset..offset+7] (8 bytes)
- if (str + offset + 7 < e) {
- const __m128i unpacked = mm_load8_zero_extend(str + offset);
- _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + offset), unpacked);
- offset += 8;
+ const char *e = str + size;
+ if (size >= sizeof(__m128i)) {
+ qptrdiff offset = 0;
+ for ( ; str + offset + sizeof(__m128i) <= e; offset += sizeof(__m128i))
+ processOneChunk(offset);
+ if (str + offset < e)
+ processOneChunk(size - sizeof(__m128i));
+ return;
}
- size = size % 8;
- dst += offset;
- str += offset;
# if !defined(__OPTIMIZE_SIZE__)
- return UnrollTailLoop<7>::exec(int(size), [=](int i) { dst[i] = (uchar)str[i]; });
+ if (size >= 4) {
+ // two overlapped loads & stores, of either 64-bit or of 32-bit
+ if (size >= 8) {
+ const __m128i unpacked1 = mm_load8_zero_extend(str);
+ const __m128i unpacked2 = mm_load8_zero_extend(str + size - 8);
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), unpacked1);
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + size - 8), unpacked2);
+ } else {
+ const __m128i chunk1 = _mm_cvtsi32_si128(qFromUnaligned<quint32>(str));
+ const __m128i chunk2 = _mm_cvtsi32_si128(qFromUnaligned<quint32>(str + size - 4));
+ const __m128i unpacked1 = _mm_unpacklo_epi8(chunk1, nullMask);
+ const __m128i unpacked2 = _mm_unpacklo_epi8(chunk2, nullMask);
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(dst), unpacked1);
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(dst + size - 4), unpacked2);
+ }
+ return;
+ } else {
+ size = size % 4;
+ return UnrollTailLoop<3>::exec(qsizetype(size), [=](qsizetype i) { dst[i] = uchar(str[i]); });
+ }
# endif
#endif
#if defined(__mips_dsp)
+ static_assert(sizeof(qsizetype) == sizeof(int),
+ "oops, the assembler implementation needs to be called in a loop");
if (size > 20)
qt_fromlatin1_mips_asm_unroll8(dst, str, size);
else
@@ -669,31 +992,51 @@ Q_CORE_EXPORT void qt_from_latin1(char16_t *dst, const char *str, size_t size) n
#endif
}
+static QVarLengthArray<char16_t> qt_from_latin1_to_qvla(QLatin1StringView str)
+{
+ const qsizetype len = str.size();
+ QVarLengthArray<char16_t> arr(len);
+ qt_from_latin1(arr.data(), str.data(), len);
+ return arr;
+}
+
template <bool Checked>
static void qt_to_latin1_internal(uchar *dst, const char16_t *src, qsizetype length)
{
#if defined(__SSE2__)
- uchar *e = dst + length;
- qptrdiff offset = 0;
-
-# ifdef __AVX2__
- const __m256i questionMark256 = _mm256_broadcastw_epi16(_mm_cvtsi32_si128('?'));
- const __m256i outOfRange256 = _mm256_broadcastw_epi16(_mm_cvtsi32_si128(0x100));
- const __m128i questionMark = _mm256_castsi256_si128(questionMark256);
- const __m128i outOfRange = _mm256_castsi256_si128(outOfRange256);
-# else
- const __m128i questionMark = _mm_set1_epi16('?');
- const __m128i outOfRange = _mm_set1_epi16(0x100);
-# endif
+ auto questionMark256 = []() {
+ if constexpr (UseAvx2)
+ return _mm256_broadcastw_epi16(_mm_cvtsi32_si128('?'));
+ else
+ return 0;
+ }();
+ auto outOfRange256 = []() {
+ if constexpr (UseAvx2)
+ return _mm256_broadcastw_epi16(_mm_cvtsi32_si128(0x100));
+ else
+ return 0;
+ }();
+ __m128i questionMark, outOfRange;
+ if constexpr (UseAvx2) {
+ questionMark = _mm256_castsi256_si128(questionMark256);
+ outOfRange = _mm256_castsi256_si128(outOfRange256);
+ } else {
+ questionMark = _mm_set1_epi16('?');
+ outOfRange = _mm_set1_epi16(0x100);
+ }
auto mergeQuestionMarks = [=](__m128i chunk) {
+ if (!Checked)
+ return chunk;
+
// SSE has no compare instruction for unsigned comparison.
-# ifdef __SSE4_1__
- // We use an unsigned uc = qMin(uc, 0x100) and then compare for equality.
- chunk = _mm_min_epu16(chunk, outOfRange);
- const __m128i offLimitMask = _mm_cmpeq_epi16(chunk, outOfRange);
- chunk = _mm_blendv_epi8(chunk, questionMark, offLimitMask);
-# else
+ if constexpr (UseSse4_1) {
+ // We use an unsigned uc = qMin(uc, 0x100) and then compare for equality.
+ chunk = _mm_min_epu16(chunk, outOfRange);
+ const __m128i offLimitMask = _mm_cmpeq_epi16(chunk, outOfRange);
+ chunk = _mm_blendv_epi8(chunk, questionMark, offLimitMask);
+ return chunk;
+ }
// The variables must be shiffted + 0x8000 to be compared
const __m128i signedBitOffset = _mm_set1_epi16(short(0x8000));
const __m128i thresholdMask = _mm_set1_epi16(short(0xff + 0x8000));
@@ -713,90 +1056,99 @@ static void qt_to_latin1_internal(uchar *dst, const char16_t *src, qsizetype len
chunk = _mm_or_si128(correctBytes, offLimitQuestionMark);
Q_UNUSED(outOfRange);
-# endif
return chunk;
};
- // we're going to write to dst[offset..offset+15] (16 bytes)
- for ( ; dst + offset + 15 < e; offset += 16) {
-# if defined(__AVX2__)
- __m256i chunk = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(src + offset));
- if (Checked) {
- // See mergeQuestionMarks lambda above for details
- chunk = _mm256_min_epu16(chunk, outOfRange256);
- const __m256i offLimitMask = _mm256_cmpeq_epi16(chunk, outOfRange256);
- chunk = _mm256_blendv_epi8(chunk, questionMark256, offLimitMask);
- }
+ // we're going to read to src[offset..offset+15] (16 bytes)
+ auto loadChunkAt = [=](qptrdiff offset) {
+ __m128i chunk1, chunk2;
+ if constexpr (UseAvx2) {
+ __m256i chunk = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(src + offset));
+ if (Checked) {
+ // See mergeQuestionMarks lambda above for details
+ chunk = _mm256_min_epu16(chunk, outOfRange256);
+ const __m256i offLimitMask = _mm256_cmpeq_epi16(chunk, outOfRange256);
+ chunk = _mm256_blendv_epi8(chunk, questionMark256, offLimitMask);
+ }
- const __m128i chunk2 = _mm256_extracti128_si256(chunk, 1);
- const __m128i chunk1 = _mm256_castsi256_si128(chunk);
-# else
- __m128i chunk1 = _mm_loadu_si128((const __m128i*)(src + offset)); // load
- if (Checked)
+ chunk2 = _mm256_extracti128_si256(chunk, 1);
+ chunk1 = _mm256_castsi256_si128(chunk);
+ } else {
+ chunk1 = _mm_loadu_si128((const __m128i*)(src + offset)); // load
chunk1 = mergeQuestionMarks(chunk1);
- __m128i chunk2 = _mm_loadu_si128((const __m128i*)(src + offset + 8)); // load
- if (Checked)
+ chunk2 = _mm_loadu_si128((const __m128i*)(src + offset + 8)); // load
chunk2 = mergeQuestionMarks(chunk2);
-# endif
+ }
// pack the two vector to 16 x 8bits elements
- const __m128i result = _mm_packus_epi16(chunk1, chunk2);
- _mm_storeu_si128((__m128i*)(dst + offset), result); // store
+ return _mm_packus_epi16(chunk1, chunk2);
+ };
+
+ if (size_t(length) >= sizeof(__m128i)) {
+ // because of possible overlapping, we won't process the last chunk in the loop
+ qptrdiff offset = 0;
+ for ( ; offset + 2 * sizeof(__m128i) < size_t(length); offset += sizeof(__m128i))
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + offset), loadChunkAt(offset));
+
+ // overlapped conversion of the last full chunk and the tail
+ __m128i last1 = loadChunkAt(offset);
+ __m128i last2 = loadChunkAt(length - sizeof(__m128i));
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + offset), last1);
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + length - sizeof(__m128i)), last2);
+ return;
}
# if !defined(__OPTIMIZE_SIZE__)
- // we're going to write to dst[offset..offset+7] (8 bytes)
- if (dst + offset + 7 < e) {
- __m128i chunk = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + offset));
- if (Checked)
- chunk = mergeQuestionMarks(chunk);
-
- // pack, where the upper half is ignored
- const __m128i result = _mm_packus_epi16(chunk, chunk);
- _mm_storel_epi64(reinterpret_cast<__m128i *>(dst + offset), result);
- offset += 8;
- }
+ if (length >= 4) {
+ // this code is fine even for in-place conversion because we load both
+ // before any store
+ if (length >= 8) {
+ __m128i chunk1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src));
+ __m128i chunk2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + length - 8));
+ chunk1 = mergeQuestionMarks(chunk1);
+ chunk2 = mergeQuestionMarks(chunk2);
- // we're going to write to dst[offset..offset+3] (4 bytes)
- if (dst + offset + 3 < e) {
- __m128i chunk = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src + offset));
- if (Checked)
- chunk = mergeQuestionMarks(chunk);
+ // pack, where the upper half is ignored
+ const __m128i result1 = _mm_packus_epi16(chunk1, chunk1);
+ const __m128i result2 = _mm_packus_epi16(chunk2, chunk2);
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(dst), result1);
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(dst + length - 8), result2);
+ } else {
+ __m128i chunk1 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src));
+ __m128i chunk2 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src + length - 4));
+ chunk1 = mergeQuestionMarks(chunk1);
+ chunk2 = mergeQuestionMarks(chunk2);
- // pack, we'll the upper three quarters
- const __m128i result = _mm_packus_epi16(chunk, chunk);
- qToUnaligned(_mm_cvtsi128_si32(result), dst + offset);
- offset += 4;
+ // pack, we'll zero the upper three quarters
+ const __m128i result1 = _mm_packus_epi16(chunk1, chunk1);
+ const __m128i result2 = _mm_packus_epi16(chunk2, chunk2);
+ qToUnaligned(_mm_cvtsi128_si32(result1), dst);
+ qToUnaligned(_mm_cvtsi128_si32(result2), dst + length - 4);
+ }
+ return;
}
length = length % 4;
-# else
- length = length % 16;
-# endif // optimize size
-
- // advance dst, src for tail processing
- dst += offset;
- src += offset;
-
-# if !defined(__OPTIMIZE_SIZE__)
- return UnrollTailLoop<3>::exec(length, [=](int i) {
+ return UnrollTailLoop<3>::exec(length, [=](qsizetype i) {
if (Checked)
dst[i] = (src[i]>0xff) ? '?' : (uchar) src[i];
else
dst[i] = src[i];
});
-# endif
+# else
+ length = length % 16;
+# endif // optimize size
#elif defined(__ARM_NEON__)
- // Refer to the documentation of the SSE2 implementation
- // this use eactly the same method as for SSE except:
+ // Refer to the documentation of the SSE2 implementation.
+ // This uses exactly the same method as for SSE except:
// 1) neon has unsigned comparison
// 2) packing is done to 64 bits (8 x 8bits component).
if (length >= 16) {
- const int chunkCount = length >> 3; // divided by 8
+ const qsizetype chunkCount = length >> 3; // divided by 8
const uint16x8_t questionMark = vdupq_n_u16('?'); // set
const uint16x8_t thresholdMask = vdupq_n_u16(0xff); // set
- for (int i = 0; i < chunkCount; ++i) {
+ for (qsizetype i = 0; i < chunkCount; ++i) {
uint16x8_t chunk = vld1q_u16((uint16_t *)src); // load
src += 8;
@@ -814,6 +1166,8 @@ static void qt_to_latin1_internal(uchar *dst, const char16_t *src, qsizetype len
}
#endif
#if defined(__mips_dsp)
+ static_assert(sizeof(qsizetype) == sizeof(int),
+ "oops, the assembler implementation needs to be called in a loop");
qt_toLatin1_mips_dsp_asm(dst, src, length);
#else
while (length--) {
@@ -826,7 +1180,7 @@ static void qt_to_latin1_internal(uchar *dst, const char16_t *src, qsizetype len
#endif
}
-static void qt_to_latin1(uchar *dst, const char16_t *src, qsizetype length)
+void qt_to_latin1(uchar *dst, const char16_t *src, qsizetype length)
{
qt_to_latin1_internal<true>(dst, src, length);
}
@@ -836,58 +1190,80 @@ void qt_to_latin1_unchecked(uchar *dst, const char16_t *src, qsizetype length)
qt_to_latin1_internal<false>(dst, src, length);
}
-// Unicode case-insensitive comparison
-static int ucstricmp(const QChar *a, const QChar *ae, const QChar *b, const QChar *be)
+// Unicode case-insensitive comparison (argument order matches QStringView)
+Q_NEVER_INLINE static int ucstricmp(qsizetype alen, const char16_t *a, qsizetype blen, const char16_t *b)
{
if (a == b)
- return (ae - be);
-
- const QChar *e = ae;
- if (be - b < ae - a)
- e = a + (be - b);
+ return qt_lencmp(alen, blen);
char32_t alast = 0;
char32_t blast = 0;
- while (a < e) {
+ qsizetype l = qMin(alen, blen);
+ qsizetype i;
+ for (i = 0; i < l; ++i) {
// qDebug() << Qt::hex << alast << blast;
// qDebug() << Qt::hex << "*a=" << *a << "alast=" << alast << "folded=" << foldCase (*a, alast);
// qDebug() << Qt::hex << "*b=" << *b << "blast=" << blast << "folded=" << foldCase (*b, blast);
- int diff = foldCase(a->unicode(), alast) - foldCase(b->unicode(), blast);
+ int diff = foldCase(a[i], alast) - foldCase(b[i], blast);
if ((diff))
return diff;
- ++a;
- ++b;
}
- if (a == ae) {
- if (b == be)
+ if (i == alen) {
+ if (i == blen)
return 0;
return -1;
}
return 1;
}
-// Case-insensitive comparison between a Unicode string and a QLatin1String
-static int ucstricmp(const QChar *a, const QChar *ae, const char *b, const char *be)
+// Case-insensitive comparison between a QStringView and a QLatin1StringView
+// (argument order matches those types)
+Q_NEVER_INLINE static int ucstricmp(qsizetype alen, const char16_t *a, qsizetype blen, const char *b)
{
- auto e = ae;
- if (be - b < ae - a)
- e = a + (be - b);
-
- while (a < e) {
- int diff = foldCase(a->unicode()) - foldCase(char16_t{uchar(*b)});
+ qsizetype l = qMin(alen, blen);
+ qsizetype i;
+ for (i = 0; i < l; ++i) {
+ int diff = foldCase(a[i]) - foldCase(char16_t{uchar(b[i])});
if ((diff))
return diff;
- ++a;
- ++b;
}
- if (a == ae) {
- if (b == be)
+ if (i == alen) {
+ if (i == blen)
return 0;
return -1;
}
return 1;
}
+// Case-insensitive comparison between a Unicode string and a UTF-8 string
+Q_NEVER_INLINE static int ucstricmp8(const char *utf8, const char *utf8end, const QChar *utf16, const QChar *utf16end)
+{
+ auto src1 = reinterpret_cast<const uchar *>(utf8);
+ auto end1 = reinterpret_cast<const uchar *>(utf8end);
+ QStringIterator src2(utf16, utf16end);
+
+ while (src1 < end1 && src2.hasNext()) {
+ char32_t uc1 = 0;
+ char32_t *output = &uc1;
+ uchar b = *src1++;
+ const qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src1, end1);
+ if (res < 0) {
+ // decoding error
+ uc1 = QChar::ReplacementCharacter;
+ } else {
+ uc1 = QChar::toCaseFolded(uc1);
+ }
+
+ char32_t uc2 = QChar::toCaseFolded(src2.next());
+ int diff = uc1 - uc2; // can't underflow
+ if (diff)
+ return diff;
+ }
+
+ // the shorter string sorts first
+ return (end1 > src1) - int(src2.hasNext());
+}
+
#if defined(__mips_dsp)
// From qstring_mips_dsp_asm.S
extern "C" int qt_ucstrncmp_mips_dsp_asm(const char16_t *a,
@@ -896,98 +1272,24 @@ extern "C" int qt_ucstrncmp_mips_dsp_asm(const char16_t *a,
#endif
// Unicode case-sensitive compare two same-sized strings
-static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
+template <StringComparisonMode Mode>
+static int ucstrncmp(const char16_t *a, const char16_t *b, size_t l)
{
-#ifdef __OPTIMIZE_SIZE__
- const QChar *end = a + l;
- while (a < end) {
- if (int diff = (int)a->unicode() - (int)b->unicode())
- return diff;
- ++a;
- ++b;
- }
- return 0;
-#else
-#if defined(__mips_dsp)
+ // This function isn't memcmp() because that can return the wrong sorting
+ // result in little-endian architectures: 0x00ff must sort before 0x0100,
+ // but the bytes in memory are FF 00 and 00 01.
+
+#ifndef __OPTIMIZE_SIZE__
+# if defined(__mips_dsp)
static_assert(sizeof(uint) == sizeof(size_t));
if (l >= 8) {
- return qt_ucstrncmp_mips_dsp_asm(reinterpret_cast<const char16_t*>(a),
- reinterpret_cast<const char16_t*>(b),
- l);
+ return qt_ucstrncmp_mips_dsp_asm(a, b, l);
}
-#endif // __mips_dsp
-#ifdef __SSE2__
- const QChar *end = a + l;
- qptrdiff offset = 0;
-
- // Using the PMOVMSKB instruction, we get two bits for each character
- // we compare.
- int retval;
- auto isDifferent = [a, b, &offset, &retval](__m128i a_data, __m128i b_data) {
- __m128i result = _mm_cmpeq_epi16(a_data, b_data);
- uint mask = ~uint(_mm_movemask_epi8(result));
- if (ushort(mask) == 0)
- return false;
- uint idx = qCountTrailingZeroBits(mask);
- retval = a[offset + idx / 2].unicode() - b[offset + idx / 2].unicode();
- return true;
- };
-
- // we're going to read a[0..15] and b[0..15] (32 bytes)
- for ( ; end - a >= offset + 16; offset += 16) {
-#ifdef __AVX2__
- __m256i a_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(a + offset));
- __m256i b_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(b + offset));
- __m256i result = _mm256_cmpeq_epi16(a_data, b_data);
- uint mask = _mm256_movemask_epi8(result);
-#else
- __m128i a_data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset));
- __m128i a_data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset + 8));
- __m128i b_data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
- __m128i b_data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset + 8));
- __m128i result1 = _mm_cmpeq_epi16(a_data1, b_data1);
- __m128i result2 = _mm_cmpeq_epi16(a_data2, b_data2);
- uint mask = _mm_movemask_epi8(result1) | (_mm_movemask_epi8(result2) << 16);
-#endif
- mask = ~mask;
- if (mask) {
- // found a different character
- uint idx = qCountTrailingZeroBits(mask);
- return a[offset + idx / 2].unicode() - b[offset + idx / 2].unicode();
- }
- }
-
- // we're going to read a[0..7] and b[0..7] (16 bytes)
- if (end - a >= offset + 8) {
- __m128i a_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset));
- __m128i b_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
- if (isDifferent(a_data, b_data))
- return retval;
-
- offset += 8;
- }
-
- // we're going to read a[0..3] and b[0..3] (8 bytes)
- if (end - a >= offset + 4) {
- __m128i a_data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(a + offset));
- __m128i b_data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(b + offset));
- if (isDifferent(a_data, b_data))
- return retval;
-
- offset += 4;
- }
-
- // reset l
- l &= 3;
-
- const auto lambda = [=](size_t i) -> int {
- return a[offset + i].unicode() - b[offset + i].unicode();
- };
- return UnrollTailLoop<3>::exec(l, 0, lambda, lambda);
-#endif
-#if defined(__ARM_NEON__) && defined(Q_PROCESSOR_ARM_64) // vaddv is only available on Aarch64
+# elif defined(__SSE2__)
+ return ucstrncmp_sse2<Mode>(a, b, l);
+# elif defined(__ARM_NEON__)
if (l >= 8) {
- const QChar *end = a + l;
+ const char16_t *end = a + l;
const uint16x8_t mask = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 };
while (end - a > 7) {
uint16x8_t da = vld1q_u16(reinterpret_cast<const uint16_t *>(a));
@@ -996,8 +1298,10 @@ static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
uint8_t r = ~(uint8_t)vaddvq_u16(vandq_u16(vceqq_u16(da, db), mask));
if (r) {
// found a different QChar
+ if (Mode == CompareStringsForEquality)
+ return 1;
uint idx = qCountTrailingZeroBits(r);
- return (int)a[idx].unicode() - (int)b[idx].unicode();
+ return a[idx] - b[idx];
}
a += 8;
b += 8;
@@ -1005,156 +1309,31 @@ static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
l &= 7;
}
const auto lambda = [=](size_t i) -> int {
- return a[i].unicode() - b[i].unicode();
+ return a[i] - b[i];
};
return UnrollTailLoop<7>::exec(l, 0, lambda, lambda);
-#endif // __ARM_NEON__
- if (!l)
- return 0;
-
- // check alignment
- if ((reinterpret_cast<quintptr>(a) & 2) == (reinterpret_cast<quintptr>(b) & 2)) {
- // both addresses have the same alignment
- if (reinterpret_cast<quintptr>(a) & 2) {
- // both addresses are not aligned to 4-bytes boundaries
- // compare the first character
- if (*a != *b)
- return a->unicode() - b->unicode();
- --l;
- ++a;
- ++b;
-
- // now both addresses are 4-bytes aligned
- }
+# endif // MIPS DSP or __SSE2__ or __ARM_NEON__
+#endif // __OPTIMIZE_SIZE__
- // both addresses are 4-bytes aligned
- // do a fast 32-bit comparison
- const quint32 *da = reinterpret_cast<const quint32 *>(a);
- const quint32 *db = reinterpret_cast<const quint32 *>(b);
- const quint32 *e = da + (l >> 1);
- for ( ; da != e; ++da, ++db) {
- if (*da != *db) {
- a = reinterpret_cast<const QChar *>(da);
- b = reinterpret_cast<const QChar *>(db);
- if (*a != *b)
- return a->unicode() - b->unicode();
- return a[1].unicode() - b[1].unicode();
- }
- }
+ if (Mode == CompareStringsForEquality || QSysInfo::ByteOrder == QSysInfo::BigEndian)
+ return memcmp(a, b, l * sizeof(char16_t));
- // do we have a tail?
- a = reinterpret_cast<const QChar *>(da);
- b = reinterpret_cast<const QChar *>(db);
- return (l & 1) ? a->unicode() - b->unicode() : 0;
- } else {
- // one of the addresses isn't 4-byte aligned but the other is
- const QChar *e = a + l;
- for ( ; a != e; ++a, ++b) {
- if (*a != *b)
- return a->unicode() - b->unicode();
- }
+ for (size_t i = 0; i < l; ++i) {
+ if (int diff = a[i] - b[i])
+ return diff;
}
return 0;
-#endif
}
-static int ucstrncmp(const QChar *a, const uchar *c, size_t l)
+template <StringComparisonMode Mode>
+static int ucstrncmp(const char16_t *a, const char *b, size_t l)
{
- const char16_t *uc = reinterpret_cast<const char16_t *>(a);
+ const uchar *c = reinterpret_cast<const uchar *>(b);
+ const char16_t *uc = a;
const char16_t *e = uc + l;
-#ifdef __SSE2__
- __m128i nullmask = _mm_setzero_si128();
- qptrdiff offset = 0;
-
-# if !defined(__OPTIMIZE_SIZE__)
- // Using the PMOVMSKB instruction, we get two bits for each character
- // we compare.
- int retval;
- auto isDifferent = [uc, c, &offset, &retval](__m128i a_data, __m128i b_data) {
- __m128i result = _mm_cmpeq_epi16(a_data, b_data);
- uint mask = ~uint(_mm_movemask_epi8(result));
- if (ushort(mask) == 0)
- return false;
- uint idx = qCountTrailingZeroBits(mask);
- retval = uc[offset + idx / 2] - c[offset + idx / 2];
- return true;
- };
-# endif
-
- // we're going to read uc[offset..offset+15] (32 bytes)
- // and c[offset..offset+15] (16 bytes)
- for ( ; uc + offset + 15 < e; offset += 16) {
- // similar to fromLatin1_helper:
- // load 16 bytes of Latin 1 data
- __m128i chunk = _mm_loadu_si128((const __m128i*)(c + offset));
-
-# ifdef __AVX2__
- // expand Latin 1 data via zero extension
- __m256i ldata = _mm256_cvtepu8_epi16(chunk);
-
- // load UTF-16 data and compare
- __m256i ucdata = _mm256_loadu_si256((const __m256i*)(uc + offset));
- __m256i result = _mm256_cmpeq_epi16(ldata, ucdata);
-
- uint mask = ~_mm256_movemask_epi8(result);
-# else
- // expand via unpacking
- __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullmask);
- __m128i secondHalf = _mm_unpackhi_epi8(chunk, nullmask);
-
- // load UTF-16 data and compare
- __m128i ucdata1 = _mm_loadu_si128((const __m128i*)(uc + offset));
- __m128i ucdata2 = _mm_loadu_si128((const __m128i*)(uc + offset + 8));
- __m128i result1 = _mm_cmpeq_epi16(firstHalf, ucdata1);
- __m128i result2 = _mm_cmpeq_epi16(secondHalf, ucdata2);
-
- uint mask = ~(_mm_movemask_epi8(result1) | _mm_movemask_epi8(result2) << 16);
-# endif
- if (mask) {
- // found a different character
- uint idx = qCountTrailingZeroBits(mask);
- return uc[offset + idx / 2] - c[offset + idx / 2];
- }
- }
-
-# if !defined(__OPTIMIZE_SIZE__)
- // we'll read uc[offset..offset+7] (16 bytes) and c[offset..offset+7] (8 bytes)
- if (uc + offset + 7 < e) {
- // same, but we're using an 8-byte load
- __m128i secondHalf = mm_load8_zero_extend(c + offset);
-
- __m128i ucdata = _mm_loadu_si128((const __m128i*)(uc + offset));
- if (isDifferent(ucdata, secondHalf))
- return retval;
-
- // still matched
- offset += 8;
- }
-
- enum { MaxTailLength = 3 };
- // we'll read uc[offset..offset+3] (8 bytes) and c[offset..offset+3] (4 bytes)
- if (uc + offset + 3 < e) {
- __m128i chunk = _mm_cvtsi32_si128(qFromUnaligned<int>(c + offset));
- __m128i secondHalf = _mm_unpacklo_epi8(chunk, nullmask);
-
- __m128i ucdata = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(uc + offset));
- if (isDifferent(ucdata, secondHalf))
- return retval;
-
- // still matched
- offset += 4;
- }
-# endif // optimize size
-
- // reset uc and c
- uc += offset;
- c += offset;
-
-# if !defined(__OPTIMIZE_SIZE__)
- const auto lambda = [=](size_t i) { return uc[i] - char16_t(c[i]); };
- return UnrollTailLoop<MaxTailLength>::exec(e - uc, 0, lambda, lambda);
-# endif
+#if defined(__SSE2__) && !defined(__OPTIMIZE_SIZE__)
+ return ucstrncmp_sse2<Mode>(uc, c, l);
#endif
while (uc < e) {
@@ -1167,101 +1346,114 @@ static int ucstrncmp(const QChar *a, const uchar *c, size_t l)
return 0;
}
-template <typename Number>
-Q_DECL_CONSTEXPR int lencmp(Number lhs, Number rhs) noexcept
+// Unicode case-sensitive equality
+template <typename Char2>
+static bool ucstreq(const char16_t *a, size_t alen, const Char2 *b)
{
- return lhs == rhs ? 0 :
- lhs > rhs ? 1 :
- /* else */ -1 ;
+ if constexpr (std::is_same_v<decltype(a), decltype(b)>) {
+ if (a == b)
+ return true;
+ }
+ return ucstrncmp<CompareStringsForEquality>(a, b, alen) == 0;
}
// Unicode case-sensitive comparison
-static int ucstrcmp(const QChar *a, size_t alen, const QChar *b, size_t blen)
+template <typename Char2>
+static int ucstrcmp(const char16_t *a, size_t alen, const Char2 *b, size_t blen)
{
- if (a == b && alen == blen)
- return 0;
+ if constexpr (std::is_same_v<decltype(a), decltype(b)>) {
+ if (a == b && alen == blen)
+ return 0;
+ }
const size_t l = qMin(alen, blen);
- int cmp = ucstrncmp(a, b, l);
- return cmp ? cmp : lencmp(alen, blen);
+ int cmp = ucstrncmp<CompareStringsForOrdering>(a, b, l);
+ return cmp ? cmp : qt_lencmp(alen, blen);
}
-static int ucstrcmp(const QChar *a, size_t alen, const char *b, size_t blen)
+using CaseInsensitiveL1 = QtPrivate::QCaseInsensitiveLatin1Hash;
+
+static int latin1nicmp(const char *lhsChar, qsizetype lSize, const char *rhsChar, qsizetype rSize)
{
- const size_t l = qMin(alen, blen);
- const int cmp = ucstrncmp(a, reinterpret_cast<const uchar*>(b), l);
- return cmp ? cmp : lencmp(alen, blen);
-}
-
-static int latin1nicmp(const char *lhsChar, int lSize, const char *rhsChar, int rSize)
-{
- constexpr uchar latin1Lower[256] = {
- 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
- 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
- 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
- 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
- 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x5e,0x5f,
- 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
- 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
- 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
- 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
- 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
- // 0xd7 (multiplication sign) and 0xdf (sz ligature) complicate life
- 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
- 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xd7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xdf,
- 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
- 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
- };
- // We're called with QLatin1String's .data() and .size():
+ // We're called with QLatin1StringView's .data() and .size():
Q_ASSERT(lSize >= 0 && rSize >= 0);
if (!lSize)
return rSize ? -1 : 0;
if (!rSize)
return 1;
- const int size = std::min(lSize, rSize);
-
- const uchar *lhs = reinterpret_cast<const uchar *>(lhsChar);
- const uchar *rhs = reinterpret_cast<const uchar *>(rhsChar);
- Q_ASSERT(lhs && rhs); // since both lSize and rSize are positive
- for (int i = 0; i < size; i++) {
- Q_ASSERT(lhs[i] && rhs[i]);
- if (int res = latin1Lower[lhs[i]] - latin1Lower[rhs[i]])
+ const qsizetype size = std::min(lSize, rSize);
+
+ Q_ASSERT(lhsChar && rhsChar); // since both lSize and rSize are positive
+ for (qsizetype i = 0; i < size; i++) {
+ if (int res = CaseInsensitiveL1::difference(lhsChar[i], rhsChar[i]))
return res;
}
- return lencmp(lSize, rSize);
+ return qt_lencmp(lSize, rSize);
}
-static int qt_compare_strings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::equalStrings(QStringView lhs, QStringView rhs) noexcept
{
- if (cs == Qt::CaseSensitive)
- return ucstrcmp(lhs.begin(), lhs.size(), rhs.begin(), rhs.size());
- else
- return ucstricmp(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
+ Q_ASSERT(lhs.size() == rhs.size());
+ return ucstreq(lhs.utf16(), lhs.size(), rhs.utf16());
}
-static int qt_compare_strings(QStringView lhs, QLatin1String rhs, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::equalStrings(QStringView lhs, QLatin1StringView rhs) noexcept
{
- if (cs == Qt::CaseSensitive)
- return ucstrcmp(lhs.begin(), lhs.size(), rhs.begin(), rhs.size());
- else
- return ucstricmp(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
+ Q_ASSERT(lhs.size() == rhs.size());
+ return ucstreq(lhs.utf16(), lhs.size(), rhs.latin1());
}
-static int qt_compare_strings(QLatin1String lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::equalStrings(QLatin1StringView lhs, QStringView rhs) noexcept
{
- return -qt_compare_strings(rhs, lhs, cs);
+ return QtPrivate::equalStrings(rhs, lhs);
}
-static int qt_compare_strings(QLatin1String lhs, QLatin1String rhs, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::equalStrings(QLatin1StringView lhs, QLatin1StringView rhs) noexcept
{
- if (lhs.isEmpty())
- return lencmp(0, rhs.size());
- if (cs == Qt::CaseInsensitive)
- return latin1nicmp(lhs.data(), lhs.size(), rhs.data(), rhs.size());
- const auto l = std::min(lhs.size(), rhs.size());
- int r = qstrncmp(lhs.data(), rhs.data(), l);
- return r ? r : lencmp(lhs.size(), rhs.size());
+ Q_ASSERT(lhs.size() == rhs.size());
+ return (!lhs.size() || memcmp(lhs.data(), rhs.data(), lhs.size()) == 0);
+}
+
+bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QStringView rhs) noexcept
+{
+ return QUtf8::compareUtf8(lhs, rhs) == 0;
+}
+
+bool QtPrivate::equalStrings(QStringView lhs, QBasicUtf8StringView<false> rhs) noexcept
+{
+ return QtPrivate::equalStrings(rhs, lhs);
+}
+
+bool QtPrivate::equalStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs) noexcept
+{
+ return QUtf8::compareUtf8(QByteArrayView(rhs), lhs) == 0;
+}
+
+bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs) noexcept
+{
+ return QtPrivate::equalStrings(rhs, lhs);
+}
+
+bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs) noexcept
+{
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED) || defined(QT_STATIC)
+ Q_ASSERT(lhs.size() == rhs.size());
+#else
+ // operator== didn't enforce size prior to Qt 6.2
+ if (lhs.size() != rhs.size())
+ return false;
+#endif
+ return (!lhs.size() || memcmp(lhs.data(), rhs.data(), lhs.size()) == 0);
+}
+
+bool QAnyStringView::equal(QAnyStringView lhs, QAnyStringView rhs) noexcept
+{
+ if (lhs.size() != rhs.size() && lhs.isUtf8() == rhs.isUtf8())
+ return false;
+ return lhs.visit([rhs](auto lhs) {
+ return rhs.visit([lhs](auto rhs) {
+ return QtPrivate::equalStrings(lhs, rhs);
+ });
+ });
}
/*!
@@ -1271,16 +1463,19 @@ static int qt_compare_strings(QLatin1String lhs, QLatin1String rhs, Qt::CaseSens
Returns an integer that compares to 0 as \a lhs compares to \a rhs.
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
Case-sensitive comparison is based exclusively on the numeric Unicode values
of the characters and is very fast, but is not what a human would expect.
Consider sorting user-visible strings with QString::localeAwareCompare().
+
+ \sa {Comparing Strings}
*/
int QtPrivate::compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
{
- return qt_compare_strings(lhs, rhs, cs);
+ if (cs == Qt::CaseSensitive)
+ return ucstrcmp(lhs.utf16(), lhs.size(), rhs.utf16(), rhs.size());
+ return ucstricmp(lhs.size(), lhs.utf16(), rhs.size(), rhs.utf16());
}
/*!
@@ -1291,36 +1486,41 @@ int QtPrivate::compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitiv
Returns an integer that compares to 0 as \a lhs compares to \a rhs.
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
Case-sensitive comparison is based exclusively on the numeric Unicode values
of the characters and is very fast, but is not what a human would expect.
Consider sorting user-visible strings with QString::localeAwareCompare().
+
+ \sa {Comparing Strings}
*/
-int QtPrivate::compareStrings(QStringView lhs, QLatin1String rhs, Qt::CaseSensitivity cs) noexcept
+int QtPrivate::compareStrings(QStringView lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs) noexcept
{
- return qt_compare_strings(lhs, rhs, cs);
+ if (cs == Qt::CaseSensitive)
+ return ucstrcmp(lhs.utf16(), lhs.size(), rhs.latin1(), rhs.size());
+ return ucstricmp(lhs.size(), lhs.utf16(), rhs.size(), rhs.latin1());
}
/*!
\relates QStringView
\internal
- \since 5.10
+ \since 6.0
\overload
+*/
+int QtPrivate::compareStrings(QStringView lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs) noexcept
+{
+ return -compareStrings(rhs, lhs, cs);
+}
- Returns an integer that compares to 0 as \a lhs compares to \a rhs.
-
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
-
- Case-sensitive comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would expect.
- Consider sorting user-visible strings with QString::localeAwareCompare().
+/*!
+ \relates QStringView
+ \internal
+ \since 5.10
+ \overload
*/
-int QtPrivate::compareStrings(QLatin1String lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
+int QtPrivate::compareStrings(QLatin1StringView lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
{
- return qt_compare_strings(lhs, rhs, cs);
+ return -compareStrings(rhs, lhs, cs);
}
/*!
@@ -1331,53 +1531,130 @@ int QtPrivate::compareStrings(QLatin1String lhs, QStringView rhs, Qt::CaseSensit
Returns an integer that compares to 0 as \a lhs compares to \a rhs.
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
Case-sensitive comparison is based exclusively on the numeric Latin-1 values
of the characters and is very fast, but is not what a human would expect.
Consider sorting user-visible strings with QString::localeAwareCompare().
+
+ \sa {Comparing Strings}
*/
-int QtPrivate::compareStrings(QLatin1String lhs, QLatin1String rhs, Qt::CaseSensitivity cs) noexcept
+int QtPrivate::compareStrings(QLatin1StringView lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs) noexcept
{
- return qt_compare_strings(lhs, rhs, cs);
+ if (lhs.isEmpty())
+ return qt_lencmp(qsizetype(0), rhs.size());
+ if (cs == Qt::CaseInsensitive)
+ return latin1nicmp(lhs.data(), lhs.size(), rhs.data(), rhs.size());
+ const auto l = std::min(lhs.size(), rhs.size());
+ int r = memcmp(lhs.data(), rhs.data(), l);
+ return r ? r : qt_lencmp(lhs.size(), rhs.size());
}
-#define REHASH(a) \
- if (sl_minus_1 < sizeof(std::size_t) * CHAR_BIT) \
- hashHaystack -= std::size_t(a) << sl_minus_1; \
- hashHaystack <<= 1
+/*!
+ \relates QStringView
+ \internal
+ \since 6.0
+ \overload
+*/
+int QtPrivate::compareStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs) noexcept
+{
+ return -QUtf8::compareUtf8(QByteArrayView(rhs), lhs, cs);
+}
+
+/*!
+ \relates QStringView
+ \internal
+ \since 6.0
+ \overload
+*/
+int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
+{
+ if (cs == Qt::CaseSensitive)
+ return QUtf8::compareUtf8(lhs, rhs);
+ return ucstricmp8(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
+}
-inline bool qIsUpper(char ch)
+/*!
+ \relates QStringView
+ \internal
+ \since 6.0
+ \overload
+*/
+int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs) noexcept
{
- return ch >= 'A' && ch <= 'Z';
+ return -compareStrings(rhs, lhs, cs);
}
-inline bool qIsDigit(char ch)
+/*!
+ \relates QStringView
+ \internal
+ \since 6.0
+ \overload
+*/
+int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs) noexcept
{
- return ch >= '0' && ch <= '9';
+ return QUtf8::compareUtf8(QByteArrayView(lhs), QByteArrayView(rhs), cs);
}
-inline char qToLower(char ch)
+int QAnyStringView::compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSensitivity cs) noexcept
{
- if (ch >= 'A' && ch <= 'Z')
- return ch - 'A' + 'a';
- else
- return ch;
+ return lhs.visit([rhs, cs](auto lhs) {
+ return rhs.visit([lhs, cs](auto rhs) {
+ return QtPrivate::compareStrings(lhs, rhs, cs);
+ });
+ });
}
+// ### Qt 7: do not allow anything but ASCII digits
+// in arg()'s replacements.
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+static bool supportUnicodeDigitValuesInArg()
+{
+ static const bool result = []() {
+ static const char supportUnicodeDigitValuesEnvVar[]
+ = "QT_USE_UNICODE_DIGIT_VALUES_IN_STRING_ARG";
+
+ if (qEnvironmentVariableIsSet(supportUnicodeDigitValuesEnvVar))
+ return qEnvironmentVariableIntValue(supportUnicodeDigitValuesEnvVar) != 0;
+
+#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0) // keep it in sync with the test
+ return true;
+#else
+ return false;
+#endif
+ }();
+
+ return result;
+}
+#endif
+
+static int qArgDigitValue(QChar ch) noexcept
+{
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ if (supportUnicodeDigitValuesInArg())
+ return ch.digitValue();
+#endif
+ if (ch >= u'0' && ch <= u'9')
+ return int(ch.unicode() - u'0');
+ return -1;
+}
+
+#if QT_CONFIG(regularexpression)
+Q_DECL_COLD_FUNCTION
+void qtWarnAboutInvalidRegularExpression(const QString &pattern, const char *where);
+#endif
/*!
\macro QT_RESTRICTED_CAST_FROM_ASCII
\relates QString
- Defining this macro disables most automatic conversions from source
- literals and 8-bit data to unicode QStrings, but allows the use of
+ Disables most automatic conversions from source literals and 8-bit data
+ to unicode QStrings, but allows the use of
the \c{QChar(char)} and \c{QString(const char (&ch)[N]} constructors,
- and the \c{QString::operator=(const char (&ch)[N])} assignment operator
- giving most of the type-safety benefits of \c QT_NO_CAST_FROM_ASCII
+ and the \c{QString::operator=(const char (&ch)[N])} assignment operator.
+ This gives most of the type-safety benefits of \l QT_NO_CAST_FROM_ASCII
but does not require user code to wrap character and string literals
- with QLatin1Char, QLatin1String or similar.
+ with QLatin1Char, QLatin1StringView or similar.
Using this macro together with source strings outside the 7-bit range,
non-literals, or literals with embedded NUL characters is undefined.
@@ -1388,19 +1665,24 @@ inline char qToLower(char ch)
/*!
\macro QT_NO_CAST_FROM_ASCII
\relates QString
+ \relates QChar
- Disables automatic conversions from 8-bit strings (char *) to unicode QStrings
+ Disables automatic conversions from 8-bit strings (\c{char *}) to Unicode
+ QStrings, as well as from 8-bit \c{char} types (\c{char} and
+ \c{unsigned char}) to QChar.
- \sa QT_NO_CAST_TO_ASCII, QT_RESTRICTED_CAST_FROM_ASCII, QT_NO_CAST_FROM_BYTEARRAY
+ \sa QT_NO_CAST_TO_ASCII, QT_RESTRICTED_CAST_FROM_ASCII,
+ QT_NO_CAST_FROM_BYTEARRAY
*/
/*!
\macro QT_NO_CAST_TO_ASCII
\relates QString
- disables automatic conversion from QString to 8-bit strings (char *)
+ Disables automatic conversion from QString to 8-bit strings (\c{char *}).
- \sa QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII, QT_NO_CAST_FROM_BYTEARRAY
+ \sa QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII,
+ QT_NO_CAST_FROM_BYTEARRAY
*/
/*!
@@ -1428,10 +1710,18 @@ inline char qToLower(char ch)
\ingroup shared
\ingroup string-processing
+ \compares strong
+ \compareswith strong QChar QLatin1StringView {const char16_t *} \
+ QStringView QUtf8StringView
+ \endcompareswith
+ \compareswith strong QByteArray QByteArrayView {const char *}
+ When comparing with byte arrays, their content is interpreted as utf-8.
+ \endcompareswith
+
QString stores a string of 16-bit \l{QChar}s, where each QChar
corresponds to one UTF-16 code unit. (Unicode characters
with code values above 65535 are stored using surrogate pairs,
- i.e., two consecutive \l{QChar}s.)
+ that is, two consecutive \l{QChar}s.)
\l{Unicode} is an international standard that supports most of the
writing systems in use today. It is a superset of US-ASCII (ANSI
@@ -1447,17 +1737,15 @@ inline char qToLower(char ch)
store raw bytes and traditional 8-bit '\\0'-terminated strings.
For most purposes, QString is the class you want to use. It is
used throughout the Qt API, and the Unicode support ensures that
- your applications will be easy to translate if you want to expand
- your application's market at some point. The two main cases where
- QByteArray is appropriate are when you need to store raw binary
- data, and when memory conservation is critical (like in embedded
- systems).
-
- \tableofcontents
+ your applications are easy to translate if you want to expand
+ your application's market at some point. Two prominent cases
+ where QByteArray is appropriate are when you need to store raw
+ binary data, and when memory conservation is critical (like in
+ embedded systems).
- \section1 Initializing a String
+ \section1 Initializing a string
- One way to initialize a QString is simply to pass a \c{const char
+ One way to initialize a QString is to pass a \c{const char
*} to its constructor. For example, the following code creates a
QString of size 5 containing the data "Hello":
@@ -1468,23 +1756,24 @@ inline char qToLower(char ch)
In all of the QString functions that take \c{const char *}
parameters, the \c{const char *} is interpreted as a classic
- C-style '\\0'-terminated string encoded in UTF-8. It is legal for
- the \c{const char *} parameter to be \nullptr.
+ C-style \c{'\\0'}-terminated string. Except where the function's
+ name overtly indicates some other encoding, such \c{const char *}
+ parameters are assumed to be encoded in UTF-8.
You can also provide string data as an array of \l{QChar}s:
\snippet qstring/main.cpp 1
QString makes a deep copy of the QChar data, so you can modify it
- later without experiencing side effects. (If for performance
- reasons you don't want to take a deep copy of the character data,
- use QString::fromRawData() instead.)
+ later without experiencing side effects. You can avoid taking a
+ deep copy of the character data by using QStringView or
+ QString::fromRawData() instead.
Another approach is to set the size of the string using resize()
and to initialize the data character per character. QString uses
0-based indexes, just like C++ arrays. To access the character at
a particular index position, you can use \l operator[](). On
- non-const strings, \l operator[]() returns a reference to a
+ non-\c{const} strings, \l operator[]() returns a reference to a
character that can be used on the left side of an assignment. For
example:
@@ -1495,9 +1784,9 @@ inline char qToLower(char ch)
\snippet qstring/main.cpp 3
- The at() function can be faster than \l operator[](), because it
+ The at() function can be faster than \l operator[]() because it
never causes a \l{deep copy} to occur. Alternatively, use the
- left(), right(), or mid() functions to extract several characters
+ first(), last(), or sliced() functions to extract several characters
at a time.
A QString can embed '\\0' characters (QChar::Null). The size()
@@ -1517,11 +1806,11 @@ inline char qToLower(char ch)
You can also pass string literals to functions that take QStrings
as arguments, invoking the QString(const char *)
constructor. Similarly, you can pass a QString to a function that
- takes a \c{const char *} argument using the \l qPrintable() macro
+ takes a \c{const char *} argument using the \l qPrintable() macro,
which returns the given QString as a \c{const char *}. This is
equivalent to calling <QString>.toLocal8Bit().constData().
- \section1 Manipulating String Data
+ \section1 Manipulating string data
QString provides the following basic functions for modifying the
character data: append(), prepend(), insert(), replace(), and
@@ -1529,32 +1818,62 @@ inline char qToLower(char ch)
\snippet qstring/main.cpp 5
+ In the above example, the replace() function's first two arguments are the
+ position from which to start replacing and the number of characters that
+ should be replaced.
+
+ When data-modifying functions increase the size of the string,
+ QString may reallocate the memory in which it holds its data. When
+ this happens, QString expands by more than it immediately needs so as
+ to have space for further expansion without reallocation until the size
+ of the string has significantly increased.
+
+ The insert(), remove(), and, when replacing a sub-string with one of
+ different size, replace() functions can be slow (\l{linear time}) for
+ large strings because they require moving many characters in the string
+ by at least one position in memory.
+
If you are building a QString gradually and know in advance
approximately how many characters the QString will contain, you
can call reserve(), asking QString to preallocate a certain amount
of memory. You can also call capacity() to find out how much
- memory QString actually allocated.
-
- The replace() and remove() functions' first two arguments are the
- position from which to start erasing and the number of characters
- that should be erased. If you want to replace all occurrences of
- a particular substring with another, use one of the two-parameter
- replace() overloads.
-
- A frequent requirement is to remove whitespace characters from a
- string ('\\n', '\\t', ' ', etc.). If you want to remove whitespace
- from both ends of a QString, use the trimmed() function. If you
- want to remove whitespace from both ends and replace multiple
- consecutive whitespaces with a single space character within the
- string, use simplified().
+ memory the QString actually has allocated.
+
+ QString provides \l{STL-style iterators} (QString::const_iterator and
+ QString::iterator). In practice, iterators are handy when working with
+ generic algorithms provided by the C++ standard library.
+
+ \note Iterators over a QString, and references to individual characters
+ within one, cannot be relied on to remain valid when any non-\c{const}
+ method of the QString is called. Accessing such an iterator or reference
+ after the call to a non-\c{const} method leads to undefined behavior. When
+ stability for iterator-like functionality is required, you should use
+ indexes instead of iterators, as they are not tied to QString's internal
+ state and thus do not get invalidated.
+
+ \note Due to \l{implicit sharing}, the first non-\c{const} operator or
+ function used on a given QString may cause it to internally perform a deep
+ copy of its data. This invalidates all iterators over the string and
+ references to individual characters within it. Do not call non-const
+ functions while keeping iterators. Accessing an iterator or reference
+ after it has been invalidated leads to undefined behavior. See the
+ \l{Implicit sharing iterator problem} section for more information.
+
+ A frequent requirement is to remove or simplify the spacing between
+ visible characters in a string. The characters that make up that spacing
+ are those for which \l {QChar::}{isSpace()} returns \c true, such as
+ the simple space \c{' '}, the horizontal tab \c{'\\t'} and the newline \c{'\\n'}.
+ To obtain a copy of a string leaving out any spacing from its start and end,
+ use \l trimmed(). To also replace each sequence of spacing characters within
+ the string with a simple space, \c{' '}, use \l simplified().
If you want to find all occurrences of a particular character or
substring in a QString, use the indexOf() or lastIndexOf()
- functions. The former searches forward starting from a given index
- position, the latter searches backward. Both return the index
- position of the character or substring if they find it; otherwise,
- they return -1. For example, here is a typical loop that finds all
- occurrences of a particular substring:
+ functions.The former searches forward, the latter searches backward.
+ Either can be told an index position from which to start their search.
+ Each returns the index position of the character or substring if they
+ find it; otherwise, they return -1. For example, here is a typical loop
+ that finds all occurrences of a particular substring:
\snippet qstring/main.cpp 6
@@ -1563,41 +1882,57 @@ inline char qToLower(char ch)
setNum() functions, the number() static functions, and the
toInt(), toDouble(), and similar functions.
- To get an upper- or lowercase version of a string use toUpper() or
+ To get an uppercase or lowercase version of a string, use toUpper() or
toLower().
Lists of strings are handled by the QStringList class. You can
split a string into a list of strings using the split() function,
and join a list of strings into a single string with an optional
- separator using QStringList::join(). You can obtain a list of
- strings from a string list that contain a particular substring or
- that match a particular QRegularExpression using the QStringList::filter()
- function.
+ separator using QStringList::join(). You can obtain a filtered list
+ from a string list by selecting the entries in it that contain a
+ particular substring or match a particular QRegularExpression.
+ See QStringList::filter() for details.
- \section1 Querying String Data
+ \section1 Querying string data
- If you want to see if a QString starts or ends with a particular
- substring use startsWith() or endsWith(). If you simply want to
- check whether a QString contains a particular character or
- substring, use the contains() function. If you want to find out
- how many times a particular character or substring occurs in the
- string, use count().
-
- QStrings can be compared using overloaded operators such as \l
- operator<(), \l operator<=(), \l operator==(), \l operator>=(),
- and so on. Note that the comparison is based exclusively on the
- numeric Unicode values of the characters. It is very fast, but is
- not what a human would expect; the QString::localeAwareCompare()
- function is a better choice for sorting user-interface strings.
+ To see if a QString starts or ends with a particular substring, use
+ startsWith() or endsWith(). To check whether a QString contains a
+ specific character or substring, use the contains() function. To
+ find out how many times a particular character or substring occurs
+ in a string, use count().
To obtain a pointer to the actual character data, call data() or
constData(). These functions return a pointer to the beginning of
the QChar data. The pointer is guaranteed to remain valid until a
- non-const function is called on the QString.
+ non-\c{const} function is called on the QString.
+
+ \section2 Comparing strings
+
+ QStrings can be compared using overloaded operators such as \l
+ operator<(), \l operator<=(), \l operator==(), \l operator>=(),
+ and so on. The comparison is based exclusively on the lexicographical
+ order of the two strings, seen as sequences of UTF-16 code units.
+ It is very fast but is not what a human would expect; the
+ QString::localeAwareCompare() function is usually a better choice for
+ sorting user-interface strings, when such a comparison is available.
+
+ When Qt is linked with the ICU library (which it usually is), its
+ locale-aware sorting is used. Otherwise, platform-specific solutions
+ are used:
+ \list
+ \li On Windows, localeAwareCompare() uses the current user locale,
+ as set in the \uicontrol{regional} and \uicontrol{language}
+ options portion of \uicontrol{Control Panel}.
+ \li On \macos and iOS, \l localeAwareCompare() compares according
+ to the \uicontrol{Order for sorted lists} setting in the
+ \uicontrol{International preferences} panel.
+ \li On other Unix-like systems, the comparison falls back to the
+ system library's \c strcoll().
+ \endlist
- \section1 Converting Between encoded strings data and QString
+ \section1 Converting between encoded string data and QString
- QString provides the following three functions that return a
+ QString provides the following functions that return a
\c{const char *} version of the string as QByteArray: toUtf8(),
toLatin1(), and toLocal8Bit().
@@ -1622,26 +1957,21 @@ inline char qToLower(char ch)
Latin-1, but there is always the risk that an implicit conversion
from or to \c{const char *} is done using the wrong 8-bit
encoding. To minimize these risks, you can turn off these implicit
- conversions by defining the following two preprocessor symbols:
+ conversions by defining some of the following preprocessor symbols:
\list
- \li \c QT_NO_CAST_FROM_ASCII disables automatic conversions from
+ \li \l QT_NO_CAST_FROM_ASCII disables automatic conversions from
C string literals and pointers to Unicode.
- \li \c QT_RESTRICTED_CAST_FROM_ASCII allows automatic conversions
- from C characters and character arrays, but disables automatic
+ \li \l QT_RESTRICTED_CAST_FROM_ASCII allows automatic conversions
+ from C characters and character arrays but disables automatic
conversions from character pointers to Unicode.
- \li \c QT_NO_CAST_TO_ASCII disables automatic conversion from QString
+ \li \l QT_NO_CAST_TO_ASCII disables automatic conversion from QString
to C strings.
\endlist
- One way to define these preprocessor symbols globally for your
- application is to add the following entry to your \l {Creating Project Files}{qmake project file}:
-
- \snippet code/src_corelib_text_qstring.cpp 0
-
You then need to explicitly call fromUtf8(), fromLatin1(),
or fromLocal8Bit() to construct a QString from an
- 8-bit string, or use the lightweight QLatin1String class, for
+ 8-bit string, or use the lightweight QLatin1StringView class. For
example:
\snippet code/src_corelib_text_qstring.cpp 1
@@ -1662,7 +1992,7 @@ inline char qToLower(char ch)
\snippet qstring/main.cpp 7
- The \c result variable, is a normal variable allocated on the
+ The \c result variable is a normal variable allocated on the
stack. When \c return is called, and because we're returning by
value, the copy constructor is called and a copy of the string is
returned. No actual copying takes place thanks to the implicit
@@ -1670,12 +2000,12 @@ inline char qToLower(char ch)
\endtable
- \section1 Distinction Between Null and Empty Strings
+ \section1 Distinction between null and empty strings
- For historical reasons, QString distinguishes between a null
- string and an empty string. A \e null string is a string that is
+ For historical reasons, QString distinguishes between null
+ and empty strings. A \e null string is a string that is
initialized using QString's default constructor or by passing
- (const char *)0 to the constructor. An \e empty string is any
+ \nullptr to the constructor. An \e empty string is any
string with size 0. A null string is always empty, but an empty
string isn't necessarily null:
@@ -1683,43 +2013,46 @@ inline char qToLower(char ch)
All functions except isNull() treat null strings the same as empty
strings. For example, toUtf8().constData() returns a valid pointer
- (\e not nullptr) to a '\\0' character for a null string. We
+ (not \nullptr) to a '\\0' character for a null string. We
recommend that you always use the isEmpty() function and avoid isNull().
- \section1 Argument Formats
+ \section1 Number formats
- In member functions where an argument \e format can be specified
- (e.g., arg(), number()), the argument \e format can be one of the
- following:
+ When a QString::arg() \c{'%'} format specifier includes the \c{'L'} locale
+ qualifier, and the base is ten (its default), the default locale is
+ used. This can be set using \l{QLocale::setDefault()}. For more refined
+ control of localized string representations of numbers, see
+ QLocale::toString(). All other number formatting done by QString follows the
+ C locale's representation of numbers.
- \table
- \header \li Format \li Meaning
- \row \li \c e \li format as [-]9.9e[+|-]999
- \row \li \c E \li format as [-]9.9E[+|-]999
- \row \li \c f \li format as [-]9.9
- \row \li \c g \li use \c e or \c f format, whichever is the most concise
- \row \li \c G \li use \c E or \c f format, whichever is the most concise
- \endtable
+ When QString::arg() applies left-padding to numbers, the fill character
+ \c{'0'} is treated specially. If the number is negative, its minus sign
+ appears before the zero-padding. If the field is localized, the
+ locale-appropriate zero character is used in place of \c{'0'}. For
+ floating-point numbers, this special treatment only applies if the number is
+ finite.
- A \e precision is also specified with the argument \e format. For
- the 'e', 'E', and 'f' formats, the \e precision represents the
- number of digits \e after the decimal point. For the 'g' and 'G'
- formats, the \e precision represents the maximum number of
- significant digits (trailing zeroes are omitted).
+ \section2 Floating-point formats
- \section1 More Efficient String Construction
+ In member functions (for example, arg() and number()) that format floating-point
+ numbers (\c float or \c double) as strings, the representation used can be
+ controlled by a choice of \e format and \e precision, whose meanings are as
+ for \l {QLocale::toString(double, char, int)}.
- Many strings are known at compile time. But the trivial
- constructor QString("Hello"), will copy the contents of the string,
- treating the contents as Latin-1. To avoid this one can use the
- QStringLiteral macro to directly create the required data at compile
- time. Constructing a QString out of the literal does then not cause
- any overhead at runtime.
+ If the selected \e format includes an exponent, localized forms follow the
+ locale's convention on digits in the exponent. For non-localized formatting,
+ the exponent shows its sign and includes at least two digits, left-padding
+ with zero if needed.
- A slightly less efficient way is to use QLatin1String. This class wraps
- a C string literal, precalculates it length at compile time and can
- then be used for faster comparison with QStrings and conversion to
- QStrings than a regular C string literal.
+ \section1 More efficient string construction
+
+ Many strings are known at compile time. The QString constructor from
+ C++ string literals will copy the contents of the string,
+ treating the contents as UTF-8. This requires memory allocation and
+ re-encoding string data, operations that will happen at runtime.
+ If the string data is known at compile time, you can use the QStringLiteral
+ macro or similarly \c{operator""_s} to create QString's payload at compile
+ time instead.
Using the QString \c{'+'} operator, it is easy to construct a
complex string from multiple substrings. You will often write code
@@ -1728,16 +2061,15 @@ inline char qToLower(char ch)
\snippet qstring/stringbuilder.cpp 0
There is nothing wrong with either of these string constructions,
- but there are a few hidden inefficiencies. Beginning with Qt 4.6,
- you can eliminate them.
+ but there are a few hidden inefficiencies:
- First, multiple uses of the \c{'+'} operator usually means
+ First, repeated use of the \c{'+'} operator may lead to
multiple memory allocations. When concatenating \e{n} substrings,
where \e{n > 2}, there can be as many as \e{n - 1} calls to the
memory allocator.
- In 4.6, an internal template class \c{QStringBuilder} has been
- added along with a few helper functions. This class is marked
+ These allocations can be optimized by an internal class
+ \c{QStringBuilder}. This class is marked
internal and does not appear in the documentation, because you
aren't meant to instantiate it in your code. Its use will be
automatic, as described below. The class is found in
@@ -1753,61 +2085,59 @@ inline char qToLower(char ch)
then called \e{once} to get the required space, and the substrings
are copied into it one by one.
- Additional efficiency is gained by inlining and reduced reference
- counting (the QString created from a \c{QStringBuilder} typically
+ Additional efficiency is gained by inlining and reducing reference
+ counting (the QString created from a \c{QStringBuilder}
has a ref count of 1, whereas QString::append() needs an extra
test).
There are two ways you can access this improved method of string
construction. The straightforward way is to include
- \c{QStringBuilder} wherever you want to use it, and use the
+ \c{QStringBuilder} wherever you want to use it and use the
\c{'%'} operator instead of \c{'+'} when concatenating strings:
\snippet qstring/stringbuilder.cpp 5
- A more global approach which is the most convenient but
- not entirely source compatible, is to this define in your
- .pro file:
-
- \snippet qstring/stringbuilder.cpp 3
-
- and the \c{'+'} will automatically be performed as the
- \c{QStringBuilder} \c{'%'} everywhere.
-
- \section1 Maximum size and out-of-memory conditions
+ A more global approach, which is more convenient but not entirely
+ source-compatible, is to define \c QT_USE_QSTRINGBUILDER (by adding
+ it to the compiler flags) at build time. This will make concatenating
+ strings with \c{'+'} work the same way as \c{QStringBuilder's} \c{'%'}.
- The current version of QString is limited to just under 2 GB (2^31 bytes)
- in size. The exact value is architecture-dependent, since it depends on the
- overhead required for managing the data block, but is no more than 32
- bytes. Raw data blocks are also limited by the use of \c int type in the
- current version to 2 GB minus 1 byte. Since QString uses two bytes per
- character, that translates to just under 2^30 characters in one QString.
+ \note Using automatic type deduction (for example, by using the \c
+ auto keyword) with the result of string concatenation when QStringBuilder
+ is enabled will show that the concatenation is indeed an object of a
+ QStringBuilder specialization:
- In case memory allocation fails, QString will throw a \c std::bad_alloc
- exception. Out of memory conditions in the Qt containers are the only case
- where Qt will throw exceptions.
+ \snippet qstring/stringbuilder.cpp 6
- Note that the operating system may impose further limits on applications
- holding a lot of allocated memory, especially large, contiguous blocks.
- Such considerations, the configuration of such behavior or any mitigation
- are outside the scope of the Qt API.
+ This does not cause any harm, as QStringBuilder will implicitly convert to
+ QString when required. If this is undesirable, then one should specify
+ the necessary types instead of having the compiler deduce them:
- \sa fromRawData(), QChar, QLatin1String, QByteArray, QStringRef
-*/
+ \snippet qstring/stringbuilder.cpp 7
-/*!
- \enum QString::SplitBehavior
+ \section1 Maximum size and out-of-memory conditions
- \obsolete
- Use Qt::SplitBehavior instead.
+ The maximum size of QString depends on the architecture. Most 64-bit
+ systems can allocate more than 2 GB of memory, with a typical limit
+ of 2^63 bytes. The actual value also depends on the overhead required for
+ managing the data block. As a result, you can expect a maximum size
+ of 2 GB minus overhead on 32-bit platforms and 2^63 bytes minus overhead
+ on 64-bit platforms. The number of elements that can be stored in a
+ QString is this maximum size divided by the size of QChar.
- This enum specifies how the split() function should behave with
- respect to empty strings.
+ When memory allocation fails, QString throws a \c std::bad_alloc
+ exception if the application was compiled with exception support.
+ Out-of-memory conditions in Qt containers are the only cases where Qt
+ will throw exceptions. If exceptions are disabled, then running out of
+ memory is undefined behavior.
- \value KeepEmptyParts If a field is empty, keep it in the result.
- \value SkipEmptyParts If a field is empty, don't include it in the result.
+ \note Target operating systems may impose limits on how much memory an
+ application can allocate, in total, or on the size of individual allocations.
+ This may further restrict the size of string a QString can hold.
+ Mitigating or controlling the behavior these limits cause is beyond the
+ scope of the Qt API.
- \sa split()
+ \sa fromRawData(), QChar, QStringView, QLatin1StringView, QByteArray
*/
/*! \typedef QString::ConstIterator
@@ -1866,7 +2196,7 @@ inline char qToLower(char ch)
/*!
\typedef QString::pointer
- The QString::const_pointer typedef provides an STL-style
+ The QString::pointer typedef provides an STL-style
pointer to a QString element (QChar).
*/
@@ -1876,8 +2206,13 @@ inline char qToLower(char ch)
/*! \fn QString::iterator QString::begin()
- Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first character in
- the string.
+ Returns an \l{STL-style iterators}{STL-style iterator} pointing to the
+ first character in the string.
+
+//! [iterator-invalidation-func-desc]
+ \warning The returned iterator is invalidated on detachment or when the
+ QString is modified.
+//! [iterator-invalidation-func-desc]
\sa constBegin(), end()
*/
@@ -1890,24 +2225,30 @@ inline char qToLower(char ch)
/*! \fn QString::const_iterator QString::cbegin() const
\since 5.0
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character
- in the string.
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the
+ first character in the string.
+
+ \include qstring.cpp iterator-invalidation-func-desc
\sa begin(), cend()
*/
/*! \fn QString::const_iterator QString::constBegin() const
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character
- in the string.
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the
+ first character in the string.
+
+ \include qstring.cpp iterator-invalidation-func-desc
\sa begin(), constEnd()
*/
/*! \fn QString::iterator QString::end()
- Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary character
- after the last character in the string.
+ Returns an \l{STL-style iterators}{STL-style iterator} pointing just after
+ the last character in the string.
+
+ \include qstring.cpp iterator-invalidation-func-desc
\sa begin(), constEnd()
*/
@@ -1920,16 +2261,20 @@ inline char qToLower(char ch)
/*! \fn QString::const_iterator QString::cend() const
\since 5.0
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing just
+ after the last character in the string.
+
+ \include qstring.cpp iterator-invalidation-func-desc
\sa cbegin(), end()
*/
/*! \fn QString::const_iterator QString::constEnd() const
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing just
+ after the last character in the string.
+
+ \include qstring.cpp iterator-invalidation-func-desc
\sa constBegin(), end()
*/
@@ -1937,8 +2282,10 @@ inline char qToLower(char ch)
/*! \fn QString::reverse_iterator QString::rbegin()
\since 5.6
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the string, in reverse order.
+ Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to
+ the first character in the string, in reverse order.
+
+ \include qstring.cpp iterator-invalidation-func-desc
\sa begin(), crbegin(), rend()
*/
@@ -1951,8 +2298,10 @@ inline char qToLower(char ch)
/*! \fn QString::const_reverse_iterator QString::crbegin() const
\since 5.6
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the string, in reverse order.
+ Returns a const \l{STL-style iterators}{STL-style} reverse iterator
+ pointing to the first character in the string, in reverse order.
+
+ \include qstring.cpp iterator-invalidation-func-desc
\sa begin(), rbegin(), rend()
*/
@@ -1960,8 +2309,10 @@ inline char qToLower(char ch)
/*! \fn QString::reverse_iterator QString::rend()
\since 5.6
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last character in the string, in reverse order.
+ Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing just
+ after the last character in the string, in reverse order.
+
+ \include qstring.cpp iterator-invalidation-func-desc
\sa end(), crend(), rbegin()
*/
@@ -1974,8 +2325,10 @@ inline char qToLower(char ch)
/*! \fn QString::const_reverse_iterator QString::crend() const
\since 5.6
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to one
- past the last character in the string, in reverse order.
+ Returns a const \l{STL-style iterators}{STL-style} reverse iterator
+ pointing just after the last character in the string, in reverse order.
+
+ \include qstring.cpp iterator-invalidation-func-desc
\sa end(), rend(), rbegin()
*/
@@ -1983,9 +2336,9 @@ inline char qToLower(char ch)
/*!
\fn QString::QString()
- Constructs a null string. Null strings are also empty.
+ Constructs a null string. Null strings are also considered empty.
- \sa isEmpty()
+ \sa isEmpty(), isNull(), {Distinction Between Null and Empty Strings}
*/
/*!
@@ -2003,24 +2356,40 @@ inline char qToLower(char ch)
given const char pointer is converted to Unicode using the
fromUtf8() function.
- You can disable this constructor by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this constructor by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
- \note Defining \c QT_RESTRICTED_CAST_FROM_ASCII also disables
+ \note Defining \l QT_RESTRICTED_CAST_FROM_ASCII also disables
this constructor, but enables a \c{QString(const char (&ch)[N])}
constructor instead. Using non-literal input, or input with
embedded NUL characters, or non-7-bit characters is undefined
in this case.
- \sa fromLatin1(), fromLocal8Bit(), fromUtf8(), QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII
+ \sa fromLatin1(), fromLocal8Bit(), fromUtf8()
+*/
+
+/*! \fn QString::QString(const char8_t *str)
+
+ Constructs a string initialized with the UTF-8 string \a str. The
+ given const char8_t pointer is converted to Unicode using the
+ fromUtf8() function.
+
+ \since 6.1
+ \sa fromLatin1(), fromLocal8Bit(), fromUtf8()
+*/
+
+/*
+//! [from-std-string]
+Returns a copy of the \a str string. The given string is assumed to be
+encoded in \1, and is converted to QString using the \2 function.
+//! [from-std-string]
*/
/*! \fn QString QString::fromStdString(const std::string &str)
- Returns a copy of the \a str string. The given string is converted
- to Unicode using the fromUtf8() function.
+ \include qstring.cpp {from-std-string} {UTF-8} {fromUtf8()}
\sa fromLatin1(), fromLocal8Bit(), fromUtf8(), QByteArray::fromStdString()
*/
@@ -2032,37 +2401,40 @@ inline char qToLower(char ch)
windows) and ucs4 if the size of wchar_t is 4 bytes (most Unix
systems).
- \sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4(), fromStdU16String(), fromStdU32String()
+ \sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4(),
+ fromStdU16String(), fromStdU32String()
*/
-/*! \fn QString QString::fromWCharArray(const wchar_t *string, int size)
+/*! \fn QString QString::fromWCharArray(const wchar_t *string, qsizetype size)
\since 4.2
Returns a copy of the \a string, where the encoding of \a string depends on
- the size of wchar. If wchar is 4 bytes, the \a string is interpreted as UCS-4,
- if wchar is 2 bytes it is interpreted as UTF-16.
+ the size of wchar. If wchar is 4 bytes, the \a string is interpreted as
+ UCS-4, if wchar is 2 bytes it is interpreted as UTF-16.
- If \a size is -1 (default), the \a string has to be \\0'-terminated.
+ If \a size is -1 (default), the \a string must be '\\0'-terminated.
- \sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4(), fromStdWString()
+ \sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4(),
+ fromStdWString()
*/
/*! \fn std::wstring QString::toStdWString() const
Returns a std::wstring object with the data contained in this
- QString. The std::wstring is encoded in utf16 on platforms where
- wchar_t is 2 bytes wide (e.g. windows) and in ucs4 on platforms
+ QString. The std::wstring is encoded in UTF-16 on platforms where
+ wchar_t is 2 bytes wide (for example, Windows) and in UTF-32 on platforms
where wchar_t is 4 bytes wide (most Unix systems).
This method is mostly useful to pass a QString to a function
that accepts a std::wstring object.
- \sa utf16(), toLatin1(), toUtf8(), toLocal8Bit(), toStdU16String(), toStdU32String()
+ \sa utf16(), toLatin1(), toUtf8(), toLocal8Bit(), toStdU16String(),
+ toStdU32String()
*/
-int QString::toUcs4_helper(const ushort *uc, int length, uint *out)
+qsizetype QString::toUcs4_helper(const char16_t *uc, qsizetype length, char32_t *out)
{
- int count = 0;
+ qsizetype count = 0;
QStringIterator i(QStringView(uc, length));
while (i.hasNext())
@@ -2071,7 +2443,7 @@ int QString::toUcs4_helper(const ushort *uc, int length, uint *out)
return count;
}
-/*! \fn int QString::toWCharArray(wchar_t *array) const
+/*! \fn qsizetype QString::toWCharArray(wchar_t *array) const
\since 4.2
Fills the \a array with the data contained in this QString object.
@@ -2087,7 +2459,8 @@ int QString::toUcs4_helper(const ushort *uc, int length, uint *out)
\note This function does not append a null character to the array.
- \sa utf16(), toUcs4(), toLatin1(), toUtf8(), toLocal8Bit(), toStdWString(), QStringView::toWCharArray()
+ \sa utf16(), toUcs4(), toLatin1(), toUtf8(), toLocal8Bit(), toStdWString(),
+ QStringView::toWCharArray()
*/
/*! \fn QString::QString(const QString &other)
@@ -2117,20 +2490,18 @@ int QString::toUcs4_helper(const ushort *uc, int length, uint *out)
\sa fromRawData()
*/
-QString::QString(const QChar *unicode, int size)
+QString::QString(const QChar *unicode, qsizetype size)
{
if (!unicode) {
d.clear();
} else {
- if (size < 0) {
- size = 0;
- while (!unicode[size].isNull())
- ++size;
- }
+ if (size < 0)
+ size = QtPrivate::qustrlen(reinterpret_cast<const char16_t *>(unicode));
if (!size) {
- d = DataPointer(Data::allocate(0), 0);
+ d = DataPointer::fromRawData(&_empty, 0);
} else {
- d = DataPointer(Data::allocate(size + 1), size);
+ d = DataPointer(size, size);
+ Q_CHECK_PTR(d.data());
memcpy(d.data(), unicode, size * sizeof(QChar));
d.data()[size] = '\0';
}
@@ -2143,36 +2514,41 @@ QString::QString(const QChar *unicode, int size)
\sa fill()
*/
-QString::QString(int size, QChar ch)
+QString::QString(qsizetype size, QChar ch)
{
if (size <= 0) {
- d = DataPointer(Data::allocate(0), 0);
+ d = DataPointer::fromRawData(&_empty, 0);
} else {
- d = DataPointer(Data::allocate(size + 1), size);
+ d = DataPointer(size, size);
+ Q_CHECK_PTR(d.data());
d.data()[size] = '\0';
- char16_t *i = d.data() + size;
char16_t *b = d.data();
+ char16_t *e = d.data() + size;
const char16_t value = ch.unicode();
- while (i != b)
- *--i = value;
+ std::fill(b, e, value);
}
}
-/*! \fn QString::QString(int size, Qt::Initialization)
+/*! \fn QString::QString(qsizetype size, Qt::Initialization)
\internal
Constructs a string of the given \a size without initializing the
characters. This is only used in \c QStringBuilder::toString().
*/
-QString::QString(int size, Qt::Initialization)
+QString::QString(qsizetype size, Qt::Initialization)
{
- d = DataPointer(Data::allocate(size + 1), size);
- d.data()[size] = '\0';
+ if (size <= 0) {
+ d = DataPointer::fromRawData(&_empty, 0);
+ } else {
+ d = DataPointer(size, size);
+ Q_CHECK_PTR(d.data());
+ d.data()[size] = '\0';
+ }
}
-/*! \fn QString::QString(QLatin1String str)
+/*! \fn QString::QString(QLatin1StringView str)
- Constructs a copy of the Latin-1 string \a str.
+ Constructs a copy of the Latin-1 string viewed by \a str.
\sa fromLatin1()
*/
@@ -2182,7 +2558,8 @@ QString::QString(int size, Qt::Initialization)
*/
QString::QString(QChar ch)
{
- d = DataPointer(Data::allocate(2), 1);
+ d = DataPointer(1, 1);
+ Q_CHECK_PTR(d.data());
d.data()[0] = ch.unicode();
d.data()[1] = '\0';
}
@@ -2190,16 +2567,18 @@ QString::QString(QChar ch)
/*! \fn QString::QString(const QByteArray &ba)
Constructs a string initialized with the byte array \a ba. The
- given byte array is converted to Unicode using fromUtf8(). Stops
- copying at the first 0 character, otherwise copies the entire byte
- array.
+ given byte array is converted to Unicode using fromUtf8().
- You can disable this constructor by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this constructor by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
- \sa fromLatin1(), fromLocal8Bit(), fromUtf8(), QT_NO_CAST_FROM_ASCII
+ \note Any null ('\\0') bytes in the byte array will be included in this
+ string, converted to Unicode null characters (U+0000). This behavior is
+ different from Qt 5.x.
+
+ \sa fromLatin1(), fromLocal8Bit(), fromUtf8()
*/
/*! \fn QString::QString(const Null &)
@@ -2243,6 +2622,18 @@ QString::QString(QChar ch)
\internal
*/
+/*! \fn QString::operator std::u16string_view() const
+ \since 6.7
+
+ Converts this QString object to a \c{std::u16string_view} object.
+*/
+
+static bool needsReallocate(const QString &str, qsizetype newSize)
+{
+ const auto capacityAtEnd = str.capacity() - str.data_ptr().freeSpaceAtBegin();
+ return newSize > capacityAtEnd;
+}
+
/*!
Sets the size of the string to \a size characters.
@@ -2250,15 +2641,18 @@ QString::QString(QChar ch)
extended to make it \a size characters long with the extra
characters added to the end. The new characters are uninitialized.
- If \a size is less than the current size, characters are removed
- from the end.
+ If \a size is less than the current size, characters beyond position
+ \a size are excluded from the string.
+
+ \note While resize() will grow the capacity if needed, it never shrinks
+ capacity. To shed excess capacity, use squeeze().
Example:
\snippet qstring/main.cpp 45
If you want to append a certain number of identical characters to
- the string, use the \l {QString::}{resize(int, QChar)} overload.
+ the string, use the \l {QString::}{resize(qsizetype, QChar)} overload.
If you want to expand the string so that it reaches a certain
width and fill the new positions with a particular character, use
@@ -2268,41 +2662,59 @@ QString::QString(QChar ch)
\snippet qstring/main.cpp 47
- \sa truncate(), reserve()
+ \sa truncate(), reserve(), squeeze()
*/
-void QString::resize(int size)
+void QString::resize(qsizetype size)
{
if (size < 0)
size = 0;
- if (d->needsDetach() || size > capacity())
- reallocData(uint(size) + 1u, true);
+ if (d->needsDetach() || needsReallocate(*this, size))
+ reallocData(size, QArrayData::Grow);
d.size = size;
if (d->allocatedCapacity())
- d.data()[size] = 0;
+ d.data()[size] = u'\0';
}
/*!
\overload
\since 5.7
- Unlike \l {QString::}{resize(int)}, this overload
+ Unlike \l {QString::}{resize(qsizetype)}, this overload
initializes the new characters to \a fillChar:
\snippet qstring/main.cpp 46
*/
-void QString::resize(int size, QChar fillChar)
+void QString::resize(qsizetype newSize, QChar fillChar)
{
- const int oldSize = length();
- resize(size);
- const int difference = length() - oldSize;
+ const qsizetype oldSize = size();
+ resize(newSize);
+ const qsizetype difference = size() - oldSize;
if (difference > 0)
std::fill_n(d.data() + oldSize, difference, fillChar.unicode());
}
-/*! \fn int QString::capacity() const
+
+/*!
+ \since 6.8
+
+ Sets the size of the string to \a size characters. If the size of
+ the string grows, the new characters are uninitialized.
+
+ The behavior is identical to \c{resize(size)}.
+
+ \sa resize()
+*/
+
+void QString::resizeForOverwrite(qsizetype size)
+{
+ resize(size);
+}
+
+
+/*! \fn qsizetype QString::capacity() const
Returns the maximum number of characters that can be stored in
the string without forcing a reallocation.
@@ -2315,22 +2727,37 @@ void QString::resize(int size, QChar fillChar)
\note a statically allocated string will report a capacity of 0,
even if it's not empty.
+ \note The free space position in the allocated memory block is undefined. In
+ other words, one should not assume that the free memory is always located
+ after the initialized elements.
+
\sa reserve(), squeeze()
*/
/*!
- \fn void QString::reserve(int size)
+ \fn void QString::reserve(qsizetype size)
- Attempts to allocate memory for at least \a size characters. If
- you know in advance how large the string will be, you can call
- this function, and if you resize the string often you are likely
- to get better performance. If \a size is an underestimate, the
- worst that will happen is that the QString will be a bit slower.
+ Ensures the string has space for at least \a size characters.
- The sole purpose of this function is to provide a means of fine
- tuning QString's memory usage. In general, you will rarely ever
- need to call this function. If you want to change the size of the
- string, call resize().
+ If you know in advance how large a string will be, you can call this
+ function to save repeated reallocation while building it.
+ This can improve performance when building a string incrementally.
+ A long sequence of operations that add to a string may trigger several
+ reallocations, the last of which may leave you with significantly more
+ space than you need. This is less efficient than doing a single
+ allocation of the right size at the start.
+
+ If in doubt about how much space shall be needed, it is usually better to
+ use an upper bound as \a size, or a high estimate of the most likely size,
+ if a strict upper bound would be much bigger than this. If \a size is an
+ underestimate, the string will grow as needed once the reserved size is
+ exceeded, which may lead to a larger allocation than your best
+ overestimate would have and will slow the operation that triggers it.
+
+ \warning reserve() reserves memory but does not change the size of the
+ string. Accessing data beyond the end of the string is undefined behavior.
+ If you need to access memory beyond the current end of the string,
+ use resize().
This function is useful for code that needs to build up a long
string and wants to avoid repeated reallocation. In this example,
@@ -2340,7 +2767,7 @@ void QString::resize(int size, QChar fillChar)
\snippet qstring/main.cpp 44
- \sa squeeze(), capacity()
+ \sa squeeze(), capacity(), resize()
*/
/*!
@@ -2355,28 +2782,44 @@ void QString::resize(int size, QChar fillChar)
\sa reserve(), capacity()
*/
-void QString::reallocData(uint alloc, bool grow)
+void QString::reallocData(qsizetype alloc, QArrayData::AllocationOption option)
{
- auto allocOptions = d->detachFlags();
- if (grow)
- allocOptions |= QArrayData::GrowsForward;
+ if (!alloc) {
+ d = DataPointer::fromRawData(&_empty, 0);
+ return;
+ }
- if (d->needsDetach()) {
- DataPointer dd(Data::allocate(alloc, allocOptions), qMin(int(alloc) - 1, d.size));
- ::memcpy(dd.data(), d.data(), dd.size * sizeof(QChar));
+ // don't use reallocate path when reducing capacity and there's free space
+ // at the beginning: might shift data pointer outside of allocated space
+ const bool cannotUseReallocate = d.freeSpaceAtBegin() > 0;
+
+ if (d->needsDetach() || cannotUseReallocate) {
+ DataPointer dd(alloc, qMin(alloc, d.size), option);
+ Q_CHECK_PTR(dd.data());
+ if (dd.size > 0)
+ ::memcpy(dd.data(), d.data(), dd.size * sizeof(QChar));
dd.data()[dd.size] = 0;
d = dd;
} else {
- d->reallocate(alloc, allocOptions);
+ d->reallocate(alloc, option);
}
}
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-void QString::expand(int i)
+void QString::reallocGrowData(qsizetype n)
{
- resize(qMax(i + 1, size()), QLatin1Char(' '));
+ if (!n) // expected to always allocate
+ n = 1;
+
+ if (d->needsDetach()) {
+ DataPointer dd(DataPointer::allocateGrow(d, n, QArrayData::GrowsAtEnd));
+ Q_CHECK_PTR(dd.data());
+ dd->copyAppend(d.data(), d.data() + d.size);
+ dd.data()[dd.size] = 0;
+ d = dd;
+ } else {
+ d->reallocate(d.constAllocatedCapacity() + n, QArrayData::Grow);
+ }
}
-#endif
/*! \fn void QString::clear()
@@ -2405,15 +2848,16 @@ QString &QString::operator=(const QString &other) noexcept
\since 5.2
*/
-/*! \fn QString &QString::operator=(QLatin1String str)
+/*! \fn QString &QString::operator=(QLatin1StringView str)
\overload operator=()
- Assigns the Latin-1 string \a str to this string.
+ Assigns the Latin-1 string viewed by \a str to this string.
*/
-QString &QString::operator=(QLatin1String other)
+QString &QString::operator=(QLatin1StringView other)
{
- if (isDetached() && other.size() <= capacity()) { // assumes d->alloc == 0 -> !isDetached() (sharedNull)
+ const qsizetype capacityAtEnd = capacity() - d.freeSpaceAtBegin();
+ if (isDetached() && other.size() <= capacityAtEnd) { // assumes d->alloc == 0 -> !isDetached() (sharedNull)
d.size = other.size();
d.data()[other.size()] = 0;
qt_from_latin1(d.data(), other.latin1(), other.size());
@@ -2428,15 +2872,12 @@ QString &QString::operator=(QLatin1String other)
\overload operator=()
Assigns \a ba to this string. The byte array is converted to Unicode
- using the fromUtf8() function. This function stops conversion at the
- first NUL character found, or the end of the \a ba byte array.
+ using the fromUtf8() function.
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
/*! \fn QString &QString::operator=(const char *str)
@@ -2446,12 +2887,10 @@ QString &QString::operator=(QLatin1String other)
Assigns \a str to this string. The const char pointer is converted
to Unicode using the fromUtf8() function.
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
- or \c QT_RESTRICTED_CAST_FROM_ASCII when you compile your applications.
+ You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
+ or \l QT_RESTRICTED_CAST_FROM_ASCII when you compile your applications.
This can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII
*/
/*!
@@ -2461,19 +2900,11 @@ QString &QString::operator=(QLatin1String other)
*/
QString &QString::operator=(QChar ch)
{
- if (isDetached() && capacity() >= 1) { // assumes d->alloc == 0 -> !isDetached() (sharedNull)
- // re-use existing capacity:
- d.data()[0] = ch.unicode();
- d.data()[1] = 0;
- d.size = 1;
- } else {
- operator=(QString(ch));
- }
- return *this;
+ return assign(1, ch);
}
/*!
- \fn QString& QString::insert(int position, const QString &str)
+ \fn QString& QString::insert(qsizetype position, const QString &str)
Inserts the string \a str at the given index \a position and
returns a reference to this string.
@@ -2482,144 +2913,227 @@ QString &QString::operator=(QChar ch)
\snippet qstring/main.cpp 26
- If the given \a position is greater than size(), the array is
- first extended using resize().
+//! [string-grow-at-insertion]
+ This string grows to accommodate the insertion. If \a position is beyond
+ the end of the string, space characters are appended to the string to reach
+ this \a position, followed by \a str.
+//! [string-grow-at-insertion]
\sa append(), prepend(), replace(), remove()
*/
-
/*!
- \fn QString& QString::insert(int position, const QStringRef &str)
- \since 5.5
- \overload insert()
-
- Inserts the string reference \a str at the given index \a position and
- returns a reference to this string.
-
- If the given \a position is greater than size(), the array is
- first extended using resize().
-*/
-
-
-/*!
- \fn QString& QString::insert(int position, QStringView str)
+ \fn QString& QString::insert(qsizetype position, QStringView str)
\since 6.0
\overload insert()
Inserts the string view \a str at the given index \a position and
returns a reference to this string.
- If the given \a position is greater than size(), the array is
- first extended using resize().
+ \include qstring.cpp string-grow-at-insertion
*/
/*!
- \fn QString& QString::insert(int position, const char *str)
+ \fn QString& QString::insert(qsizetype position, const char *str)
\since 5.5
\overload insert()
Inserts the C string \a str at the given index \a position and
returns a reference to this string.
- If the given \a position is greater than size(), the array is
- first extended using resize().
+ \include qstring.cpp string-grow-at-insertion
- This function is not available when \c QT_NO_CAST_FROM_ASCII is
+ This function is not available when \l QT_NO_CAST_FROM_ASCII is
defined.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
-
/*!
- \fn QString& QString::insert(int position, const QByteArray &str)
+ \fn QString& QString::insert(qsizetype position, const QByteArray &str)
\since 5.5
\overload insert()
- Inserts the byte array \a str at the given index \a position and
- returns a reference to this string.
+ Interprets the contents of \a str as UTF-8, inserts the Unicode string
+ it encodes at the given index \a position and returns a reference to
+ this string.
- If the given \a position is greater than size(), the array is
- first extended using resize().
+ \include qstring.cpp string-grow-at-insertion
- This function is not available when \c QT_NO_CAST_FROM_ASCII is
+ This function is not available when \l QT_NO_CAST_FROM_ASCII is
defined.
+*/
- \sa QT_NO_CAST_FROM_ASCII
+/*! \internal
+ T is a view or a container on/of QChar, char16_t, or char
*/
+template <typename T>
+static void insert_helper(QString &str, qsizetype i, const T &toInsert)
+{
+ auto &str_d = str.data_ptr();
+ qsizetype difference = 0;
+ if (Q_UNLIKELY(i > str_d.size))
+ difference = i - str_d.size;
+ const qsizetype oldSize = str_d.size;
+ const qsizetype insert_size = toInsert.size();
+ const qsizetype newSize = str_d.size + difference + insert_size;
+ const auto side = i == 0 ? QArrayData::GrowsAtBeginning : QArrayData::GrowsAtEnd;
+
+ if (str_d.needsDetach() || needsReallocate(str, newSize)) {
+ const auto cbegin = str.cbegin();
+ const auto cend = str.cend();
+ const auto insert_start = difference == 0 ? std::next(cbegin, i) : cend;
+ QString other;
+ // Using detachAndGrow() so that prepend optimization works and QStringBuilder
+ // unittests pass
+ other.data_ptr().detachAndGrow(side, newSize, nullptr, nullptr);
+ other.append(QStringView(cbegin, insert_start));
+ other.resize(i, u' ');
+ other.append(toInsert);
+ other.append(QStringView(insert_start, cend));
+ str.swap(other);
+ return;
+ }
+
+ str_d.detachAndGrow(side, difference + insert_size, nullptr, nullptr);
+ Q_CHECK_PTR(str_d.data());
+ str.resize(newSize);
+ auto begin = str_d.begin();
+ auto old_end = std::next(begin, oldSize);
+ std::fill_n(old_end, difference, u' ');
+ auto insert_start = std::next(begin, i);
+ if (difference == 0)
+ std::move_backward(insert_start, old_end, str_d.end());
+
+ using Char = std::remove_cv_t<typename T::value_type>;
+ if constexpr(std::is_same_v<Char, QChar>)
+ std::copy_n(reinterpret_cast<const char16_t *>(toInsert.data()), insert_size, insert_start);
+ else if constexpr (std::is_same_v<Char, char16_t>)
+ std::copy_n(toInsert.data(), insert_size, insert_start);
+ else if constexpr (std::is_same_v<Char, char>)
+ qt_from_latin1(insert_start, toInsert.data(), insert_size);
+}
/*!
- \fn QString &QString::insert(int position, QLatin1String str)
+ \fn QString &QString::insert(qsizetype position, QLatin1StringView str)
\overload insert()
- Inserts the Latin-1 string \a str at the given index \a position.
+ Inserts the Latin-1 string viewed by \a str at the given index \a position.
+
+ \include qstring.cpp string-grow-at-insertion
*/
-QString &QString::insert(int i, QLatin1String str)
+QString &QString::insert(qsizetype i, QLatin1StringView str)
{
const char *s = str.latin1();
if (i < 0 || !s || !(*s))
return *this;
- int len = str.size();
- if (Q_UNLIKELY(i > size()))
- resize(i + len, QLatin1Char(' '));
- else
- resize(size() + len);
+ insert_helper(*this, i, str);
+ return *this;
+}
+
+/*!
+ \fn QString &QString::insert(qsizetype position, QUtf8StringView str)
+ \overload insert()
+ \since 6.5
+
+ Inserts the UTF-8 string view \a str at the given index \a position.
+
+ \note Inserting variable-width UTF-8-encoded string data is conceptually slower
+ than inserting fixed-width string data such as UTF-16 (QStringView) or Latin-1
+ (QLatin1StringView) and should thus be used sparingly.
+
+ \include qstring.cpp string-grow-at-insertion
+*/
+QString &QString::insert(qsizetype i, QUtf8StringView s)
+{
+ auto insert_size = s.size();
+ if (i < 0 || insert_size <= 0)
+ return *this;
+
+ qsizetype difference = 0;
+ if (Q_UNLIKELY(i > d.size))
+ difference = i - d.size;
+
+ const qsizetype newSize = d.size + difference + insert_size;
+
+ if (d.needsDetach() || needsReallocate(*this, newSize)) {
+ const auto cbegin = this->cbegin();
+ const auto insert_start = difference == 0 ? std::next(cbegin, i) : cend();
+ QString other;
+ other.reserve(newSize);
+ other.append(QStringView(cbegin, insert_start));
+ if (difference > 0)
+ other.resize(i, u' ');
+ other.append(s);
+ other.append(QStringView(insert_start, cend()));
+ swap(other);
+ return *this;
+ }
+
+ if (i >= d.size) {
+ d.detachAndGrow(QArrayData::GrowsAtEnd, difference + insert_size, nullptr, nullptr);
+ Q_CHECK_PTR(d.data());
+
+ if (difference > 0)
+ resize(i, u' ');
+ append(s);
+ } else {
+ // Optimal insertion of Utf8 data is at the end, anywhere else could
+ // potentially lead to moving characters twice if Utf8 data size
+ // (variable-width) is less than the equivalent Utf16 data size
+ QVarLengthArray<char16_t> buffer(insert_size); // ### optimize (QTBUG-108546)
+ char16_t *b = QUtf8::convertToUnicode(buffer.data(), s);
+ insert_helper(*this, i, QStringView(buffer.data(), b));
+ }
- ::memmove(d.data() + i + len, d.data() + i, (d.size - i - len) * sizeof(QChar));
- qt_from_latin1(d.data() + i, s, uint(len));
return *this;
}
/*!
- \fn QString& QString::insert(int position, const QChar *unicode, int size)
+ \fn QString& QString::insert(qsizetype position, const QChar *unicode, qsizetype size)
\overload insert()
Inserts the first \a size characters of the QChar array \a unicode
at the given index \a position in the string.
+
+ This string grows to accommodate the insertion. If \a position is beyond
+ the end of the string, space characters are appended to the string to reach
+ this \a position, followed by \a size characters of the QChar array
+ \a unicode.
*/
-QString& QString::insert(int i, const QChar *unicode, int size)
+QString& QString::insert(qsizetype i, const QChar *unicode, qsizetype size)
{
if (i < 0 || size <= 0)
return *this;
- const auto s = reinterpret_cast<const char16_t *>(unicode);
- if (points_into_range(s, d.data(), d.data() + d.size))
- return insert(i, QStringView{QVarLengthArray(s, s + size)});
-
- if (Q_UNLIKELY(i > int(d.size)))
- resize(i + size, QLatin1Char(' '));
- else
- resize(d.size + size);
+ // In case when data points into "this"
+ if (!d->needsDetach() && QtPrivate::q_points_into_range(unicode, *this)) {
+ QVarLengthArray copy(unicode, unicode + size);
+ insert(i, copy.data(), size);
+ } else {
+ insert_helper(*this, i, QStringView(unicode, size));
+ }
- ::memmove(d.data() + i + size, d.data() + i, (d.size - i - size) * sizeof(QChar));
- memcpy(d.data() + i, s, size * sizeof(QChar));
return *this;
}
/*!
- \fn QString& QString::insert(int position, QChar ch)
+ \fn QString& QString::insert(qsizetype position, QChar ch)
\overload insert()
Inserts \a ch at the given index \a position in the string.
+
+ This string grows to accommodate the insertion. If \a position is beyond
+ the end of the string, space characters are appended to the string to reach
+ this \a position, followed by \a ch.
*/
-QString& QString::insert(int i, QChar ch)
+QString& QString::insert(qsizetype i, QChar ch)
{
if (i < 0)
i += d.size;
- if (i < 0)
- return *this;
- if (Q_UNLIKELY(i > size()))
- resize(i + 1, QLatin1Char(' '));
- else
- resize(d.size + 1);
- ::memmove(d.data() + i + 1, d.data() + i, (d.size - i - 1) * sizeof(QChar));
- d.data()[i] = ch.unicode();
- return *this;
+ return insert(i, &ch, 1);
}
/*!
@@ -2644,32 +3158,39 @@ QString &QString::append(const QString &str)
{
if (!str.isNull()) {
if (isNull()) {
- operator=(str);
- } else {
- if (d->needsDetach() || size() + str.size() > capacity())
- reallocData(uint(size() + str.size()) + 1u, true);
- memcpy(d.data() + d.size, str.d.data(), str.d.size * sizeof(QChar));
- d.size += str.d.size;
- d.data()[d.size] = '\0';
+ if (Q_UNLIKELY(!str.d.isMutable()))
+ assign(str); // fromRawData, so we do a deep copy
+ else
+ operator=(str);
+ } else if (str.size()) {
+ append(str.constData(), str.size());
}
}
return *this;
}
/*!
+ \fn QString &QString::append(QStringView v)
+ \overload append()
+ \since 6.0
+
+ Appends the given string view \a v to this string and returns the result.
+*/
+
+/*!
\overload append()
\since 5.0
Appends \a len characters from the QChar array \a str to this string.
*/
-QString &QString::append(const QChar *str, int len)
+QString &QString::append(const QChar *str, qsizetype len)
{
if (str && len > 0) {
- if (d->needsDetach() || size() + len > capacity())
- reallocData(uint(size() + len) + 1u, true);
- memcpy(d.data() + d.size, str, len * sizeof(QChar));
- d.size += len;
- d.data()[d.size] = '\0';
+ static_assert(sizeof(QChar) == sizeof(char16_t), "Unexpected difference in sizes");
+ // the following should be safe as QChar uses char16_t as underlying data
+ const char16_t *char16String = reinterpret_cast<const char16_t *>(str);
+ d->growAppend(char16String, char16String + len);
+ d.data()[d.size] = u'\0';
}
return *this;
}
@@ -2677,20 +3198,23 @@ QString &QString::append(const QChar *str, int len)
/*!
\overload append()
- Appends the Latin-1 string \a str to this string.
+ Appends the Latin-1 string viewed by \a str to this string.
*/
-QString &QString::append(QLatin1String str)
+QString &QString::append(QLatin1StringView str)
{
- const char *s = str.latin1();
- if (s) {
- int len = str.size();
- if (d->needsDetach() || size() + len > capacity())
- reallocData(uint(size() + len) + 1u, true);
- char16_t *i = d.data() + d.size;
- qt_from_latin1(i, s, uint(len));
- i[len] = '\0';
- d.size += len;
- }
+ append_helper(*this, str);
+ return *this;
+}
+
+/*!
+ \overload append()
+ \since 6.5
+
+ Appends the UTF-8 string view \a str to this string.
+*/
+QString &QString::append(QUtf8StringView str)
+{
+ append_helper(*this, str);
return *this;
}
@@ -2701,12 +3225,10 @@ QString &QString::append(QLatin1String str)
Appends the byte array \a ba to this string. The given byte array
is converted to Unicode using the fromUtf8() function.
- You can disable this function by defining \c QT_NO_CAST_FROM_ASCII
+ You can disable this function by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
to ensure that all user-visible strings go through QObject::tr(),
for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
/*! \fn QString &QString::append(const char *str)
@@ -2716,12 +3238,10 @@ QString &QString::append(QLatin1String str)
Appends the string \a str to this string. The given const char
pointer is converted to Unicode using the fromUtf8() function.
- You can disable this function by defining \c QT_NO_CAST_FROM_ASCII
+ You can disable this function by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
to ensure that all user-visible strings go through QObject::tr(),
for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
/*!
@@ -2731,9 +3251,8 @@ QString &QString::append(QLatin1String str)
*/
QString &QString::append(QChar ch)
{
- if (d->needsDetach() || size() + 1 > capacity())
- reallocData(uint(d.size) + 2u, true);
- d.data()[d.size++] = ch.unicode();
+ d.detachAndGrow(QArrayData::GrowsAtEnd, 1, nullptr, nullptr);
+ d->copyAppend(1, ch.unicode());
d.data()[d.size] = '\0';
return *this;
}
@@ -2743,6 +3262,10 @@ QString &QString::append(QChar ch)
Prepends the string \a str to the beginning of this string and
returns a reference to this string.
+ This operation is typically very fast (\l{constant time}), because
+ QString preallocates extra space at the beginning of the string data,
+ so it can grow without reallocating the entire string each time.
+
Example:
\snippet qstring/main.cpp 36
@@ -2750,26 +3273,25 @@ QString &QString::append(QChar ch)
\sa append(), insert()
*/
-/*! \fn QString &QString::prepend(QLatin1String str)
+/*! \fn QString &QString::prepend(QLatin1StringView str)
\overload prepend()
- Prepends the Latin-1 string \a str to this string.
+ Prepends the Latin-1 string viewed by \a str to this string.
*/
-/*! \fn QString &QString::prepend(const QChar *str, int len)
- \since 5.5
+/*! \fn QString &QString::prepend(QUtf8StringView str)
+ \since 6.5
\overload prepend()
- Prepends \a len characters from the QChar array \a str to this string and
- returns a reference to this string.
+ Prepends the UTF-8 string view \a str to this string.
*/
-/*! \fn QString &QString::prepend(const QStringRef &str)
+/*! \fn QString &QString::prepend(const QChar *str, qsizetype len)
\since 5.5
\overload prepend()
- Prepends the string reference \a str to the beginning of this string and
+ Prepends \a len characters from the QChar array \a str to this string and
returns a reference to this string.
*/
@@ -2788,12 +3310,10 @@ QString &QString::append(QChar ch)
Prepends the byte array \a ba to this string. The byte array is
converted to Unicode using the fromUtf8() function.
- You can disable this function by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this function by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
/*! \fn QString &QString::prepend(const char *str)
@@ -2803,12 +3323,10 @@ QString &QString::append(QChar ch)
Prepends the string \a str to this string. The const char pointer
is converted to Unicode using the fromUtf8() function.
- You can disable this function by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this function by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
/*! \fn QString &QString::prepend(QChar ch)
@@ -2819,7 +3337,112 @@ QString &QString::append(QChar ch)
*/
/*!
- \fn QString &QString::remove(int position, int n)
+ \fn QString &QString::assign(QAnyStringView v)
+ \since 6.6
+
+ Replaces the contents of this string with a copy of \a v and returns a
+ reference to this string.
+
+ The size of this string will be equal to the size of \a v, converted to
+ UTF-16 as if by \c{v.toString()}. Unlike QAnyStringView::toString(), however,
+ this function only allocates memory if the estimated size exceeds the capacity
+ of this string or this string is shared.
+
+ \sa QAnyStringView::toString()
+*/
+
+/*!
+ \fn QString &QString::assign(qsizetype n, QChar c)
+ \since 6.6
+
+ Replaces the contents of this string with \a n copies of \a c and
+ returns a reference to this string.
+
+ The size of this string will be equal to \a n, which has to be non-negative.
+
+ This function will only allocate memory if \a n exceeds the capacity of this
+ string or this string is shared.
+
+ \sa fill()
+*/
+
+/*!
+ \fn template <typename InputIterator, QString::if_compatible_iterator<InputIterator>> QString &QString::assign(InputIterator first, InputIterator last)
+ \since 6.6
+
+ Replaces the contents of this string with a copy of the elements in the
+ iterator range [\a first, \a last) and returns a reference to this string.
+
+ The size of this string will be equal to the decoded length of the elements
+ in the range [\a first, \a last), which need not be the same as the length of
+ the range itself, because this function transparently recodes the input
+ character set to UTF-16.
+
+ This function will only allocate memory if the number of elements in the
+ range, or, for non-UTF-16-encoded input, the maximum possible size of the
+ resulting string, exceeds the capacity of this string, or if this string is
+ shared.
+
+ \note This function overload only participates in overload resolution if
+ \c InputIterator meets the requirements of a
+ \l {https://en.cppreference.com/w/cpp/named_req/InputIterator} {LegacyInputIterator}
+ and the \c{value_type} of \c InputIterator is one of the following character types:
+ \list
+ \li QChar
+ \li QLatin1Char
+ \li \c {char}
+ \li \c {unsigned char}
+ \li \c {signed char}
+ \li \c {char8_t}
+ \li \c char16_t
+ \li (on platforms, such as Windows, where it is a 16-bit type) \c wchar_t
+ \li \c char32_t
+ \endlist
+
+ \note The behavior is undefined if either argument is an iterator into *this or
+ [\a first, \a last) is not a valid range.
+*/
+
+QString &QString::assign(QAnyStringView s)
+{
+ if (s.size() <= capacity() && isDetached()) {
+ const auto offset = d.freeSpaceAtBegin();
+ if (offset)
+ d.setBegin(d.begin() - offset);
+ resize(0);
+ s.visit([this](auto input) {
+ this->append(input);
+ });
+ } else {
+ *this = s.toString();
+ }
+ return *this;
+}
+
+#ifndef QT_BOOTSTRAPPED
+QString &QString::assign_helper(const char32_t *data, qsizetype len)
+{
+ // worst case: each char32_t requires a surrogate pair, so
+ const auto requiredCapacity = len * 2;
+ if (requiredCapacity <= capacity() && isDetached()) {
+ const auto offset = d.freeSpaceAtBegin();
+ if (offset)
+ d.setBegin(d.begin() - offset);
+ auto begin = reinterpret_cast<QChar *>(d.begin());
+ auto ba = QByteArrayView(reinterpret_cast<const std::byte*>(data), len * sizeof(char32_t));
+ QStringConverter::State state;
+ const auto end = QUtf32::convertToUnicode(begin, ba, &state, DetectEndianness);
+ d.size = end - begin;
+ d.data()[d.size] = u'\0';
+ } else {
+ *this = QString::fromUcs4(data, len);
+ }
+ return *this;
+}
+#endif
+
+/*!
+ \fn QString &QString::remove(qsizetype position, qsizetype n)
Removes \a n characters from the string, starting at the given \a
position index, and returns a reference to the string.
@@ -2828,23 +3451,42 @@ QString &QString::append(QChar ch)
position + \a n is beyond the end of the string, the string is
truncated at the specified \a position.
+ If \a n is <= 0 nothing is changed.
+
\snippet qstring/main.cpp 37
+//! [shrinking-erase]
+ Element removal will preserve the string's capacity and not reduce the
+ amount of allocated memory. To shed extra capacity and free as much memory
+ as possible, call squeeze() after the last change to the string's size.
+//! [shrinking-erase]
+
\sa insert(), replace()
*/
-QString &QString::remove(int pos, int len)
+QString &QString::remove(qsizetype pos, qsizetype len)
{
if (pos < 0) // count from end of string
pos += size();
- if (uint(pos) >= uint(size())) {
- // range problems
- } else if (len >= size() - pos) {
- resize(pos); // truncate
- } else if (len > 0) {
- detach();
- memmove(d.data() + pos, d.data() + pos + len,
- (d.size - pos - len + 1) * sizeof(QChar));
- d.size -= len;
+
+ if (size_t(pos) >= size_t(size()) || len <= 0)
+ return *this;
+
+ len = std::min(len, size() - pos);
+
+ if (!d->isShared()) {
+ d->erase(d.begin() + pos, len);
+ d.data()[d.size] = u'\0';
+ } else {
+ // TODO: either reserve "size()", which is bigger than needed, or
+ // modify the shrinking-erase docs of this method (since the size
+ // of "copy" won't have any extra capacity any more)
+ const qsizetype sz = size() - len;
+ QString copy{sz, Qt::Uninitialized};
+ auto begin = d.begin();
+ auto toRemove_start = d.begin() + pos;
+ copy.d->copyRanges({{begin, toRemove_start},
+ {toRemove_start + len, d.end()}});
+ swap(copy);
}
return *this;
}
@@ -2857,42 +3499,55 @@ static void removeStringImpl(QString &s, const T &needle, Qt::CaseSensitivity cs
return;
// avoid detach if nothing to do:
- int i = s.indexOf(needle, 0, cs);
+ qsizetype i = s.indexOf(needle, 0, cs);
if (i < 0)
return;
- const auto beg = s.begin(); // detaches
- auto dst = beg + i;
- auto src = beg + i + needleSize;
- const auto end = s.end();
- // loop invariant: [beg, dst[ is partial result
- // [src, end[ still to be checked for needles
- while (src < end) {
- const auto i = s.indexOf(needle, src - beg, cs);
- const auto hit = i == -1 ? end : beg + i;
- const auto skipped = hit - src;
- memmove(dst, src, skipped * sizeof(QChar));
- dst += skipped;
- src = hit + needleSize;
+ QString::DataPointer &dptr = s.data_ptr();
+ auto begin = dptr.begin();
+ auto end = dptr.end();
+
+ auto copyFunc = [&](auto &dst) {
+ auto src = begin + i + needleSize;
+ while (src < end) {
+ i = s.indexOf(needle, std::distance(begin, src), cs);
+ auto hit = i == -1 ? end : begin + i;
+ dst = std::copy(src, hit, dst);
+ src = hit + needleSize;
+ }
+ return dst;
+ };
+
+ if (!dptr->needsDetach()) {
+ auto dst = begin + i;
+ dst = copyFunc(dst);
+ s.truncate(std::distance(begin, dst));
+ } else {
+ QString copy{s.size(), Qt::Uninitialized};
+ auto copy_begin = copy.begin();
+ auto dst = std::copy(begin, begin + i, copy_begin); // Chunk before the first hit
+ dst = copyFunc(dst);
+ copy.resize(std::distance(copy_begin, dst));
+ s.swap(copy);
}
- s.truncate(dst - beg);
}
/*!
Removes every occurrence of the given \a str string in this
string, and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
This is the same as \c replace(str, "", cs).
+ \include qstring.cpp shrinking-erase
+
\sa replace()
*/
QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
{
const auto s = str.d.data();
- if (points_into_range(s, d.data(), d.data() + d.size))
+ if (QtPrivate::q_points_into_range(s, d))
removeStringImpl(*this, QStringView{QVarLengthArray(s, s + str.size())}, cs);
else
removeStringImpl(*this, qToStringViewIgnoringNull(str), cs);
@@ -2903,28 +3558,61 @@ QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
\since 5.11
\overload
- Removes every occurrence of the given \a str string in this
- string, and returns a reference to this string.
+ Removes every occurrence of the given Latin-1 string viewed by \a str
+ from this string, and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
This is the same as \c replace(str, "", cs).
+ \include qstring.cpp shrinking-erase
+
\sa replace()
*/
-QString &QString::remove(QLatin1String str, Qt::CaseSensitivity cs)
+QString &QString::remove(QLatin1StringView str, Qt::CaseSensitivity cs)
{
removeStringImpl(*this, str, cs);
return *this;
}
/*!
+ \fn QString &QString::removeAt(qsizetype pos)
+
+ \since 6.5
+
+ Removes the character at index \a pos. If \a pos is out of bounds
+ (i.e. \a pos >= size()), this function does nothing.
+
+ \sa remove()
+*/
+
+/*!
+ \fn QString &QString::removeFirst()
+
+ \since 6.5
+
+ Removes the first character in this string. If the string is empty,
+ this function does nothing.
+
+ \sa remove()
+*/
+
+/*!
+ \fn QString &QString::removeLast()
+
+ \since 6.5
+
+ Removes the last character in this string. If the string is empty,
+ this function does nothing.
+
+ \sa remove()
+*/
+
+/*!
Removes every occurrence of the character \a ch in this string, and
returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
@@ -2932,24 +3620,41 @@ QString &QString::remove(QLatin1String str, Qt::CaseSensitivity cs)
This is the same as \c replace(ch, "", cs).
+ \include qstring.cpp shrinking-erase
+
\sa replace()
*/
QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
{
- const int idx = indexOf(ch, 0, cs);
- if (idx != -1) {
- const auto first = begin(); // implicit detach()
- auto last = end();
- if (cs == Qt::CaseSensitive) {
- last = std::remove(first + idx, last, ch);
- } else {
- const QChar c = ch.toCaseFolded();
- auto caseInsensEqual = [c](QChar x) {
- return c == x.toCaseFolded();
- };
- last = std::remove_if(first + idx, last, caseInsensEqual);
- }
- resize(last - first);
+ const qsizetype idx = indexOf(ch, 0, cs);
+ if (idx == -1)
+ return *this;
+
+ const bool isCase = cs == Qt::CaseSensitive;
+ ch = isCase ? ch : ch.toCaseFolded();
+ auto match = [ch, isCase](QChar x) {
+ return ch == (isCase ? x : x.toCaseFolded());
+ };
+
+
+ auto begin = d.begin();
+ auto first_match = begin + idx;
+ auto end = d.end();
+ if (!d->isShared()) {
+ auto it = std::remove_if(first_match, end, match);
+ d->erase(it, std::distance(it, end));
+ d.data()[d.size] = u'\0';
+ } else {
+ // Instead of detaching, create a new string and copy all characters except for
+ // the ones we're removing
+ // TODO: size() is more than the needed since "copy" would be shorter
+ QString copy{size(), Qt::Uninitialized};
+ auto dst = copy.d.begin();
+ auto it = std::copy(begin, first_match, dst); // Chunk before idx
+ it = std::remove_copy_if(first_match + 1, end, it, match);
+ copy.d.size = std::distance(dst, it);
+ copy.d.data()[copy.d.size] = u'\0';
+ *this = std::move(copy);
}
return *this;
}
@@ -2963,11 +3668,114 @@ QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
\snippet qstring/main.cpp 96
+ \include qstring.cpp shrinking-erase
+
\sa indexOf(), lastIndexOf(), replace()
*/
/*!
- \fn QString &QString::replace(int position, int n, const QString &after)
+ \fn template <typename Predicate> QString &QString::removeIf(Predicate pred)
+ \since 6.1
+
+ Removes all elements for which the predicate \a pred returns true
+ from the string. Returns a reference to the string.
+
+ \sa remove()
+*/
+
+
+/*! \internal
+ Instead of detaching, or reallocating if "before" is shorter than "after"
+ and there isn't enough capacity, create a new string, copy characters to it
+ as needed, then swap it with "str".
+*/
+static void replace_with_copy(QString &str, QSpan<size_t> indices, qsizetype blen,
+ QStringView after)
+{
+ const qsizetype alen = after.size();
+ const char16_t *after_b = after.utf16();
+
+ const QString::DataPointer &str_d = str.data_ptr();
+ auto src_start = str_d.begin();
+ const qsizetype newSize = str_d.size + indices.size() * (alen - blen);
+ QString copy{ newSize, Qt::Uninitialized };
+ QString::DataPointer &copy_d = copy.data_ptr();
+ auto dst = copy_d.begin();
+ for (size_t index : indices) {
+ auto hit = str_d.begin() + index;
+ dst = std::copy(src_start, hit, dst);
+ dst = std::copy_n(after_b, alen, dst);
+ src_start = hit + blen;
+ }
+ dst = std::copy(src_start, str_d.end(), dst);
+ str.swap(copy);
+}
+
+// No detaching or reallocation is needed
+static void replace_in_place(QString &str, QSpan<size_t> indices,
+ qsizetype blen, QStringView after)
+{
+ const qsizetype alen = after.size();
+ const char16_t *after_b = after.utf16();
+ const char16_t *after_e = after.utf16() + after.size();
+
+ if (blen == alen) { // Replace in place
+ for (size_t index : indices)
+ std::copy_n(after_b, alen, str.data_ptr().begin() + index);
+ } else if (blen > alen) { // Replace from front
+ char16_t *begin = str.data_ptr().begin();
+ char16_t *hit = begin + indices.front();
+ char16_t *to = hit;
+ to = std::copy_n(after_b, alen, to);
+ char16_t *movestart = hit + blen;
+ for (size_t index : indices.sliced(1)) {
+ hit = begin + index;
+ to = std::move(movestart, hit, to);
+ to = std::copy_n(after_b, alen, to);
+ movestart = hit + blen;
+ }
+ to = std::move(movestart, str.data_ptr().end(), to);
+ str.resize(std::distance(begin, to));
+ } else { // blen < alen, Replace from back
+ const qsizetype oldSize = str.data_ptr().size;
+ const qsizetype adjust = indices.size() * (alen - blen);
+ const qsizetype newSize = oldSize + adjust;
+
+ str.resize(newSize);
+ char16_t *begin = str.data_ptr().begin();
+ char16_t *moveend = begin + oldSize;
+ char16_t *to = str.data_ptr().end();
+
+ for (auto it = indices.rbegin(), end = indices.rend(); it != end; ++it) {
+ char16_t *hit = begin + *it;
+ char16_t *movestart = hit + blen;
+ to = std::move_backward(movestart, moveend, to);
+ to = std::copy_backward(after_b, after_e, to);
+ moveend = hit;
+ }
+ }
+}
+
+static void replace_helper(QString &str, QSpan<size_t> indices, qsizetype blen, QStringView after)
+{
+ const qsizetype oldSize = str.data_ptr().size;
+ const qsizetype adjust = indices.size() * (after.size() - blen);
+ const qsizetype newSize = oldSize + adjust;
+ if (str.data_ptr().needsDetach() || needsReallocate(str, newSize)) {
+ replace_with_copy(str, indices, blen, after);
+ return;
+ }
+
+ if (QtPrivate::q_points_into_range(after.begin(), str))
+ // Copy after if it lies inside our own d.b area (which we could
+ // possibly invalidate via a realloc or modify by replacement)
+ replace_in_place(str, indices, blen, QVarLengthArray(after.begin(), after.end()));
+ else
+ replace_in_place(str, indices, blen, after);
+}
+
+/*!
+ \fn QString &QString::replace(qsizetype position, qsizetype n, const QString &after)
Replaces \a n characters beginning at index \a position with
the string \a after and returns a reference to this string.
@@ -2982,38 +3790,38 @@ QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
\sa insert(), remove()
*/
-QString &QString::replace(int pos, int len, const QString &after)
+QString &QString::replace(qsizetype pos, qsizetype len, const QString &after)
{
- return replace(pos, len, after.constData(), after.length());
+ return replace(pos, len, after.constData(), after.size());
}
/*!
- \fn QString &QString::replace(int position, int n, const QChar *unicode, int size)
+ \fn QString &QString::replace(qsizetype position, qsizetype n, const QChar *after, qsizetype alen)
\overload replace()
Replaces \a n characters beginning at index \a position with the
- first \a size characters of the QChar array \a unicode and returns a
+ first \a alen characters of the QChar array \a after and returns a
reference to this string.
*/
-QString &QString::replace(int pos, int len, const QChar *unicode, int size)
+QString &QString::replace(qsizetype pos, qsizetype len, const QChar *after, qsizetype alen)
{
- if (uint(pos) > uint(this->size()))
+ if (size_t(pos) > size_t(this->size()))
return *this;
if (len > this->size() - pos)
len = this->size() - pos;
- uint index = pos;
- replace_helper(&index, 1, len, unicode, size);
+ size_t index = pos;
+ replace_helper(*this, QSpan(&index, 1), len, QStringView{after, alen});
return *this;
}
/*!
- \fn QString &QString::replace(int position, int n, QChar after)
+ \fn QString &QString::replace(qsizetype position, qsizetype n, QChar after)
\overload replace()
Replaces \a n characters beginning at index \a position with the
character \a after and returns a reference to this string.
*/
-QString &QString::replace(int pos, int len, QChar after)
+QString &QString::replace(qsizetype pos, qsizetype len, QChar after)
{
return replace(pos, len, &after, 1);
}
@@ -3023,8 +3831,7 @@ QString &QString::replace(int pos, int len, QChar after)
Replaces every occurrence of the string \a before with the string \a
after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
@@ -3041,90 +3848,6 @@ QString &QString::replace(const QString &before, const QString &after, Qt::CaseS
return replace(before.constData(), before.size(), after.constData(), after.size(), cs);
}
-namespace { // helpers for replace and its helper:
-QChar *textCopy(const QChar *start, int len)
-{
- const size_t size = len * sizeof(QChar);
- QChar *const copy = static_cast<QChar *>(::malloc(size));
- Q_CHECK_PTR(copy);
- ::memcpy(copy, start, size);
- return copy;
-}
-
-static bool pointsIntoRange(const QChar *ptr, const char16_t *base, qsizetype len)
-{
- const QChar *const start = reinterpret_cast<const QChar *>(base);
- const std::less<const QChar *> less;
- return !less(ptr, start) && less(ptr, start + len);
-}
-} // end namespace
-
-/*!
- \internal
- */
-void QString::replace_helper(uint *indices, int nIndices, int blen, const QChar *after, int alen)
-{
- // Copy after if it lies inside our own d.b area (which we could
- // possibly invalidate via a realloc or modify by replacement).
- QChar *afterBuffer = nullptr;
- if (pointsIntoRange(after, d.data(), d.size)) // Use copy in place of vulnerable original:
- after = afterBuffer = textCopy(after, alen);
-
- QT_TRY {
- if (blen == alen) {
- // replace in place
- detach();
- for (int i = 0; i < nIndices; ++i)
- memcpy(d.data() + indices[i], after, alen * sizeof(QChar));
- } else if (alen < blen) {
- // replace from front
- detach();
- uint to = indices[0];
- if (alen)
- memcpy(d.data()+to, after, alen*sizeof(QChar));
- to += alen;
- uint movestart = indices[0] + blen;
- for (int i = 1; i < nIndices; ++i) {
- int msize = indices[i] - movestart;
- if (msize > 0) {
- memmove(d.data() + to, d.data() + movestart, msize * sizeof(QChar));
- to += msize;
- }
- if (alen) {
- memcpy(d.data() + to, after, alen * sizeof(QChar));
- to += alen;
- }
- movestart = indices[i] + blen;
- }
- int msize = d.size - movestart;
- if (msize > 0)
- memmove(d.data() + to, d.data() + movestart, msize * sizeof(QChar));
- resize(d.size - nIndices*(blen-alen));
- } else {
- // replace from back
- int adjust = nIndices*(alen-blen);
- int newLen = d.size + adjust;
- int moveend = d.size;
- resize(newLen);
-
- while (nIndices) {
- --nIndices;
- int movestart = indices[nIndices] + blen;
- int insertstart = indices[nIndices] + nIndices*(alen-blen);
- int moveto = insertstart + alen;
- memmove(d.data() + moveto, d.data() + movestart,
- (moveend - movestart)*sizeof(QChar));
- memcpy(d.data() + insertstart, after, alen * sizeof(QChar));
- moveend = movestart-blen;
- }
- }
- } QT_CATCH(const std::bad_alloc &) {
- ::free(afterBuffer);
- QT_RETHROW;
- }
- ::free(afterBuffer);
-}
-
/*!
\since 4.5
\overload replace()
@@ -3133,11 +3856,10 @@ void QString::replace_helper(uint *indices, int nIndices, int blen, const QChar
characters of \a before with the first \a alen characters of \a
after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
*/
-QString &QString::replace(const QChar *before, int blen,
- const QChar *after, int alen,
+QString &QString::replace(const QChar *before, qsizetype blen,
+ const QChar *after, qsizetype alen,
Qt::CaseSensitivity cs)
{
if (d.size == 0) {
@@ -3149,51 +3871,25 @@ QString &QString::replace(const QChar *before, int blen,
}
if (alen == 0 && blen == 0)
return *this;
+ if (alen == 1 && blen == 1)
+ return replace(*before, *after, cs);
QStringMatcher matcher(before, blen, cs);
- QChar *beforeBuffer = nullptr, *afterBuffer = nullptr;
-
- int index = 0;
- while (1) {
- uint indices[1024];
- uint pos = 0;
- while (pos < 1024) {
- index = matcher.indexIn(*this, index);
- if (index == -1)
- break;
- indices[pos++] = index;
- if (blen) // Step over before:
- index += blen;
- else // Only count one instance of empty between any two characters:
- index++;
- }
- if (!pos) // Nothing to replace
- break;
-
- if (Q_UNLIKELY(index != -1)) {
- /*
- We're about to change data, that before and after might point
- into, and we'll need that data for our next batch of indices.
- */
- if (!afterBuffer && pointsIntoRange(after, d.data(), d.size))
- after = afterBuffer = textCopy(after, alen);
-
- if (!beforeBuffer && pointsIntoRange(before, d.data(), d.size)) {
- beforeBuffer = textCopy(before, blen);
- matcher = QStringMatcher(beforeBuffer, blen, cs);
- }
- }
- replace_helper(indices, pos, blen, after, alen);
+ qsizetype index = 0;
- if (Q_LIKELY(index == -1)) // Nothing left to replace
- break;
- // The call to replace_helper just moved what index points at:
- index += pos*(alen-blen);
+ QVarLengthArray<size_t> indices;
+ while ((index = matcher.indexIn(*this, index)) != -1) {
+ indices.push_back(index);
+ if (blen) // Step over before:
+ index += blen;
+ else // Only count one instance of empty between any two characters:
+ index++;
}
- ::free(afterBuffer);
- ::free(beforeBuffer);
+ if (indices.isEmpty())
+ return *this;
+ replace_helper(*this, indices, blen, QStringView{after, alen});
return *this;
}
@@ -3202,8 +3898,7 @@ QString &QString::replace(const QChar *before, int blen,
Replaces every occurrence of the character \a ch in the string with
\a after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
*/
QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs)
{
@@ -3216,35 +3911,27 @@ QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs
if (size() == 0)
return *this;
- char16_t cc = (cs == Qt::CaseSensitive ? ch.unicode() : ch.toCaseFolded().unicode());
+ const char16_t cc = (cs == Qt::CaseSensitive ? ch.unicode() : ch.toCaseFolded().unicode());
- int index = 0;
- while (1) {
- uint indices[1024];
- uint pos = 0;
- if (cs == Qt::CaseSensitive) {
- while (pos < 1024 && index < size()) {
- if (d.data()[index] == cc)
- indices[pos++] = index;
- index++;
- }
- } else {
- while (pos < 1024 && index < size()) {
- if (QChar::toCaseFolded(d.data()[index]) == cc)
- indices[pos++] = index;
- index++;
- }
+ QVarLengthArray<size_t> indices;
+ if (cs == Qt::CaseSensitive) {
+ const char16_t *begin = d.begin();
+ const char16_t *end = d.end();
+ QStringView view(begin, end);
+ const char16_t *hit = nullptr;
+ while ((hit = QtPrivate::qustrchr(view, cc)) != end) {
+ indices.push_back(std::distance(begin, hit));
+ view = QStringView(std::next(hit), end);
}
- if (!pos) // Nothing to replace
- break;
-
- replace_helper(indices, pos, 1, after.constData(), after.size());
-
- if (Q_LIKELY(index == -1)) // Nothing left to replace
- break;
- // The call to replace_helper just moved what index points at:
- index += pos*(after.size() - 1);
+ } else {
+ for (qsizetype i = 0; i < d.size; ++i)
+ if (QChar::toCaseFolded(d.data()[i]) == cc)
+ indices.push_back(i);
}
+ if (indices.isEmpty())
+ return *this;
+
+ replace_helper(*this, indices, 1, after);
return *this;
}
@@ -3253,34 +3940,43 @@ QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs
Replaces every occurrence of the character \a before with the
character \a after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
*/
QString& QString::replace(QChar before, QChar after, Qt::CaseSensitivity cs)
{
- if (d.size) {
- const int idx = indexOf(before, 0, cs);
- if (idx != -1) {
- detach();
- const char16_t a = after.unicode();
- char16_t *i = d.data();
- char16_t *const e = i + d.size;
- i += idx;
- *i = a;
- if (cs == Qt::CaseSensitive) {
- const char16_t b = before.unicode();
- while (++i != e) {
- if (*i == b)
- *i = a;
- }
- } else {
- const char16_t b = foldCase(before.unicode());
- while (++i != e) {
- if (foldCase(*i) == b)
- *i = a;
- }
- }
+ const qsizetype idx = indexOf(before, 0, cs);
+ if (idx == -1)
+ return *this;
+
+ const char16_t achar = after.unicode();
+ char16_t bchar = before.unicode();
+
+ auto matchesCIS = [](char16_t beforeChar) {
+ return [beforeChar](char16_t ch) { return foldAndCompare(ch, beforeChar); };
+ };
+
+ auto hit = d.begin() + idx;
+ if (!d.needsDetach()) {
+ *hit++ = achar;
+ if (cs == Qt::CaseSensitive) {
+ std::replace(hit, d.end(), bchar, achar);
+ } else {
+ bchar = foldCase(bchar);
+ std::replace_if(hit, d.end(), matchesCIS(bchar), achar);
}
+ } else {
+ QString other{ d.size, Qt::Uninitialized };
+ auto dest = std::copy(d.begin(), hit, other.d.begin());
+ *dest++ = achar;
+ ++hit;
+ if (cs == Qt::CaseSensitive) {
+ std::replace_copy(hit, d.end(), dest, bchar, achar);
+ } else {
+ bchar = foldCase(bchar);
+ std::replace_copy_if(hit, d.end(), dest, matchesCIS(bchar), achar);
+ }
+
+ swap(other);
}
return *this;
}
@@ -3289,22 +3985,23 @@ QString& QString::replace(QChar before, QChar after, Qt::CaseSensitivity cs)
\since 4.5
\overload replace()
- Replaces every occurrence of the string \a before with the string \a
- after and returns a reference to this string.
+ Replaces every occurrence in this string of the Latin-1 string viewed
+ by \a before with the Latin-1 string viewed by \a after, and returns a
+ reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\note The text is not rescanned after a replacement.
*/
-QString &QString::replace(QLatin1String before, QLatin1String after, Qt::CaseSensitivity cs)
+QString &QString::replace(QLatin1StringView before, QLatin1StringView after, Qt::CaseSensitivity cs)
{
- int alen = after.size();
- int blen = before.size();
- QVarLengthArray<char16_t> a(alen);
- QVarLengthArray<char16_t> b(blen);
- qt_from_latin1(a.data(), after.latin1(), alen);
- qt_from_latin1(b.data(), before.latin1(), blen);
+ const qsizetype alen = after.size();
+ const qsizetype blen = before.size();
+ if (blen == 1 && alen == 1)
+ return replace(before.front(), after.front(), cs);
+
+ QVarLengthArray<char16_t> a = qt_from_latin1_to_qvla(after);
+ QVarLengthArray<char16_t> b = qt_from_latin1_to_qvla(before);
return replace((const QChar *)b.data(), blen, (const QChar *)a.data(), alen, cs);
}
@@ -3312,19 +4009,21 @@ QString &QString::replace(QLatin1String before, QLatin1String after, Qt::CaseSen
\since 4.5
\overload replace()
- Replaces every occurrence of the string \a before with the string \a
- after and returns a reference to this string.
+ Replaces every occurrence in this string of the Latin-1 string viewed
+ by \a before with the string \a after, and returns a reference to this
+ string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\note The text is not rescanned after a replacement.
*/
-QString &QString::replace(QLatin1String before, const QString &after, Qt::CaseSensitivity cs)
+QString &QString::replace(QLatin1StringView before, const QString &after, Qt::CaseSensitivity cs)
{
- int blen = before.size();
- QVarLengthArray<char16_t> b(blen);
- qt_from_latin1(b.data(), before.latin1(), blen);
+ const qsizetype blen = before.size();
+ if (blen == 1 && after.size() == 1)
+ return replace(before.front(), after.front(), cs);
+
+ QVarLengthArray<char16_t> b = qt_from_latin1_to_qvla(before);
return replace((const QChar *)b.data(), blen, after.constData(), after.d.size, cs);
}
@@ -3335,16 +4034,17 @@ QString &QString::replace(QLatin1String before, const QString &after, Qt::CaseSe
Replaces every occurrence of the string \a before with the string \a
after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\note The text is not rescanned after a replacement.
*/
-QString &QString::replace(const QString &before, QLatin1String after, Qt::CaseSensitivity cs)
+QString &QString::replace(const QString &before, QLatin1StringView after, Qt::CaseSensitivity cs)
{
- int alen = after.size();
- QVarLengthArray<char16_t> a(alen);
- qt_from_latin1(a.data(), after.latin1(), alen);
+ const qsizetype alen = after.size();
+ if (before.size() == 1 && alen == 1)
+ return replace(before.front(), after.front(), cs);
+
+ QVarLengthArray<char16_t> a = qt_from_latin1_to_qvla(after);
return replace(before.constData(), before.d.size, (const QChar *)a.data(), alen, cs);
}
@@ -3355,444 +4055,513 @@ QString &QString::replace(const QString &before, QLatin1String after, Qt::CaseSe
Replaces every occurrence of the character \a c with the string \a
after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\note The text is not rescanned after a replacement.
*/
-QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
+QString &QString::replace(QChar c, QLatin1StringView after, Qt::CaseSensitivity cs)
{
- int alen = after.size();
- QVarLengthArray<char16_t> a(alen);
- qt_from_latin1(a.data(), after.latin1(), alen);
+ const qsizetype alen = after.size();
+ if (alen == 1)
+ return replace(c, after.front(), cs);
+
+ QVarLengthArray<char16_t> a = qt_from_latin1_to_qvla(after);
return replace(&c, 1, (const QChar *)a.data(), alen, cs);
}
-
/*!
- \relates QString
- Returns \c true if string \a s1 is equal to string \a s2; otherwise
- returns \c false.
+ \fn bool QString::operator==(const QString &lhs, const QString &rhs)
+ \overload operator==()
- The comparison is based exclusively on the numeric Unicode values of
- the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- localeAwareCompare().
-*/
-bool operator==(const QString &s1, const QString &s2) noexcept
-{
- if (s1.d.size != s2.d.size)
- return false;
+ Returns \c true if string \a lhs is equal to string \a rhs; otherwise
+ returns \c false.
- return qt_compare_strings(s1, s2, Qt::CaseSensitive) == 0;
-}
+ \include qstring.cpp compare-isNull-vs-isEmpty
+
+ \sa {Comparing Strings}
+*/
/*!
+ \fn bool QString::operator==(const QString &lhs, const QLatin1StringView &rhs)
+
\overload operator==()
- Returns \c true if this string is equal to \a other; otherwise
+
+ Returns \c true if \a lhs is equal to \a rhs; otherwise
returns \c false.
*/
-bool QString::operator==(QLatin1String other) const noexcept
-{
- if (size() != other.size())
- return false;
- return qt_compare_strings(*this, other, Qt::CaseSensitive) == 0;
-}
+/*!
+ \fn bool QString::operator==(const QLatin1StringView &lhs, const QString &rhs)
+
+ \overload operator==()
+
+ Returns \c true if \a lhs is equal to \a rhs; otherwise
+ returns \c false.
+*/
-/*! \fn bool QString::operator==(const QByteArray &other) const
+/*! \fn bool QString::operator==(const QString &lhs, const QByteArray &rhs)
\overload operator==()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. This function stops conversion at the
- first NUL character found, or the end of the byte array.
+ The \a rhs byte array is converted to a QUtf8StringView.
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
- Returns \c true if this string is lexically equal to the parameter
- string \a other. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
+ Returns \c true if string \a lhs is lexically equal to \a rhs.
+ Otherwise returns \c false.
*/
-/*! \fn bool QString::operator==(const char *other) const
+/*! \fn bool QString::operator==(const QString &lhs, const char * const &rhs)
\overload operator==()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
+*/
+
+/*!
+ \fn bool QString::operator<(const QString &lhs, const QString &rhs)
- \sa QT_NO_CAST_FROM_ASCII
+ \overload operator<()
+
+ Returns \c true if string \a lhs is lexically less than string
+ \a rhs; otherwise returns \c false.
+
+ \sa {Comparing Strings}
*/
/*!
- \relates QString
- Returns \c true if string \a s1 is lexically less than string
- \a s2; otherwise returns \c false.
+ \fn bool QString::operator<(const QString &lhs, const QLatin1StringView &rhs)
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
+ \overload operator<()
+
+ Returns \c true if \a lhs is lexically less than \a rhs;
+ otherwise returns \c false.
*/
-bool operator<(const QString &s1, const QString &s2) noexcept
-{
- return qt_compare_strings(s1, s2, Qt::CaseSensitive) < 0;
-}
/*!
- \overload operator<()
+ \fn bool QString::operator<(const QLatin1StringView &lhs, const QString &rhs)
+
+ \overload operator<()
- Returns \c true if this string is lexically less than the parameter
- string called \a other; otherwise returns \c false.
+ Returns \c true if \a lhs is lexically less than \a rhs;
+ otherwise returns \c false.
*/
-bool QString::operator<(QLatin1String other) const noexcept
-{
- return qt_compare_strings(*this, other, Qt::CaseSensitive) < 0;
-}
-/*! \fn bool QString::operator<(const QByteArray &other) const
+/*! \fn bool QString::operator<(const QString &lhs, const QByteArray &rhs)
\overload operator<()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
+ The \a rhs byte array is converted to a QUtf8StringView.
+ If any NUL characters ('\\0') are embedded in the byte array, they will be
+ included in the transformation.
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this operator
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
-/*! \fn bool QString::operator<(const char *other) const
+/*! \fn bool QString::operator<(const QString &lhs, const char * const &rhs)
- Returns \c true if this string is lexically less than string \a other.
+ Returns \c true if string \a lhs is lexically less than string \a rhs.
Otherwise returns \c false.
\overload operator<()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
-/*! \fn bool operator<=(const QString &s1, const QString &s2)
-
- \relates QString
+/*! \fn bool QString::operator<=(const QString &lhs, const QString &rhs)
- Returns \c true if string \a s1 is lexically less than or equal to
- string \a s2; otherwise returns \c false.
+ Returns \c true if string \a lhs is lexically less than or equal to
+ string \a rhs; otherwise returns \c false.
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- localeAwareCompare().
+ \sa {Comparing Strings}
*/
-/*! \fn bool QString::operator<=(QLatin1String other) const
+/*!
+ \fn bool QString::operator<=(const QString &lhs, const QLatin1StringView &rhs)
- Returns \c true if this string is lexically less than or equal to
- parameter string \a other. Otherwise returns \c false.
+ \overload operator<=()
+
+ Returns \c true if \a lhs is lexically less than or equal to \a rhs;
+ otherwise returns \c false.
+*/
+
+/*!
+ \fn bool QString::operator<=(const QLatin1StringView &lhs, const QString &rhs)
\overload operator<=()
+
+ Returns \c true if \a lhs is lexically less than or equal to \a rhs;
+ otherwise returns \c false.
*/
-/*! \fn bool QString::operator<=(const QByteArray &other) const
+/*! \fn bool QString::operator<=(const QString &lhs, const QByteArray &rhs)
\overload operator<=()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
+ The \a rhs byte array is converted to a QUtf8StringView.
+ If any NUL characters ('\\0') are embedded in the byte array, they will be
+ included in the transformation.
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
-/*! \fn bool QString::operator<=(const char *other) const
+/*! \fn bool QString::operator<=(const QString &lhs, const char * const &rhs)
\overload operator<=()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
-/*! \fn bool operator>(const QString &s1, const QString &s2)
- \relates QString
+/*! \fn bool QString::operator>(const QString &lhs, const QString &rhs)
- Returns \c true if string \a s1 is lexically greater than string \a s2;
+ Returns \c true if string \a lhs is lexically greater than string \a rhs;
otherwise returns \c false.
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- localeAwareCompare().
+ \sa {Comparing Strings}
*/
/*!
- \overload operator>()
+ \fn bool QString::operator>(const QString &lhs, const QLatin1StringView &rhs)
+
+ \overload operator>()
- Returns \c true if this string is lexically greater than the parameter
- string \a other; otherwise returns \c false.
+ Returns \c true if \a lhs is lexically greater than \a rhs;
+ otherwise returns \c false.
*/
-bool QString::operator>(QLatin1String other) const noexcept
-{
- return qt_compare_strings(*this, other, Qt::CaseSensitive) > 0;
-}
-/*! \fn bool QString::operator>(const QByteArray &other) const
+/*!
+ \fn bool QString::operator>(const QLatin1StringView &lhs, const QString &rhs)
\overload operator>()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
+ Returns \c true if \a lhs is lexically greater than \a rhs;
+ otherwise returns \c false.
+*/
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+/*! \fn bool QString::operator>(const QString &lhs, const QByteArray &rhs)
+
+ \overload operator>()
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+ If any NUL characters ('\\0') are embedded in the byte array, they will be
+ included in the transformation.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
-/*! \fn bool QString::operator>(const char *other) const
+/*! \fn bool QString::operator>(const QString &lhs, const char * const &rhs)
\overload operator>()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
+ You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
to ensure that all user-visible strings go through QObject::tr(),
for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
-/*! \fn bool operator>=(const QString &s1, const QString &s2)
- \relates QString
+/*! \fn bool QString::operator>=(const QString &lhs, const QString &rhs)
- Returns \c true if string \a s1 is lexically greater than or equal to
- string \a s2; otherwise returns \c false.
+ Returns \c true if string \a lhs is lexically greater than or equal to
+ string \a rhs; otherwise returns \c false.
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- localeAwareCompare().
+ \sa {Comparing Strings}
*/
-/*! \fn bool QString::operator>=(QLatin1String other) const
+/*!
+ \fn bool QString::operator>=(const QString &lhs, const QLatin1StringView &rhs)
+
+ \overload operator>=()
+
+ Returns \c true if \a lhs is lexically greater than or equal to \a rhs;
+ otherwise returns \c false.
+*/
- Returns \c true if this string is lexically greater than or equal to parameter
- string \a other. Otherwise returns \c false.
+/*!
+ \fn bool QString::operator>=(const QLatin1StringView &lhs, const QString &rhs)
\overload operator>=()
+
+ Returns \c true if \a lhs is lexically greater than or equal to \a rhs;
+ otherwise returns \c false.
*/
-/*! \fn bool QString::operator>=(const QByteArray &other) const
+/*! \fn bool QString::operator>=(const QString &lhs, const QByteArray &rhs)
\overload operator>=()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded in
- the byte array, they will be included in the transformation.
+ The \a rhs byte array is converted to a QUtf8StringView.
+ If any NUL characters ('\\0') are embedded in the byte array, they will be
+ included in the transformation.
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
+ You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
to ensure that all user-visible strings go through QObject::tr(),
for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
-/*! \fn bool QString::operator>=(const char *other) const
+/*! \fn bool QString::operator>=(const QString &lhs, const char * const &rhs)
\overload operator>=()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
+ You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
to ensure that all user-visible strings go through QObject::tr(),
for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
-/*! \fn bool operator!=(const QString &s1, const QString &s2)
- \relates QString
+/*! \fn bool QString::operator!=(const QString &lhs, const QString &rhs)
- Returns \c true if string \a s1 is not equal to string \a s2;
+ Returns \c true if string \a lhs is not equal to string \a rhs;
otherwise returns \c false.
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- localeAwareCompare().
+ \sa {Comparing Strings}
*/
-/*! \fn bool QString::operator!=(QLatin1String other) const
+/*! \fn bool QString::operator!=(const QString &lhs, const QLatin1StringView &rhs)
- Returns \c true if this string is not equal to parameter string \a other.
+ Returns \c true if string \a lhs is not equal to string \a rhs.
Otherwise returns \c false.
\overload operator!=()
*/
-/*! \fn bool QString::operator!=(const QByteArray &other) const
+/*! \fn bool QString::operator!=(const QString &lhs, const QByteArray &rhs)
\overload operator!=()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
+ The \a rhs byte array is converted to a QUtf8StringView.
+ If any NUL characters ('\\0') are embedded in the byte array, they will be
+ included in the transformation.
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
+ You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
to ensure that all user-visible strings go through QObject::tr(),
for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
-/*! \fn bool QString::operator!=(const char *other) const
+/*! \fn bool QString::operator!=(const QString &lhs, const char * const &rhs)
\overload operator!=()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
+*/
+
+/*! \fn bool QString::operator==(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is equal to the UTF-8 encoding of
+ \a rhs; otherwise returns \c false.
- \sa QT_NO_CAST_FROM_ASCII
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
+/*! \fn bool QString::operator!=(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is not equal to the UTF-8 encoding of
+ \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
+/*! \fn bool QString::operator<(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is lexically less than the UTF-8 encoding
+ of \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
+/*! \fn bool QString::operator>(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is lexically greater than the UTF-8
+ encoding of \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
+/*! \fn bool QString::operator<=(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is lexically less than or equal to the
+ UTF-8 encoding of \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
+/*! \fn bool QString::operator>=(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is greater than or equal to the UTF-8
+ encoding of \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
*/
-#if QT_STRINGVIEW_LEVEL < 2
/*!
- Returns the index position of the first occurrence of the string \a
- str in this string, searching forward from index position \a
- from. Returns -1 if \a str is not found.
+ \include qstring.qdocinc {qstring-first-index-of} {string} {str}
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
\snippet qstring/main.cpp 24
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
+ \include qstring.qdocinc negative-index-start-search-from-end
\sa lastIndexOf(), contains(), count()
*/
-int QString::indexOf(const QString &str, int from, Qt::CaseSensitivity cs) const
+qsizetype QString::indexOf(const QString &str, qsizetype from, Qt::CaseSensitivity cs) const
{
- // ### Qt6: qsizetype
- return int(QtPrivate::findString(QStringView(unicode(), length()), from, QStringView(str.unicode(), str.length()), cs));
+ return QtPrivate::findString(QStringView(unicode(), size()), from, QStringView(str.unicode(), str.size()), cs);
}
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
- \fn int QString::indexOf(QStringView str, int from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QString::indexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
\since 5.14
\overload indexOf()
- Returns the index position of the first occurrence of the string view \a str
- in this string, searching forward from index position \a from.
- Returns -1 if \a str is not found.
+ \include qstring.qdocinc {qstring-first-index-of} {string view} {str}
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
+ \include qstring.qdocinc negative-index-start-search-from-end
\sa QStringView::indexOf(), lastIndexOf(), contains(), count()
*/
/*!
\since 4.5
- Returns the index position of the first occurrence of the string \a
- str in this string, searching forward from index position \a
- from. Returns -1 if \a str is not found.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include {qstring.qdocinc} {qstring-first-index-of} {Latin-1 string viewed by} {str}
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
\snippet qstring/main.cpp 24
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
+ \include qstring.qdocinc negative-index-start-search-from-end
\sa lastIndexOf(), contains(), count()
*/
-int QString::indexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) const
+qsizetype QString::indexOf(QLatin1StringView str, qsizetype from, Qt::CaseSensitivity cs) const
{
- // ### Qt6: qsizetype
- return int(QtPrivate::findString(QStringView(unicode(), size()), from, str, cs));
+ return QtPrivate::findString(QStringView(unicode(), size()), from, str, cs);
}
/*!
+ \fn qsizetype QString::indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
\overload indexOf()
- Returns the index position of the first occurrence of the
- character \a ch in the string, searching forward from index
- position \a from. Returns -1 if \a ch could not be found.
+ \include qstring.qdocinc {qstring-first-index-of} {character} {ch}
+*/
+
+/*!
+ \include qstring.qdocinc {qstring-last-index-of} {string} {str}
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if \a str is not found.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ Example:
+
+ \snippet qstring/main.cpp 29
+
+ \note When searching for a 0-length \a str, the match at the end of
+ the data is excluded from the search by a negative \a from, even
+ though \c{-1} is normally thought of as searching from the end of the
+ string: the match at the end is \e after the last character, so it is
+ excluded. To include such a final empty match, either give a positive
+ value for \a from or omit the \a from parameter entirely.
+
+ \sa indexOf(), contains(), count()
*/
-int QString::indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
+qsizetype QString::lastIndexOf(const QString &str, qsizetype from, Qt::CaseSensitivity cs) const
{
- // ### Qt6: qsizetype
- return int(qFindChar(QStringView(unicode(), length()), ch, from, cs));
+ return QtPrivate::lastIndexOf(QStringView(*this), from, str, cs);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
+ \fn qsizetype QString::lastIndexOf(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \since 6.2
+ \overload lastIndexOf()
+
Returns the index position of the last occurrence of the string \a
- str in this string, searching backward from index position \a
- from. If \a from is -1 (default), the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
+ str in this string. Returns -1 if \a str is not found.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
@@ -3800,74 +4569,109 @@ int QString::indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
\sa indexOf(), contains(), count()
*/
-int QString::lastIndexOf(const QString &str, int from, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(QtPrivate::lastIndexOf(QStringView(*this), from, str, cs));
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 4.5
\overload lastIndexOf()
- Returns the index position of the last occurrence of the string \a
- str in this string, searching backward from index position \a
- from. If \a from is -1 (default), the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
+ \include qstring.qdocinc {qstring-last-index-of} {Latin-1 string viewed by} {str}
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if \a str is not found.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
\snippet qstring/main.cpp 29
+ \note When searching for a 0-length \a str, the match at the end of
+ the data is excluded from the search by a negative \a from, even
+ though \c{-1} is normally thought of as searching from the end of the
+ string: the match at the end is \e after the last character, so it is
+ excluded. To include such a final empty match, either give a positive
+ value for \a from or omit the \a from parameter entirely.
+
\sa indexOf(), contains(), count()
*/
-int QString::lastIndexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) const
+qsizetype QString::lastIndexOf(QLatin1StringView str, qsizetype from, Qt::CaseSensitivity cs) const
{
- // ### Qt6: qsizetype
- return int(QtPrivate::lastIndexOf(*this, from, str, cs));
+ return QtPrivate::lastIndexOf(*this, from, str, cs);
}
/*!
+ \fn qsizetype QString::lastIndexOf(QLatin1StringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \since 6.2
\overload lastIndexOf()
- Returns the index position of the last occurrence of the character
- \a ch, searching backward from position \a from.
+ Returns the index position of the last occurrence of the string \a
+ str in this string. Returns -1 if \a str is not found.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ Example:
+
+ \snippet qstring/main.cpp 29
+
+ \sa indexOf(), contains(), count()
*/
-int QString::lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(qLastIndexOf(QStringView(*this), ch, from, cs));
-}
/*!
- \fn int QString::lastIndexOf(QStringView str, int from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QString::lastIndexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
+ \overload lastIndexOf()
+
+ \include qstring.qdocinc {qstring-last-index-of} {character} {ch}
+*/
+
+/*!
+ \fn QString::lastIndexOf(QChar ch, Qt::CaseSensitivity) const
+ \since 6.3
+ \overload lastIndexOf()
+*/
+
+/*!
+ \fn qsizetype QString::lastIndexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
\since 5.14
\overload lastIndexOf()
- Returns the index position of the last occurrence of the string view \a
- str in this string, searching backward from index position \a
- from. If \a from is -1 (default), the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
+ \include qstring.qdocinc {qstring-last-index-of} {string view} {str}
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if \a str is not found.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \note When searching for a 0-length \a str, the match at the end of
+ the data is excluded from the search by a negative \a from, even
+ though \c{-1} is normally thought of as searching from the end of the
+ string: the match at the end is \e after the last character, so it is
+ excluded. To include such a final empty match, either give a positive
+ value for \a from or omit the \a from parameter entirely.
\sa indexOf(), contains(), count()
*/
+/*!
+ \fn qsizetype QString::lastIndexOf(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \since 6.2
+ \overload lastIndexOf()
+
+ Returns the index position of the last occurrence of the string view \a
+ str in this string. Returns -1 if \a str is not found.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa indexOf(), contains(), count()
+*/
#if QT_CONFIG(regularexpression)
struct QStringCapture
{
- int pos;
- int len;
+ qsizetype pos;
+ qsizetype len;
int no;
};
Q_DECLARE_TYPEINFO(QStringCapture, Q_PRIMITIVE_TYPE);
@@ -3893,7 +4697,7 @@ Q_DECLARE_TYPEINFO(QStringCapture, Q_PRIMITIVE_TYPE);
QString &QString::replace(const QRegularExpression &re, const QString &after)
{
if (!re.isValid()) {
- qWarning("QString::replace: invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString::replace");
return *this;
}
@@ -3902,18 +4706,18 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
if (!iterator.hasNext()) // no matches at all
return *this;
- reallocData(uint(d.size) + 1u);
+ reallocData(d.size, QArrayData::KeepSize);
- int numCaptures = re.captureCount();
+ qsizetype numCaptures = re.captureCount();
// 1. build the backreferences list, holding where the backreferences
// are in the replacement string
- QList<QStringCapture> backReferences;
- const int al = after.length();
+ QVarLengthArray<QStringCapture> backReferences;
+ const qsizetype al = after.size();
const QChar *ac = after.unicode();
- for (int i = 0; i < al - 1; i++) {
- if (ac[i] == QLatin1Char('\\')) {
+ for (qsizetype i = 0; i < al - 1; i++) {
+ if (ac[i] == u'\\') {
int no = ac[i + 1].digitValue();
if (no > 0 && no <= numCaptures) {
QStringCapture backReference;
@@ -3938,33 +4742,34 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
// - the part before the match
// - the after string, with the proper replacements for the backreferences
- int newLength = 0; // length of the new string, with all the replacements
- int lastEnd = 0;
- QList<QStringRef> chunks;
+ qsizetype newLength = 0; // length of the new string, with all the replacements
+ qsizetype lastEnd = 0;
+ QVarLengthArray<QStringView> chunks;
+ const QStringView copyView{ copy }, afterView{ after };
while (iterator.hasNext()) {
QRegularExpressionMatch match = iterator.next();
- int len;
+ qsizetype len;
// add the part before the match
len = match.capturedStart() - lastEnd;
if (len > 0) {
- chunks << copy.midRef(lastEnd, len);
+ chunks << copyView.mid(lastEnd, len);
newLength += len;
}
lastEnd = 0;
// add the after string, with replacements for the backreferences
- for (const QStringCapture &backReference : qAsConst(backReferences)) {
+ for (const QStringCapture &backReference : std::as_const(backReferences)) {
// part of "after" before the backreference
len = backReference.pos - lastEnd;
if (len > 0) {
- chunks << after.midRef(lastEnd, len);
+ chunks << afterView.mid(lastEnd, len);
newLength += len;
}
// backreference itself
len = match.capturedLength(backReference.no);
if (len > 0) {
- chunks << copy.midRef(match.capturedStart(backReference.no), len);
+ chunks << copyView.mid(match.capturedStart(backReference.no), len);
newLength += len;
}
@@ -3972,9 +4777,9 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
}
// add the last part of the after string
- len = after.length() - lastEnd;
+ len = afterView.size() - lastEnd;
if (len > 0) {
- chunks << after.midRef(lastEnd, len);
+ chunks << afterView.mid(lastEnd, len);
newLength += len;
}
@@ -3982,18 +4787,18 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
}
// 3. trailing string after the last match
- if (copy.length() > lastEnd) {
- chunks << copy.midRef(lastEnd);
- newLength += copy.length() - lastEnd;
+ if (copyView.size() > lastEnd) {
+ chunks << copyView.mid(lastEnd);
+ newLength += copyView.size() - lastEnd;
}
// 4. assemble the chunks together
resize(newLength);
- int i = 0;
+ qsizetype i = 0;
QChar *uc = data();
- for (const QStringRef &chunk : qAsConst(chunks)) {
- int len = chunk.length();
- memcpy(uc + i, chunk.unicode(), len * sizeof(QChar));
+ for (const QStringView &chunk : std::as_const(chunks)) {
+ qsizetype len = chunk.size();
+ memcpy(uc + i, chunk.constData(), len * sizeof(QChar));
i += len;
}
@@ -4005,16 +4810,14 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
Returns the number of (potentially overlapping) occurrences of
the string \a str in this string.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa contains(), indexOf()
*/
-int QString::count(const QString &str, Qt::CaseSensitivity cs) const
+qsizetype QString::count(const QString &str, Qt::CaseSensitivity cs) const
{
- // ### Qt6: qsizetype
- return int(QtPrivate::count(QStringView(unicode(), size()), QStringView(str.unicode(), str.size()), cs));
+ return QtPrivate::count(QStringView(unicode(), size()), QStringView(str.unicode(), str.size()), cs);
}
/*!
@@ -4022,52 +4825,45 @@ int QString::count(const QString &str, Qt::CaseSensitivity cs) const
Returns the number of occurrences of character \a ch in the string.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa contains(), indexOf()
*/
-int QString::count(QChar ch, Qt::CaseSensitivity cs) const
+qsizetype QString::count(QChar ch, Qt::CaseSensitivity cs) const
{
- // ### Qt6: qsizetype
- return int(QtPrivate::count(QStringView(unicode(), size()), ch, cs));
+ return QtPrivate::count(QStringView(unicode(), size()), ch, cs);
}
/*!
\since 6.0
\overload count()
Returns the number of (potentially overlapping) occurrences of the
- string reference \a str in this string.
+ string view \a str in this string.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa contains(), indexOf()
*/
-int QString::count(QStringView str, Qt::CaseSensitivity cs) const
+qsizetype QString::count(QStringView str, Qt::CaseSensitivity cs) const
{
- // ### Qt6: qsizetype
- return int(QtPrivate::count(*this, str, cs));
+ return QtPrivate::count(*this, str, cs);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*! \fn bool QString::contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
Returns \c true if this string contains an occurrence of the string
\a str; otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
\snippet qstring/main.cpp 17
\sa indexOf(), count()
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
-/*! \fn bool QString::contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+/*! \fn bool QString::contains(QLatin1StringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
\since 5.3
\overload contains()
@@ -4084,20 +4880,6 @@ int QString::count(QStringView str, Qt::CaseSensitivity cs) const
character \a ch; otherwise returns \c false.
*/
-#if QT_STRINGVIEW_LEVEL < 2
-/*! \fn bool QString::contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 4.8
-
- Returns \c true if this string contains an occurrence of the string
- reference \a str; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), count()
-*/
-#endif // QT_STRINGVIEW_LEVEL < 2
-
/*! \fn bool QString::contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
\since 5.14
\overload contains()
@@ -4105,8 +4887,7 @@ int QString::count(QStringView str, Qt::CaseSensitivity cs) const
Returns \c true if this string contains an occurrence of the string view
\a str; otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa indexOf(), count()
*/
@@ -4127,22 +4908,9 @@ int QString::count(QStringView str, Qt::CaseSensitivity cs) const
\snippet qstring/main.cpp 93
*/
-int QString::indexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const
+qsizetype QString::indexOf(const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch) const
{
- if (!re.isValid()) {
- qWarning("QString::indexOf: invalid QRegularExpression object");
- return -1;
- }
-
- QRegularExpressionMatch match = re.match(*this, from);
- if (match.hasMatch()) {
- const int ret = match.capturedStart();
- if (rmatch)
- *rmatch = std::move(match);
- return ret;
- }
-
- return -1;
+ return QtPrivate::indexOf(QStringView(*this), this, re, from, rmatch);
}
/*!
@@ -4150,7 +4918,11 @@ int QString::indexOf(const QRegularExpression &re, int from, QRegularExpressionM
Returns the index position of the last match of the regular
expression \a re in the string, which starts before the index
- position \a from. Returns -1 if \a re didn't match anywhere.
+ position \a from.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if \a re didn't match anywhere.
If the match is successful and \a rmatch is not \nullptr, it also
writes the results of the match into the QRegularExpressionMatch object
@@ -4159,31 +4931,44 @@ int QString::indexOf(const QRegularExpression &re, int from, QRegularExpressionM
Example:
\snippet qstring/main.cpp 94
+
+ \note Due to how the regular expression matching algorithm works,
+ this function will actually match repeatedly from the beginning of
+ the string until the position \a from is reached.
+
+ \note When searching for a regular expression \a re that may match
+ 0 characters, the match at the end of the data is excluded from the
+ search by a negative \a from, even though \c{-1} is normally
+ thought of as searching from the end of the string: the match at
+ the end is \e after the last character, so it is excluded. To
+ include such a final empty match, either give a positive value for
+ \a from or omit the \a from parameter entirely.
*/
-int QString::lastIndexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const
+qsizetype QString::lastIndexOf(const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch) const
{
- if (!re.isValid()) {
- qWarning("QString::lastIndexOf: invalid QRegularExpression object");
- return -1;
- }
+ return QtPrivate::lastIndexOf(QStringView(*this), this, re, from, rmatch);
+}
- int endpos = (from < 0) ? (size() + from + 1) : (from + 1);
- QRegularExpressionMatchIterator iterator = re.globalMatch(*this);
- int lastIndex = -1;
- while (iterator.hasNext()) {
- QRegularExpressionMatch match = iterator.next();
- int start = match.capturedStart();
- if (start < endpos) {
- lastIndex = start;
- if (rmatch)
- *rmatch = std::move(match);
- } else {
- break;
- }
- }
+/*!
+ \fn qsizetype QString::lastIndexOf(const QRegularExpression &re, QRegularExpressionMatch *rmatch = nullptr) const
+ \since 6.2
+ \overload lastIndexOf()
- return lastIndex;
-}
+ Returns the index position of the last match of the regular
+ expression \a re in the string. Returns -1 if \a re didn't match anywhere.
+
+ If the match is successful and \a rmatch is not \nullptr, it also
+ writes the results of the match into the QRegularExpressionMatch object
+ pointed to by \a rmatch.
+
+ Example:
+
+ \snippet qstring/main.cpp 94
+
+ \note Due to how the regular expression matching algorithm works,
+ this function will actually match repeatedly from the beginning of
+ the string until the end of the string is reached.
+*/
/*!
\since 5.1
@@ -4200,15 +4985,7 @@ int QString::lastIndexOf(const QRegularExpression &re, int from, QRegularExpress
bool QString::contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch) const
{
- if (!re.isValid()) {
- qWarning("QString::contains: invalid QRegularExpression object");
- return false;
- }
- QRegularExpressionMatch m = re.match(*this);
- bool hasMatch = m.hasMatch();
- if (hasMatch && rmatch)
- *rmatch = std::move(m);
- return hasMatch;
+ return QtPrivate::contains(QStringView(*this), this, re, rmatch);
}
/*!
@@ -4218,38 +4995,31 @@ bool QString::contains(const QRegularExpression &re, QRegularExpressionMatch *rm
Returns the number of times the regular expression \a re matches
in the string.
- This function counts overlapping matches, so in the example
- below, there are four instances of "ana" or "ama":
+ For historical reasons, this function counts overlapping matches,
+ so in the example below, there are four instances of "ana" or
+ "ama":
\snippet qstring/main.cpp 95
+
+ This behavior is different from simply iterating over the matches
+ in the string using QRegularExpressionMatchIterator.
+
+ \sa QRegularExpression::globalMatch()
*/
-int QString::count(const QRegularExpression &re) const
+qsizetype QString::count(const QRegularExpression &re) const
{
- if (!re.isValid()) {
- qWarning("QString::count: invalid QRegularExpression object");
- return 0;
- }
- int count = 0;
- int index = -1;
- int len = length();
- while (index < len - 1) {
- QRegularExpressionMatch match = re.match(*this, index + 1);
- if (!match.hasMatch())
- break;
- index = match.capturedStart();
- count++;
- }
- return count;
+ return QtPrivate::count(QStringView(*this), re);
}
#endif // QT_CONFIG(regularexpression)
-/*! \fn int QString::count() const
-
+#if QT_DEPRECATED_SINCE(6, 4)
+/*! \fn qsizetype QString::count() const
+ \deprecated [6.4] Use size() or length() instead.
\overload count()
Same as size().
*/
-
+#endif
/*!
\enum QString::SectionFlag
@@ -4279,7 +5049,7 @@ int QString::count(const QRegularExpression &re) const
*/
/*!
- \fn QString QString::section(QChar sep, int start, int end = -1, SectionFlags flags) const
+ \fn QString QString::section(QChar sep, qsizetype start, qsizetype end = -1, SectionFlags flags) const
This function returns a section of the string.
@@ -4315,19 +5085,19 @@ int QString::count(const QRegularExpression &re) const
\sa split()
*/
-QString QString::section(const QString &sep, int start, int end, SectionFlags flags) const
+QString QString::section(const QString &sep, qsizetype start, qsizetype end, SectionFlags flags) const
{
- const QList<QStringRef> sections = splitRef(
+ const QList<QStringView> sections = QStringView{ *this }.split(
sep, Qt::KeepEmptyParts, (flags & SectionCaseInsensitiveSeps) ? Qt::CaseInsensitive : Qt::CaseSensitive);
- const int sectionsSize = sections.size();
+ const qsizetype sectionsSize = sections.size();
if (!(flags & SectionSkipEmpty)) {
if (start < 0)
start += sectionsSize;
if (end < 0)
end += sectionsSize;
} else {
- int skip = 0;
- for (int k = 0; k < sectionsSize; ++k) {
+ qsizetype skip = 0;
+ for (qsizetype k = 0; k < sectionsSize; ++k) {
if (sections.at(k).isEmpty())
skip++;
}
@@ -4340,14 +5110,14 @@ QString QString::section(const QString &sep, int start, int end, SectionFlags fl
return QString();
QString ret;
- int first_i = start, last_i = end;
- for (int x = 0, i = 0; x <= end && i < sectionsSize; ++i) {
- const QStringRef &section = sections.at(i);
+ qsizetype first_i = start, last_i = end;
+ for (qsizetype x = 0, i = 0; x <= end && i < sectionsSize; ++i) {
+ const QStringView &section = sections.at(i);
const bool empty = section.isEmpty();
if (x >= start) {
- if(x == start)
+ if (x == start)
first_i = i;
- if(x == end)
+ if (x == end)
last_i = i;
if (x > start && i > 0)
ret += sep;
@@ -4363,19 +5133,20 @@ QString QString::section(const QString &sep, int start, int end, SectionFlags fl
return ret;
}
-#if !(defined(QT_NO_REGEXP) && !QT_CONFIG(regularexpression))
+#if QT_CONFIG(regularexpression)
class qt_section_chunk {
public:
qt_section_chunk() {}
- qt_section_chunk(int l, QStringRef s) : length(l), string(std::move(s)) {}
- int length;
- QStringRef string;
+ qt_section_chunk(qsizetype l, QStringView s) : length(l), string(std::move(s)) {}
+ qsizetype length;
+ QStringView string;
};
-Q_DECLARE_TYPEINFO(qt_section_chunk, Q_MOVABLE_TYPE);
+Q_DECLARE_TYPEINFO(qt_section_chunk, Q_RELOCATABLE_TYPE);
-static QString extractSections(const QList<qt_section_chunk> &sections, int start, int end, QString::SectionFlags flags)
+static QString extractSections(QSpan<qt_section_chunk> sections, qsizetype start, qsizetype end,
+ QString::SectionFlags flags)
{
- const int sectionsSize = sections.size();
+ const qsizetype sectionsSize = sections.size();
if (!(flags & QString::SectionSkipEmpty)) {
if (start < 0)
@@ -4383,10 +5154,10 @@ static QString extractSections(const QList<qt_section_chunk> &sections, int star
if (end < 0)
end += sectionsSize;
} else {
- int skip = 0;
- for (int k = 0; k < sectionsSize; ++k) {
- const qt_section_chunk &section = sections.at(k);
- if (section.length == section.string.length())
+ qsizetype skip = 0;
+ for (qsizetype k = 0; k < sectionsSize; ++k) {
+ const qt_section_chunk &section = sections[k];
+ if (section.length == section.string.size())
skip++;
}
if (start < 0)
@@ -4398,11 +5169,11 @@ static QString extractSections(const QList<qt_section_chunk> &sections, int star
return QString();
QString ret;
- int x = 0;
- int first_i = start, last_i = end;
- for (int i = 0; x <= end && i < sectionsSize; ++i) {
- const qt_section_chunk &section = sections.at(i);
- const bool empty = (section.length == section.string.length());
+ qsizetype x = 0;
+ qsizetype first_i = start, last_i = end;
+ for (qsizetype i = 0; x <= end && i < sectionsSize; ++i) {
+ const qt_section_chunk &section = sections[i];
+ const bool empty = (section.length == section.string.size());
if (x >= start) {
if (x == start)
first_i = i;
@@ -4418,21 +5189,19 @@ static QString extractSections(const QList<qt_section_chunk> &sections, int star
}
if ((flags & QString::SectionIncludeLeadingSep) && first_i >= 0) {
- const qt_section_chunk &section = sections.at(first_i);
+ const qt_section_chunk &section = sections[first_i];
ret.prepend(section.string.left(section.length));
}
if ((flags & QString::SectionIncludeTrailingSep)
&& last_i < sectionsSize - 1) {
- const qt_section_chunk &section = sections.at(last_i+1);
+ const qt_section_chunk &section = sections[last_i + 1];
ret += section.string.left(section.length);
}
return ret;
}
-#endif
-#if QT_CONFIG(regularexpression)
/*!
\overload section()
\since 5.0
@@ -4447,10 +5216,10 @@ static QString extractSections(const QList<qt_section_chunk> &sections, int star
\sa split(), simplified()
*/
-QString QString::section(const QRegularExpression &re, int start, int end, SectionFlags flags) const
+QString QString::section(const QRegularExpression &re, qsizetype start, qsizetype end, SectionFlags flags) const
{
if (!re.isValid()) {
- qWarning("QString::section: invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString::section");
return QString();
}
@@ -4462,67 +5231,63 @@ QString QString::section(const QRegularExpression &re, int start, int end, Secti
if (flags & SectionCaseInsensitiveSeps)
sep.setPatternOptions(sep.patternOptions() | QRegularExpression::CaseInsensitiveOption);
- QList<qt_section_chunk> sections;
- int n = length(), m = 0, last_m = 0, last_len = 0;
+ QVarLengthArray<qt_section_chunk> sections;
+ qsizetype n = size(), m = 0, last_m = 0, last_len = 0;
QRegularExpressionMatchIterator iterator = sep.globalMatch(*this);
while (iterator.hasNext()) {
QRegularExpressionMatch match = iterator.next();
m = match.capturedStart();
- sections.append(qt_section_chunk(last_len, QStringRef(this, last_m, m - last_m)));
+ sections.append(qt_section_chunk(last_len, QStringView{ *this }.sliced(last_m, m - last_m)));
last_m = m;
last_len = match.capturedLength();
}
- sections.append(qt_section_chunk(last_len, QStringRef(this, last_m, n - last_m)));
+ sections.append(qt_section_chunk(last_len, QStringView{ *this }.sliced(last_m, n - last_m)));
return extractSections(sections, start, end, flags);
}
#endif // QT_CONFIG(regularexpression)
/*!
+ \fn QString QString::left(qsizetype n) const &
+ \fn QString QString::left(qsizetype n) &&
+
Returns a substring that contains the \a n leftmost characters
of the string.
- \obsolete Use first() instead in new code.
+ If you know that \a n cannot be out of bounds, use first() instead in new
+ code, because it is faster.
The entire string is returned if \a n is greater than or equal
to size(), or less than zero.
- \snippet qstring/main.cpp 31
-
\sa first(), last(), startsWith(), chopped(), chop(), truncate()
*/
-QString QString::left(int n) const
-{
- if (uint(n) >= uint(size()))
- return *this;
- return QString((const QChar*) d.data(), n);
-}
/*!
+ \fn QString QString::right(qsizetype n) const &
+ \fn QString QString::right(qsizetype n) &&
+
Returns a substring that contains the \a n rightmost characters
of the string.
- \obsolete Use last() instead in new code.
+ If you know that \a n cannot be out of bounds, use last() instead in new
+ code, because it is faster.
The entire string is returned if \a n is greater than or equal
to size(), or less than zero.
- \snippet qstring/main.cpp 48
-
- \sa endsWith(), last(), first(), sliced(), chopped(), chop(), truncate()
+ \sa endsWith(), last(), first(), sliced(), chopped(), chop(), truncate(), slice()
*/
-QString QString::right(int n) const
-{
- if (uint(n) >= uint(size()))
- return *this;
- return QString(constData() + size() - n, n);
-}
/*!
+ \fn QString QString::mid(qsizetype position, qsizetype n) const &
+ \fn QString QString::mid(qsizetype position, qsizetype n) &&
+
Returns a string that contains \a n characters of this string,
starting at the specified \a position index.
- \obsolete Use sliced() instead in new code.
+ If you know that \a position and \a n cannot be out of bounds, use sliced()
+ instead in new code, because it is faster.
Returns a null string if the \a position index exceeds the
length of the string. If there are less than \a n characters
@@ -4530,14 +5295,9 @@ QString QString::right(int n) const
\a n is -1 (default), the function returns all characters that
are available from the specified \a position.
- Example:
-
- \snippet qstring/main.cpp 34
-
- \sa first(), last(), sliced(), chopped(), chop(), truncate()
+ \sa first(), last(), sliced(), chopped(), chop(), truncate(), slice()
*/
-
-QString QString::mid(int position, int n) const
+QString QString::mid(qsizetype position, qsizetype n) const &
{
qsizetype p = position;
qsizetype l = n;
@@ -4546,22 +5306,37 @@ QString QString::mid(int position, int n) const
case QContainerImplHelper::Null:
return QString();
case QContainerImplHelper::Empty:
- {
- QPair<Data *, char16_t *> pair = Data::allocate(0);
- DataPointer empty = { pair.first, pair.second, 0 };
- return QString(empty);
- }
+ return QString(DataPointer::fromRawData(&_empty, 0));
case QContainerImplHelper::Full:
return *this;
case QContainerImplHelper::Subset:
- return QString(constData() + p, l);
+ return sliced(p, l);
+ }
+ Q_UNREACHABLE_RETURN(QString());
+}
+
+QString QString::mid(qsizetype position, qsizetype n) &&
+{
+ qsizetype p = position;
+ qsizetype l = n;
+ using namespace QtPrivate;
+ switch (QContainerImplHelper::mid(size(), &p, &l)) {
+ case QContainerImplHelper::Null:
+ return QString();
+ case QContainerImplHelper::Empty:
+ resize(0); // keep capacity if we've reserve()d
+ [[fallthrough]];
+ case QContainerImplHelper::Full:
+ return std::move(*this);
+ case QContainerImplHelper::Subset:
+ return std::move(*this).sliced(p, l);
}
- Q_UNREACHABLE();
- return QString();
+ Q_UNREACHABLE_RETURN(QString());
}
/*!
- \fn QString QString::first(qsizetype n) const
+ \fn QString QString::first(qsizetype n) const &
+ \fn QString QString::first(qsizetype n) &&
\since 6.0
Returns a string that contains the first \a n characters
@@ -4569,22 +5344,28 @@ QString QString::mid(int position, int n) const
\note The behavior is undefined when \a n < 0 or \a n > size().
- \sa last(), sliced(), from(), startsWith(), chopped(), chop(), truncate()
+ \snippet qstring/main.cpp 31
+
+ \sa last(), sliced(), startsWith(), chopped(), chop(), truncate(), slice()
*/
/*!
- \fn QString QString::last(qsizetype n) const
+ \fn QString QString::last(qsizetype n) const &
+ \fn QString QString::last(qsizetype n) &&
\since 6.0
Returns the string that contains the last \a n characters of this string.
\note The behavior is undefined when \a n < 0 or \a n > size().
- \sa first(), sliced(), from(), endsWith(), chopped(), chop(), truncate()
+ \snippet qstring/main.cpp 48
+
+ \sa first(), sliced(), endsWith(), chopped(), chop(), truncate(), slice()
*/
/*!
- \fn QString QString::sliced(qsizetype pos, qsizetype n) const
+ \fn QString QString::sliced(qsizetype pos, qsizetype n) const &
+ \fn QString QString::sliced(qsizetype pos, qsizetype n) &&
\since 6.0
Returns a string that contains \a n characters of this string,
@@ -4593,23 +5374,64 @@ QString QString::mid(int position, int n) const
\note The behavior is undefined when \a pos < 0, \a n < 0,
or \a pos + \a n > size().
- \sa first(), last(), chopped(), chop(), truncate()
+ \snippet qstring/main.cpp 34
+
+ \sa first(), last(), chopped(), chop(), truncate(), slice()
*/
+QString QString::sliced_helper(QString &str, qsizetype pos, qsizetype n)
+{
+ if (n == 0)
+ return QString(DataPointer::fromRawData(&_empty, 0));
+ DataPointer d = std::move(str.d).sliced(pos, n);
+ d.data()[n] = 0;
+ return QString(std::move(d));
+}
/*!
- \fn QString QString::from(qsizetype pos) const
+ \fn QString QString::sliced(qsizetype pos) const &
+ \fn QString QString::sliced(qsizetype pos) &&
\since 6.0
+ \overload
Returns a string that contains the portion of this string starting at
position \a pos and extending to its end.
\note The behavior is undefined when \a pos < 0 or \a pos > size().
- \sa first(), last(), sliced(), chopped(), chop(), truncate()
+ \sa first(), last(), chopped(), chop(), truncate(), slice()
+*/
+
+/*!
+ \fn QString &QString::slice(qsizetype pos, qsizetype n)
+ \since 6.8
+
+ Modifies this string to start at position \a pos, extending for \a n
+ characters (code points), and returns a reference to this string.
+
+ \note The behavior is undefined if \a pos < 0, \a n < 0,
+ or \a pos + \a n > size().
+
+ \snippet qstring/main.cpp 86
+
+ \sa sliced(), first(), last(), chopped(), chop(), truncate()
*/
/*!
- \fn QString QString::chopped(int len) const
+ \fn QString &QString::slice(qsizetype pos)
+ \since 6.8
+ \overload
+
+ Modifies this string to start at position \a pos and extending to its end,
+ and returns a reference to this string.
+
+ \note The behavior is undefined if \a pos < 0 or \a pos > size().
+
+ \sa sliced(), first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QString QString::chopped(qsizetype len) const &
+ \fn QString QString::chopped(qsizetype len) &&
\since 5.10
Returns a string that contains the size() - \a len leftmost characters
@@ -4617,16 +5439,14 @@ QString QString::mid(int position, int n) const
\note The behavior is undefined if \a len is negative or greater than size().
- \sa endsWith(), left(), right(), mid(), chop(), truncate()
+ \sa endsWith(), first(), last(), sliced(), chop(), truncate(), slice()
*/
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns \c true if the string starts with \a s; otherwise returns
\c false.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\snippet qstring/main.cpp 65
@@ -4634,16 +5454,15 @@ QString QString::mid(int position, int n) const
*/
bool QString::startsWith(const QString& s, Qt::CaseSensitivity cs) const
{
- return qt_starts_with(*this, s, cs);
+ return qt_starts_with_impl(QStringView(*this), QStringView(s), cs);
}
-#endif
/*!
\overload startsWith()
*/
-bool QString::startsWith(QLatin1String s, Qt::CaseSensitivity cs) const
+bool QString::startsWith(QLatin1StringView s, Qt::CaseSensitivity cs) const
{
- return qt_starts_with(*this, s, cs);
+ return qt_starts_with_impl(QStringView(*this), s, cs);
}
/*!
@@ -4654,7 +5473,11 @@ bool QString::startsWith(QLatin1String s, Qt::CaseSensitivity cs) const
*/
bool QString::startsWith(QChar c, Qt::CaseSensitivity cs) const
{
- return qt_starts_with(*this, c, cs);
+ if (!size())
+ return false;
+ if (cs == Qt::CaseSensitive)
+ return at(0) == c;
+ return foldCase(at(0)) == foldCase(c);
}
/*!
@@ -4662,22 +5485,19 @@ bool QString::startsWith(QChar c, Qt::CaseSensitivity cs) const
\since 5.10
\overload
- Returns \c true if the string starts with the string-view \a str;
+ Returns \c true if the string starts with the string view \a str;
otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (default), the search is case-sensitive;
- otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa endsWith()
*/
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns \c true if the string ends with \a s; otherwise returns
\c false.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\snippet qstring/main.cpp 20
@@ -4685,9 +5505,8 @@ bool QString::startsWith(QChar c, Qt::CaseSensitivity cs) const
*/
bool QString::endsWith(const QString &s, Qt::CaseSensitivity cs) const
{
- return qt_ends_with(*this, s, cs);
+ return qt_ends_with_impl(QStringView(*this), QStringView(s), cs);
}
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\fn bool QString::endsWith(QStringView str, Qt::CaseSensitivity cs) const
@@ -4696,8 +5515,7 @@ bool QString::endsWith(const QString &s, Qt::CaseSensitivity cs) const
Returns \c true if the string ends with the string view \a str;
otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa startsWith()
*/
@@ -4705,9 +5523,9 @@ bool QString::endsWith(const QString &s, Qt::CaseSensitivity cs) const
/*!
\overload endsWith()
*/
-bool QString::endsWith(QLatin1String s, Qt::CaseSensitivity cs) const
+bool QString::endsWith(QLatin1StringView s, Qt::CaseSensitivity cs) const
{
- return qt_ends_with(*this, s, cs);
+ return qt_ends_with_impl(QStringView(*this), s, cs);
}
/*!
@@ -4718,7 +5536,32 @@ bool QString::endsWith(QLatin1String s, Qt::CaseSensitivity cs) const
*/
bool QString::endsWith(QChar c, Qt::CaseSensitivity cs) const
{
- return qt_ends_with(*this, c, cs);
+ if (!size())
+ return false;
+ if (cs == Qt::CaseSensitive)
+ return at(size() - 1) == c;
+ return foldCase(at(size() - 1)) == foldCase(c);
+}
+
+static bool checkCase(QStringView s, QUnicodeTables::Case c) noexcept
+{
+ QStringIterator it(s);
+ while (it.hasNext()) {
+ const char32_t uc = it.next();
+ if (qGetProp(uc)->cases[c].diff)
+ return false;
+ }
+ return true;
+}
+
+bool QtPrivate::isLower(QStringView s) noexcept
+{
+ return checkCase(s, QUnicodeTables::LowerCase);
+}
+
+bool QtPrivate::isUpper(QStringView s) noexcept
+{
+ return checkCase(s, QUnicodeTables::UpperCase);
}
/*!
@@ -4736,15 +5579,7 @@ bool QString::endsWith(QChar c, Qt::CaseSensitivity cs) const
*/
bool QString::isUpper() const
{
- QStringIterator it(*this);
-
- while (it.hasNext()) {
- const char32_t uc = it.nextUnchecked();
- if (qGetProp(uc)->cases[QUnicodeTables::UpperCase].diff)
- return false;
- }
-
- return true;
+ return QtPrivate::isUpper(qToStringViewIgnoringNull(*this));
}
/*!
@@ -4762,15 +5597,7 @@ bool QString::isUpper() const
*/
bool QString::isLower() const
{
- QStringIterator it(*this);
-
- while (it.hasNext()) {
- const char32_t uc = it.nextUnchecked();
- if (qGetProp(uc)->cases[QUnicodeTables::LowerCase].diff)
- return false;
- }
-
- return true;
+ return QtPrivate::isLower(qToStringViewIgnoringNull(*this));
}
static QByteArray qt_convert_to_latin1(QStringView string);
@@ -4781,6 +5608,21 @@ QByteArray QString::toLatin1_helper(const QString &string)
}
/*!
+ \since 6.0
+ \internal
+ \relates QAnyStringView
+
+ Returns a UTF-16 representation of \a string as a QString.
+
+ \sa QString::toLatin1(), QStringView::toLatin1(), QtPrivate::convertToUtf8(),
+ QtPrivate::convertToLocal8Bit(), QtPrivate::convertToUcs4()
+*/
+QString QtPrivate::convertToQString(QAnyStringView string)
+{
+ return string.visit([] (auto string) { return string.toString(); });
+}
+
+/*!
\since 5.10
\internal
\relates QStringView
@@ -4797,12 +5639,13 @@ QByteArray QtPrivate::convertToLatin1(QStringView string)
return qt_convert_to_latin1(string);
}
+Q_NEVER_INLINE
static QByteArray qt_convert_to_latin1(QStringView string)
{
if (Q_UNLIKELY(string.isNull()))
return QByteArray();
- QByteArray ba(string.length(), Qt::Uninitialized);
+ QByteArray ba(string.size(), Qt::Uninitialized);
// since we own the only copy, we're going to const_cast the constData;
// that avoids an unnecessary call to detach() and expansion code that will never get used
@@ -4818,27 +5661,41 @@ QByteArray QString::toLatin1_helper_inplace(QString &s)
// We can return our own buffer to the caller.
// Conversion to Latin-1 always shrinks the buffer by half.
- const char16_t *data = s.d.data();
- int length = s.d.size;
+ // This relies on the fact that we use QArrayData for everything behind the scenes
- // Move the d pointer over to the bytearray.
+ // First, do the in-place conversion. Since isDetached() == true, the data
+ // was allocated by QArrayData, so the null terminator must be there.
+ qsizetype length = s.size();
+ char16_t *sdata = s.d->data();
+ Q_ASSERT(sdata[length] == u'\0');
+ qt_to_latin1(reinterpret_cast<uchar *>(sdata), sdata, length + 1);
+
+ // Move the internals over to the byte array.
// Kids, avert your eyes. Don't try this at home.
+ auto ba_d = std::move(s.d).reinterpreted<char>();
- // this relies on the fact that we use QArrayData for everything behind the scenes which has the same layout
- static_assert(sizeof(QByteArray::DataPointer) == sizeof(QString::DataPointer), "sizes have to be equal");
- QByteArray::DataPointer ba_d(reinterpret_cast<QByteArray::Data *>(s.d.d_ptr()), reinterpret_cast<char *>(s.d.data()), length);
- ba_d.ref();
- s.clear();
+ // Some sanity checks
+ Q_ASSERT(ba_d.d->allocatedCapacity() >= ba_d.size);
+ Q_ASSERT(s.isNull());
+ Q_ASSERT(s.isEmpty());
+ Q_ASSERT(s.constData() == QString().constData());
- char *ddata = ba_d.data();
+ return QByteArray(std::move(ba_d));
+}
- // multiply the allocated capacity by sizeof(char16_t)
- ba_d.d_ptr()->alloc *= sizeof(char16_t);
+// QLatin1 methods that use helpers from qstring.cpp
+char16_t *QLatin1::convertToUnicode(char16_t *out, QLatin1StringView in) noexcept
+{
+ const qsizetype len = in.size();
+ qt_from_latin1(out, in.data(), len);
+ return std::next(out, len);
+}
- // do the in-place conversion
- qt_to_latin1(reinterpret_cast<uchar *>(ddata), data, length);
- ddata[length] = '\0';
- return QByteArray(ba_d);
+char *QLatin1::convertFromUnicode(char *out, QStringView in) noexcept
+{
+ const qsizetype len = in.size();
+ qt_to_latin1(reinterpret_cast<uchar *>(out), in.utf16(), len);
+ return out + len;
}
/*!
@@ -4859,20 +5716,18 @@ static QByteArray qt_convert_to_local_8bit(QStringView string);
\fn QByteArray QString::toLocal8Bit() const
Returns the local 8-bit representation of the string as a
- QByteArray. The returned byte array is undefined if the string
- contains characters not supported by the local 8-bit encoding.
+ QByteArray.
- On Unix systems this is equivalen to toUtf8(), on Windows the systems
- current code page is being used.
+ \include qstring.qdocinc {qstring-local-8-bit-equivalent} {toUtf8}
If this string contains any characters that cannot be encoded in the
- locale, the returned byte array is undefined. Those characters may be
- suppressed or replaced by another.
+ local 8-bit encoding, the returned byte array is undefined. Those
+ characters may be suppressed or replaced by another.
\sa fromLocal8Bit(), toLatin1(), toUtf8(), QStringEncoder
*/
-QByteArray QString::toLocal8Bit_helper(const QChar *data, int size)
+QByteArray QString::toLocal8Bit_helper(const QChar *data, qsizetype size)
{
return qt_convert_to_local_8bit(QStringView(data, size));
}
@@ -4892,7 +5747,7 @@ static QByteArray qt_convert_to_local_8bit(QStringView string)
Returns a local 8-bit representation of \a string as a QByteArray.
- On Unix systems this is equivalen to toUtf8(), on Windows the systems
+ On Unix systems this is equivalent to toUtf8(), on Windows the systems
current code page is being used.
The behavior is undefined if \a string contains characters not
@@ -4928,7 +5783,7 @@ static QByteArray qt_convert_to_utf8(QStringView str)
if (str.isNull())
return QByteArray();
- return QUtf8::convertFromUnicode(str.data(), str.length());
+ return QUtf8::convertFromUnicode(str);
}
/*!
@@ -4962,7 +5817,8 @@ static QList<uint> qt_convert_to_ucs4(QStringView string);
The returned list is not \\0'-terminated.
- \sa fromUtf8(), toUtf8(), toLatin1(), toLocal8Bit(), QStringEncoder, fromUcs4(), toWCharArray()
+ \sa fromUtf8(), toUtf8(), toLatin1(), toLocal8Bit(), QStringEncoder,
+ fromUcs4(), toWCharArray()
*/
QList<uint> QString::toUcs4() const
{
@@ -4971,7 +5827,7 @@ QList<uint> QString::toUcs4() const
static QList<uint> qt_convert_to_ucs4(QStringView string)
{
- QList<uint> v(string.length());
+ QList<uint> v(string.size());
uint *a = const_cast<uint*>(v.constData());
QStringIterator it(string);
while (it.hasNext())
@@ -5002,31 +5858,40 @@ QList<uint> QtPrivate::convertToUcs4(QStringView string)
return qt_convert_to_ucs4(string);
}
-QString::DataPointer QString::fromLatin1_helper(const char *str, int size)
+/*!
+ \fn QString QString::fromLatin1(QByteArrayView str)
+ \overload
+ \since 6.0
+
+ Returns a QString initialized with the Latin-1 string \a str.
+
+ \note: any null ('\\0') bytes in the byte array will be included in this
+ string, converted to Unicode null characters (U+0000).
+*/
+QString QString::fromLatin1(QByteArrayView ba)
{
DataPointer d;
- if (!str) {
+ if (!ba.data()) {
// nothing to do
- } else if (size == 0 || (!*str && size < 0)) {
- d = DataPointer(Data::allocate(0), 0);
+ } else if (ba.size() == 0) {
+ d = DataPointer::fromRawData(&_empty, 0);
} else {
- if (size < 0)
- size = qstrlen(str);
- d = DataPointer(Data::allocate(size + 1), size);
- d.data()[size] = '\0';
+ d = DataPointer(ba.size(), ba.size());
+ Q_CHECK_PTR(d.data());
+ d.data()[ba.size()] = '\0';
char16_t *dst = d.data();
- qt_from_latin1(dst, str, uint(size));
+ qt_from_latin1(dst, ba.data(), size_t(ba.size()));
}
- return d;
+ return QString(std::move(d));
}
-/*! \fn QString QString::fromLatin1(const char *str, int size)
+/*!
+ \fn QString QString::fromLatin1(const char *str, qsizetype size)
Returns a QString initialized with the first \a size characters
of the Latin-1 string \a str.
- If \a size is -1 (default), it is taken to be strlen(\a
- str).
+ If \a size is \c{-1}, \c{strlen(str)} is used instead.
\sa toLatin1(), fromUtf8(), fromLocal8Bit()
*/
@@ -5037,17 +5902,20 @@ QString::DataPointer QString::fromLatin1_helper(const char *str, int size)
\since 5.0
Returns a QString initialized with the Latin-1 string \a str.
+
+ \note: any null ('\\0') bytes in the byte array will be included in this
+ string, converted to Unicode null characters (U+0000). This behavior is
+ different from Qt 5.x.
*/
-/*! \fn QString QString::fromLocal8Bit(const char *str, int size)
+/*!
+ \fn QString QString::fromLocal8Bit(const char *str, qsizetype size)
Returns a QString initialized with the first \a size characters
of the 8-bit string \a str.
- If \a size is -1 (default), it is taken to be strlen(\a
- str).
+ If \a size is \c{-1}, \c{strlen(str)} is used instead.
- On Unix systems this is equivalen to fromUtf8(), on Windows the systems
- current code page is being used.
+ \include qstring.qdocinc {qstring-local-8-bit-equivalent} {fromUtf8}
\sa toLocal8Bit(), fromLatin1(), fromUtf8()
*/
@@ -5058,26 +5926,41 @@ QString::DataPointer QString::fromLatin1_helper(const char *str, int size)
\since 5.0
Returns a QString initialized with the 8-bit string \a str.
+
+ \include qstring.qdocinc {qstring-local-8-bit-equivalent} {fromUtf8}
+
+ \note: any null ('\\0') bytes in the byte array will be included in this
+ string, converted to Unicode null characters (U+0000). This behavior is
+ different from Qt 5.x.
+*/
+
+/*!
+ \fn QString QString::fromLocal8Bit(QByteArrayView str)
+ \overload
+ \since 6.0
+
+ Returns a QString initialized with the 8-bit string \a str.
+
+ \include qstring.qdocinc {qstring-local-8-bit-equivalent} {fromUtf8}
+
+ \note: any null ('\\0') bytes in the byte array will be included in this
+ string, converted to Unicode null characters (U+0000).
*/
-QString QString::fromLocal8Bit_helper(const char *str, int size)
+QString QString::fromLocal8Bit(QByteArrayView ba)
{
- if (!str)
+ if (ba.isNull())
return QString();
- if (size == 0 || (!*str && size < 0)) {
- QPair<Data *, char16_t *> pair = Data::allocate(0);
- QString::DataPointer empty = { pair.first, pair.second, 0 };
- return QString(empty);
- }
+ if (ba.isEmpty())
+ return QString(DataPointer::fromRawData(&_empty, 0));
QStringDecoder toUtf16(QStringDecoder::System, QStringDecoder::Flag::Stateless);
- return toUtf16(str, size);
+ return toUtf16(ba);
}
-/*! \fn QString QString::fromUtf8(const char *str, int size)
+/*! \fn QString QString::fromUtf8(const char *str, qsizetype size)
Returns a QString initialized with the first \a size bytes
of the UTF-8 string \a str.
- If \a size is -1 (default), it is taken to be strlen(\a
- str).
+ If \a size is \c{-1}, \c{strlen(str)} is used instead.
UTF-8 is a Unicode codec and can represent all characters in a Unicode
string like QString. However, invalid sequences are possible with UTF-8
@@ -5095,6 +5978,14 @@ QString QString::fromLocal8Bit_helper(const char *str, int size)
*/
/*!
+ \fn QString QString::fromUtf8(const char8_t *str)
+ \overload
+ \since 6.1
+
+ This overload is only available when compiling in C++20 mode.
+*/
+
+/*!
\fn QString QString::fromUtf8(const char8_t *str, qsizetype size)
\overload
\since 6.0
@@ -5108,16 +5999,32 @@ QString QString::fromLocal8Bit_helper(const char *str, int size)
\since 5.0
Returns a QString initialized with the UTF-8 string \a str.
+
+ \note: any null ('\\0') bytes in the byte array will be included in this
+ string, converted to Unicode null characters (U+0000). This behavior is
+ different from Qt 5.x.
*/
-QString QString::fromUtf8_helper(const char *str, int size)
+
+/*!
+ \fn QString QString::fromUtf8(QByteArrayView str)
+ \overload
+ \since 6.0
+
+ Returns a QString initialized with the UTF-8 string \a str.
+
+ \note: any null ('\\0') bytes in the byte array will be included in this
+ string, converted to Unicode null characters (U+0000).
+*/
+QString QString::fromUtf8(QByteArrayView ba)
{
- if (!str)
+ if (ba.isNull())
return QString();
-
- Q_ASSERT(size != -1);
- return QUtf8::convertToUnicode(str, size);
+ if (ba.isEmpty())
+ return QString(DataPointer::fromRawData(&_empty, 0));
+ return QUtf8::convertToUnicode(ba);
}
+#ifndef QT_BOOTSTRAPPED
/*!
\since 5.3
Returns a QString initialized with the first \a size characters
@@ -5129,38 +6036,31 @@ QString QString::fromUtf8_helper(const char *str, int size)
host byte order is assumed.
This function is slow compared to the other Unicode conversions.
- Use QString(const QChar *, int) or QString(const QChar *) if possible.
+ Use QString(const QChar *, qsizetype) or QString(const QChar *) if possible.
QString makes a deep copy of the Unicode data.
\sa utf16(), setUtf16(), fromStdU16String()
*/
-QString QString::fromUtf16(const char16_t *unicode, int size)
+QString QString::fromUtf16(const char16_t *unicode, qsizetype size)
{
if (!unicode)
return QString();
- if (size < 0) {
- size = 0;
- while (unicode[size] != 0)
- ++size;
- }
+ if (size < 0)
+ size = QtPrivate::qustrlen(unicode);
QStringDecoder toUtf16(QStringDecoder::Utf16, QStringDecoder::Flag::Stateless);
- return toUtf16(reinterpret_cast<const char *>(unicode), size*2);
+ return toUtf16(QByteArrayView(reinterpret_cast<const char *>(unicode), size * 2));
}
/*!
- \fn QString QString::fromUtf16(const ushort *str, int size)
- \obsolete
-
- Use the \c char16_t overload.
+ \fn QString QString::fromUtf16(const ushort *str, qsizetype size)
+ \deprecated [6.0] Use the \c char16_t overload instead.
*/
/*!
- \fn QString QString::fromUcs4(const uint *str, int size)
+ \fn QString QString::fromUcs4(const uint *str, qsizetype size)
\since 4.2
- \obsolete
-
- Use the \c char32_t overload instead.
+ \deprecated [6.0] Use the \c char32_t overload instead.
*/
/*!
@@ -5171,9 +6071,10 @@ QString QString::fromUtf16(const char16_t *unicode, int size)
If \a size is -1 (default), \a unicode must be \\0'-terminated.
- \sa toUcs4(), fromUtf16(), utf16(), setUtf16(), fromWCharArray(), fromStdU32String()
+ \sa toUcs4(), fromUtf16(), utf16(), setUtf16(), fromWCharArray(),
+ fromStdU32String()
*/
-QString QString::fromUcs4(const char32_t *unicode, int size)
+QString QString::fromUcs4(const char32_t *unicode, qsizetype size)
{
if (!unicode)
return QString();
@@ -5183,20 +6084,20 @@ QString QString::fromUcs4(const char32_t *unicode, int size)
++size;
}
QStringDecoder toUtf16(QStringDecoder::Utf32, QStringDecoder::Flag::Stateless);
- return toUtf16(reinterpret_cast<const char *>(unicode), size*4);
+ return toUtf16(QByteArrayView(reinterpret_cast<const char *>(unicode), size * 4));
}
-
+#endif // !QT_BOOTSTRAPPED
/*!
Resizes the string to \a size characters and copies \a unicode
into the string.
- If \a unicode is 0, nothing is copied, but the string is still
+ If \a unicode is \nullptr, nothing is copied, but the string is still
resized to \a size.
\sa unicode(), setUtf16()
*/
-QString& QString::setUnicode(const QChar *unicode, int size)
+QString& QString::setUnicode(const QChar *unicode, qsizetype size)
{
resize(size);
if (unicode && size)
@@ -5205,12 +6106,12 @@ QString& QString::setUnicode(const QChar *unicode, int size)
}
/*!
- \fn QString &QString::setUtf16(const ushort *unicode, int size)
+ \fn QString &QString::setUtf16(const ushort *unicode, qsizetype size)
Resizes the string to \a size characters and copies \a unicode
into the string.
- If \a unicode is 0, nothing is copied, but the string is still
+ If \a unicode is \nullptr, nothing is copied, but the string is still
resized to \a size.
Note that unlike fromUtf16(), this function does not consider BOMs and
@@ -5250,16 +6151,14 @@ namespace {
template <typename StringView>
StringView qt_trimmed(StringView s) noexcept
{
- auto begin = s.begin();
- auto end = s.end();
- QStringAlgorithms<const StringView>::trimmed_helper_positions(begin, end);
+ const auto [begin, end] = QStringAlgorithms<const StringView>::trimmed_helper_positions(s);
return StringView{begin, end};
}
}
/*!
\fn QStringView QtPrivate::trimmed(QStringView s)
- \fn QLatin1String QtPrivate::trimmed(QLatin1String s)
+ \fn QLatin1StringView QtPrivate::trimmed(QLatin1StringView s)
\internal
\relates QStringView
\since 5.10
@@ -5270,14 +6169,14 @@ namespace {
\c true. This includes the ASCII characters '\\t', '\\n', '\\v',
'\\f', '\\r', and ' '.
- \sa QString::trimmed(), QStringView::trimmed(), QLatin1String::trimmed()
+ \sa QString::trimmed(), QStringView::trimmed(), QLatin1StringView::trimmed()
*/
QStringView QtPrivate::trimmed(QStringView s) noexcept
{
return qt_trimmed(s);
}
-QLatin1String QtPrivate::trimmed(QLatin1String s) noexcept
+QLatin1StringView QtPrivate::trimmed(QLatin1StringView s) noexcept
{
return qt_trimmed(s);
}
@@ -5310,7 +6209,7 @@ QString QString::trimmed_helper(QString &str)
return QStringAlgorithms<QString>::trimmed_helper(str);
}
-/*! \fn const QChar QString::at(int position) const
+/*! \fn const QChar QString::at(qsizetype position) const
Returns the character at the given index \a position in the
string.
@@ -5322,7 +6221,7 @@ QString QString::trimmed_helper(QString &str)
*/
/*!
- \fn QChar &QString::operator[](int position)
+ \fn QChar &QString::operator[](qsizetype position)
Returns the character at the specified \a position in the string as a
modifiable reference.
@@ -5335,7 +6234,7 @@ QString QString::trimmed_helper(QString &str)
*/
/*!
- \fn const QChar QString::operator[](int position) const
+ \fn const QChar QString::operator[](qsizetype position) const
\overload operator[]()
*/
@@ -5401,7 +6300,7 @@ QString QString::trimmed_helper(QString &str)
*/
/*!
- \fn void QString::truncate(int position)
+ \fn void QString::truncate(qsizetype position)
Truncates the string at the given \a position index.
@@ -5414,10 +6313,10 @@ QString QString::trimmed_helper(QString &str)
If \a position is negative, it is equivalent to passing zero.
- \sa chop(), resize(), left(), QStringRef::truncate()
+ \sa chop(), resize(), first(), QStringView::truncate()
*/
-void QString::truncate(int pos)
+void QString::truncate(qsizetype pos)
{
if (pos < size())
resize(pos);
@@ -5436,9 +6335,9 @@ void QString::truncate(int pos)
If you want to remove characters from the \e beginning of the
string, use remove() instead.
- \sa truncate(), resize(), remove(), QStringRef::chop()
+ \sa truncate(), resize(), remove(), QStringView::chop()
*/
-void QString::chop(int n)
+void QString::chop(qsizetype n)
{
if (n > 0)
resize(d.size - n);
@@ -5456,20 +6355,16 @@ void QString::chop(int n)
\sa resize()
*/
-QString& QString::fill(QChar ch, int size)
+QString& QString::fill(QChar ch, qsizetype size)
{
resize(size < 0 ? d.size : size);
- if (d.size) {
- QChar *i = (QChar*)d.data() + d.size;
- QChar *b = (QChar*)d.data();
- while (i != b)
- *--i = ch;
- }
+ if (d.size)
+ std::fill(d.data(), d.data() + d.size, ch.unicode());
return *this;
}
/*!
- \fn int QString::length() const
+ \fn qsizetype QString::length() const
Returns the number of characters in this string. Equivalent to
size().
@@ -5478,7 +6373,7 @@ QString& QString::fill(QChar ch, int size)
*/
/*!
- \fn int QString::size() const
+ \fn qsizetype QString::size() const
Returns the number of characters in this string.
@@ -5490,6 +6385,16 @@ QString& QString::fill(QChar ch, int size)
\sa isEmpty(), resize()
*/
+/*!
+ \fn qsizetype QString::max_size()
+ \since 6.8
+
+ This function is provided for STL compatibility.
+ It returns the maximum number of elements that the string can
+ theoretically hold. In practice, the number can be much smaller,
+ limited by the amount of memory available to the system.
+*/
+
/*! \fn bool QString::isNull() const
Returns \c true if this string is null; otherwise returns \c false.
@@ -5535,11 +6440,18 @@ QString& QString::fill(QChar ch, int size)
\sa append(), prepend()
*/
-/*! \fn QString &QString::operator+=(QLatin1String str)
+/*! \fn QString &QString::operator+=(QLatin1StringView str)
\overload operator+=()
- Appends the Latin-1 string \a str to this string.
+ Appends the Latin-1 string viewed by \a str to this string.
+*/
+
+/*! \fn QString &QString::operator+=(QUtf8StringView str)
+ \since 6.5
+ \overload operator+=()
+
+ Appends the UTF-8 string view \a str to this string.
*/
/*! \fn QString &QString::operator+=(const QByteArray &ba)
@@ -5551,12 +6463,10 @@ QString& QString::fill(QChar ch, int size)
are embedded in the \a ba byte array, they will be included in the
transformation.
- You can disable this function by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ You can disable this function by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
*/
/*! \fn QString &QString::operator+=(const char *str)
@@ -5566,19 +6476,10 @@ QString& QString::fill(QChar ch, int size)
Appends the string \a str to this string. The const char pointer
is converted to Unicode using the fromUtf8() function.
- You can disable this function by defining \c QT_NO_CAST_FROM_ASCII
+ You can disable this function by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
to ensure that all user-visible strings go through QObject::tr(),
for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn QString &QString::operator+=(const QStringRef &str)
-
- \overload operator+=()
-
- Appends the string section referenced by \a str to this string.
*/
/*! \fn QString &QString::operator+=(QStringView str)
@@ -5596,85 +6497,68 @@ QString& QString::fill(QChar ch, int size)
*/
/*!
- \fn bool operator==(const char *s1, const QString &s2)
+ \fn bool QString::operator==(const char * const &lhs, const QString &rhs)
- \overload operator==()
- \relates QString
+ \overload operator==()
- Returns \c true if \a s1 is equal to \a s2; otherwise returns \c false.
- Note that no string is equal to \a s1 being 0.
+ Returns \c true if \a lhs is equal to \a rhs; otherwise returns \c false.
+ Note that no string is equal to \a lhs being 0.
- Equivalent to \c {s1 != 0 && compare(s1, s2) == 0}.
+ Equivalent to \c {lhs != 0 && compare(lhs, rhs) == 0}.
*/
/*!
- \fn bool operator!=(const char *s1, const QString &s2)
- \relates QString
+ \fn bool QString::operator!=(const char * const &lhs, const QString &rhs)
- Returns \c true if \a s1 is not equal to \a s2; otherwise returns
+ Returns \c true if \a lhs is not equal to \a rhs; otherwise returns
\c false.
- For \a s1 != 0, this is equivalent to \c {compare(} \a s1, \a s2
- \c {) != 0}. Note that no string is equal to \a s1 being 0.
+ For \a lhs != 0, this is equivalent to \c {compare(} \a lhs, \a rhs
+ \c {) != 0}. Note that no string is equal to \a lhs being 0.
*/
/*!
- \fn bool operator<(const char *s1, const QString &s2)
- \relates QString
+ \fn bool QString::operator<(const char * const &lhs, const QString &rhs)
- Returns \c true if \a s1 is lexically less than \a s2; otherwise
- returns \c false. For \a s1 != 0, this is equivalent to \c
- {compare(s1, s2) < 0}.
+ Returns \c true if \a lhs is lexically less than \a rhs; otherwise
+ returns \c false. For \a lhs != 0, this is equivalent to \c
+ {compare(lhs, rhs) < 0}.
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
+ \sa {Comparing Strings}
*/
/*!
- \fn bool operator<=(const char *s1, const QString &s2)
- \relates QString
+ \fn bool QString::operator<=(const char * const &lhs, const QString &rhs)
- Returns \c true if \a s1 is lexically less than or equal to \a s2;
- otherwise returns \c false. For \a s1 != 0, this is equivalent to \c
- {compare(s1, s2) <= 0}.
+ Returns \c true if \a lhs is lexically less than or equal to \a rhs;
+ otherwise returns \c false. For \a lhs != 0, this is equivalent to \c
+ {compare(lhs, rhs) <= 0}.
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
+ \sa {Comparing Strings}
*/
/*!
- \fn bool operator>(const char *s1, const QString &s2)
- \relates QString
+ \fn bool QString::operator>(const char * const &lhs, const QString &rhs)
- Returns \c true if \a s1 is lexically greater than \a s2; otherwise
- returns \c false. Equivalent to \c {compare(s1, s2) > 0}.
+ Returns \c true if \a lhs is lexically greater than \a rhs; otherwise
+ returns \c false. Equivalent to \c {compare(lhs, rhs) > 0}.
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
+ \sa {Comparing Strings}
*/
/*!
- \fn bool operator>=(const char *s1, const QString &s2)
- \relates QString
+ \fn bool QString::operator>=(const char * const &lhs, const QString &rhs)
- Returns \c true if \a s1 is lexically greater than or equal to \a s2;
- otherwise returns \c false. For \a s1 != 0, this is equivalent to \c
- {compare(s1, s2) >= 0}.
+ Returns \c true if \a lhs is lexically greater than or equal to \a rhs;
+ otherwise returns \c false. For \a lhs != 0, this is equivalent to \c
+ {compare(lhs, rhs) >= 0}.
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
+ \sa {Comparing Strings}
*/
/*!
- \fn const QString operator+(const QString &s1, const QString &s2)
+ \fn QString operator+(const QString &s1, const QString &s2)
+ \fn QString operator+(QString &&s1, const QString &s2)
\relates QString
Returns a string which is the result of concatenating \a s1 and \a
@@ -5682,7 +6566,7 @@ QString& QString::fill(QChar ch, int size)
*/
/*!
- \fn const QString operator+(const QString &s1, const char *s2)
+ \fn QString operator+(const QString &s1, const char *s2)
\relates QString
Returns a string which is the result of concatenating \a s1 and \a
@@ -5693,7 +6577,7 @@ QString& QString::fill(QChar ch, int size)
*/
/*!
- \fn const QString operator+(const char *s1, const QString &s2)
+ \fn QString operator+(const char *s1, const QString &s2)
\relates QString
Returns a string which is the result of concatenating \a s1 and \a
@@ -5707,12 +6591,11 @@ QString& QString::fill(QChar ch, int size)
\fn int QString::compare(const QString &s1, const QString &s2, Qt::CaseSensitivity cs)
\since 4.2
- Compares \a s1 with \a s2 and returns an integer less than, equal
- to, or greater than zero if \a s1 is less than, equal to, or
- greater than \a s2.
+ Compares the string \a s1 with the string \a s2 and returns a negative integer
+ if \a s1 is less than \a s2, a positive integer if it is greater than \a s2,
+ and zero if they are equal.
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
Case sensitive comparison is based exclusively on the numeric
Unicode values of the characters and is very fast, but is not what
@@ -5721,11 +6604,16 @@ QString& QString::fill(QChar ch, int size)
\snippet qstring/main.cpp 16
- \sa operator==(), operator<(), operator>()
+//! [compare-isNull-vs-isEmpty]
+ \note This function treats null strings the same as empty strings,
+ for more details see \l {Distinction Between Null and Empty Strings}.
+//! [compare-isNull-vs-isEmpty]
+
+ \sa operator==(), operator<(), operator>(), {Comparing Strings}
*/
/*!
- \fn int QString::compare(const QString &s1, QLatin1String s2, Qt::CaseSensitivity cs)
+ \fn int QString::compare(const QString &s1, QLatin1StringView s2, Qt::CaseSensitivity cs)
\since 4.2
\overload compare()
@@ -5734,7 +6622,7 @@ QString& QString::fill(QChar ch, int size)
*/
/*!
- \fn int QString::compare(QLatin1String s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ \fn int QString::compare(QLatin1StringView s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
\since 4.2
\overload compare()
@@ -5763,36 +6651,33 @@ QString& QString::fill(QChar ch, int size)
sensitivity setting \a cs.
*/
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\overload compare()
\since 4.2
- Lexically compares this string with the \a other string and
- returns an integer less than, equal to, or greater than zero if
- this string is less than, equal to, or greater than the other
- string.
+ Lexically compares this string with the string \a other and returns
+ a negative integer if this string is less than \a other, a positive
+ integer if it is greater than \a other, and zero if they are equal.
Same as compare(*this, \a other, \a cs).
*/
int QString::compare(const QString &other, Qt::CaseSensitivity cs) const noexcept
{
- return qt_compare_strings(*this, other, cs);
+ return QtPrivate::compareStrings(*this, other, cs);
}
-#endif
/*!
\internal
\since 4.5
*/
-int QString::compare_helper(const QChar *data1, int length1, const QChar *data2, int length2,
+int QString::compare_helper(const QChar *data1, qsizetype length1, const QChar *data2, qsizetype length2,
Qt::CaseSensitivity cs) noexcept
{
Q_ASSERT(length1 >= 0);
Q_ASSERT(length2 >= 0);
Q_ASSERT(data1 || length1 == 0);
Q_ASSERT(data2 || length2 == 0);
- return qt_compare_strings(QStringView(data1, length1), QStringView(data2, length2), cs);
+ return QtPrivate::compareStrings(QStringView(data1, length1), QStringView(data2, length2), cs);
}
/*!
@@ -5801,29 +6686,26 @@ int QString::compare_helper(const QChar *data1, int length1, const QChar *data2,
Same as compare(*this, \a other, \a cs).
*/
-int QString::compare(QLatin1String other, Qt::CaseSensitivity cs) const noexcept
+int QString::compare(QLatin1StringView other, Qt::CaseSensitivity cs) const noexcept
{
- return qt_compare_strings(*this, other, cs);
+ return QtPrivate::compareStrings(*this, other, cs);
}
/*!
\internal
\since 5.0
*/
-int QString::compare_helper(const QChar *data1, int length1, const char *data2, int length2,
- Qt::CaseSensitivity cs)
+int QString::compare_helper(const QChar *data1, qsizetype length1, const char *data2, qsizetype length2,
+ Qt::CaseSensitivity cs) noexcept
{
Q_ASSERT(length1 >= 0);
Q_ASSERT(data1 || length1 == 0);
if (!data2)
- return length1;
+ return qt_lencmp(length1, 0);
if (Q_UNLIKELY(length2 < 0))
- length2 = int(strlen(data2));
- // ### make me nothrow in all cases
- QVarLengthArray<ushort> s2(length2);
- const auto beg = reinterpret_cast<QChar *>(s2.data());
- const auto end = QUtf8::convertToUnicode(beg, data2, length2);
- return qt_compare_strings(QStringView(data1, length1), QStringView(beg, end - beg), cs);
+ length2 = qsizetype(strlen(data2));
+ return QtPrivate::compareStrings(QStringView(data1, length1),
+ QUtf8StringView(data2, length2), cs);
}
/*!
@@ -5836,16 +6718,120 @@ int QString::compare_helper(const QChar *data1, int length1, const char *data2,
\overload compare()
*/
+bool comparesEqual(const QByteArrayView &lhs, const QChar &rhs) noexcept
+{
+ return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+}
+
+Qt::strong_ordering compareThreeWay(const QByteArrayView &lhs, const QChar &rhs) noexcept
+{
+ const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+ return Qt::compareThreeWay(res, 0);
+}
+
+bool comparesEqual(const QByteArrayView &lhs, char16_t rhs) noexcept
+{
+ return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+}
+
+Qt::strong_ordering compareThreeWay(const QByteArrayView &lhs, char16_t rhs) noexcept
+{
+ const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+ return Qt::compareThreeWay(res, 0);
+}
+
+bool comparesEqual(const QByteArray &lhs, const QChar &rhs) noexcept
+{
+ return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+}
+
+Qt::strong_ordering compareThreeWay(const QByteArray &lhs, const QChar &rhs) noexcept
+{
+ const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+ return Qt::compareThreeWay(res, 0);
+}
+
+bool comparesEqual(const QByteArray &lhs, char16_t rhs) noexcept
+{
+ return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+}
+
+Qt::strong_ordering compareThreeWay(const QByteArray &lhs, char16_t rhs) noexcept
+{
+ const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+ return Qt::compareThreeWay(res, 0);
+}
+
+/*!
+ \internal
+ \since 6.8
+*/
+bool QT_FASTCALL QChar::equal_helper(QChar lhs, const char *rhs) noexcept
+{
+ return QtPrivate::equalStrings(QStringView(&lhs, 1), QUtf8StringView(rhs));
+}
+
+int QT_FASTCALL QChar::compare_helper(QChar lhs, const char *rhs) noexcept
+{
+ return QtPrivate::compareStrings(QStringView(&lhs, 1), QUtf8StringView(rhs));
+}
+
+/*!
+ \internal
+ \since 6.8
+*/
+bool QStringView::equal_helper(QStringView sv, const char *data, qsizetype len)
+{
+ Q_ASSERT(len >= 0);
+ Q_ASSERT(data || len == 0);
+ return QtPrivate::equalStrings(sv, QUtf8StringView(data, len));
+}
+
+/*!
+ \internal
+ \since 6.8
+*/
+int QStringView::compare_helper(QStringView sv, const char *data, qsizetype len)
+{
+ Q_ASSERT(len >= 0);
+ Q_ASSERT(data || len == 0);
+ return QtPrivate::compareStrings(sv, QUtf8StringView(data, len));
+}
+
+/*!
+ \internal
+ \since 6.8
+*/
+bool QLatin1StringView::equal_helper(QLatin1StringView s1, const char *s2, qsizetype len) noexcept
+{
+ // because qlatin1stringview.h can't include qutf8stringview.h
+ Q_ASSERT(len >= 0);
+ Q_ASSERT(s2 || len == 0);
+ return QtPrivate::equalStrings(s1, QUtf8StringView(s2, len));
+}
+
+/*!
+ \internal
+ \since 6.6
+*/
+int QLatin1StringView::compare_helper(const QLatin1StringView &s1, const char *s2, qsizetype len) noexcept
+{
+ // because qlatin1stringview.h can't include qutf8stringview.h
+ Q_ASSERT(len >= 0);
+ Q_ASSERT(s2 || len == 0);
+ return QtPrivate::compareStrings(s1, QUtf8StringView(s2, len));
+}
+
/*!
\internal
\since 4.5
*/
-int QString::compare_helper(const QChar *data1, int length1, QLatin1String s2,
- Qt::CaseSensitivity cs) noexcept
+int QLatin1StringView::compare_helper(const QChar *data1, qsizetype length1, QLatin1StringView s2,
+ Qt::CaseSensitivity cs) noexcept
{
Q_ASSERT(length1 >= 0);
Q_ASSERT(data1 || length1 == 0);
- return qt_compare_strings(QStringView(data1, length1), s2, cs);
+ return QtPrivate::compareStrings(QStringView(data1, length1), s2, cs);
}
/*!
@@ -5859,10 +6845,7 @@ int QString::compare_helper(const QChar *data1, int length1, QLatin1String s2,
platform-dependent manner. Use this function to present sorted
lists of strings to the user.
- On \macos and iOS this function compares according the
- "Order for sorted lists" setting in the International preferences panel.
-
- \sa compare(), QLocale
+ \sa compare(), QLocale, {Comparing Strings}
*/
/*!
@@ -5879,6 +6862,8 @@ int QString::compare_helper(const QChar *data1, int length1, QLatin1String s2,
lists of strings to the user.
Same as \c {localeAwareCompare(*this, other)}.
+
+ \sa {Comparing Strings}
*/
/*!
@@ -5893,6 +6878,8 @@ int QString::compare_helper(const QChar *data1, int length1, QLatin1String s2,
The comparison is performed in a locale- and also
platform-dependent manner. Use this function to present sorted
lists of strings to the user.
+
+ \sa {Comparing Strings}
*/
@@ -5914,22 +6901,20 @@ int QString::compare_helper(const QChar *data1, int length1, QLatin1String s2,
lists of strings to the user.
Same as \c {localeAwareCompare(*this, other)}.
+
+ \sa {Comparing Strings}
*/
int QString::localeAwareCompare(const QString &other) const
{
- return localeAwareCompare_helper(constData(), length(), other.constData(), other.length());
+ return localeAwareCompare_helper(constData(), size(), other.constData(), other.size());
}
-#if QT_CONFIG(icu)
-Q_GLOBAL_STATIC(QThreadStorage<QCollator>, defaultCollator)
-#endif
-
/*!
\internal
\since 4.5
*/
-int QString::localeAwareCompare_helper(const QChar *data1, int length1,
- const QChar *data2, int length2)
+int QString::localeAwareCompare_helper(const QChar *data1, qsizetype length1,
+ const QChar *data2, qsizetype length2)
{
Q_ASSERT(length1 >= 0);
Q_ASSERT(data1 || length1 == 0);
@@ -5938,13 +6923,11 @@ int QString::localeAwareCompare_helper(const QChar *data1, int length1,
// do the right thing for null and empty
if (length1 == 0 || length2 == 0)
- return qt_compare_strings(QStringView(data1, length1), QStringView(data2, length2),
+ return QtPrivate::compareStrings(QStringView(data1, length1), QStringView(data2, length2),
Qt::CaseSensitive);
#if QT_CONFIG(icu)
- if (!defaultCollator()->hasLocalData())
- defaultCollator()->setLocalData(QCollator());
- return defaultCollator()->localData().compare(data1, length1, data2, length2);
+ return QCollator::defaultCompare(QStringView(data1, length1), QStringView(data2, length2));
#else
const QString lhs = QString::fromRawData(data1, length1).normalized(QString::NormalizationForm_C);
const QString rhs = QString::fromRawData(data2, length2).normalized(QString::NormalizationForm_C);
@@ -5976,14 +6959,11 @@ int QString::localeAwareCompare_helper(const QChar *data1, int length1,
CFRelease(otherString);
return result;
# elif defined(Q_OS_UNIX)
- // declared in <string.h>
- int delta = strcoll(lhs.toLocal8Bit().constData(), rhs.toLocal8Bit().constData());
- if (delta == 0)
- delta = qt_compare_strings(lhs, rhs, Qt::CaseSensitive);
- return delta;
+ // declared in <string.h> (no better than QtPrivate::compareStrings() on Android, sadly)
+ return strcoll(lhs.toLocal8Bit().constData(), rhs.toLocal8Bit().constData());
# else
# error "This case shouldn't happen"
- return qt_compare_strings(lhs, rhs, Qt::CaseSensitive);
+ return QtPrivate::compareStrings(lhs, rhs, Qt::CaseSensitive);
# endif
#endif // !QT_CONFIG(icu)
}
@@ -6016,7 +6996,7 @@ const ushort *QString::utf16() const
{
if (!d->isMutable()) {
// ensure '\0'-termination for ::fromRawData strings
- const_cast<QString*>(this)->reallocData(uint(d.size) + 1u);
+ const_cast<QString*>(this)->reallocData(d.size, QArrayData::KeepSize);
}
return reinterpret_cast<const ushort *>(d.data());
}
@@ -6039,11 +7019,11 @@ const ushort *QString::utf16() const
\sa rightJustified()
*/
-QString QString::leftJustified(int width, QChar fill, bool truncate) const
+QString QString::leftJustified(qsizetype width, QChar fill, bool truncate) const
{
QString result;
- int len = length();
- int padlen = width - len;
+ qsizetype len = size();
+ qsizetype padlen = width - len;
if (padlen > 0) {
result.resize(len+padlen);
if (len)
@@ -6078,11 +7058,11 @@ QString QString::leftJustified(int width, QChar fill, bool truncate) const
\sa leftJustified()
*/
-QString QString::rightJustified(int width, QChar fill, bool truncate) const
+QString QString::rightJustified(qsizetype width, QChar fill, bool truncate) const
{
QString result;
- int len = length();
- int padlen = width - len;
+ qsizetype len = size();
+ qsizetype padlen = width - len;
if (padlen > 0) {
result.resize(len+padlen);
QChar *uc = (QChar*)result.d.data();
@@ -6106,8 +7086,8 @@ QString QString::rightJustified(int width, QChar fill, bool truncate) const
\snippet qstring/main.cpp 75
- The case conversion will always happen in the 'C' locale. For locale dependent
- case folding use QLocale::toLower()
+ The case conversion will always happen in the 'C' locale. For
+ locale-dependent case folding use QLocale::toLower()
\sa toUpper(), QLocale::toLower()
*/
@@ -6130,9 +7110,9 @@ namespace QUnicodeTables {
\endlist
In copy-convert mode, the local variable \c{s} is detached from the input
- \a str. In the in-place convert mode, \a str is in moved-from state (which
- this function requires to be a valid, empty string) and \c{s} contains the
- only copy of the string, without reallocation (thus, \a it is still valid).
+ \a str. In the in-place convert mode, \a str is in moved-from state and
+ \c{s} contains the only copy of the string, without reallocation (thus,
+ \a it is still valid).
There is one pathological case left: when the in-place conversion needs to
reallocate memory to grow the buffer. In that case, we need to adjust the \a
@@ -6143,11 +7123,11 @@ Q_NEVER_INLINE
static QString detachAndConvertCase(T &str, QStringIterator it, QUnicodeTables::Case which)
{
Q_ASSERT(!str.isEmpty());
- QString s = std::move(str); // will copy if T is const QString
+ QString s = std::move(str); // will copy if T is const QString
QChar *pp = s.begin() + it.index(); // will detach if necessary
do {
- const auto folded = fullConvertCase(it.nextUnchecked(), which);
+ const auto folded = fullConvertCase(it.next(), which);
if (Q_UNLIKELY(folded.size() > 1)) {
if (folded.chars[0] == *pp && folded.size() == 2) {
// special case: only second actually changed (e.g. surrogate pairs),
@@ -6156,15 +7136,14 @@ static QString detachAndConvertCase(T &str, QStringIterator it, QUnicodeTables::
*pp++ = folded.chars[1];
} else {
// slow path: the string is growing
- int inpos = it.index() - 1;
- int outpos = pp - s.constBegin();
+ qsizetype inpos = it.index() - 1;
+ qsizetype outpos = pp - s.constBegin();
s.replace(outpos, 1, reinterpret_cast<const QChar *>(folded.data()), folded.size());
pp = const_cast<QChar *>(s.constBegin()) + outpos + folded.size();
- // do we need to adjust the input iterator too?
- // if it is pointing to s's data, str is empty
- if (str.isEmpty())
+ // Adjust the input iterator if we are performing an in-place conversion
+ if constexpr (!std::is_const<T>::value)
it = QStringIterator(s.constBegin(), inpos + folded.size(), s.constEnd());
}
} else {
@@ -6187,9 +7166,9 @@ static QString convertCase(T &str, QUnicodeTables::Case which)
QStringIterator it(p, e);
while (it.hasNext()) {
- const char32_t uc = it.nextUnchecked();
+ const char32_t uc = it.next();
if (qGetProp(uc)->cases[which].diff) {
- it.recedeUnchecked();
+ it.recede();
return detachAndConvertCase(str, it, which);
}
}
@@ -6231,8 +7210,8 @@ QString QString::toCaseFolded_helper(QString &str)
\snippet qstring/main.cpp 81
- The case conversion will always happen in the 'C' locale. For locale dependent
- case folding use QLocale::toUpper()
+ The case conversion will always happen in the 'C' locale. For
+ locale-dependent case folding use QLocale::toUpper()
\sa toLower(), QLocale::toLower()
*/
@@ -6247,7 +7226,6 @@ QString QString::toUpper_helper(QString &str)
return QUnicodeTables::convertCase(str, QUnicodeTables::UpperCase);
}
-// ### Qt 6: Consider whether this function shouldn't be removed See task 202871.
/*!
\since 5.5
@@ -6291,11 +7269,11 @@ QString QString::asprintf(const char *cformat, ...)
return s;
}
-static void append_utf8(QString &qs, const char *cs, int len)
+static void append_utf8(QString &qs, const char *cs, qsizetype len)
{
- const int oldSize = qs.size();
+ const qsizetype oldSize = qs.size();
qs.resize(oldSize + len);
- const QChar *newEnd = QUtf8::convertToUnicode(qs.data() + oldSize, cs, len);
+ const QChar *newEnd = QUtf8::convertToUnicode(qs.data() + oldSize, QByteArrayView(cs, len));
qs.resize(newEnd - qs.constData());
}
@@ -6312,26 +7290,28 @@ static uint parse_flag_characters(const char * &c) noexcept
case '-': flags |= QLocaleData::LeftAdjusted; break;
case ' ': flags |= QLocaleData::BlankBeforePositive; break;
case '+': flags |= QLocaleData::AlwaysShowSign; break;
- case '\'': flags |= QLocaleData::ThousandsGroup; break;
+ case '\'': flags |= QLocaleData::GroupDigits; break;
default: return flags;
}
++c;
}
}
-static int parse_field_width(const char * &c)
+static int parse_field_width(const char *&c, qsizetype size)
{
- Q_ASSERT(qIsDigit(*c));
+ Q_ASSERT(isAsciiDigit(*c));
+ const char *const stop = c + size;
// can't be negative - started with a digit
// contains at least one digit
- const char *endp;
- bool ok;
- const qulonglong result = qstrtoull(c, &endp, 10, &ok);
- c = endp;
- while (qIsDigit(*c)) // preserve Qt 5.5 behavior of consuming all digits, no matter how many
+ auto [result, used] = qstrntoull(c, size, 10);
+ c += used;
+ if (used <= 0)
+ return false;
+ // preserve Qt 5.5 behavior of consuming all digits, no matter how many
+ while (c < stop && isAsciiDigit(*c))
++c;
- return ok && result < qulonglong(std::numeric_limits<int>::max()) ? int(result) : 0;
+ return result < qulonglong(std::numeric_limits<int>::max()) ? int(result) : 0;
}
enum LengthMod { lm_none, lm_hh, lm_h, lm_l, lm_ll, lm_L, lm_j, lm_z, lm_t };
@@ -6385,12 +7365,13 @@ QString QString::vasprintf(const char *cformat, va_list ap)
QString result;
const char *c = cformat;
+ const char *formatEnd = cformat + qstrlen(cformat);
for (;;) {
// Copy non-escape chars to result
const char *cb = c;
while (*c != '\0' && *c != '%')
c++;
- append_utf8(result, cb, int(c - cb));
+ append_utf8(result, cb, qsizetype(c - cb));
if (*c == '\0')
break;
@@ -6400,11 +7381,11 @@ QString QString::vasprintf(const char *cformat, va_list ap)
++c;
if (*c == '\0') {
- result.append(QLatin1Char('%')); // a % at the end of the string - treat as non-escape text
+ result.append(u'%'); // a % at the end of the string - treat as non-escape text
break;
}
if (*c == '%') {
- result.append(QLatin1Char('%')); // %%
+ result.append(u'%'); // %%
++c;
continue;
}
@@ -6412,14 +7393,14 @@ QString QString::vasprintf(const char *cformat, va_list ap)
uint flags = parse_flag_characters(c);
if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
+ result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
break;
}
// Parse field width
int width = -1; // -1 means unspecified
- if (qIsDigit(*c)) {
- width = parse_field_width(c);
+ if (isAsciiDigit(*c)) {
+ width = parse_field_width(c, formatEnd - c);
} else if (*c == '*') { // can't parse this in another function, not portably, at least
width = va_arg(ap, int);
if (width < 0)
@@ -6428,7 +7409,7 @@ QString QString::vasprintf(const char *cformat, va_list ap)
}
if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
+ result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
break;
}
@@ -6436,8 +7417,9 @@ QString QString::vasprintf(const char *cformat, va_list ap)
int precision = -1; // -1 means unspecified
if (*c == '.') {
++c;
- if (qIsDigit(*c)) {
- precision = parse_field_width(c);
+ precision = 0;
+ if (isAsciiDigit(*c)) {
+ precision = parse_field_width(c, formatEnd - c);
} else if (*c == '*') { // can't parse this in another function, not portably, at least
precision = va_arg(ap, int);
if (precision < 0)
@@ -6447,14 +7429,14 @@ QString QString::vasprintf(const char *cformat, va_list ap)
}
if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
+ result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
break;
}
const LengthMod length_mod = parse_length_modifier(c);
if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
+ result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
break;
}
@@ -6471,8 +7453,10 @@ QString QString::vasprintf(const char *cformat, va_list ap)
case lm_l: i = va_arg(ap, long int); break;
case lm_ll: i = va_arg(ap, qint64); break;
case lm_j: i = va_arg(ap, long int); break;
- case lm_z: i = va_arg(ap, size_t); break;
- case lm_t: i = va_arg(ap, int); break;
+
+ /* ptrdiff_t actually, but it should be the same for us */
+ case lm_z: i = va_arg(ap, qsizetype); break;
+ case lm_t: i = va_arg(ap, qsizetype); break;
default: i = 0; break;
}
subst = QLocaleData::c()->longLongToString(i, precision, 10, width, flags);
@@ -6490,15 +7474,16 @@ QString QString::vasprintf(const char *cformat, va_list ap)
case lm_h: u = va_arg(ap, uint); break;
case lm_l: u = va_arg(ap, ulong); break;
case lm_ll: u = va_arg(ap, quint64); break;
+ case lm_t: u = va_arg(ap, size_t); break;
case lm_z: u = va_arg(ap, size_t); break;
default: u = 0; break;
}
- if (qIsUpper(*c))
+ if (isAsciiUpper(*c))
flags |= QLocaleData::CapitalEorX;
int base = 10;
- switch (qToLower(*c)) {
+ switch (QtMiscUtils::toAsciiLower(*c)) {
case 'o':
base = 8; break;
case 'u':
@@ -6525,11 +7510,11 @@ QString QString::vasprintf(const char *cformat, va_list ap)
else
d = va_arg(ap, double);
- if (qIsUpper(*c))
+ if (isAsciiUpper(*c))
flags |= QLocaleData::CapitalEorX;
QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- switch (qToLower(*c)) {
+ switch (QtMiscUtils::toAsciiLower(*c)) {
case 'e': form = QLocaleData::DFExponent; break;
case 'a': // not supported - decimal form used instead
case 'f': form = QLocaleData::DFDecimal; break;
@@ -6552,13 +7537,17 @@ QString QString::vasprintf(const char *cformat, va_list ap)
if (length_mod == lm_l) {
const ushort *buff = va_arg(ap, const ushort*);
const ushort *ch = buff;
- while (*ch != 0)
+ while (precision != 0 && *ch != 0) {
++ch;
+ --precision;
+ }
subst.setUtf16(buff, ch - buff);
- } else
+ } else if (precision == -1) {
subst = QString::fromUtf8(va_arg(ap, const char*));
- if (precision != -1)
- subst.truncate(precision);
+ } else {
+ const char *buff = va_arg(ap, const char*);
+ subst = QString::fromUtf8(buff, qstrnlen(buff, precision));
+ }
++c;
break;
}
@@ -6574,27 +7563,27 @@ QString QString::vasprintf(const char *cformat, va_list ap)
switch (length_mod) {
case lm_hh: {
signed char *n = va_arg(ap, signed char*);
- *n = result.length();
+ *n = result.size();
break;
}
case lm_h: {
short int *n = va_arg(ap, short int*);
- *n = result.length();
+ *n = result.size();
break;
}
case lm_l: {
long int *n = va_arg(ap, long int*);
- *n = result.length();
+ *n = result.size();
break;
}
case lm_ll: {
qint64 *n = va_arg(ap, qint64*);
- *n = result.length();
+ *n = result.size();
break;
}
default: {
int *n = va_arg(ap, int*);
- *n = result.length();
+ *n = int(result.size());
break;
}
}
@@ -6617,6 +7606,8 @@ QString QString::vasprintf(const char *cformat, va_list ap)
}
/*!
+ \fn QString::toLongLong(bool *ok, int base) const
+
Returns the string converted to a \c{long long} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
@@ -6624,12 +7615,13 @@ QString QString::vasprintf(const char *cformat, va_list ap)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toLongLong()
+ The string conversion will always happen in the 'C' locale. For
+ locale-dependent conversion use QLocale::toLongLong()
Example:
@@ -6637,28 +7629,41 @@ QString QString::vasprintf(const char *cformat, va_list ap)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toULongLong(), toInt(), QLocale::toLongLong()
*/
-qint64 QString::toLongLong(bool *ok, int base) const
-{
- return toIntegral_helper<qlonglong>(*this, ok, base);
-}
-
-qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base)
+template <typename Int>
+static Int toIntegral(QStringView string, bool *ok, int base)
{
#if defined(QT_CHECK_RANGE)
if (base != 0 && (base < 2 || base > 36)) {
- qWarning("QString::toULongLong: Invalid base (%d)", base);
+ qWarning("QString::toIntegral: Invalid base (%d)", base);
base = 10;
}
#endif
- return QLocaleData::c()->stringToLongLong(string, base, ok, QLocale::RejectGroupSeparator);
+ QVarLengthArray<uchar> latin1(string.size());
+ qt_to_latin1(latin1.data(), string.utf16(), string.size());
+ QSimpleParsedNumber<Int> r;
+ if constexpr (std::is_signed_v<Int>)
+ r = QLocaleData::bytearrayToLongLong(latin1, base);
+ else
+ r = QLocaleData::bytearrayToUnsLongLong(latin1, base);
+ if (ok)
+ *ok = r.ok();
+ return r.result;
}
+qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base)
+{
+ return toIntegral<qlonglong>(string, ok, base);
+}
/*!
+ \fn QString::toULongLong(bool *ok, int base) const
+
Returns the string converted to an \c{unsigned long long} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
@@ -6666,12 +7671,13 @@ qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toULongLong()
+ The string conversion will always happen in the 'C' locale. For
+ locale-dependent conversion use QLocale::toULongLong()
Example:
@@ -6679,24 +7685,14 @@ qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toLongLong(), QLocale::toULongLong()
*/
-quint64 QString::toULongLong(bool *ok, int base) const
-{
- return toIntegral_helper<qulonglong>(*this, ok, base);
-}
-
qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
{
-#if defined(QT_CHECK_RANGE)
- if (base != 0 && (base < 2 || base > 36)) {
- qWarning("QString::toULongLong: Invalid base (%d)", base);
- base = 10;
- }
-#endif
-
- return QLocaleData::c()->stringToUnsLongLong(string, base, ok, QLocale::RejectGroupSeparator);
+ return toIntegral<qulonglong>(string, ok, base);
}
/*!
@@ -6709,12 +7705,13 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toLongLong()
+ The string conversion will always happen in the 'C' locale. For
+ locale-dependent conversion use QLocale::toLongLong()
Example:
@@ -6722,14 +7719,11 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toULong(), toInt(), QLocale::toInt()
*/
-long QString::toLong(bool *ok, int base) const
-{
- return toIntegral_helper<long>(*this, ok, base);
-}
-
/*!
\fn ulong QString::toULong(bool *ok, int base) const
@@ -6740,12 +7734,13 @@ long QString::toLong(bool *ok, int base) const
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toULongLong()
+ The string conversion will always happen in the 'C' locale. For
+ locale-dependent conversion use QLocale::toULongLong()
Example:
@@ -6753,16 +7748,13 @@ long QString::toLong(bool *ok, int base) const
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), QLocale::toUInt()
*/
-ulong QString::toULong(bool *ok, int base) const
-{
- return toIntegral_helper<ulong>(*this, ok, base);
-}
-
-
/*!
+ \fn int QString::toInt(bool *ok, int base) const
Returns the string converted to an \c int using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
@@ -6770,12 +7762,13 @@ ulong QString::toULong(bool *ok, int base) const
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toInt()
+ The string conversion will always happen in the 'C' locale. For
+ locale-dependent conversion use QLocale::toInt()
Example:
@@ -6783,15 +7776,13 @@ ulong QString::toULong(bool *ok, int base) const
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toUInt(), toDouble(), QLocale::toInt()
*/
-int QString::toInt(bool *ok, int base) const
-{
- return toIntegral_helper<int>(*this, ok, base);
-}
-
/*!
+ \fn uint QString::toUInt(bool *ok, int base) const
Returns the string converted to an \c{unsigned int} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
@@ -6799,12 +7790,13 @@ int QString::toInt(bool *ok, int base) const
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toUInt()
+ The string conversion will always happen in the 'C' locale. For
+ locale-dependent conversion use QLocale::toUInt()
Example:
@@ -6812,15 +7804,14 @@ int QString::toInt(bool *ok, int base) const
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toInt(), QLocale::toUInt()
*/
-uint QString::toUInt(bool *ok, int base) const
-{
- return toIntegral_helper<uint>(*this, ok, base);
-}
-
/*!
+ \fn short QString::toShort(bool *ok, int base) const
+
Returns the string converted to a \c short using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
@@ -6828,12 +7819,13 @@ uint QString::toUInt(bool *ok, int base) const
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toShort()
+ The string conversion will always happen in the 'C' locale. For
+ locale-dependent conversion use QLocale::toShort()
Example:
@@ -6841,15 +7833,14 @@ uint QString::toUInt(bool *ok, int base) const
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toUShort(), toInt(), QLocale::toShort()
*/
-short QString::toShort(bool *ok, int base) const
-{
- return toIntegral_helper<short>(*this, ok, base);
-}
-
/*!
+ \fn ushort QString::toUShort(bool *ok, int base) const
+
Returns the string converted to an \c{unsigned short} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
@@ -6857,12 +7848,13 @@ short QString::toShort(bool *ok, int base) const
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toUShort()
+ The string conversion will always happen in the 'C' locale. For
+ locale-dependent conversion use QLocale::toUShort()
Example:
@@ -6870,15 +7862,11 @@ short QString::toShort(bool *ok, int base) const
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toShort(), QLocale::toUShort()
*/
-ushort QString::toUShort(bool *ok, int base) const
-{
- return toIntegral_helper<ushort>(*this, ok, base);
-}
-
-
/*!
Returns the string converted to a \c double value.
@@ -6897,8 +7885,8 @@ ushort QString::toUShort(bool *ok, int base) const
\snippet qstring/main.cpp 67
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toDouble()
+ The string conversion will always happen in the 'C' locale. For
+ locale-dependent conversion use QLocale::toDouble()
\snippet qstring/main.cpp 68
@@ -6915,7 +7903,18 @@ ushort QString::toUShort(bool *ok, int base) const
double QString::toDouble(bool *ok) const
{
- return QLocaleData::c()->stringToDouble(*this, ok, QLocale::RejectGroupSeparator);
+ return QStringView(*this).toDouble(ok);
+}
+
+double QStringView::toDouble(bool *ok) const
+{
+ QStringView string = qt_trimmed(*this);
+ QVarLengthArray<uchar> latin1(string.size());
+ qt_to_latin1(latin1.data(), string.utf16(), string.size());
+ auto r = qt_asciiToDouble(reinterpret_cast<const char *>(latin1.data()), string.size());
+ if (ok != nullptr)
+ *ok = r.ok();
+ return r.result;
}
/*!
@@ -6932,8 +7931,8 @@ double QString::toDouble(bool *ok) const
notation, and the decimal point. Including the unit or additional characters
leads to a conversion error.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toFloat()
+ The string conversion will always happen in the 'C' locale. For
+ locale-dependent conversion use QLocale::toFloat()
For historical reasons, this function does not handle
thousands group separators. If you need to convert such numbers,
@@ -6953,13 +7952,17 @@ float QString::toFloat(bool *ok) const
return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
}
+float QStringView::toFloat(bool *ok) const
+{
+ return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
+}
+
/*! \fn QString &QString::setNum(int n, int base)
Sets the string to the printed value of \a n in the specified \a
base, and returns a reference to the string.
- The base is 10 by default and must be between 2 and 36. For bases
- other than 10, \a n is treated as an unsigned integer.
+ The base is 10 by default and must be between 2 and 36.
\snippet qstring/main.cpp 56
@@ -7012,26 +8015,17 @@ QString &QString::setNum(qulonglong n, int base)
*/
/*!
- \fn QString &QString::setNum(double n, char format, int precision)
\overload
- Sets the string to the printed value of \a n, formatted according
- to the given \a format and \a precision, and returns a reference
- to the string.
-
- The \a format can be 'e', 'E', 'f', 'g' or 'G' (see
- \l{Argument Formats} for an explanation of the formats).
-
- The formatting always uses QLocale::C, i.e., English/UnitedStates.
- To get a localized string representation of a number, use
- QLocale::toString() with the appropriate locale.
+ Sets the string to the printed value of \a n, formatted according to the
+ given \a format and \a precision, and returns a reference to the string.
- \sa number()
+ \sa number(), QLocale::FloatingPointPrecisionOption, {Number Formats}
*/
-QString &QString::setNum(double n, char f, int prec)
+QString &QString::setNum(double n, char format, int precision)
{
- return *this = number(n, f, prec);
+ return *this = number(n, format, precision);
}
/*!
@@ -7111,7 +8105,12 @@ QString QString::number(qlonglong n, int base)
base = 10;
}
#endif
- return QLocaleData::c()->longLongToString(n, -1, base);
+ bool negative = n < 0;
+ /*
+ Negating std::numeric_limits<qlonglong>::min() hits undefined behavior, so
+ taking an absolute value has to take a slight detour.
+ */
+ return qulltoBasicLatin(negative ? 1u + qulonglong(-(n + 1)) : qulonglong(n), base, negative);
}
/*!
@@ -7125,31 +8124,26 @@ QString QString::number(qulonglong n, int base)
base = 10;
}
#endif
- return QLocaleData::c()->unsLongLongToString(n, -1, base);
+ return qulltoBasicLatin(n, base, false);
}
/*!
- \fn QString QString::number(double n, char format, int precision)
+ Returns a string representing the floating-point number \a n.
- Returns a string equivalent of the number \a n, formatted
- according to the specified \a format and \a precision. See
- \l{Argument Formats} for details.
+ Returns a string that represents \a n, formatted according to the specified
+ \a format and \a precision.
- Unlike QLocale::toString(), this function does not honor the
- user's locale settings.
+ For formats with an exponent, the exponent will show its sign and have at
+ least two digits, left-padding the exponent with zero if needed.
- \sa setNum(), QLocale::toString()
+ \sa setNum(), QLocale::toString(), QLocale::FloatingPointPrecisionOption, {Number Formats}
*/
-QString QString::number(double n, char f, int prec)
+QString QString::number(double n, char format, int precision)
{
QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- uint flags = QLocaleData::ZeroPadExponent;
- if (qIsUpper(f))
- flags |= QLocaleData::CapitalEorX;
-
- switch (qToLower(f)) {
+ switch (QtMiscUtils::toAsciiLower(format)) {
case 'f':
form = QLocaleData::DFDecimal;
break;
@@ -7161,12 +8155,12 @@ QString QString::number(double n, char f, int prec)
break;
default:
#if defined(QT_CHECK_RANGE)
- qWarning("QString::setNum: Invalid format char '%c'", f);
+ qWarning("QString::setNum: Invalid format char '%c'", format);
#endif
break;
}
- return QLocaleData::c()->doubleToString(n, prec, form, -1, flags);
+ return qdtoBasicLatin(n, form, precision, isAsciiUpper(format));
}
namespace {
@@ -7180,12 +8174,12 @@ static ResultList splitString(const StringSource &source, QStringView sep,
typename StringSource::size_type extra = 0;
while ((end = QtPrivate::findString(QStringView(source.constData(), source.size()), start + extra, sep, cs)) != -1) {
if (start != end || behavior == Qt::KeepEmptyParts)
- list.append(source.mid(start, end - start));
+ list.append(source.sliced(start, end - start));
start = end + sep.size();
extra = (sep.size() == 0 ? 1 : 0);
}
if (start != source.size() || behavior == Qt::KeepEmptyParts)
- list.append(source.mid(start));
+ list.append(source.sliced(start));
return list;
}
@@ -7200,7 +8194,7 @@ static ResultList splitString(const StringSource &source, QStringView sep,
\a cs specifies whether \a sep should be matched case
sensitively or case insensitively.
- If \a behavior is QString::SkipEmptyParts, empty entries don't
+ If \a behavior is Qt::SkipEmptyParts, empty entries don't
appear in the result. By default, empty entries are kept.
Example:
@@ -7227,24 +8221,6 @@ QStringList QString::split(const QString &sep, Qt::SplitBehavior behavior, Qt::C
}
/*!
- Splits the string into substring references wherever \a sep occurs, and
- returns the list of those strings.
-
- See QString::split() for how \a sep, \a behavior and \a cs interact to form
- the result.
-
- \note All references are valid as long this string is alive. Destroying this
- string will cause all references to be dangling pointers.
-
- \since 5.14
- \sa QStringRef split()
-*/
-QList<QStringRef> QString::splitRef(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
-{
- return splitString<QList<QStringRef>>(QStringRef(this), sep, behavior, cs);
-}
-
-/*!
\overload
\since 5.14
*/
@@ -7254,53 +8230,19 @@ QStringList QString::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensit
}
/*!
- \overload
- \since 5.14
-*/
-QList<QStringRef> QString::splitRef(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
-{
- return splitString<QList<QStringRef>>(QStringRef(this), QStringView(&sep, 1), behavior, cs);
-}
-
-/*!
- Splits the string into substrings references wherever \a sep occurs, and
- returns the list of those strings.
-
- See QString::split() for how \a sep, \a behavior and \a cs interact to form
- the result.
-
- \note All references are valid as long this string is alive. Destroying this
- string will cause all references to be dangling pointers.
-
- \since 5.14
-*/
-QList<QStringRef> QStringRef::split(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
-{
- return splitString<QList<QStringRef>>(*this, sep, behavior, cs);
-}
-
-/*!
- \overload
- \since 5.14
-*/
-QList<QStringRef> QStringRef::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
-{
- return splitString<QList<QStringRef>>(*this, QStringView(&sep, 1), behavior, cs);
-}
-
-/*!
\fn QList<QStringView> QStringView::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
\fn QList<QStringView> QStringView::split(QStringView sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
- Splits the string into substring references wherever \a sep occurs, and
- returns the list of those strings.
+ Splits the view into substring views wherever \a sep occurs, and
+ returns the list of those string views.
See QString::split() for how \a sep, \a behavior and \a cs interact to form
the result.
- \note All references are valid as long this string is alive. Destroying this
- string will cause all references to be dangling pointers.
+ \note All the returned views are valid as long as the data referenced by
+ this string view is valid. Destroying the data will cause all views to
+ become dangling.
\since 6.0
*/
@@ -7316,29 +8258,30 @@ QList<QStringView> QStringView::split(QChar sep, Qt::SplitBehavior behavior, Qt:
#if QT_CONFIG(regularexpression)
namespace {
-template<class ResultList, typename String>
+template<class ResultList, typename String, typename MatchingFunction>
static ResultList splitString(const String &source, const QRegularExpression &re,
+ MatchingFunction matchingFunction,
Qt::SplitBehavior behavior)
{
ResultList list;
if (!re.isValid()) {
- qWarning("QString::split: invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString::split");
return list;
}
- int start = 0;
- int end = 0;
- QRegularExpressionMatchIterator iterator = re.globalMatch(source);
+ qsizetype start = 0;
+ qsizetype end = 0;
+ QRegularExpressionMatchIterator iterator = (re.*matchingFunction)(source, 0, QRegularExpression::NormalMatch, QRegularExpression::NoMatchOption);
while (iterator.hasNext()) {
QRegularExpressionMatch match = iterator.next();
end = match.capturedStart();
if (start != end || behavior == Qt::KeepEmptyParts)
- list.append(source.mid(start, end - start));
+ list.append(source.sliced(start, end - start));
start = match.capturedEnd();
}
if (start != source.size() || behavior == Qt::KeepEmptyParts)
- list.append(source.mid(start));
+ list.append(source.sliced(start));
return list;
}
@@ -7373,44 +8316,33 @@ static ResultList splitString(const String &source, const QRegularExpression &re
*/
QStringList QString::split(const QRegularExpression &re, Qt::SplitBehavior behavior) const
{
- return splitString<QStringList>(*this, re, behavior);
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ const auto matchingFunction = qOverload<const QString &, qsizetype, QRegularExpression::MatchType, QRegularExpression::MatchOptions>(&QRegularExpression::globalMatch);
+#else
+ const auto matchingFunction = &QRegularExpression::globalMatch;
+#endif
+ return splitString<QStringList>(*this,
+ re,
+ matchingFunction,
+ behavior);
}
/*!
\overload
- \since 5.14
-
- Splits the string into substring references wherever the regular expression
- \a re matches, and returns the list of those strings. If \a re
- does not match anywhere in the string, splitRef() returns a
- single-element list containing this string reference.
-
- \note All references are valid as long this string is alive. Destroying this
- string will cause all references to be dangling pointers.
-
- \sa split() QStringRef
-*/
-QList<QStringRef> QString::splitRef(const QRegularExpression &re, Qt::SplitBehavior behavior) const
-{
- return splitString<QList<QStringRef>>(QStringRef(this), re, behavior);
-}
-
-/*!
\since 6.0
- Splits the string into substring views wherever the regular expression
- \a re matches, and returns the list of those strings. If \a re
- does not match anywhere in the string, splitRef() returns a
- single-element list containing this string reference.
-
- \note All references are valid as long this string is alive. Destroying this
- string will cause all references to be dangling pointers.
+ Splits the string into substring views wherever the regular expression \a re
+ matches, and returns the list of those strings. If \a re does not match
+ anywhere in the string, split() returns a single-element list containing
+ this string as view.
- \sa split() QStringRef
+ \note The views in the returned list are sub-views of this view; as such,
+ they reference the same data as it and only remain valid for as long as that
+ data remains live.
*/
QList<QStringView> QStringView::split(const QRegularExpression &re, Qt::SplitBehavior behavior) const
{
- return splitString<QList<QStringView>>(*this, re, behavior);
+ return splitString<QList<QStringView>>(*this, re, &QRegularExpression::globalMatchView, behavior);
}
#endif // QT_CONFIG(regularexpression)
@@ -7426,7 +8358,7 @@ QList<QStringView> QStringView::split(const QRegularExpression &re, Qt::SplitBeh
\value NormalizationForm_KC Compatibility Decomposition followed by Canonical Composition
\sa normalized(),
- {http://www.unicode.org/reports/tr15/}{Unicode Standard Annex #15}
+ {https://www.unicode.org/reports/tr15/}{Unicode Standard Annex #15}
*/
/*!
@@ -7440,7 +8372,7 @@ QList<QStringView> QStringView::split(const QRegularExpression &re, Qt::SplitBeh
\snippet code/src_corelib_text_qstring.cpp 8
*/
-QString QString::repeated(int times) const
+QString QString::repeated(qsizetype times) const
{
if (d.size == 0)
return *this;
@@ -7451,7 +8383,7 @@ QString QString::repeated(int times) const
return QString();
}
- const int resultSize = times * d.size;
+ const qsizetype resultSize = times * d.size;
QString result;
result.reserve(resultSize);
@@ -7460,10 +8392,10 @@ QString QString::repeated(int times) const
memcpy(result.d.data(), d.data(), d.size * sizeof(QChar));
- int sizeSoFar = d.size;
+ qsizetype sizeSoFar = d.size;
char16_t *end = result.d.data() + sizeSoFar;
- const int halfResultSize = resultSize >> 1;
+ const qsizetype halfResultSize = resultSize >> 1;
while (sizeSoFar <= halfResultSize) {
memcpy(end, result.d.data(), sizeSoFar * sizeof(QChar));
end += sizeSoFar;
@@ -7475,29 +8407,32 @@ QString QString::repeated(int times) const
return result;
}
-void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar::UnicodeVersion version, int from)
+void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar::UnicodeVersion version, qsizetype from)
{
- const QChar *p = data->constData() + from;
- if (isAscii(p, p + data->length() - from))
- return;
- if (p > data->constData() + from)
- from = p - data->constData() - 1; // need one before the non-ASCII to perform NFC
+ {
+ // check if it's fully ASCII first, because then we have no work
+ auto start = reinterpret_cast<const char16_t *>(data->constData());
+ const char16_t *p = start + from;
+ if (isAscii_helper(p, p + data->size() - from))
+ return;
+ if (p > start + from)
+ from = p - start - 1; // need one before the non-ASCII to perform NFC
+ }
if (version == QChar::Unicode_Unassigned) {
version = QChar::currentUnicodeVersion();
} else if (int(version) <= NormalizationCorrectionsVersionMax) {
const QString &s = *data;
QChar *d = nullptr;
- for (int i = 0; i < NumNormalizationCorrections; ++i) {
- const NormalizationCorrection &n = uc_normalization_corrections[i];
+ for (const NormalizationCorrection &n : uc_normalization_corrections) {
if (n.version > version) {
- int pos = from;
+ qsizetype pos = from;
if (QChar::requiresSurrogates(n.ucs4)) {
char16_t ucs4High = QChar::highSurrogate(n.ucs4);
char16_t ucs4Low = QChar::lowSurrogate(n.ucs4);
char16_t oldHigh = QChar::highSurrogate(n.old_mapping);
char16_t oldLow = QChar::lowSurrogate(n.old_mapping);
- while (pos < s.length() - 1) {
+ while (pos < s.size() - 1) {
if (s.at(pos).unicode() == ucs4High && s.at(pos + 1).unicode() == ucs4Low) {
if (!d)
d = data->data();
@@ -7507,7 +8442,7 @@ void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar::
++pos;
}
} else {
- while (pos < s.length()) {
+ while (pos < s.size()) {
if (s.at(pos).unicode() == n.ucs4) {
if (!d)
d = data->data();
@@ -7544,14 +8479,42 @@ QString QString::normalized(QString::NormalizationForm mode, QChar::UnicodeVersi
return copy;
}
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+static void checkArgEscape(QStringView s)
+{
+ // If we're in here, it means that qArgDigitValue has accepted the
+ // digit. We can skip the check in case we already know it will
+ // succeed.
+ if (!supportUnicodeDigitValuesInArg())
+ return;
+
+ const auto isNonAsciiDigit = [](QChar c) {
+ return c.unicode() < u'0' || c.unicode() > u'9';
+ };
+
+ if (std::any_of(s.begin(), s.end(), isNonAsciiDigit)) {
+ const auto accumulateDigit = [](int partial, QChar digit) {
+ return partial * 10 + digit.digitValue();
+ };
+ const int parsedNumber = std::accumulate(s.begin(), s.end(), 0, accumulateDigit);
+
+ qWarning("QString::arg(): the replacement \"%%%ls\" contains non-ASCII digits;\n"
+ " it is currently being interpreted as the %d-th substitution.\n"
+ " This is deprecated; support for non-ASCII digits will be dropped\n"
+ " in a future version of Qt.",
+ qUtf16Printable(s.toString()),
+ parsedNumber);
+ }
+}
+#endif
struct ArgEscapeData
{
int min_escape; // lowest escape sequence number
- int occurrences; // number of occurrences of the lowest escape sequence number
- int locale_occurrences; // number of occurrences of the lowest escape sequence number that
- // contain 'L'
- int escape_len; // total length of escape sequences which will be replaced
+ qsizetype occurrences; // number of occurrences of the lowest escape sequence number
+ qsizetype locale_occurrences; // number of occurrences of the lowest escape sequence number that
+ // contain 'L'
+ qsizetype escape_len; // total length of escape sequences which will be replaced
};
static ArgEscapeData findArgEscapes(QStringView s)
@@ -7584,20 +8547,34 @@ static ArgEscapeData findArgEscapes(QStringView s)
break;
}
- int escape = c->digitValue();
+ int escape = qArgDigitValue(*c);
if (escape == -1)
continue;
+ // ### Qt 7: do not allow anything but ASCII digits
+ // in arg()'s replacements.
+#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ const QChar *escapeBegin = c;
+ const QChar *escapeEnd = escapeBegin + 1;
+#endif
+
++c;
if (c != uc_end) {
- int next_escape = c->digitValue();
+ const int next_escape = qArgDigitValue(*c);
if (next_escape != -1) {
escape = (10 * escape) + next_escape;
++c;
+#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ ++escapeEnd;
+#endif
}
}
+#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ checkArgEscape(QStringView(escapeBegin, escapeEnd));
+#endif
+
if (escape > d.min_escape)
continue;
@@ -7616,101 +8593,85 @@ static ArgEscapeData findArgEscapes(QStringView s)
return d;
}
-static QString replaceArgEscapes(QStringView s, const ArgEscapeData &d, int field_width,
+static QString replaceArgEscapes(QStringView s, const ArgEscapeData &d, qsizetype field_width,
QStringView arg, QStringView larg, QChar fillChar)
{
- const QChar *uc_begin = s.begin();
- const QChar *uc_end = s.end();
-
- int abs_field_width = qAbs(field_width);
- int result_len = s.length()
- - d.escape_len
- + (d.occurrences - d.locale_occurrences)
- *qMax(abs_field_width, arg.length())
- + d.locale_occurrences
- *qMax(abs_field_width, larg.length());
+ // Negative field-width for right-padding, positive for left-padding:
+ const qsizetype abs_field_width = qAbs(field_width);
+ const qsizetype result_len =
+ s.size() - d.escape_len
+ + (d.occurrences - d.locale_occurrences) * qMax(abs_field_width, arg.size())
+ + d.locale_occurrences * qMax(abs_field_width, larg.size());
QString result(result_len, Qt::Uninitialized);
- QChar *result_buff = (QChar*) result.unicode();
+ QChar *rc = const_cast<QChar *>(result.unicode());
+ QChar *const result_end = rc + result_len;
+ qsizetype repl_cnt = 0;
- QChar *rc = result_buff;
- const QChar *c = uc_begin;
- int repl_cnt = 0;
+ const QChar *c = s.begin();
+ const QChar *const uc_end = s.end();
while (c != uc_end) {
- /* We don't have to check if we run off the end of the string with c,
- because as long as d.occurrences > 0 we KNOW there are valid escape
- sequences. */
+ Q_ASSERT(d.occurrences > repl_cnt);
+ /* We don't have to check increments of c against uc_end because, as
+ long as d.occurrences > repl_cnt, we KNOW there are valid escape
+ sequences remaining. */
const QChar *text_start = c;
-
while (c->unicode() != '%')
++c;
const QChar *escape_start = c++;
-
- bool locale_arg = false;
- if (c->unicode() == 'L') {
- locale_arg = true;
+ const bool localize = c->unicode() == 'L';
+ if (localize)
++c;
- }
- int escape = c->digitValue();
- if (escape != -1) {
- if (c + 1 != uc_end && (c + 1)->digitValue() != -1) {
- escape = (10 * escape) + (c + 1)->digitValue();
+ int escape = qArgDigitValue(*c);
+ if (escape != -1 && c + 1 != uc_end) {
+ const int digit = qArgDigitValue(c[1]);
+ if (digit != -1) {
++c;
+ escape = 10 * escape + digit;
}
}
if (escape != d.min_escape) {
- memcpy(rc, text_start, (c - text_start)*sizeof(QChar));
+ memcpy(rc, text_start, (c - text_start) * sizeof(QChar));
rc += c - text_start;
- }
- else {
+ } else {
++c;
- memcpy(rc, text_start, (escape_start - text_start)*sizeof(QChar));
+ memcpy(rc, text_start, (escape_start - text_start) * sizeof(QChar));
rc += escape_start - text_start;
- uint pad_chars;
- if (locale_arg)
- pad_chars = qMax(abs_field_width, larg.length()) - larg.length();
- else
- pad_chars = qMax(abs_field_width, arg.length()) - arg.length();
+ const QStringView use = localize ? larg : arg;
+ const qsizetype pad_chars = abs_field_width - use.size();
+ // (If negative, relevant loops are no-ops: no need to check.)
if (field_width > 0) { // left padded
- for (uint i = 0; i < pad_chars; ++i)
- *rc++ = fillChar;
+ rc = std::fill_n(rc, pad_chars, fillChar);
}
- if (locale_arg) {
- memcpy(rc, larg.data(), larg.length()*sizeof(QChar));
- rc += larg.length();
- }
- else {
- memcpy(rc, arg.data(), arg.length()*sizeof(QChar));
- rc += arg.length();
- }
+ if (use.size())
+ memcpy(rc, use.data(), use.size() * sizeof(QChar));
+ rc += use.size();
if (field_width < 0) { // right padded
- for (uint i = 0; i < pad_chars; ++i)
- *rc++ = fillChar;
+ rc = std::fill_n(rc, pad_chars, fillChar);
}
if (++repl_cnt == d.occurrences) {
- memcpy(rc, c, (uc_end - c)*sizeof(QChar));
+ memcpy(rc, c, (uc_end - c) * sizeof(QChar));
rc += uc_end - c;
- Q_ASSERT(rc - result_buff == result_len);
+ Q_ASSERT(rc == result_end);
c = uc_end;
}
}
}
- Q_ASSERT(rc == result_buff + result_len);
+ Q_ASSERT(rc == result_end);
return result;
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a copy of this string with the lowest numbered place marker
replaced by string \a a, i.e., \c %1, \c %2, ..., \c %99.
@@ -7744,7 +8705,6 @@ QString QString::arg(const QString &a, int fieldWidth, QChar fillChar) const
{
return arg(qToStringViewIgnoringNull(a), fieldWidth, fillChar);
}
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\overload
@@ -7795,7 +8755,7 @@ QString QString::arg(QStringView a, int fieldWidth, QChar fillChar) const
\since 5.10
Returns a copy of this string with the lowest-numbered place-marker
- replaced by string \a a, i.e., \c %1, \c %2, ..., \c %99.
+ replaced by the Latin-1 string viewed by \a a, i.e., \c %1, \c %2, ..., \c %99.
\a fieldWidth specifies the minimum amount of space that \a a
shall occupy. If \a a requires less space than \a fieldWidth, it
@@ -7814,109 +8774,12 @@ QString QString::arg(QStringView a, int fieldWidth, QChar fillChar) const
is printed and the result is undefined. Place-marker numbers must be
in the range 1 to 99.
*/
-QString QString::arg(QLatin1String a, int fieldWidth, QChar fillChar) const
+QString QString::arg(QLatin1StringView a, int fieldWidth, QChar fillChar) const
{
- QVarLengthArray<char16_t> utf16(a.size());
- qt_from_latin1(utf16.data(), a.data(), a.size());
+ QVarLengthArray<char16_t> utf16 = qt_from_latin1_to_qvla(a);
return arg(QStringView(utf16.data(), utf16.size()), fieldWidth, fillChar);
}
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2) const
- \overload arg()
-
- This is the same as \c {str.arg(a1).arg(a2)}, except that the
- strings \a a1 and \a a2 are replaced in one pass. This can make a
- difference if \a a1 contains e.g. \c{%1}:
-
- \snippet qstring/main.cpp 13
-
- A similar problem occurs when the numbered place markers are not
- white space separated:
-
- \snippet qstring/main.cpp 12
- \snippet qstring/main.cpp 97
-
- Let's look at the substitutions:
- \list
- \li First, \c Hello replaces \c {%1} so the string becomes \c {"Hello%3%2"}.
- \li Then, \c 20 replaces \c {%2} so the string becomes \c {"Hello%320"}.
- \li Since the maximum numbered place marker value is 99, \c 50 replaces \c {%32}.
- \endlist
- Thus the string finally becomes \c {"Hello500"}.
-
- In such cases, the following yields the expected results:
-
- \snippet qstring/main.cpp 12
- \snippet qstring/main.cpp 98
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3) const
- \overload arg()
-
- This is the same as calling \c str.arg(a1).arg(a2).arg(a3), except
- that the strings \a a1, \a a2 and \a a3 are replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4)}, except that the strings \a
- a1, \a a2, \a a3 and \a a4 are replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4, const QString& a5) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4).arg(a5)}, except that the strings
- \a a1, \a a2, \a a3, \a a4, and \a a5 are replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4, const QString& a5, const QString& a6) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4).arg(a5).arg(a6))}, except that
- the strings \a a1, \a a2, \a a3, \a a4, \a a5, and \a a6 are
- replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4, const QString& a5, const QString& a6, const QString& a7) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4).arg(a5).arg(a6).arg(a7)},
- except that the strings \a a1, \a a2, \a a3, \a a4, \a a5, \a a6,
- and \a a7 are replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4, const QString& a5, const QString& a6, const QString& a7, const QString& a8) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4).arg(a5).arg(a6).arg(a7).arg(a8)},
- except that the strings \a a1, \a a2, \a a3, \a a4, \a a5, \a a6, \a
- a7, and \a a8 are replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4, const QString& a5, const QString& a6, const QString& a7, const QString& a8, const QString& a9) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4).arg(a5).arg(a6).arg(a7).arg(a8).arg(a9)},
- except that the strings \a a1, \a a2, \a a3, \a a4, \a a5, \a a6, \a
- a7, \a a8, and \a a9 are replaced in one pass.
-*/
-
/*! \fn QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const
\overload arg()
@@ -7932,15 +8795,13 @@ QString QString::arg(QLatin1String a, int fieldWidth, QChar fillChar) const
The '%' can be followed by an 'L', in which case the sequence is
replaced with a localized representation of \a a. The conversion
uses the default locale, set by QLocale::setDefault(). If no default
- locale was specified, the "C" locale is used. The 'L' flag is
+ locale was specified, the system locale is used. The 'L' flag is
ignored if \a base is not 10.
\snippet qstring/main.cpp 12
\snippet qstring/main.cpp 14
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
+ \sa {Number Formats}
*/
/*! \fn QString QString::arg(uint a, int fieldWidth, int base, QChar fillChar) const
@@ -7949,9 +8810,7 @@ QString QString::arg(QLatin1String a, int fieldWidth, QChar fillChar) const
The \a base argument specifies the base to use when converting the
integer \a a into a string. The base must be between 2 and 36.
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
+ \sa {Number Formats}
*/
/*! \fn QString QString::arg(long a, int fieldWidth, int base, QChar fillChar) const
@@ -7975,12 +8834,11 @@ QString QString::arg(QLatin1String a, int fieldWidth, QChar fillChar) const
\snippet qstring/main.cpp 12
\snippet qstring/main.cpp 14
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
+ \sa {Number Formats}
*/
-/*! \fn QString QString::arg(ulong a, int fieldWidth, int base, QChar fillChar) const
+/*!
+ \fn QString QString::arg(ulong a, int fieldWidth, int base, QChar fillChar) const
\overload arg()
\a fieldWidth specifies the minimum amount of space that \a a is
@@ -7992,9 +8850,7 @@ QString QString::arg(QLatin1String a, int fieldWidth, QChar fillChar) const
integer \a a to a string. The base must be between 2 and 36, with 8
giving octal, 10 decimal, and 16 hexadecimal numbers.
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
+ \sa {Number Formats}
*/
/*!
@@ -8009,9 +8865,7 @@ QString QString::arg(QLatin1String a, int fieldWidth, QChar fillChar) const
integer \a a into a string. The base must be between 2 and 36, with
8 giving octal, 10 decimal, and 16 hexadecimal numbers.
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
+ \sa {Number Formats}
*/
QString QString::arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const
{
@@ -8023,22 +8877,26 @@ QString QString::arg(qlonglong a, int fieldWidth, int base, QChar fillChar) cons
}
unsigned flags = QLocaleData::NoFlags;
- if (fillChar == QLatin1Char('0'))
+ // ZeroPadded sorts out left-padding when the fill is zero, to the right of sign:
+ if (fillChar == u'0')
flags = QLocaleData::ZeroPadded;
QString arg;
- if (d.occurrences > d.locale_occurrences)
+ if (d.occurrences > d.locale_occurrences) {
arg = QLocaleData::c()->longLongToString(a, -1, base, fieldWidth, flags);
+ Q_ASSERT(fillChar != u'0' || fieldWidth <= arg.size());
+ }
- QString locale_arg;
+ QString localeArg;
if (d.locale_occurrences > 0) {
QLocale locale;
if (!(locale.numberOptions() & QLocale::OmitGroupSeparator))
- flags |= QLocaleData::ThousandsGroup;
- locale_arg = locale.d->m_data->longLongToString(a, -1, base, fieldWidth, flags);
+ flags |= QLocaleData::GroupDigits;
+ localeArg = locale.d->m_data->longLongToString(a, -1, base, fieldWidth, flags);
+ Q_ASSERT(fillChar != u'0' || fieldWidth <= localeArg.size());
}
- return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar);
+ return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar);
}
/*!
@@ -8053,9 +8911,7 @@ QString QString::arg(qlonglong a, int fieldWidth, int base, QChar fillChar) cons
integer \a a into a string. \a base must be between 2 and 36, with 8
giving octal, 10 decimal, and 16 hexadecimal numbers.
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
+ \sa {Number Formats}
*/
QString QString::arg(qulonglong a, int fieldWidth, int base, QChar fillChar) const
{
@@ -8067,22 +8923,26 @@ QString QString::arg(qulonglong a, int fieldWidth, int base, QChar fillChar) con
}
unsigned flags = QLocaleData::NoFlags;
- if (fillChar == QLatin1Char('0'))
+ // ZeroPadded sorts out left-padding when the fill is zero, to the right of sign:
+ if (fillChar == u'0')
flags = QLocaleData::ZeroPadded;
QString arg;
- if (d.occurrences > d.locale_occurrences)
+ if (d.occurrences > d.locale_occurrences) {
arg = QLocaleData::c()->unsLongLongToString(a, -1, base, fieldWidth, flags);
+ Q_ASSERT(fillChar != u'0' || fieldWidth <= arg.size());
+ }
- QString locale_arg;
+ QString localeArg;
if (d.locale_occurrences > 0) {
QLocale locale;
if (!(locale.numberOptions() & QLocale::OmitGroupSeparator))
- flags |= QLocaleData::ThousandsGroup;
- locale_arg = locale.d->m_data->unsLongLongToString(a, -1, base, fieldWidth, flags);
+ flags |= QLocaleData::GroupDigits;
+ localeArg = locale.d->m_data->unsLongLongToString(a, -1, base, fieldWidth, flags);
+ Q_ASSERT(fillChar != u'0' || fieldWidth <= localeArg.size());
}
- return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar);
+ return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar);
}
/*!
@@ -8099,9 +8959,7 @@ QString QString::arg(qulonglong a, int fieldWidth, int base, QChar fillChar) con
integer \a a into a string. The base must be between 2 and 36, with
8 giving octal, 10 decimal, and 16 hexadecimal numbers.
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
+ \sa {Number Formats}
*/
/*!
@@ -8117,9 +8975,7 @@ QString QString::arg(qulonglong a, int fieldWidth, int base, QChar fillChar) con
integer \a a into a string. The base must be between 2 and 36, with
8 giving octal, 10 decimal, and 16 hexadecimal numbers.
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
+ \sa {Number Formats}
*/
/*!
@@ -8141,11 +8997,10 @@ QString QString::arg(char a, int fieldWidth, QChar fillChar) const
}
/*!
- \fn QString QString::arg(double a, int fieldWidth, char format, int precision, QChar fillChar) const
\overload arg()
Argument \a a is formatted according to the specified \a format and
- \a precision. See \l{Argument Formats} for details.
+ \a precision. See \l{Floating-point Formats} for details.
\a fieldWidth specifies the minimum amount of space that \a a is
padded to and filled with the character \a fillChar. A positive
@@ -8154,18 +9009,9 @@ QString QString::arg(char a, int fieldWidth, QChar fillChar) const
\snippet code/src_corelib_text_qstring.cpp 2
- The '%' can be followed by an 'L', in which case the sequence is
- replaced with a localized representation of \a a. The conversion
- uses the default locale, set by QLocale::setDefault(). If no
- default locale was specified, the "C" locale is used.
-
- If \a fillChar is '0' (the number 0, ASCII 48), this function will
- use the locale's zero to pad. For negative numbers, the zero padding
- will probably appear before the minus sign.
-
- \sa QLocale::toString()
+ \sa QLocale::toString(), QLocale::FloatingPointPrecisionOption, {Number Formats}
*/
-QString QString::arg(double a, int fieldWidth, char fmt, int prec, QChar fillChar) const
+QString QString::arg(double a, int fieldWidth, char format, int precision, QChar fillChar) const
{
ArgEscapeData d = findArgEscapes(*this);
@@ -8175,14 +9021,15 @@ QString QString::arg(double a, int fieldWidth, char fmt, int prec, QChar fillCha
}
unsigned flags = QLocaleData::NoFlags;
- if (fillChar == QLatin1Char('0'))
+ // ZeroPadded sorts out left-padding when the fill is zero, to the right of sign:
+ if (fillChar == u'0')
flags |= QLocaleData::ZeroPadded;
- if (qIsUpper(fmt))
+ if (isAsciiUpper(format))
flags |= QLocaleData::CapitalEorX;
QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- switch (qToLower(fmt)) {
+ switch (QtMiscUtils::toAsciiLower(format)) {
case 'f':
form = QLocaleData::DFDecimal;
break;
@@ -8194,58 +9041,63 @@ QString QString::arg(double a, int fieldWidth, char fmt, int prec, QChar fillCha
break;
default:
#if defined(QT_CHECK_RANGE)
- qWarning("QString::arg: Invalid format char '%c'", fmt);
+ qWarning("QString::arg: Invalid format char '%c'", format);
#endif
break;
}
QString arg;
- if (d.occurrences > d.locale_occurrences)
- arg = QLocaleData::c()->doubleToString(a, prec, form, fieldWidth, flags | QLocaleData::ZeroPadExponent);
+ if (d.occurrences > d.locale_occurrences) {
+ arg = QLocaleData::c()->doubleToString(a, precision, form, fieldWidth,
+ flags | QLocaleData::ZeroPadExponent);
+ Q_ASSERT(fillChar != u'0' || !qt_is_finite(a)
+ || fieldWidth <= arg.size());
+ }
- QString locale_arg;
+ QString localeArg;
if (d.locale_occurrences > 0) {
QLocale locale;
const QLocale::NumberOptions numberOptions = locale.numberOptions();
if (!(numberOptions & QLocale::OmitGroupSeparator))
- flags |= QLocaleData::ThousandsGroup;
+ flags |= QLocaleData::GroupDigits;
if (!(numberOptions & QLocale::OmitLeadingZeroInExponent))
flags |= QLocaleData::ZeroPadExponent;
if (numberOptions & QLocale::IncludeTrailingZeroesAfterDot)
flags |= QLocaleData::AddTrailingZeroes;
- locale_arg = locale.d->m_data->doubleToString(a, prec, form, fieldWidth, flags);
+ localeArg = locale.d->m_data->doubleToString(a, precision, form, fieldWidth, flags);
+ Q_ASSERT(fillChar != u'0' || !qt_is_finite(a)
+ || fieldWidth <= localeArg.size());
}
- return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar);
+ return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar);
}
static inline char16_t to_unicode(const QChar c) { return c.unicode(); }
static inline char16_t to_unicode(const char c) { return QLatin1Char{c}.unicode(); }
template <typename Char>
-static int getEscape(const Char *uc, qsizetype *pos, qsizetype len, int maxNumber = 999)
+static int getEscape(const Char *uc, qsizetype *pos, qsizetype len)
{
- int i = *pos;
+ qsizetype i = *pos;
++i;
- if (i < len && uc[i] == QLatin1Char('L'))
+ if (i < len && uc[i] == u'L')
++i;
if (i < len) {
int escape = to_unicode(uc[i]) - '0';
if (uint(escape) >= 10U)
return -1;
++i;
- while (i < len) {
+ if (i < len) {
+ // there's a second digit
int digit = to_unicode(uc[i]) - '0';
- if (uint(digit) >= 10U)
- break;
- escape = (escape * 10) + digit;
- ++i;
- }
- if (escape <= maxNumber) {
- *pos = i;
- return escape;
+ if (uint(digit) < 10U) {
+ escape = (escape * 10) + digit;
+ ++i;
+ }
}
+ *pos = i;
+ return escape;
}
return -1;
}
@@ -8263,7 +9115,7 @@ static int getEscape(const Char *uc, qsizetype *pos, qsizetype len, int maxNumbe
the int contains the numerical number as parsed from the placeholder.
3. Next, collect all the non-negative ints found, sort them in ascending order and
remove duplicates.
- 3a. If the result has more entires than multiArg() was given replacement strings,
+ 3a. If the result has more entries than multiArg() was given replacement strings,
we have found placeholders we can't satisfy with replacement strings. That is
fine (there could be another .arg() call coming after this one), so just
truncate the result to the number of actual multiArg() replacement strings.
@@ -8288,13 +9140,13 @@ namespace {
struct Part
{
Part() = default; // for QVarLengthArray; do not use
- Q_DECL_CONSTEXPR Part(QStringView s, int num = -1)
+ constexpr Part(QStringView s, int num = -1)
: tag{QtPrivate::ArgBase::U16}, number{num}, data{s.utf16()}, size{s.size()} {}
- Q_DECL_CONSTEXPR Part(QLatin1String s, int num = -1)
+ constexpr Part(QLatin1StringView s, int num = -1)
: tag{QtPrivate::ArgBase::L1}, number{num}, data{s.data()}, size{s.size()} {}
void reset(QStringView s) noexcept { *this = {s, number}; }
- void reset(QLatin1String s) noexcept { *this = {s, number}; }
+ void reset(QLatin1StringView s) noexcept { *this = {s, number}; }
QtPrivate::ArgBase::Tag tag;
int number;
@@ -8324,13 +9176,13 @@ static ParseResult parseMultiArgFormatString(StringView s)
qsizetype last = 0;
while (i < end) {
- if (uc[i] == QLatin1Char('%')) {
+ if (uc[i] == u'%') {
qsizetype percent = i;
int number = getEscape(uc, &i, len);
if (number != -1) {
if (last != percent)
- result.push_back(Part{s.mid(last, percent - last)}); // literal text (incl. failed placeholders)
- result.push_back(Part{s.mid(percent, i - percent), number}); // parsed placeholder
+ result.push_back(Part{s.sliced(last, percent - last)}); // literal text (incl. failed placeholders)
+ result.push_back(Part{s.sliced(percent, i - percent), number}); // parsed placeholder
last = i;
continue;
}
@@ -8339,7 +9191,7 @@ static ParseResult parseMultiArgFormatString(StringView s)
}
if (last < len)
- result.push_back(Part{s.mid(last, len - last)}); // trailing literal text
+ result.push_back(Part{s.sliced(last, len - last)}); // trailing literal text
return result;
}
@@ -8348,7 +9200,7 @@ static ArgIndexToPlaceholderMap makeArgIndexToPlaceholderMap(const ParseResult &
{
ArgIndexToPlaceholderMap result;
- for (Part part : parts) {
+ for (const Part &part : parts) {
if (part.number >= 0)
result.push_back(part.number);
}
@@ -8389,7 +9241,7 @@ static qsizetype resolveStringRefsAndReturnTotalSize(ParseResult &parts, const A
} // unnamed namespace
-Q_ALWAYS_INLINE QString to_string(QLatin1String s) noexcept { return s; }
+Q_ALWAYS_INLINE QString to_string(QLatin1StringView s) noexcept { return s; }
Q_ALWAYS_INLINE QString to_string(QStringView s) noexcept { return s.toString(); }
template <typename StringView>
@@ -8402,7 +9254,7 @@ static QString argToQStringImpl(StringView pattern, size_t numArgs, const QtPriv
ArgIndexToPlaceholderMap argIndexToPlaceholderMap = makeArgIndexToPlaceholderMap(parts);
if (static_cast<size_t>(argIndexToPlaceholderMap.size()) > numArgs) // 3a
- argIndexToPlaceholderMap.resize(int(numArgs));
+ argIndexToPlaceholderMap.resize(qsizetype(numArgs));
else if (Q_UNLIKELY(static_cast<size_t>(argIndexToPlaceholderMap.size()) < numArgs)) // 3b
qWarning("QString::arg: %d argument(s) missing in %ls",
int(numArgs - argIndexToPlaceholderMap.size()), qUtf16Printable(to_string(pattern)));
@@ -8414,7 +9266,7 @@ static QString argToQStringImpl(StringView pattern, size_t numArgs, const QtPriv
QString result(totalSize, Qt::Uninitialized);
auto out = const_cast<QChar*>(result.constData());
- for (Part part : parts) {
+ for (const Part &part : parts) {
switch (part.tag) {
case QtPrivate::ArgBase::L1:
if (part.size) {
@@ -8441,36 +9293,16 @@ QString QtPrivate::argToQString(QStringView pattern, size_t n, const ArgBase **a
return argToQStringImpl(pattern, n, args);
}
-QString QtPrivate::argToQString(QLatin1String pattern, size_t n, const ArgBase **args)
+QString QtPrivate::argToQString(QLatin1StringView pattern, size_t n, const ArgBase **args)
{
return argToQStringImpl(pattern, n, args);
}
-/*! \fn bool QString::isSimpleText() const
-
- \internal
-*/
-bool QString::isSimpleText() const
-{
- const char16_t *p = d.data();
- const char16_t * const end = p + d.size;
- while (p < end) {
- char16_t uc = *p;
- // sort out regions of complex text formatting
- if (uc > 0x058f && (uc < 0x1100 || uc > 0xfb0f)) {
- return false;
- }
- p++;
- }
-
- return true;
-}
-
/*! \fn bool QString::isRightToLeft() const
Returns \c true if the string is read right to left.
- \sa QStringRef::isRightToLeft()
+ \sa QStringView::isRightToLeft()
*/
bool QString::isRightToLeft() const
{
@@ -8568,6 +9400,38 @@ bool QString::isRightToLeft() const
Appends the given \a ch character onto the end of this string.
*/
+/*!
+ \since 6.1
+
+ Removes from the string the characters in the half-open range
+ [ \a first , \a last ). Returns an iterator to the character
+ immediately after the last erased character (i.e. the character
+ referred to by \a last before the erase).
+*/
+QString::iterator QString::erase(QString::const_iterator first, QString::const_iterator last)
+{
+ const auto start = std::distance(cbegin(), first);
+ const auto len = std::distance(first, last);
+ remove(start, len);
+ return begin() + start;
+}
+
+/*!
+ \fn QString::iterator QString::erase(QString::const_iterator it)
+
+ \overload
+ \since 6.5
+
+ Removes the character denoted by \c it from the string.
+ Returns an iterator to the character immediately after the
+ erased character.
+
+ \code
+ QString c = "abcdefg";
+ auto it = c.erase(c.cbegin()); // c is now "bcdefg"; "it" points to "b"
+ \endcode
+*/
+
/*! \fn void QString::shrink_to_fit()
\since 5.10
@@ -8615,16 +9479,9 @@ bool QString::isRightToLeft() const
\sa fromUtf16(), setRawData()
*/
-QString QString::fromRawData(const QChar *unicode, int size)
+QString QString::fromRawData(const QChar *unicode, qsizetype size)
{
- QString::DataPointer x;
- if (!unicode) {
- } else if (!size) {
- x = DataPointer(Data::allocate(0), 0);
- } else {
- x = Data::fromRawData(reinterpret_cast<const char16_t *>(unicode), size);
- }
- return QString(x);
+ return QString(DataPointer::fromRawData(const_cast<char16_t *>(reinterpret_cast<const char16_t *>(unicode)), size));
}
/*!
@@ -8641,7 +9498,7 @@ QString QString::fromRawData(const QChar *unicode, int size)
\sa fromRawData()
*/
-QString &QString::setRawData(const QChar *unicode, int size)
+QString &QString::setRawData(const QChar *unicode, qsizetype size)
{
if (!unicode || !size) {
clear();
@@ -8653,8 +9510,7 @@ QString &QString::setRawData(const QChar *unicode, int size)
/*! \fn QString QString::fromStdU16String(const std::u16string &str)
\since 5.5
- Returns a copy of the \a str string. The given string is assumed
- to be encoded in UTF-16.
+ \include qstring.cpp {from-std-string} {UTF-16} {fromUtf16()}
\sa fromUtf16(), fromStdWString(), fromStdU32String()
*/
@@ -8673,8 +9529,7 @@ QString &QString::setRawData(const QChar *unicode, int size)
/*! \fn QString QString::fromStdU32String(const std::u32string &str)
\since 5.5
- Returns a copy of the \a str string. The given string is assumed
- to be encoded in UCS-4.
+ \include qstring.cpp {from-std-string} {UCS-4} {fromUcs4()}
\sa fromUcs4(), fromStdWString(), fromStdU16String()
*/
@@ -8690,872 +9545,7 @@ QString &QString::setRawData(const QChar *unicode, int size)
\sa toUcs4(), toStdWString(), toStdU16String()
*/
-/*! \class QLatin1String
- \inmodule QtCore
- \brief The QLatin1String class provides a thin wrapper around an US-ASCII/Latin-1 encoded string literal.
-
- \ingroup string-processing
- \reentrant
-
- Many of QString's member functions are overloaded to accept
- \c{const char *} instead of QString. This includes the copy
- constructor, the assignment operator, the comparison operators,
- and various other functions such as \l{QString::insert()}{insert()}, \l{QString::replace()}{replace()},
- and \l{QString::indexOf()}{indexOf()}. These functions
- are usually optimized to avoid constructing a QString object for
- the \c{const char *} data. For example, assuming \c str is a
- QString,
-
- \snippet code/src_corelib_text_qstring.cpp 3
-
- is much faster than
-
- \snippet code/src_corelib_text_qstring.cpp 4
-
- because it doesn't construct four temporary QString objects and
- make a deep copy of the character data.
-
- Applications that define \c QT_NO_CAST_FROM_ASCII (as explained
- in the QString documentation) don't have access to QString's
- \c{const char *} API. To provide an efficient way of specifying
- constant Latin-1 strings, Qt provides the QLatin1String, which is
- just a very thin wrapper around a \c{const char *}. Using
- QLatin1String, the example code above becomes
-
- \snippet code/src_corelib_text_qstring.cpp 5
-
- This is a bit longer to type, but it provides exactly the same
- benefits as the first version of the code, and is faster than
- converting the Latin-1 strings using QString::fromLatin1().
-
- Thanks to the QString(QLatin1String) constructor,
- QLatin1String can be used everywhere a QString is expected. For
- example:
-
- \snippet code/src_corelib_text_qstring.cpp 6
-
- \note If the function you're calling with a QLatin1String
- argument isn't actually overloaded to take QLatin1String, the
- implicit conversion to QString will trigger a memory allocation,
- which is usually what you want to avoid by using QLatin1String
- in the first place. In those cases, using QStringLiteral may be
- the better option.
-
- \sa QString, QLatin1Char, {QStringLiteral()}{QStringLiteral}, QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \typedef QLatin1String::value_type
- \since 5.10
-
- Alias for \c{const char}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::difference_type
- \since 5.10
-
- Alias for \c{int}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::size_type
- \since 5.10
-
- Alias for \c{int}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::reference
- \since 5.10
-
- Alias for \c{value_type &}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::const_reference
- \since 5.11
-
- Alias for \c{reference}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::iterator
- \since 5.10
-
- QLatin1String does not support mutable iterators, so this is the same
- as const_iterator.
-
- \sa const_iterator, reverse_iterator
-*/
-
-/*!
- \typedef QLatin1String::const_iterator
- \since 5.10
-
- \sa iterator, const_reverse_iterator
-*/
-
-/*!
- \typedef QLatin1String::reverse_iterator
- \since 5.10
-
- QLatin1String does not support mutable reverse iterators, so this is the
- same as const_reverse_iterator.
-
- \sa const_reverse_iterator, iterator
-*/
-
-/*!
- \typedef QLatin1String::const_reverse_iterator
- \since 5.10
-
- \sa reverse_iterator, const_iterator
-*/
-
-/*! \fn QLatin1String::QLatin1String()
- \since 5.6
-
- Constructs a QLatin1String object that stores a nullptr.
-*/
-
-/*! \fn QLatin1String::QLatin1String(const char *str)
-
- Constructs a QLatin1String object that stores \a str.
-
- The string data is \e not copied. The caller must be able to
- guarantee that \a str will not be deleted or modified as long as
- the QLatin1String object exists.
-
- \sa latin1()
-*/
-
-/*! \fn QLatin1String::QLatin1String(const char *str, int size)
-
- Constructs a QLatin1String object that stores \a str with \a size.
-
- The string data is \e not copied. The caller must be able to
- guarantee that \a str will not be deleted or modified as long as
- the QLatin1String object exists.
-
- \sa latin1()
-*/
-
-/*!
- \fn QLatin1String::QLatin1String(const char *first, const char *last)
- \since 5.10
-
- Constructs a QLatin1String object that stores \a first with length
- (\a last - \a first).
-
- The range \c{[first,last)} must remain valid for the lifetime of
- this Latin-1 string object.
-
- Passing \nullptr as \a first is safe if \a last is \nullptr,
- too, and results in a null Latin-1 string.
-
- The behavior is undefined if \a last precedes \a first, \a first
- is \nullptr and \a last is not, or if \c{last - first >
- INT_MAX}.
-*/
-
-/*! \fn QLatin1String::QLatin1String(const QByteArray &str)
-
- Constructs a QLatin1String object that stores \a str.
-
- The string data is \e not copied. The caller must be able to
- guarantee that \a str will not be deleted or modified as long as
- the QLatin1String object exists.
-
- \sa latin1()
-*/
-
-/*!
- \fn QLatin1String::toString() const
- \since 6.0
-
- Converts this Latin-1 string into a QString. Equivalent to
- \code
- return QString(*this);
- \endcode
-*/
-
-/*! \fn const char *QLatin1String::latin1() const
-
- Returns the Latin-1 string stored in this object.
-*/
-
-/*! \fn const char *QLatin1String::data() const
-
- Returns the Latin-1 string stored in this object.
-*/
-
-/*! \fn int QLatin1String::size() const
-
- Returns the size of the Latin-1 string stored in this object.
-*/
-
-/*! \fn bool QLatin1String::isNull() const
- \since 5.10
-
- Returns whether the Latin-1 string stored in this object is null
- (\c{data() == nullptr}) or not.
-
- \sa isEmpty(), data()
-*/
-
-/*! \fn bool QLatin1String::isEmpty() const
- \since 5.10
-
- Returns whether the Latin-1 string stored in this object is empty
- (\c{size() == 0}) or not.
-
- \sa isNull(), size()
-*/
-
-/*! \fn QLatin1Char QLatin1String::at(int pos) const
- \since 5.8
-
- Returns the character at position \a pos in this object.
-
- \note This function performs no error checking.
- The behavior is undefined when \a pos < 0 or \a pos >= size().
-
- \sa operator[]()
-*/
-
-/*! \fn QLatin1Char QLatin1String::operator[](int pos) const
- \since 5.8
-
- Returns the character at position \a pos in this object.
-
- \note This function performs no error checking.
- The behavior is undefined when \a pos < 0 or \a pos >= size().
-
- \sa at()
-*/
-
-/*!
- \fn QLatin1Char QLatin1String::front() const
- \since 5.10
-
- Returns the first character in the string.
- Same as \c{at(0)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa back(), at(), operator[]()
-*/
-
-/*!
- \fn QLatin1Char QLatin1String::back() const
- \since 5.10
-
- Returns the last character in the string.
- Same as \c{at(size() - 1)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa front(), at(), operator[]()
-*/
-
-/*!
- \fn int QLatin1String::compare(QStringView str, Qt::CaseSensitivity cs) const
- \fn int QLatin1String::compare(QLatin1String l1, Qt::CaseSensitivity cs) const
- \fn int QLatin1String::compare(QChar ch) const
- \fn int QLatin1String::compare(QChar ch, Qt::CaseSensitivity cs) const
- \since 5.14
-
- Returns an integer that compares to zero as this Latin-1 string compares to the
- string-view \a str, Latin-1 string \a l1, or character \a ch, respectively.
-
- If \a cs is Qt::CaseSensitive (the default), the comparison is case sensitive;
- otherwise the comparison is case-insensitive.
-
- \sa operator==(), operator<(), operator>()
-*/
-
-
-/*!
- \fn bool QLatin1String::startsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::startsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::startsWith(QChar ch) const
- \since 5.10
- \fn bool QLatin1String::startsWith(QChar ch, Qt::CaseSensitivity cs) const
- \since 5.10
-
- Returns \c true if this Latin-1 string starts with string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
-
- \sa endsWith()
-*/
-
-/*!
- \fn bool QLatin1String::endsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::endsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::endsWith(QChar ch) const
- \since 5.10
- \fn bool QLatin1String::endsWith(QChar ch, Qt::CaseSensitivity cs) const
- \since 5.10
-
- Returns \c true if this Latin-1 string ends with string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
-
- \sa startsWith()
-*/
-
-/*!
- \fn int QLatin1String::indexOf(QStringView str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \fn int QLatin1String::indexOf(QLatin1String l1, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \fn int QLatin1String::indexOf(QChar c, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 5.14
-
- Returns the index position of the first occurrence of the string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively, in this Latin-1 string,
- searching forward from index position \a from. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
-
- \sa QString::indexOf()
-*/
-
-/*!
- \fn bool QLatin1String::contains(QStringView str, Qt::CaseSensitivity cs) const
- \fn bool QLatin1String::contains(QLatin1String l1, Qt::CaseSensitivity cs) const
- \fn bool QLatin1String::contains(QChar c, Qt::CaseSensitivity cs) const
- \since 5.14
-
- Returns \c true if this Latin-1 string contains an occurrence of the string-view
- \a str, Latin-1 string \a l1, or character \a ch; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is
- case-sensitive; otherwise the search is case-insensitive.
-
- \sa indexOf(), QStringView::contains(), QStringView::indexOf(), QString::indexOf()
-*/
-
-/*!
- \fn int QLatin1String::lastIndexOf(QStringView str, int from, Qt::CaseSensitivity cs) const
- \fn int QLatin1String::lastIndexOf(QLatin1String l1, int from, Qt::CaseSensitivity cs) const
- \fn int QLatin1String::lastIndexOf(QChar c, int from, Qt::CaseSensitivity cs) const
- \since 5.14
-
- Returns the index position of the last occurrence of the string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively, in this Latin-1 string,
- searching backward from index position \a from. If \a from is -1 (default),
- the search starts at the last character; if \a from is -2, at the next to last
- character and so on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), QStringView::lastIndexOf(), QStringView::indexOf(), QString::indexOf()
-*/
-
-/*!
- \fn QLatin1String::const_iterator QLatin1String::begin() const
- \since 5.10
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character in
- the string.
-
- This function is provided for STL compatibility.
-
- \sa end(), cbegin(), rbegin(), data()
-*/
-
-/*!
- \fn QLatin1String::const_iterator QLatin1String::cbegin() const
- \since 5.10
-
- Same as begin().
-
- This function is provided for STL compatibility.
-
- \sa cend(), begin(), crbegin(), data()
-*/
-
-/*!
- \fn QLatin1String::const_iterator QLatin1String::end() const
- \since 5.10
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
-
- This function is provided for STL compatibility.
-
- \sa begin(), cend(), rend()
-*/
-
-/*! \fn QLatin1String::const_iterator QLatin1String::cend() const
- \since 5.10
-
- Same as end().
-
- This function is provided for STL compatibility.
-
- \sa cbegin(), end(), crend()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::rbegin() const
- \since 5.10
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the string, in reverse order.
-
- This function is provided for STL compatibility.
-
- \sa rend(), crbegin(), begin()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::crbegin() const
- \since 5.10
-
- Same as rbegin().
-
- This function is provided for STL compatibility.
-
- \sa crend(), rbegin(), cbegin()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::rend() const
- \since 5.10
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last character in the string, in reverse order.
-
- This function is provided for STL compatibility.
-
- \sa rbegin(), crend(), end()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::crend() const
- \since 5.10
-
- Same as rend().
-
- This function is provided for STL compatibility.
-
- \sa crbegin(), rend(), cend()
-*/
-
-/*! \fn QLatin1String QLatin1String::mid(int start, int length) const
- \since 5.8
-
- Returns the substring of length \a length starting at position
- \a start in this object.
-
- Returns a null string if the \a start index exceeds the
- length of the string. If there are less than \a length characters
- available in the string starting at \a start, or if
- \a length is negative (default), the function returns all characters
- that are available from \a start.
-
- \sa left(), right(), chopped(), chop(), truncate()
-*/
-
-/*! \fn QLatin1String QLatin1String::left(int length) const
- \since 5.8
-
- Returns the substring of length \a length starting at position
- 0 in this object.
-
- The entire string is returned if \a length is greater than or equal
- to size(), or less than zero.
-
- \sa mid(), right(), chopped(), chop(), truncate()
-*/
-
-/*! \fn QLatin1String QLatin1String::right(int length) const
- \since 5.8
-
- Returns the substring of length \a length starting at position
- size() - \a length in this object.
-
- The entire string is returned if \a length is greater than or equal
- to size(), or less than zero.
-
- \sa mid(), left(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::chopped(int length) const
- \since 5.10
-
- Returns the substring of length size() - \a length starting at the
- beginning of this object.
-
- Same as \c{left(size() - length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), right(), chop(), truncate()
-*/
-
-/*!
- \fn void QLatin1String::truncate(int length)
- \since 5.10
-
- Truncates this string to length \a length.
-
- Same as \c{*this = left(length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), right(), chopped(), chop()
-*/
-
-/*!
- \fn void QLatin1String::chop(int length)
- \since 5.10
-
- Truncates this string by \a length characters.
-
- Same as \c{*this = left(size() - length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), right(), chopped(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::trimmed() const
- \since 5.10
-
- Strips leading and trailing whitespace and returns the result.
-
- Whitespace means any character for which QChar::isSpace() returns
- \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
- '\\f', '\\r', and ' '.
-*/
-
-/*! \fn bool QLatin1String::operator==(const QString &other) const
-
- Returns \c true if this string is equal to string \a other;
- otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool QLatin1String::operator==(const char *other) const
- \since 4.3
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator==(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other byte array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool QLatin1String::operator!=(const QString &other) const
-
- Returns \c true if this string is not equal to string \a other;
- otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool QLatin1String::operator!=(const char *other) const
- \since 4.3
- \overload operator!=()
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator!=(const QByteArray &other) const
- \since 5.0
- \overload operator!=()
-
- The \a other byte array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator>(const QString &other) const
-
- Returns \c true if this string is lexically greater than string \a
- other; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool QLatin1String::operator>(const char *other) const
- \since 4.3
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator>(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator<(const QString &other) const
-
- Returns \c true if this string is lexically less than the \a other
- string; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-/*!
- \fn bool QLatin1String::operator<(const char *other) const
- \since 4.3
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator<(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator>=(const QString &other) const
-
- Returns \c true if this string is lexically greater than or equal
- to string \a other; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool QLatin1String::operator>=(const char *other) const
- \since 4.3
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator>=(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool QLatin1String::operator<=(const QString &other) const
-
- Returns \c true if this string is lexically less than or equal
- to string \a other; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool QLatin1String::operator<=(const char *other) const
- \since 4.3
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator<=(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-
-/*! \fn bool operator==(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically equal to string \a s2; otherwise
- returns \c false.
-*/
-/*! \fn bool operator!=(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically unequal to string \a s2; otherwise
- returns \c false.
-*/
-/*! \fn bool operator<(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically smaller than string \a s2; otherwise
- returns \c false.
-*/
-/*! \fn bool operator<=(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically smaller than or equal to string \a s2; otherwise
- returns \c false.
-*/
-/*! \fn bool operator>(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically greater than string \a s2; otherwise
- returns \c false.
-*/
-/*! \fn bool operator>=(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically greater than or equal to
- string \a s2; otherwise returns \c false.
-*/
-
-
-#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE))
+#if !defined(QT_NO_DATASTREAM)
/*!
\fn QDataStream &operator<<(QDataStream &stream, const QString &string)
\relates QString
@@ -9572,15 +9562,16 @@ QDataStream &operator<<(QDataStream &out, const QString &str)
} else {
if (!str.isNull() || out.version() < 3) {
if ((out.byteOrder() == QDataStream::BigEndian) == (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
- out.writeBytes(reinterpret_cast<const char *>(str.unicode()), uint(sizeof(QChar) * str.length()));
+ out.writeBytes(reinterpret_cast<const char *>(str.unicode()),
+ static_cast<qsizetype>(sizeof(QChar) * str.size()));
} else {
- QVarLengthArray<char16_t> buffer(str.length());
- qbswap<sizeof(char16_t)>(str.constData(), str.length(), buffer.data());
- out.writeBytes(reinterpret_cast<const char *>(buffer.data()), uint(sizeof(char16_t) * buffer.size()));
+ QVarLengthArray<char16_t> buffer(str.size());
+ qbswap<sizeof(char16_t)>(str.constData(), str.size(), buffer.data());
+ out.writeBytes(reinterpret_cast<const char *>(buffer.data()),
+ static_cast<qsizetype>(sizeof(char16_t) * buffer.size()));
}
} else {
- // write null marker
- out << (quint32)0xffffffff;
+ QDataStream::writeQSizeType(out, -1); // write null marker
}
}
return out;
@@ -9602,20 +9593,25 @@ QDataStream &operator>>(QDataStream &in, QString &str)
in >> l;
str = QString::fromLatin1(l);
} else {
- quint32 bytes = 0;
- in >> bytes; // read size of string
- if (bytes == 0xffffffff) { // null string
+ qint64 size = QDataStream::readQSizeType(in);
+ qsizetype bytes = size;
+ if (size != bytes || size < -1) {
str.clear();
- } else if (bytes > 0) { // not empty
+ in.setStatus(QDataStream::SizeLimitExceeded);
+ return in;
+ }
+ if (bytes == -1) { // null string
+ str = QString();
+ } else if (bytes > 0) {
if (bytes & 0x1) {
str.clear();
in.setStatus(QDataStream::ReadCorruptData);
return in;
}
- const quint32 Step = 1024 * 1024;
- quint32 len = bytes / 2;
- quint32 allocated = 0;
+ const qsizetype Step = 1024 * 1024;
+ qsizetype len = bytes / 2;
+ qsizetype allocated = 0;
while (allocated < len) {
int blockSize = qMin(Step, len - allocated);
@@ -9635,607 +9631,13 @@ QDataStream &operator>>(QDataStream &in, QString &str)
qbswap<sizeof(*data)>(data, len, data);
}
} else {
- str = QString(QLatin1String(""));
+ str = QString(QLatin1StringView(""));
}
}
return in;
}
#endif // QT_NO_DATASTREAM
-
-
-
-/*!
- \class QStringRef
- \inmodule QtCore
- \since 4.3
- \brief The QStringRef class provides a thin wrapper around QString substrings.
- \reentrant
- \ingroup tools
- \ingroup string-processing
-
- QStringRef provides a read-only subset of the QString API.
-
- A string reference explicitly references a portion of a string()
- with a given size(), starting at a specific position(). Calling
- toString() returns a copy of the data as a real QString instance.
-
- This class is designed to improve the performance of substring
- handling when manipulating substrings obtained from existing QString
- instances. QStringRef avoids the memory allocation and reference
- counting overhead of a standard QString by simply referencing a
- part of the original string. This can prove to be advantageous in
- low level code, such as that used in a parser, at the expense of
- potentially more complex code.
-
- For most users, there are no semantic benefits to using QStringRef
- instead of QString since QStringRef requires attention to be paid
- to memory management issues, potentially making code more complex
- to write and maintain.
-
- \warning A QStringRef is only valid as long as the referenced
- string exists. If the original string is deleted, the string
- reference points to an invalid memory location.
-
- We suggest that you only use this class in stable code where profiling
- has clearly identified that performance improvements can be made by
- replacing standard string operations with the optimized substring
- handling provided by this class.
-
- \sa {Implicitly Shared Classes}
-*/
-
-/*!
- \typedef QStringRef::size_type
- \internal
-*/
-
-/*!
- \typedef QStringRef::value_type
- \internal
-*/
-
-/*!
- \typedef QStringRef::const_pointer
- \internal
-*/
-
-/*!
- \typedef QStringRef::const_reference
- \internal
-*/
-
-/*!
- \typedef QStringRef::const_iterator
- \since 5.4
-
- \sa QStringRef::const_reverse_iterator
-*/
-
-/*!
- \typedef QStringRef::const_reverse_iterator
- \since 5.7
-
- \sa QStringRef::const_iterator
-*/
-
-/*!
- \fn QStringRef::QStringRef()
-
- Constructs an empty string reference.
-*/
-
-/*! \fn QStringRef::QStringRef(const QString *string, int position, int length)
-
-Constructs a string reference to the range of characters in the given
-\a string specified by the starting \a position and \a length in characters.
-
-\warning This function exists to improve performance as much as possible,
-and performs no bounds checking. For program correctness, \a position and
-\a length must describe a valid substring of \a string.
-
-This means that the starting \a position must be positive or 0 and smaller
-than \a string's length, and \a length must be positive or 0 but smaller than
-the string's length minus the starting \a position;
-i.e, 0 <= position < string->length() and
-0 <= length <= string->length() - position must both be satisfied.
-*/
-
-/*! \fn QStringRef::QStringRef(const QString *string)
-
-Constructs a string reference to the given \a string.
-*/
-
-/*! \fn QStringRef::QStringRef(const QStringRef &other)
-
-Constructs a copy of the \a other string reference.
- */
-/*!
-\fn QStringRef::~QStringRef()
-
-Destroys the string reference.
-
-Since this class is only used to refer to string data, and does not take
-ownership of it, no memory is freed when instances are destroyed.
-*/
-
-/*!
- \fn int QStringRef::position() const
-
- Returns the starting position in the referenced string that is referred to
- by the string reference.
-
- \sa size(), string()
-*/
-
-/*!
- \fn int QStringRef::size() const
-
- Returns the number of characters referred to by the string reference.
- Equivalent to length() and count().
-
- \sa position(), string()
-*/
-/*!
- \fn int QStringRef::count() const
- Returns the number of characters referred to by the string reference.
- Equivalent to size() and length().
-
- \sa position(), string()
-*/
-/*!
- \fn int QStringRef::length() const
- Returns the number of characters referred to by the string reference.
- Equivalent to size() and count().
-
- \sa position(), string()
-*/
-
-
-/*!
- \fn bool QStringRef::isEmpty() const
-
- Returns \c true if the string reference has no characters; otherwise returns
- \c false.
-
- A string reference is empty if its size is zero.
-
- \sa size()
-*/
-
-/*!
- \fn bool QStringRef::isNull() const
-
- Returns \c true if this string reference does not reference a string or if
- the string it references is null (i.e. QString::isNull() is true).
-
- \sa size()
-*/
-
-/*!
- \fn const QString *QStringRef::string() const
-
- Returns a pointer to the string referred to by the string reference, or
- 0 if it does not reference a string.
-
- \sa unicode()
-*/
-
-
-/*!
- \fn const QChar *QStringRef::unicode() const
-
- Returns a Unicode representation of the string reference. Since
- the data stems directly from the referenced string, it is not
- \\0'-terminated unless the string reference includes the string's
- null terminator.
-
- \sa string()
-*/
-
-/*!
- \fn const QChar *QStringRef::data() const
-
- Same as unicode().
-*/
-
-/*!
- \fn const QChar *QStringRef::constData() const
-
- Same as unicode().
-*/
-
-/*!
- \fn QStringRef::const_iterator QStringRef::begin() const
- \since 5.4
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character in
- the string.
-
- \sa cbegin(), constBegin(), end(), constEnd(), rbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_iterator QStringRef::cbegin() const
- \since 5.4
-
- Same as begin().
-
- \sa begin(), constBegin(), cend(), constEnd(), rbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_iterator QStringRef::constBegin() const
- \since 5.9
-
- Same as begin().
-
- \sa begin(), cend(), constEnd(), rbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_iterator QStringRef::end() const
- \since 5.4
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
-
- \sa cbegin(), constBegin(), end(), constEnd(), rbegin(), rend()
-*/
-
-/*! \fn QStringRef::const_iterator QStringRef::cend() const
- \since 5.4
-
- Same as end().
-
- \sa end(), constEnd(), cbegin(), constBegin(), rbegin(), rend()
-*/
-
-/*! \fn QStringRef::const_iterator QStringRef::constEnd() const
- \since 5.9
-
- Same as end().
-
- \sa end(), cend(), cbegin(), constBegin(), rbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_reverse_iterator QStringRef::rbegin() const
- \since 5.7
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the string, in reverse order.
-
- \sa begin(), crbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_reverse_iterator QStringRef::crbegin() const
- \since 5.7
-
- Same as rbegin().
-
- \sa begin(), rbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_reverse_iterator QStringRef::rend() const
- \since 5.7
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last character in the string, in reverse order.
-
- \sa end(), crend(), rbegin()
-*/
-
-
-/*!
- \fn QStringRef::const_reverse_iterator QStringRef::crend() const
- \since 5.7
-
- Same as rend().
-
- \sa end(), rend(), rbegin()
-*/
-
-/*!
- Returns a copy of the string reference as a QString object.
-
- If the string reference is not a complete reference of the string
- (meaning that position() is 0 and size() equals string()->size()),
- this function will allocate a new string to return.
-
- \sa string()
-*/
-
-QString QStringRef::toString() const {
- if (isNull())
- return QString();
- if (m_size && m_position == 0 && m_size == m_string->size())
- return *m_string;
- return QString(m_string->unicode() + m_position, m_size);
-}
-
-
-/*! \relates QStringRef
-
- Returns \c true if string reference \a s1 is lexically equal to string reference \a s2; otherwise
- returns \c false.
-*/
-bool operator==(const QStringRef &s1,const QStringRef &s2) noexcept
-{
- return s1.size() == s2.size() && qt_compare_strings(s1, s2, Qt::CaseSensitive) == 0;
-}
-
-/*! \relates QStringRef
-
- Returns \c true if string \a s1 is lexically equal to string reference \a s2; otherwise
- returns \c false.
-*/
-bool operator==(const QString &s1,const QStringRef &s2) noexcept
-{
- return s1.size() == s2.size() && qt_compare_strings(s1, s2, Qt::CaseSensitive) == 0;
-}
-
-/*! \relates QStringRef
-
- Returns \c true if string \a s1 is lexically equal to string reference \a s2; otherwise
- returns \c false.
-*/
-bool operator==(QLatin1String s1, const QStringRef &s2) noexcept
-{
- if (s1.size() != s2.size())
- return false;
-
- return qt_compare_strings(s2, s1, Qt::CaseSensitive) == 0;
-}
-
-/*!
- \relates QStringRef
-
- Returns \c true if string reference \a s1 is lexically less than
- string reference \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-bool operator<(const QStringRef &s1,const QStringRef &s2) noexcept
-{
- return qt_compare_strings(s1, s2, Qt::CaseSensitive) < 0;
-}
-
-/*!\fn bool operator<=(const QStringRef &s1,const QStringRef &s2)
-
- \relates QStringRef
-
- Returns \c true if string reference \a s1 is lexically less than
- or equal to string reference \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-/*!\fn bool operator>=(const QStringRef &s1,const QStringRef &s2)
-
- \relates QStringRef
-
- Returns \c true if string reference \a s1 is lexically greater than
- or equal to string reference \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-/*!\fn bool operator>(const QStringRef &s1,const QStringRef &s2)
-
- \relates QStringRef
-
- Returns \c true if string reference \a s1 is lexically greater than
- string reference \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-
-/*!
- \fn const QChar QStringRef::at(int position) const
-
- Returns the character at the given index \a position in the
- string reference.
-
- The \a position must be a valid index position in the string
- (i.e., 0 <= \a position < size()).
-*/
-
-/*!
- \fn QChar QStringRef::operator[](int position) const
- \since 5.7
-
- Returns the character at the given index \a position in the
- string reference.
-
- The \a position must be a valid index position in the string
- reference (i.e., 0 <= \a position < size()).
-
- \sa at()
-*/
-
-/*!
- \fn QChar QStringRef::front() const
- \since 5.10
-
- Returns the first character in the string.
- Same as \c{at(0)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa back(), at(), operator[]()
-*/
-
-/*!
- \fn QChar QStringRef::back() const
- \since 5.10
-
- Returns the last character in the string.
- Same as \c{at(size() - 1)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa front(), at(), operator[]()
-*/
-
-/*!
- \fn void QStringRef::clear()
-
- Clears the contents of the string reference by making it null and empty.
-
- \sa isEmpty(), isNull()
-*/
-
-/*!
- \fn QStringRef &QStringRef::operator=(const QStringRef &other)
-
- Assigns the \a other string reference to this string reference, and
- returns the result.
-*/
-
-/*!
- \fn QStringRef &QStringRef::operator=(const QString *string)
-
- Constructs a string reference to the given \a string and assigns it to
- this string reference, returning the result.
-*/
-
-/*!
- \fn bool QStringRef::operator==(const char * s) const
-
- \overload operator==()
-
- The \a s byte array is converted to a QStringRef using the
- fromUtf8() function. This function stops conversion at the
- first NUL character found, or the end of the byte array.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically equal to the parameter
- string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QStringRef::operator!=(const char * s) const
-
- \overload operator!=()
-
- The \a s const char pointer is converted to a QStringRef using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is not lexically equal to the parameter
- string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QStringRef::operator<(const char * s) const
-
- \overload operator<()
-
- The \a s const char pointer is converted to a QStringRef using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically smaller than the parameter
- string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QStringRef::operator<=(const char * s) const
-
- \overload operator<=()
-
- The \a s const char pointer is converted to a QStringRef using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically smaller than or equal to the parameter
- string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QStringRef::operator>(const char * s) const
-
-
- \overload operator>()
-
- The \a s const char pointer is converted to a QStringRef using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically greater than the parameter
- string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QStringRef::operator>= (const char * s) const
-
- \overload operator>=()
-
- The \a s const char pointer is converted to a QStringRef using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically greater than or equal to the
- parameter string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
/*!
\typedef QString::Data
\internal
@@ -10251,631 +9653,6 @@ bool operator<(const QStringRef &s1,const QStringRef &s2) noexcept
\internal
*/
-
-
-/*! Appends the string reference to \a string, and returns a new
-reference to the combined string data.
- */
-QStringRef QStringRef::appendTo(QString *string) const
-{
- if (!string)
- return QStringRef();
- int pos = string->size();
- string->insert(pos, unicode(), size());
- return QStringRef(string, pos, size());
-}
-
-/*!
- \fn int QStringRef::compare(const QStringRef &s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
- \since 4.5
-
- Compares the string \a s1 with the string \a s2 and returns an
- integer less than, equal to, or greater than zero if \a s1
- is less than, equal to, or greater than \a s2.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-*/
-
-/*!
- \fn int QStringRef::compare(const QStringRef &s1, const QStringRef &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
- \since 4.5
- \overload
-
- Compares the string \a s1 with the string \a s2 and returns an
- integer less than, equal to, or greater than zero if \a s1
- is less than, equal to, or greater than \a s2.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-*/
-
-/*!
- \fn int QStringRef::compare(const QStringRef &s1, QLatin1String s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
- \since 4.5
- \overload
-
- Compares the string \a s1 with the string \a s2 and returns an
- integer less than, equal to, or greater than zero if \a s1
- is less than, equal to, or greater than \a s2.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-*/
-
-/*!
- \overload
- \fn int QStringRef::compare(const QString &other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 4.5
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-
- Equivalent to \c {compare(*this, other, cs)}.
-*/
-
-/*!
- \overload
- \fn int QStringRef::compare(const QStringRef &other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 4.5
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-
- Equivalent to \c {compare(*this, other, cs)}.
-*/
-
-/*!
- \overload
- \fn int QStringRef::compare(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 5.14
-
- Compares this string with \a ch and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than \a ch, interpreted as a string of length one.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-*/
-
-/*!
- \overload
- \fn int QStringRef::compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 4.5
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-
- Equivalent to \c {compare(*this, other, cs)}.
-*/
-
-/*!
- \overload
- \fn int QStringRef::compare(const QByteArray &other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 5.8
-
- Compares this string with \a other and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other byte array,
- interpreted as a UTF-8 sequence.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-
- Equivalent to \c {compare(*this, other, cs)}.
-*/
-
-/*!
- \fn int QStringRef::localeAwareCompare(const QStringRef &s1, const QString & s2)
- \since 4.5
-
- Compares \a s1 with \a s2 and returns an integer less than, equal
- to, or greater than zero if \a s1 is less than, equal to, or
- greater than \a s2.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-
- On \macos and iOS, this function compares according the
- "Order for sorted lists" setting in the International prefereces panel.
-
- \sa compare(), QLocale
-*/
-
-/*!
- \fn int QStringRef::localeAwareCompare(const QStringRef &s1, const QStringRef & s2)
- \since 4.5
- \overload
-
- Compares \a s1 with \a s2 and returns an integer less than, equal
- to, or greater than zero if \a s1 is less than, equal to, or
- greater than \a s2.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-
-*/
-
-/*!
- \fn int QStringRef::localeAwareCompare(const QString &other) const
- \since 4.5
- \overload
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-*/
-
-/*!
- \fn int QStringRef::localeAwareCompare(const QStringRef &other) const
- \since 4.5
- \overload
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-*/
-
-/*!
- \fn QString &QString::append(QStringView str)
- \since 6.0
-
- Appends the given string view \a str to this string and returns the result.
-*/
-
-/*!
- \fn QStringRef::left(int n) const
- \since 5.2
-
- Returns a substring reference to the \a n leftmost characters
- of the string.
-
- If \a n is greater than or equal to size(), or less than zero,
- a reference to the entire string is returned.
-
- \sa right(), mid(), startsWith(), chopped(), chop(), truncate()
-*/
-QStringRef QStringRef::left(int n) const
-{
- if (uint(n) >= uint(m_size))
- return *this;
- return QStringRef(m_string, m_position, n);
-}
-
-/*!
- \since 4.4
-
- Returns a substring reference to the \a n leftmost characters
- of the string.
-
- If \a n is greater than or equal to size(), or less than zero,
- a reference to the entire string is returned.
-
- \snippet qstring/main.cpp leftRef
-
- \sa left(), rightRef(), midRef(), startsWith()
-*/
-QStringRef QString::leftRef(int n) const
-{
- return QStringRef(this).left(n);
-}
-
-/*!
- \fn QStringRef::right(int n) const
- \since 5.2
-
- Returns a substring reference to the \a n rightmost characters
- of the string.
-
- If \a n is greater than or equal to size(), or less than zero,
- a reference to the entire string is returned.
-
- \sa left(), mid(), endsWith(), chopped(), chop(), truncate()
-*/
-QStringRef QStringRef::right(int n) const
-{
- if (uint(n) >= uint(m_size))
- return *this;
- return QStringRef(m_string, m_size - n + m_position, n);
-}
-
-/*!
- \since 4.4
-
- Returns a substring reference to the \a n rightmost characters
- of the string.
-
- If \a n is greater than or equal to size(), or less than zero,
- a reference to the entire string is returned.
-
- \snippet qstring/main.cpp rightRef
-
- \sa right(), leftRef(), midRef(), endsWith()
-*/
-QStringRef QString::rightRef(int n) const
-{
- return QStringRef(this).right(n);
-}
-
-/*!
- \fn QStringRef QStringRef::mid(int position, int n = -1) const
- \since 5.2
-
- Returns a substring reference to \a n characters of this string,
- starting at the specified \a position.
-
- If the \a position exceeds the length of the string, a null
- reference is returned.
-
- If there are less than \a n characters available in the string,
- starting at the given \a position, or if \a n is -1 (default), the
- function returns all characters from the specified \a position
- onwards.
-
- \sa left(), right(), chopped(), chop(), truncate()
-*/
-QStringRef QStringRef::mid(int pos, int n) const
-{
- qsizetype p = pos;
- qsizetype l = n;
- using namespace QtPrivate;
- switch (QContainerImplHelper::mid(m_size, &p, &l)) {
- case QContainerImplHelper::Null:
- return QStringRef();
- case QContainerImplHelper::Empty:
- return QStringRef(m_string, 0, 0);
- case QContainerImplHelper::Full:
- return *this;
- case QContainerImplHelper::Subset:
- return QStringRef(m_string, p + m_position, l);
- }
- Q_UNREACHABLE();
- return QStringRef();
-}
-
-/*!
- \fn QStringRef QStringRef::chopped(int len) const
- \since 5.10
-
- Returns a substring reference to the size() - \a len leftmost characters
- of this string.
-
- \note The behavior is undefined if \a len is negative or greater than size().
-
- \sa endsWith(), left(), right(), mid(), chop(), truncate()
-*/
-
-/*!
- \since 4.4
-
- Returns a substring reference to \a n characters of this string,
- starting at the specified \a position.
-
- If the \a position exceeds the length of the string, a null
- reference is returned.
-
- If there are less than \a n characters available in the string,
- starting at the given \a position, or if \a n is -1 (default), the
- function returns all characters from the specified \a position
- onwards.
-
- Example:
-
- \snippet qstring/main.cpp midRef
-
- \sa mid(), leftRef(), rightRef()
-*/
-QStringRef QString::midRef(int position, int n) const
-{
- return QStringRef(this).mid(position, n);
-}
-
-/*!
- \fn void QStringRef::truncate(int position)
- \since 5.6
-
- Truncates the string at the given \a position index.
-
- If the specified \a position index is beyond the end of the
- string, nothing happens.
-
- If \a position is negative, it is equivalent to passing zero.
-
- \sa QString::truncate()
-*/
-
-/*!
- \fn void QStringRef::chop(int n)
- \since 5.8
-
- Removes \a n characters from the end of the string.
-
- If \a n is greater than or equal to size(), the result is an
- empty string; if \a n is negative, it is equivalent to passing zero.
-
- \sa QString::chop(), truncate()
-*/
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- \since 4.8
-
- Returns the index position of the first occurrence of the string \a
- str in this string reference, searching forward from index position
- \a from. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
-
- \sa QString::indexOf(), lastIndexOf(), contains(), count()
-*/
-int QStringRef::indexOf(const QString &str, int from, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(QtPrivate::findString(QStringView(unicode(), length()), from, QStringView(str.unicode(), str.length()), cs));
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
-
-/*!
- \fn int QStringRef::indexOf(QStringView str, int from, Qt::CaseSensitivity cs) const
- \since 5.14
- \overload indexOf()
-
- Returns the index position of the first occurrence of the string view \a str
- in this string reference, searching forward from index position \a from.
- Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
-
- \sa QString::indexOf(), QStringView::indexOf(), lastIndexOf(), contains(), count()
-*/
-
-/*!
- \since 4.8
- \overload indexOf()
-
- Returns the index position of the first occurrence of the
- character \a ch in the string reference, searching forward from
- index position \a from. Returns -1 if \a ch could not be found.
-
- \sa QString::indexOf(), lastIndexOf(), contains(), count()
-*/
-int QStringRef::indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(qFindChar(QStringView(unicode(), length()), ch, from, cs));
-}
-
-/*!
- \since 4.8
-
- Returns the index position of the first occurrence of the string \a
- str in this string reference, searching forward from index position
- \a from. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
-
- \sa QString::indexOf(), lastIndexOf(), contains(), count()
-*/
-int QStringRef::indexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(QtPrivate::findString(QStringView(unicode(), size()), from, str, cs));
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- \since 4.8
-
- \overload indexOf()
-
- Returns the index position of the first occurrence of the string
- reference \a str in this string reference, searching forward from
- index position \a from. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::indexOf(), lastIndexOf(), contains(), count()
-*/
-int QStringRef::indexOf(const QStringRef &str, int from, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(QtPrivate::findString(QStringView(unicode(), size()), from, QStringView(str.unicode(), str.size()), cs));
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
-
-/*!
- \since 4.8
-
- Returns the index position of the last occurrence of the string \a
- str in this string reference, searching backward from index position
- \a from. If \a from is -1 (default), the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::lastIndexOf(), indexOf(), contains(), count()
-*/
-int QStringRef::lastIndexOf(const QString &str, int from, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(QtPrivate::lastIndexOf(*this, from, str, cs));
-}
-
-/*!
- \since 4.8
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the character
- \a ch, searching backward from position \a from.
-
- \sa QString::lastIndexOf(), indexOf(), contains(), count()
-*/
-int QStringRef::lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(qLastIndexOf(*this, ch, from, cs));
-}
-
-/*!
- \since 4.8
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the string \a
- str in this string reference, searching backward from index position
- \a from. If \a from is -1 (default), the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::lastIndexOf(), indexOf(), contains(), count()
-*/
-int QStringRef::lastIndexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(QtPrivate::lastIndexOf(*this, from, str, cs));
-}
-
-/*!
- \since 4.8
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the string
- reference \a str in this string reference, searching backward from
- index position \a from. If \a from is -1 (default), the search
- starts at the last character; if \a from is -2, at the next to last
- character and so on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::lastIndexOf(), indexOf(), contains(), count()
-*/
-int QStringRef::lastIndexOf(const QStringRef &str, int from, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(QtPrivate::lastIndexOf(*this, from, str, cs));
-}
-
-/*!
- \fn int QStringRef::lastIndexOf(QStringView str, int from, Qt::CaseSensitivity cs) const
- \since 5.14
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the string view \a
- str in this string, searching backward from index position \a
- from. If \a from is -1 (default), the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), contains(), count()
-*/
-
-/*!
- \since 4.8
- Returns the number of (potentially overlapping) occurrences of
- the string \a str in this string reference.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa QString::count(), contains(), indexOf()
-*/
-int QStringRef::count(const QString &str, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(QtPrivate::count(QStringView(unicode(), size()), QStringView(str.unicode(), str.size()), cs));
-}
-
-/*!
- \since 4.8
- \overload count()
-
- Returns the number of occurrences of the character \a ch in the
- string reference.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa QString::count(), contains(), indexOf()
-*/
-int QStringRef::count(QChar ch, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(QtPrivate::count(QStringView(unicode(), size()), ch, cs));
-}
-
-/*!
- \since 4.8
- \overload count()
-
- Returns the number of (potentially overlapping) occurrences of the
- string reference \a str in this string reference.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa QString::count(), contains(), indexOf()
-*/
-int QStringRef::count(const QStringRef &str, Qt::CaseSensitivity cs) const
-{
- // ### Qt6: qsizetype
- return int(QtPrivate::count(QStringView(unicode(), size()), QStringView(str.unicode(), str.size()), cs));
-}
-
-/*!
- \since 5.9
-
- Returns \c true if the string is read right to left.
-
- \sa QString::isRightToLeft()
-*/
-bool QStringRef::isRightToLeft() const
-{
- return QtPrivate::isRightToLeft(QStringView(unicode(), size()));
-}
-
/*!
\since 5.11
\internal
@@ -10887,20 +9664,12 @@ bool QStringRef::isRightToLeft() const
*/
bool QtPrivate::isRightToLeft(QStringView string) noexcept
{
- const char16_t *p = string.utf16();
- const char16_t * const end = p + string.size();
int isolateLevel = 0;
- while (p < end) {
- uint ucs4 = *p;
- if (QChar::isHighSurrogate(ucs4) && p < end - 1) {
- char16_t low = p[1];
- if (QChar::isLowSurrogate(low)) {
- ucs4 = QChar::surrogateToUcs4(ucs4, low);
- ++p;
- }
- }
- switch (QChar::direction(ucs4))
- {
+
+ for (QStringIterator i(string); i.hasNext();) {
+ const char32_t c = i.next();
+
+ switch (QChar::direction(c)) {
case QChar::DirRLI:
case QChar::DirLRI:
case QChar::DirFSI:
@@ -10919,201 +9688,28 @@ bool QtPrivate::isRightToLeft(QStringView string) noexcept
if (isolateLevel)
break;
return true;
- default:
+ case QChar::DirEN:
+ case QChar::DirES:
+ case QChar::DirET:
+ case QChar::DirAN:
+ case QChar::DirCS:
+ case QChar::DirB:
+ case QChar::DirS:
+ case QChar::DirWS:
+ case QChar::DirON:
+ case QChar::DirLRE:
+ case QChar::DirLRO:
+ case QChar::DirRLE:
+ case QChar::DirRLO:
+ case QChar::DirPDF:
+ case QChar::DirNSM:
+ case QChar::DirBN:
break;
}
- ++p;
}
return false;
}
-/*!
- \since 4.8
-
- Returns \c true if the string reference starts with \a str; otherwise
- returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa QString::startsWith(), endsWith()
-*/
-bool QStringRef::startsWith(const QString &str, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, str, cs);
-}
-
-/*!
- \since 4.8
- \overload startsWith()
- \sa QString::startsWith(), endsWith()
-*/
-bool QStringRef::startsWith(QLatin1String str, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, str, cs);
-}
-
-/*!
- \fn bool QStringRef::startsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \overload startsWith()
- \sa QString::startsWith(), endsWith()
-*/
-
-/*!
- \since 4.8
- \overload startsWith()
- \sa QString::startsWith(), endsWith()
-*/
-bool QStringRef::startsWith(const QStringRef &str, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, str, cs);
-}
-
-/*!
- \since 4.8
- \overload startsWith()
-
- Returns \c true if the string reference starts with \a ch; otherwise
- returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::startsWith(), endsWith()
-*/
-bool QStringRef::startsWith(QChar ch, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, ch, cs);
-}
-
-/*!
- \since 4.8
- Returns \c true if the string reference ends with \a str; otherwise
- returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::endsWith(), startsWith()
-*/
-bool QStringRef::endsWith(const QString &str, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, str, cs);
-}
-
-/*!
- \since 4.8
- \overload endsWith()
-
- Returns \c true if the string reference ends with \a ch; otherwise
- returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::endsWith(), endsWith()
-*/
-bool QStringRef::endsWith(QChar ch, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, ch, cs);
-}
-
-/*!
- \since 4.8
- \overload endsWith()
- \sa QString::endsWith(), endsWith()
-*/
-bool QStringRef::endsWith(QLatin1String str, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, str, cs);
-}
-
-/*!
- \fn bool QStringRef::endsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \overload endsWith()
- \sa QString::endsWith(), startsWith()
-*/
-
-/*!
- \since 4.8
- \overload endsWith()
- \sa QString::endsWith(), endsWith()
-*/
-bool QStringRef::endsWith(const QStringRef &str, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, str, cs);
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*! \fn bool QStringRef::contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
-
- \since 4.8
- Returns \c true if this string reference contains an occurrence of
- the string \a str; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), count()
-*/
-#endif // QT_STRINGVIEW_LEVEL < 2
-
-/*! \fn bool QStringRef::contains(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
-
- \overload contains()
- \since 4.8
-
- Returns \c true if this string contains an occurrence of the
- character \a ch; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
-*/
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*! \fn bool QStringRef::contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \overload contains()
- \since 4.8
-
- Returns \c true if this string reference contains an occurrence of
- the string reference \a str; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), count()
-*/
-#endif // QT_STRINGVIEW_LEVEL < 2
-
-/*! \fn bool QStringRef::contains(QLatin1String str, Qt::CaseSensitivity cs) const
- \since 4.8
- \overload contains()
-
- Returns \c true if this string reference contains an occurrence of
- the string \a str; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), count()
-*/
-
-/*! \fn bool QStringRef::contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 5.14
- \overload contains()
-
- Returns \c true if this string reference contains an occurrence of
- the string view \a str; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), count()
-*/
-
qsizetype QtPrivate::count(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
{
qsizetype num = 0;
@@ -11129,64 +9725,81 @@ qsizetype QtPrivate::count(QStringView haystack, QStringView needle, Qt::CaseSen
return num;
}
-qsizetype QtPrivate::count(QStringView haystack, QChar ch, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::count(QStringView haystack, QChar needle, Qt::CaseSensitivity cs) noexcept
{
- qsizetype num = 0;
- if (cs == Qt::CaseSensitive) {
- for (QChar c : haystack) {
- if (c == ch)
- ++num;
- }
- } else {
- ch = foldCase(ch);
- for (QChar c : haystack) {
- if (foldCase(c) == ch)
- ++num;
- }
- }
- return num;
+ if (cs == Qt::CaseSensitive)
+ return std::count(haystack.cbegin(), haystack.cend(), needle);
+
+ needle = foldCase(needle);
+ return std::count_if(haystack.cbegin(), haystack.cend(),
+ [needle](const QChar c) { return foldAndCompare(c, needle); });
}
-template <typename Haystack, typename Needle>
-bool qt_starts_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::count(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
{
- if (haystack.isNull())
- return needle.isNull(); // historical behavior, consider changing in ### Qt 6.
- const auto haystackLen = haystack.size();
- const auto needleLen = needle.size();
- if (haystackLen == 0)
- return needleLen == 0;
- if (needleLen > haystackLen)
- return false;
+ qsizetype num = 0;
+ qsizetype i = -1;
+
+ QLatin1StringMatcher matcher(needle, cs);
+ while ((i = matcher.indexIn(haystack, i + 1)) != -1)
+ ++num;
- return qt_compare_strings(haystack.left(needleLen), needle, cs) == 0;
+ return num;
}
-static inline bool qt_starts_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
+qsizetype QtPrivate::count(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs)
{
- return qt_starts_with_impl(haystack, needle, cs);
+ if (haystack.size() < needle.size())
+ return 0;
+
+ if (!QtPrivate::isLatin1(needle)) // won't find non-L1 UTF-16 needles in a L1 haystack!
+ return 0;
+
+ qsizetype num = 0;
+ qsizetype i = -1;
+
+ QVarLengthArray<uchar> s(needle.size());
+ qt_to_latin1_unchecked(s.data(), needle.utf16(), needle.size());
+
+ QLatin1StringMatcher matcher(QLatin1StringView(reinterpret_cast<char *>(s.data()), s.size()),
+ cs);
+ while ((i = matcher.indexIn(haystack, i + 1)) != -1)
+ ++num;
+
+ return num;
}
-static inline bool qt_starts_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
+qsizetype QtPrivate::count(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
{
- return qt_starts_with_impl(haystack, needle, cs);
+ if (haystack.size() < needle.size())
+ return -1;
+
+ QVarLengthArray<char16_t> s = qt_from_latin1_to_qvla(needle);
+ return QtPrivate::count(haystack, QStringView(s.data(), s.size()), cs);
}
-static inline bool qt_starts_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs)
+qsizetype QtPrivate::count(QLatin1StringView haystack, QChar needle, Qt::CaseSensitivity cs) noexcept
{
- return haystack.size()
- && (cs == Qt::CaseSensitive ? haystack.front() == needle
- : foldCase(haystack.front()) == foldCase(needle));
+ // non-L1 needles cannot possibly match in L1-only haystacks
+ if (needle.unicode() > 0xff)
+ return 0;
+
+ if (cs == Qt::CaseSensitive) {
+ return std::count(haystack.cbegin(), haystack.cend(), needle.toLatin1());
+ } else {
+ return std::count_if(haystack.cbegin(), haystack.cend(),
+ CaseInsensitiveL1::matcher(needle.toLatin1()));
+ }
}
/*!
\fn bool QtPrivate::startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::startsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::startsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::startsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::startsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::startsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::startsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
\since 5.10
\internal
\relates QStringView
@@ -11194,10 +9807,9 @@ static inline bool qt_starts_with(QStringView haystack, QChar needle, Qt::CaseSe
Returns \c true if \a haystack starts with \a needle,
otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
- \sa QtPrivate::endsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1String::endsWith()
+ \sa QtPrivate::endsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1StringView::endsWith()
*/
bool QtPrivate::startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
@@ -11205,61 +9817,29 @@ bool QtPrivate::startsWith(QStringView haystack, QStringView needle, Qt::CaseSen
return qt_starts_with_impl(haystack, needle, cs);
}
-bool QtPrivate::startsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::startsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_starts_with_impl(haystack, needle, cs);
}
-bool QtPrivate::startsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::startsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_starts_with_impl(haystack, needle, cs);
}
-bool QtPrivate::startsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::startsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_starts_with_impl(haystack, needle, cs);
}
-template <typename Haystack, typename Needle>
-bool qt_ends_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) noexcept
-{
- if (haystack.isNull())
- return needle.isNull(); // historical behavior, consider changing in ### Qt 6.
- const auto haystackLen = haystack.size();
- const auto needleLen = needle.size();
- if (haystackLen == 0)
- return needleLen == 0;
- if (haystackLen < needleLen)
- return false;
-
- return qt_compare_strings(haystack.right(needleLen), needle, cs) == 0;
-}
-
-static inline bool qt_ends_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
-{
- return qt_ends_with_impl(haystack, needle, cs);
-}
-
-static inline bool qt_ends_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
-{
- return qt_ends_with_impl(haystack, needle, cs);
-}
-
-static inline bool qt_ends_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs)
-{
- return haystack.size()
- && (cs == Qt::CaseSensitive ? haystack.back() == needle
- : foldCase(haystack.back()) == foldCase(needle));
-}
-
/*!
\fn bool QtPrivate::endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::endsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::endsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::endsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::endsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::endsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::endsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
\since 5.10
\internal
\relates QStringView
@@ -11267,10 +9847,9 @@ static inline bool qt_ends_with(QStringView haystack, QChar needle, Qt::CaseSens
Returns \c true if \a haystack ends with \a needle,
otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
- \sa QtPrivate::startsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1String::endsWith()
+ \sa QtPrivate::startsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1StringView::endsWith()
*/
bool QtPrivate::endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
@@ -11278,91 +9857,27 @@ bool QtPrivate::endsWith(QStringView haystack, QStringView needle, Qt::CaseSensi
return qt_ends_with_impl(haystack, needle, cs);
}
-bool QtPrivate::endsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::endsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_ends_with_impl(haystack, needle, cs);
}
-bool QtPrivate::endsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::endsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_ends_with_impl(haystack, needle, cs);
}
-bool QtPrivate::endsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::endsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_ends_with_impl(haystack, needle, cs);
}
-namespace {
-template <typename Pointer>
-char32_t foldCaseHelper(Pointer ch, Pointer start) = delete;
-
-template <>
-char32_t foldCaseHelper<const QChar*>(const QChar* ch, const QChar* start)
-{
- return foldCase(reinterpret_cast<const char16_t*>(ch),
- reinterpret_cast<const char16_t*>(start));
-}
-
-template <>
-char32_t foldCaseHelper<const char*>(const char* ch, const char*)
-{
- return foldCase(char16_t(uchar(*ch)));
-}
-
-template <typename T>
-char16_t valueTypeToUtf16(T t) = delete;
-
-template <>
-char16_t valueTypeToUtf16<QChar>(QChar t)
-{
- return t.unicode();
-}
-
-template <>
-char16_t valueTypeToUtf16<char>(char t)
-{
- return char16_t{uchar(t)};
-}
-}
-
-/*!
- \internal
-
- Returns the index position of the first occurrence of the
- character \a ch in the string given by \a str and \a len,
- searching forward from index
- position \a from. Returns -1 if \a ch could not be found.
-*/
-
-static inline qsizetype qFindChar(QStringView str, QChar ch, qsizetype from, Qt::CaseSensitivity cs) noexcept
-{
- if (from < 0)
- from = qMax(from + str.size(), qsizetype(0));
- if (from < str.size()) {
- const char16_t *s = str.utf16();
- char16_t c = ch.unicode();
- const char16_t *n = s + from;
- const char16_t *e = s + str.size();
- if (cs == Qt::CaseSensitive) {
- n = QtPrivate::qustrchr(QStringView(n, e), c);
- if (n != e)
- return n - s;
- } else {
- c = foldCase(c);
- --n;
- while (++n != e)
- if (foldCase(*n) == c)
- return n - s;
- }
- }
- return -1;
-}
-
qsizetype QtPrivate::findString(QStringView haystack0, qsizetype from, QStringView needle0, Qt::CaseSensitivity cs) noexcept
{
const qsizetype l = haystack0.size();
const qsizetype sl = needle0.size();
+ if (sl == 1)
+ return findString(haystack0, from, needle0[0], cs);
if (from < 0)
from += l;
if (std::size_t(sl + from) > std::size_t(l))
@@ -11372,9 +9887,6 @@ qsizetype QtPrivate::findString(QStringView haystack0, qsizetype from, QStringVi
if (!l)
return -1;
- if (sl == 1)
- return qFindChar(haystack0, needle0[0], from, cs);
-
/*
We use the Boyer-Moore algorithm in cases where the overhead
for the skip table should pay off, otherwise we use a simple
@@ -11407,7 +9919,7 @@ qsizetype QtPrivate::findString(QStringView haystack0, qsizetype from, QStringVi
while (haystack <= end) {
hashHaystack += haystack[sl_minus_1];
if (hashHaystack == hashNeedle
- && qt_compare_strings(needle0, sv(haystack), Qt::CaseSensitive) == 0)
+ && QtPrivate::compareStrings(needle0, sv(haystack), Qt::CaseSensitive) == 0)
return haystack - haystack0.utf16();
REHASH(*haystack);
@@ -11424,7 +9936,7 @@ qsizetype QtPrivate::findString(QStringView haystack0, qsizetype from, QStringVi
while (haystack <= end) {
hashHaystack += foldCase(haystack + sl_minus_1, haystack_start);
if (hashHaystack == hashNeedle
- && qt_compare_strings(needle0, sv(haystack), Qt::CaseInsensitive) == 0)
+ && QtPrivate::compareStrings(needle0, sv(haystack), Qt::CaseInsensitive) == 0)
return haystack - haystack0.utf16();
REHASH(foldCase(haystack, haystack_start));
@@ -11434,128 +9946,93 @@ qsizetype QtPrivate::findString(QStringView haystack0, qsizetype from, QStringVi
return -1;
}
-template <typename Haystack>
-static inline qsizetype qLastIndexOf(Haystack haystack, QChar needle,
- qsizetype from, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::findString(QStringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
- if (from < 0)
- from += haystack.size();
- if (std::size_t(from) >= std::size_t(haystack.size()))
+ if (haystack.size() < needle.size())
return -1;
- if (from >= 0) {
- char16_t c = needle.unicode();
- const auto b = haystack.data();
- auto n = b + from;
- if (cs == Qt::CaseSensitive) {
- for (; n >= b; --n)
- if (valueTypeToUtf16(*n) == c)
- return n - b;
- } else {
- c = foldCase(c);
- for (; n >= b; --n)
- if (foldCase(valueTypeToUtf16(*n)) == c)
- return n - b;
- }
- }
- return -1;
+
+ QVarLengthArray<char16_t> s = qt_from_latin1_to_qvla(needle);
+ return QtPrivate::findString(haystack, from, QStringView(reinterpret_cast<const QChar*>(s.constData()), s.size()), cs);
}
-template<typename Haystack, typename Needle>
-static qsizetype qLastIndexOf(Haystack haystack0, qsizetype from,
- Needle needle0, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::findString(QLatin1StringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
{
- const qsizetype sl = needle0.size();
- if (sl == 1)
- return qLastIndexOf(haystack0, needle0.front(), from, cs);
-
- const qsizetype l = haystack0.size();
- if (from < 0)
- from += l;
- if (from == l && sl == 0)
- return from;
- const qsizetype delta = l - sl;
- if (std::size_t(from) >= std::size_t(l) || delta < 0)
+ if (haystack.size() < needle.size())
return -1;
- if (from > delta)
- from = delta;
-
- auto sv = [sl](const typename Haystack::value_type *v) { return Haystack(v, sl); };
- auto haystack = haystack0.data();
- const auto needle = needle0.data();
- const auto *end = haystack;
- haystack += from;
- const std::size_t sl_minus_1 = sl - 1;
- const auto *n = needle + sl_minus_1;
- const auto *h = haystack + sl_minus_1;
- std::size_t hashNeedle = 0, hashHaystack = 0;
- qsizetype idx;
-
- if (cs == Qt::CaseSensitive) {
- for (idx = 0; idx < sl; ++idx) {
- hashNeedle = (hashNeedle << 1) + valueTypeToUtf16(*(n - idx));
- hashHaystack = (hashHaystack << 1) + valueTypeToUtf16(*(h - idx));
- }
- hashHaystack -= valueTypeToUtf16(*haystack);
-
- while (haystack >= end) {
- hashHaystack += valueTypeToUtf16(*haystack);
- if (hashHaystack == hashNeedle
- && qt_compare_strings(needle0, sv(haystack), Qt::CaseSensitive) == 0)
- return haystack - end;
- --haystack;
- REHASH(valueTypeToUtf16(haystack[sl]));
- }
- } else {
- for (idx = 0; idx < sl; ++idx) {
- hashNeedle = (hashNeedle << 1) + foldCaseHelper(n - idx, needle);
- hashHaystack = (hashHaystack << 1) + foldCaseHelper(h - idx, end);
- }
- hashHaystack -= foldCaseHelper(haystack, end);
+ if (!QtPrivate::isLatin1(needle)) // won't find non-L1 UTF-16 needles in a L1 haystack!
+ return -1;
- while (haystack >= end) {
- hashHaystack += foldCaseHelper(haystack, end);
- if (hashHaystack == hashNeedle
- && qt_compare_strings(sv(haystack), needle0, Qt::CaseInsensitive) == 0)
- return haystack - end;
- --haystack;
- REHASH(foldCaseHelper(haystack + sl, end));
- }
+ if (needle.size() == 1) {
+ const char n = needle.front().toLatin1();
+ return QtPrivate::findString(haystack, from, QLatin1StringView(&n, 1), cs);
}
- return -1;
+
+ QVarLengthArray<char> s(needle.size());
+ qt_to_latin1_unchecked(reinterpret_cast<uchar *>(s.data()), needle.utf16(), needle.size());
+ return QtPrivate::findString(haystack, from, QLatin1StringView(s.data(), s.size()), cs);
}
-qsizetype QtPrivate::findString(QStringView haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::findString(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
- if (haystack.size() < needle.size())
+ if (from < 0)
+ from += haystack.size();
+ if (from < 0)
+ return -1;
+ qsizetype adjustedSize = haystack.size() - from;
+ if (adjustedSize < needle.size())
return -1;
+ if (needle.size() == 0)
+ return from;
- QVarLengthArray<char16_t> s(needle.size());
- qt_from_latin1(s.data(), needle.latin1(), needle.size());
- return QtPrivate::findString(haystack, from, QStringView(reinterpret_cast<const QChar*>(s.constData()), s.size()), cs);
-}
+ if (cs == Qt::CaseSensitive) {
-qsizetype QtPrivate::findString(QLatin1String haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
-{
- if (haystack.size() < needle.size())
+ if (needle.size() == 1) {
+ Q_ASSERT(haystack.data() != nullptr); // see size check above
+ if (auto it = memchr(haystack.data() + from, needle.front().toLatin1(), adjustedSize))
+ return static_cast<const char *>(it) - haystack.data();
+ return -1;
+ }
+
+ const QLatin1StringMatcher matcher(needle, Qt::CaseSensitivity::CaseSensitive);
+ return matcher.indexIn(haystack, from);
+ }
+
+ // If the needle is sufficiently small we simply iteratively search through
+ // the haystack. When the needle is too long we use a boyer-moore searcher
+ // from the standard library, if available. If it is not available then the
+ // QLatin1Strings are converted to QString and compared as such. Though
+ // initialization is slower the boyer-moore search it employs still makes up
+ // for it when haystack and needle are sufficiently long.
+ // The needle size was chosen by testing various lengths using the
+ // qstringtokenizer benchmark with the
+ // "tokenize_qlatin1string_qlatin1string" test.
+#ifdef Q_CC_MSVC
+ const qsizetype threshold = 1;
+#else
+ const qsizetype threshold = 13;
+#endif
+ if (needle.size() <= threshold) {
+ const auto begin = haystack.begin();
+ const auto end = haystack.end() - needle.size() + 1;
+ auto ciMatch = CaseInsensitiveL1::matcher(needle[0].toLatin1());
+ const qsizetype nlen1 = needle.size() - 1;
+ for (auto it = std::find_if(begin + from, end, ciMatch); it != end;
+ it = std::find_if(it + 1, end, ciMatch)) {
+ // In this comparison we skip the first character because we know it's a match
+ if (!nlen1 || QLatin1StringView(it + 1, nlen1).compare(needle.sliced(1), cs) == 0)
+ return std::distance(begin, it);
+ }
return -1;
+ }
- QVarLengthArray<char16_t> s(haystack.size());
- qt_from_latin1(s.data(), haystack.latin1(), haystack.size());
- return QtPrivate::findString(QStringView(reinterpret_cast<const QChar*>(s.constData()), s.size()), from, needle, cs);
+ QLatin1StringMatcher matcher(needle, Qt::CaseSensitivity::CaseInsensitive);
+ return matcher.indexIn(haystack, from);
}
-qsizetype QtPrivate::findString(QLatin1String haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, char16_t needle, Qt::CaseSensitivity cs) noexcept
{
- if (haystack.size() < needle.size())
- return -1;
-
- QVarLengthArray<char16_t> h(haystack.size());
- qt_from_latin1(h.data(), haystack.latin1(), haystack.size());
- QVarLengthArray<char16_t> n(needle.size());
- qt_from_latin1(n.data(), needle.latin1(), needle.size());
- return QtPrivate::findString(QStringView(reinterpret_cast<const QChar*>(h.constData()), h.size()), from,
- QStringView(reinterpret_cast<const QChar*>(n.constData()), n.size()), cs);
+ return qLastIndexOf(haystack, QChar(needle), from, cs);
}
qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
@@ -11563,470 +10040,349 @@ qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, QStringVi
return qLastIndexOf(haystack, from, needle, cs);
}
-qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qLastIndexOf(haystack, from, needle, cs);
}
-qsizetype QtPrivate::lastIndexOf(QLatin1String haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::lastIndexOf(QLatin1StringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
{
return qLastIndexOf(haystack, from, needle, cs);
}
-qsizetype QtPrivate::lastIndexOf(QLatin1String haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::lastIndexOf(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qLastIndexOf(haystack, from, needle, cs);
}
-/*!
- \since 4.8
-
- Returns a Latin-1 representation of the string as a QByteArray.
-
- The returned byte array is undefined if the string contains non-Latin1
- characters. Those characters may be suppressed or replaced with a
- question mark.
-
- \sa toUtf8(), toLocal8Bit(), QStringEncoder
-*/
-QByteArray QStringRef::toLatin1() const
+#if QT_CONFIG(regularexpression)
+qsizetype QtPrivate::indexOf(QStringView viewHaystack, const QString *stringHaystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
{
- return qt_convert_to_latin1(*this);
-}
-
-/*!
- \since 4.8
-
- Returns the local 8-bit representation of the string as a
- QByteArray. The returned byte array is undefined if the string
- contains characters not supported by the local 8-bit encoding.
-
- On Unix systems this is equivalen to toUtf8(), on Windows the systems
- current code page is being used.
+ if (!re.isValid()) {
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString(View)::indexOf");
+ return -1;
+ }
- If this string contains any characters that cannot be encoded in the
- locale, the returned byte array is undefined. Those characters may be
- suppressed or replaced by another.
+ QRegularExpressionMatch match = stringHaystack
+ ? re.match(*stringHaystack, from)
+ : re.matchView(viewHaystack, from);
+ if (match.hasMatch()) {
+ const qsizetype ret = match.capturedStart();
+ if (rmatch)
+ *rmatch = std::move(match);
+ return ret;
+ }
- \sa toLatin1(), toUtf8(), QStringEncoder
-*/
-QByteArray QStringRef::toLocal8Bit() const
-{
- return qt_convert_to_local_8bit(*this);
+ return -1;
}
-/*!
- \since 4.8
-
- Returns a UTF-8 representation of the string as a QByteArray.
-
- UTF-8 is a Unicode codec and can represent all characters in a Unicode
- string like QString.
-
- \sa toLatin1(), toLocal8Bit(), QStringEncoder
-*/
-QByteArray QStringRef::toUtf8() const
+qsizetype QtPrivate::indexOf(QStringView haystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
{
- return qt_convert_to_utf8(*this);
+ return indexOf(haystack, nullptr, re, from, rmatch);
}
-/*!
- \since 4.8
-
- Returns a UCS-4/UTF-32 representation of the string as a QList<uint>.
-
- UCS-4 is a Unicode codec and therefore it is lossless. All characters from
- this string will be encoded in UCS-4. Any invalid sequence of code units in
- this string is replaced by the Unicode's replacement character
- (QChar::ReplacementCharacter, which corresponds to \c{U+FFFD}).
-
- The returned list is not \\0'-terminated.
-
- \sa toUtf8(), toLatin1(), toLocal8Bit(), QStringEncoder
-*/
-QList<uint> QStringRef::toUcs4() const
+qsizetype QtPrivate::lastIndexOf(QStringView viewHaystack, const QString *stringHaystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
{
- return qt_convert_to_ucs4(*this);
-}
-
-/*!
- Returns a string that has whitespace removed from the start and
- the end.
-
- Whitespace means any character for which QChar::isSpace() returns
- \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
- '\\f', '\\r', and ' '.
-
- Unlike QString::simplified(), trimmed() leaves internal whitespace alone.
+ if (!re.isValid()) {
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString(View)::lastIndexOf");
+ return -1;
+ }
- \since 5.1
+ qsizetype endpos = (from < 0) ? (viewHaystack.size() + from + 1) : (from + 1);
+ QRegularExpressionMatchIterator iterator = stringHaystack
+ ? re.globalMatch(*stringHaystack)
+ : re.globalMatchView(viewHaystack);
+ qsizetype lastIndex = -1;
+ while (iterator.hasNext()) {
+ QRegularExpressionMatch match = iterator.next();
+ qsizetype start = match.capturedStart();
+ if (start < endpos) {
+ lastIndex = start;
+ if (rmatch)
+ *rmatch = std::move(match);
+ } else {
+ break;
+ }
+ }
- \sa QString::trimmed()
-*/
-QStringRef QStringRef::trimmed() const
-{
- const QChar *begin = cbegin();
- const QChar *end = cend();
- QStringAlgorithms<const QStringRef>::trimmed_helper_positions(begin, end);
- if (begin == cbegin() && end == cend())
- return *this;
- int position = m_position + (begin - cbegin());
- return QStringRef(m_string, position, end - begin);
+ return lastIndex;
}
-/*!
- Returns the string converted to a \c{long long} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toLongLong()
-
- \sa QString::toLongLong()
-
- \since 5.1
-*/
-
-qint64 QStringRef::toLongLong(bool *ok, int base) const
+qsizetype QtPrivate::lastIndexOf(QStringView haystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
{
- return QString::toIntegral_helper<qint64>(*this, ok, base);
+ return lastIndexOf(haystack, nullptr, re, from, rmatch);
}
-/*!
- Returns the string converted to an \c{unsigned long long} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toULongLong()
-
- \sa QString::toULongLong()
-
- \since 5.1
-*/
-
-quint64 QStringRef::toULongLong(bool *ok, int base) const
+bool QtPrivate::contains(QStringView viewHaystack, const QString *stringHaystack, const QRegularExpression &re, QRegularExpressionMatch *rmatch)
{
- return QString::toIntegral_helper<quint64>(*this, ok, base);
+ if (!re.isValid()) {
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString(View)::contains");
+ return false;
+ }
+ QRegularExpressionMatch m = stringHaystack
+ ? re.match(*stringHaystack)
+ : re.matchView(viewHaystack);
+ bool hasMatch = m.hasMatch();
+ if (hasMatch && rmatch)
+ *rmatch = std::move(m);
+ return hasMatch;
}
-/*!
- \fn long QStringRef::toLong(bool *ok, int base) const
-
- Returns the string converted to a \c long using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toLong()
-
- \sa QString::toLong()
-
- \since 5.1
-*/
-
-long QStringRef::toLong(bool *ok, int base) const
+bool QtPrivate::contains(QStringView haystack, const QRegularExpression &re, QRegularExpressionMatch *rmatch)
{
- return QString::toIntegral_helper<long>(*this, ok, base);
+ return contains(haystack, nullptr, re, rmatch);
}
-/*!
- \fn ulong QStringRef::toULong(bool *ok, int base) const
-
- Returns the string converted to an \c{unsigned long} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toULongLong()
-
- \sa QString::toULong()
-
- \since 5.1
-*/
-
-ulong QStringRef::toULong(bool *ok, int base) const
+qsizetype QtPrivate::count(QStringView haystack, const QRegularExpression &re)
{
- return QString::toIntegral_helper<ulong>(*this, ok, base);
+ if (!re.isValid()) {
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString(View)::count");
+ return 0;
+ }
+ qsizetype count = 0;
+ qsizetype index = -1;
+ qsizetype len = haystack.size();
+ while (index <= len - 1) {
+ QRegularExpressionMatch match = re.matchView(haystack, index + 1);
+ if (!match.hasMatch())
+ break;
+ count++;
+
+ // Search again, from the next character after the beginning of this
+ // capture. If the capture starts with a surrogate pair, both together
+ // count as "one character".
+ index = match.capturedStart();
+ if (index < len && haystack[index].isHighSurrogate())
+ ++index;
+ }
+ return count;
}
+#endif // QT_CONFIG(regularexpression)
/*!
- Returns the string converted to an \c int using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ \since 5.0
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toInt()
+ Converts a plain text string to an HTML string with
+ HTML metacharacters \c{<}, \c{>}, \c{&}, and \c{"} replaced by HTML
+ entities.
- \sa QString::toInt()
+ Example:
- \since 5.1
+ \snippet code/src_corelib_text_qstring.cpp 7
*/
-
-int QStringRef::toInt(bool *ok, int base) const
+QString QString::toHtmlEscaped() const
{
- return QString::toIntegral_helper<int>(*this, ok, base);
+ const auto pos = std::u16string_view(*this).find_first_of(u"<>&\"");
+ if (pos == std::u16string_view::npos)
+ return *this;
+ QString rich;
+ const qsizetype len = size();
+ rich.reserve(qsizetype(len * 1.1));
+ rich += qToStringViewIgnoringNull(*this).first(pos);
+ for (auto ch : qToStringViewIgnoringNull(*this).sliced(pos)) {
+ if (ch == u'<')
+ rich += "&lt;"_L1;
+ else if (ch == u'>')
+ rich += "&gt;"_L1;
+ else if (ch == u'&')
+ rich += "&amp;"_L1;
+ else if (ch == u'"')
+ rich += "&quot;"_L1;
+ else
+ rich += ch;
+ }
+ rich.squeeze();
+ return rich;
}
/*!
- Returns the string converted to an \c{unsigned int} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
+ \macro QStringLiteral(str)
+ \relates QString
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
+ The macro generates the data for a QString out of the string literal \a str
+ at compile time. Creating a QString from it is free in this case, and the
+ generated string data is stored in the read-only segment of the compiled
+ object file.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If you have code that looks like this:
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toUInt()
+ \snippet code/src_corelib_text_qstring.cpp 9
- \sa QString::toUInt()
+ then a temporary QString will be created to be passed as the \c{hasAttribute}
+ function parameter. This can be quite expensive, as it involves a memory
+ allocation and the copy/conversion of the data into QString's internal
+ encoding.
- \since 5.1
-*/
+ This cost can be avoided by using QStringLiteral instead:
-uint QStringRef::toUInt(bool *ok, int base) const
-{
- return QString::toIntegral_helper<uint>(*this, ok, base);
-}
+ \snippet code/src_corelib_text_qstring.cpp 10
-/*!
- Returns the string converted to a \c short using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
+ In this case, QString's internal data will be generated at compile time; no
+ conversion or allocation will occur at runtime.
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
+ Using QStringLiteral instead of a double quoted plain C++ string literal can
+ significantly speed up creation of QString instances from data known at
+ compile time.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ \note QLatin1StringView can still be more efficient than QStringLiteral
+ when the string is passed to a function that has an overload taking
+ QLatin1StringView and this overload avoids conversion to QString. For
+ instance, QString::operator==() can compare to a QLatin1StringView
+ directly:
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toShort()
+ \snippet code/src_corelib_text_qstring.cpp 11
- \sa QString::toShort()
+ \note Some compilers have bugs encoding strings containing characters outside
+ the US-ASCII character set. Make sure you prefix your string with \c{u} in
+ those cases. It is optional otherwise.
- \since 5.1
+ \sa QByteArrayLiteral
*/
-short QStringRef::toShort(bool *ok, int base) const
-{
- return QString::toIntegral_helper<short>(*this, ok, base);
-}
-
+#if QT_DEPRECATED_SINCE(6, 8)
/*!
- Returns the string converted to an \c{unsigned short} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
+ \fn QtLiterals::operator""_qs(const char16_t *str, size_t size)
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
+ \relates QString
+ \since 6.2
+ \deprecated [6.8] Use \c _s from Qt::StringLiterals namespace instead.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ Literal operator that creates a QString out of the first \a size characters in
+ the char16_t string literal \a str.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toUShort()
+ The QString is created at compile time, and the generated string data is stored
+ in the read-only segment of the compiled object file. Duplicate literals may
+ share the same read-only memory. This functionality is interchangeable with
+ QStringLiteral, but saves typing when many string literals are present in the
+ code.
- \sa QString::toUShort()
+ The following code creates a QString:
+ \code
+ auto str = u"hello"_qs;
+ \endcode
- \since 5.1
+ \sa QStringLiteral, QtLiterals::operator""_qba(const char *str, size_t size)
*/
-
-ushort QStringRef::toUShort(bool *ok, int base) const
-{
- return QString::toIntegral_helper<ushort>(*this, ok, base);
-}
-
+#endif // QT_DEPRECATED_SINCE(6, 8)
/*!
- Returns the string converted to a \c double value.
+ \fn Qt::Literals::StringLiterals::operator""_s(const char16_t *str, size_t size)
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for other reasons (e.g. underflow).
+ \relates QString
+ \since 6.4
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
+ Literal operator that creates a QString out of the first \a size characters in
+ the char16_t string literal \a str.
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toDouble()
+ The QString is created at compile time, and the generated string data is stored
+ in the read-only segment of the compiled object file. Duplicate literals may
+ share the same read-only memory. This functionality is interchangeable with
+ QStringLiteral, but saves typing when many string literals are present in the
+ code.
- For historic reasons, this function does not handle
- thousands group separators. If you need to convert such numbers,
- use QLocale::toDouble().
+ The following code creates a QString:
+ \code
+ using namespace Qt::Literals::StringLiterals;
- \sa QString::toDouble()
+ auto str = u"hello"_s;
+ \endcode
- \since 5.1
+ \sa Qt::Literals::StringLiterals
*/
-double QStringRef::toDouble(bool *ok) const
+/*!
+ \internal
+ */
+void QAbstractConcatenable::appendLatin1To(QLatin1StringView in, QChar *out) noexcept
{
- return QLocaleData::c()->stringToDouble(*this, ok, QLocale::RejectGroupSeparator);
+ qt_from_latin1(reinterpret_cast<char16_t *>(out), in.data(), size_t(in.size()));
}
/*!
- Returns the string converted to a \c float value.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for other reasons (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toFloat()
+ \fn template <typename T> qsizetype erase(QString &s, const T &t)
+ \relates QString
+ \since 6.1
- \sa QString::toFloat()
+ Removes all elements that compare equal to \a t from the
+ string \a s. Returns the number of elements removed, if any.
- \since 5.1
+ \sa erase_if
*/
-float QStringRef::toFloat(bool *ok) const
-{
- return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
-}
-
/*!
- \obsolete
- \fn QString Qt::escape(const QString &plain)
+ \fn template <typename Predicate> qsizetype erase_if(QString &s, Predicate pred)
+ \relates QString
+ \since 6.1
+
+ Removes all elements for which the predicate \a pred returns true
+ from the string \a s. Returns the number of elements removed, if
+ any.
- Use QString::toHtmlEscaped() instead.
+ \sa erase
*/
/*!
- \since 5.0
+ \macro const char *qPrintable(const QString &str)
+ \relates QString
- Converts a plain text string to an HTML string with
- HTML metacharacters \c{<}, \c{>}, \c{&}, and \c{"} replaced by HTML
- entities.
+ Returns \a str as a \c{const char *}. This is equivalent to
+ \a{str}.toLocal8Bit().constData().
- Example:
+ The char pointer will be invalid after the statement in which
+ qPrintable() is used. This is because the array returned by
+ QString::toLocal8Bit() will fall out of scope.
- \snippet code/src_corelib_text_qstring.cpp 7
+ \note qDebug(), qInfo(), qWarning(), qCritical(), qFatal() expect
+ %s arguments to be UTF-8 encoded, while qPrintable() converts to
+ local 8-bit encoding. Therefore qUtf8Printable() should be used
+ for logging strings instead of qPrintable().
+
+ \sa qUtf8Printable()
*/
-QString QString::toHtmlEscaped() const
-{
- QString rich;
- const int len = length();
- rich.reserve(int(len * 1.1));
- for (int i = 0; i < len; ++i) {
- if (at(i) == QLatin1Char('<'))
- rich += QLatin1String("&lt;");
- else if (at(i) == QLatin1Char('>'))
- rich += QLatin1String("&gt;");
- else if (at(i) == QLatin1Char('&'))
- rich += QLatin1String("&amp;");
- else if (at(i) == QLatin1Char('"'))
- rich += QLatin1String("&quot;");
- else
- rich += at(i);
- }
- rich.squeeze();
- return rich;
-}
/*!
- \macro QStringLiteral(str)
- \relates QString
+ \macro const char *qUtf8Printable(const QString &str)
+ \relates QString
+ \since 5.4
- The macro generates the data for a QString out of the string literal \a str
- at compile time. Creating a QString from it is free in this case, and the
- generated string data is stored in the read-only segment of the compiled
- object file.
+ Returns \a str as a \c{const char *}. This is equivalent to
+ \a{str}.toUtf8().constData().
- If you have code that looks like this:
+ The char pointer will be invalid after the statement in which
+ qUtf8Printable() is used. This is because the array returned by
+ QString::toUtf8() will fall out of scope.
- \snippet code/src_corelib_text_qstring.cpp 9
+ Example:
- then a temporary QString will be created to be passed as the \c{hasAttribute}
- function parameter. This can be quite expensive, as it involves a memory
- allocation and the copy/conversion of the data into QString's internal
- encoding.
+ \snippet code/src_corelib_text_qstring.cpp qUtf8Printable
- This cost can be avoided by using QStringLiteral instead:
+ \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
+*/
- \snippet code/src_corelib_text_qstring.cpp 10
+/*!
+ \macro const wchar_t *qUtf16Printable(const QString &str)
+ \relates QString
+ \since 5.7
- In this case, QString's internal data will be generated at compile time; no
- conversion or allocation will occur at runtime.
+ Returns \a str as a \c{const ushort *}, but cast to a \c{const wchar_t *}
+ to avoid warnings. This is equivalent to \a{str}.utf16() plus some casting.
- Using QStringLiteral instead of a double quoted plain C++ string literal can
- significantly speed up creation of QString instances from data known at
- compile time.
+ The only useful thing you can do with the return value of this macro is to
+ pass it to QString::asprintf() for use in a \c{%ls} conversion. In particular,
+ the return value is \e{not} a valid \c{const wchar_t*}!
- \note QLatin1String can still be more efficient than QStringLiteral
- when the string is passed to a function that has an overload taking
- QLatin1String and this overload avoids conversion to QString. For
- instance, QString::operator==() can compare to a QLatin1String
- directly:
+ In general, the pointer will be invalid after the statement in which
+ qUtf16Printable() is used. This is because the pointer may have been
+ obtained from a temporary expression, which will fall out of scope.
- \snippet code/src_corelib_text_qstring.cpp 11
+ Example:
- \note Some compilers have bugs encoding strings containing characters outside
- the US-ASCII character set. Make sure you prefix your string with \c{u} in
- those cases. It is optional otherwise.
+ \snippet code/src_corelib_text_qstring.cpp qUtf16Printable
- \sa QByteArrayLiteral
+ \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
*/
-/*!
- \internal
- */
-void QAbstractConcatenable::appendLatin1To(const char *a, int len, QChar *out) noexcept
-{
- qt_from_latin1(reinterpret_cast<char16_t *>(out), a, uint(len));
-}
-
-double QStringView::toDouble(bool *ok) const
-{
- return QLocaleData::c()->stringToDouble(*this, ok, QLocale::RejectGroupSeparator);
-}
-
-float QStringView::toFloat(bool *ok) const
-{
- return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
-}
-
QT_END_NAMESPACE
+
+#undef REHASH
diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h
index 95376f79c0..895ec4b5c0 100644
--- a/src/corelib/text/qstring.h
+++ b/src/corelib/text/qstring.h
@@ -1,44 +1,8 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Copyright (C) 2019 Mail.ru Group.
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// Copyright (C) 2019 Mail.ru Group.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRING_H
#define QSTRING_H
@@ -48,16 +12,21 @@
#endif
#include <QtCore/qchar.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qbytearray.h>
+#include <QtCore/qbytearrayview.h>
#include <QtCore/qarraydata.h>
+#include <QtCore/qlatin1stringview.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qstringliteral.h>
#include <QtCore/qstringalgorithms.h>
-#include <QtCore/qstringview.h>
+#include <QtCore/qanystringview.h>
#include <QtCore/qstringtokenizer.h>
#include <string>
#include <iterator>
+#include <QtCore/q20memory.h>
+#include <string_view>
#include <stdarg.h>
@@ -70,239 +39,178 @@ Q_FORWARD_DECLARE_CF_TYPE(CFString);
Q_FORWARD_DECLARE_OBJC_CLASS(NSString);
#endif
+class tst_QString;
+
QT_BEGIN_NAMESPACE
class QRegularExpression;
class QRegularExpressionMatch;
class QString;
-class QStringList;
-class QStringRef;
namespace QtPrivate {
template <bool...B> class BoolList;
-}
-
-class QLatin1String
-{
-public:
- Q_DECL_CONSTEXPR inline QLatin1String() noexcept : m_size(0), m_data(nullptr) {}
- Q_DECL_CONSTEXPR inline explicit QLatin1String(const char *s) noexcept : m_size(s ? int(strlen(s)) : 0), m_data(s) {}
- Q_DECL_CONSTEXPR explicit QLatin1String(const char *f, const char *l)
- : QLatin1String(f, int(l - f)) {}
- Q_DECL_CONSTEXPR inline explicit QLatin1String(const char *s, int sz) noexcept : m_size(sz), m_data(s) {}
- inline explicit QLatin1String(const QByteArray &s) noexcept : m_size(int(qstrnlen(s.constData(), s.size()))), m_data(s.constData()) {}
-
- inline QString toString() const;
-
- Q_DECL_CONSTEXPR const char *latin1() const noexcept { return m_data; }
- Q_DECL_CONSTEXPR int size() const noexcept { return m_size; }
- Q_DECL_CONSTEXPR const char *data() const noexcept { return m_data; }
-
- Q_DECL_CONSTEXPR bool isNull() const noexcept { return !data(); }
- Q_DECL_CONSTEXPR bool isEmpty() const noexcept { return !size(); }
-
- template <typename...Args>
- Q_REQUIRED_RESULT inline QString arg(Args &&...args) const;
-
- Q_DECL_CONSTEXPR QLatin1Char at(int i) const
- { return Q_ASSERT(i >= 0), Q_ASSERT(i < size()), QLatin1Char(m_data[i]); }
- Q_DECL_CONSTEXPR QLatin1Char operator[](int i) const { return at(i); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QLatin1Char front() const { return at(0); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QLatin1Char back() const { return at(size() - 1); }
-
- Q_REQUIRED_RESULT int compare(QStringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::compareStrings(*this, other, cs); }
- Q_REQUIRED_RESULT int compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::compareStrings(*this, other, cs); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR int compare(QChar c) const noexcept
- { return isEmpty() || front() == c ? size() - 1 : uchar(m_data[0]) - c.unicode() ; }
- Q_REQUIRED_RESULT int compare(QChar c, Qt::CaseSensitivity cs) const noexcept
- { return QtPrivate::compareStrings(*this, QStringView(&c, 1), cs); }
-
- Q_REQUIRED_RESULT bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::startsWith(*this, s, cs); }
- Q_REQUIRED_RESULT bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::startsWith(*this, s, cs); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR bool startsWith(QChar c) const noexcept
- { return !isEmpty() && front() == c; }
- Q_REQUIRED_RESULT inline bool startsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
- { return QtPrivate::startsWith(*this, QStringView(&c, 1), cs); }
-
- Q_REQUIRED_RESULT bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::endsWith(*this, s, cs); }
- Q_REQUIRED_RESULT bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::endsWith(*this, s, cs); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR bool endsWith(QChar c) const noexcept
- { return !isEmpty() && back() == c; }
- Q_REQUIRED_RESULT inline bool endsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
- { return QtPrivate::endsWith(*this, QStringView(&c, 1), cs); }
-
- Q_REQUIRED_RESULT int indexOf(QStringView s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return int(QtPrivate::findString(*this, from, s, cs)); } // ### Qt6: qsizetype
- Q_REQUIRED_RESULT int indexOf(QLatin1String s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return int(QtPrivate::findString(*this, from, s, cs)); } // ### Qt6: qsizetype
- Q_REQUIRED_RESULT inline int indexOf(QChar c, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return int(QtPrivate::findString(*this, from, QStringView(&c, 1), cs)); } // ### Qt6: qsizetype
-
- Q_REQUIRED_RESULT bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return indexOf(s, 0, cs) != -1; }
- Q_REQUIRED_RESULT bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return indexOf(s, 0, cs) != -1; }
- Q_REQUIRED_RESULT inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return indexOf(QStringView(&c, 1), 0, cs) != -1; }
-
- Q_REQUIRED_RESULT int lastIndexOf(QStringView s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return int(QtPrivate::lastIndexOf(*this, from, s, cs)); } // ### Qt6: qsizetype
- Q_REQUIRED_RESULT int lastIndexOf(QLatin1String s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return int(QtPrivate::lastIndexOf(*this, from, s, cs)); } // ### Qt6: qsizetype
- Q_REQUIRED_RESULT inline int lastIndexOf(QChar c, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return int(QtPrivate::lastIndexOf(*this, from, QStringView(&c, 1), cs)); } // ### Qt6: qsizetype
-
- using value_type = const char;
- using reference = value_type&;
- using const_reference = reference;
- using iterator = value_type*;
- using const_iterator = iterator;
- using difference_type = int; // violates Container concept requirements
- using size_type = int; // violates Container concept requirements
-
- Q_DECL_CONSTEXPR const_iterator begin() const noexcept { return data(); }
- Q_DECL_CONSTEXPR const_iterator cbegin() const noexcept { return data(); }
- Q_DECL_CONSTEXPR const_iterator end() const noexcept { return data() + size(); }
- Q_DECL_CONSTEXPR const_iterator cend() const noexcept { return data() + size(); }
-
- using reverse_iterator = std::reverse_iterator<iterator>;
- using const_reverse_iterator = reverse_iterator;
-
- const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
- const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
-
- constexpr QLatin1String mid(int pos, int n = -1) const
- {
- qsizetype p = pos;
- qsizetype l = n;
- using namespace QtPrivate;
- auto result = QContainerImplHelper::mid(size(), &p, &l);
- return result == QContainerImplHelper::Null ? QLatin1String() : QLatin1String(m_data + p, l);
- }
- constexpr QLatin1String left(int n) const
- {
- if (size_t(n) >= size_t(size()))
- n = size();
- return QLatin1String(m_data, n);
- }
- constexpr QLatin1String right(int n) const
- {
- if (size_t(n) >= size_t(size()))
- n = size();
- return QLatin1String(m_data + m_size - n, n);
- }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QLatin1String chopped(int n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n <= size()), QLatin1String(m_data, m_size - n); }
-
- Q_DECL_RELAXED_CONSTEXPR void chop(int n)
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size -= n; }
- Q_DECL_RELAXED_CONSTEXPR void truncate(int n)
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size = n; }
-
- Q_REQUIRED_RESULT QLatin1String trimmed() const noexcept { return QtPrivate::trimmed(*this); }
-
- template <typename Needle, typename...Flags>
- Q_REQUIRED_RESULT inline constexpr auto tokenize(Needle &&needle, Flags...flags) const
- noexcept(noexcept(qTokenize(std::declval<const QLatin1String &>(), std::forward<Needle>(needle), flags...)))
- -> decltype(qTokenize(*this, std::forward<Needle>(needle), flags...))
- { return qTokenize(*this, std::forward<Needle>(needle), flags...); }
-
- inline bool operator==(const QString &s) const noexcept;
- inline bool operator!=(const QString &s) const noexcept;
- inline bool operator>(const QString &s) const noexcept;
- inline bool operator<(const QString &s) const noexcept;
- inline bool operator>=(const QString &s) const noexcept;
- inline bool operator<=(const QString &s) const noexcept;
-
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- inline QT_ASCII_CAST_WARN bool operator==(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const char *s) const;
-
- inline QT_ASCII_CAST_WARN bool operator==(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator<(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator>(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const QByteArray &s) const;
-#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-
-private:
- int m_size;
- const char *m_data;
-};
-Q_DECLARE_TYPEINFO(QLatin1String, Q_MOVABLE_TYPE);
+template <typename Char>
+using IsCompatibleChar32TypeHelper =
+ std::is_same<Char, char32_t>;
+template <typename Char>
+using IsCompatibleChar32Type
+ = IsCompatibleChar32TypeHelper<q20::remove_cvref_t<Char>>;
+}
// Qt 4.x compatibility
//
-// QLatin1String inline implementations
+// QLatin1StringView inline implementations
//
-Q_DECL_CONSTEXPR bool QtPrivate::isLatin1(QLatin1String) noexcept
+constexpr bool QtPrivate::isLatin1(QLatin1StringView) noexcept
{ return true; }
//
-// QStringView members that require QLatin1String:
+// QStringView members that require QLatin1StringView:
//
-int QStringView::compare(QLatin1String s, Qt::CaseSensitivity cs) const noexcept
+int QStringView::compare(QLatin1StringView s, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::compareStrings(*this, s, cs); }
-bool QStringView::startsWith(QLatin1String s, Qt::CaseSensitivity cs) const noexcept
+bool QStringView::startsWith(QLatin1StringView s, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::startsWith(*this, s, cs); }
-bool QStringView::endsWith(QLatin1String s, Qt::CaseSensitivity cs) const noexcept
+bool QStringView::endsWith(QLatin1StringView s, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::endsWith(*this, s, cs); }
-qsizetype QStringView::indexOf(QLatin1String s, qsizetype from, Qt::CaseSensitivity cs) const noexcept
+qsizetype QStringView::indexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::findString(*this, from, s, cs); }
-bool QStringView::contains(QLatin1String s, Qt::CaseSensitivity cs) const noexcept
+bool QStringView::contains(QLatin1StringView s, Qt::CaseSensitivity cs) const noexcept
{ return indexOf(s, 0, cs) != qsizetype(-1); }
-qsizetype QStringView::lastIndexOf(QLatin1String s, qsizetype from, Qt::CaseSensitivity cs) const noexcept
+qsizetype QStringView::lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs) const noexcept
+{ return QtPrivate::lastIndexOf(*this, size(), s, cs); }
+qsizetype QStringView::lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::lastIndexOf(*this, from, s, cs); }
+qsizetype QStringView::count(QLatin1StringView s, Qt::CaseSensitivity cs) const
+{ return QtPrivate::count(*this, s, cs); }
+
+//
+// QAnyStringView members that require QLatin1StringView
+//
+
+constexpr QAnyStringView::QAnyStringView(QLatin1StringView str) noexcept
+ : m_data{str.data()}, m_size{size_t(str.size() << SizeShift) | Tag::Latin1} {}
+
+constexpr QLatin1StringView QAnyStringView::asLatin1StringView() const
+{
+ Q_ASSERT(isLatin1());
+ return {m_data_utf8, size()};
+}
+
+
+template <typename Visitor>
+constexpr decltype(auto) QAnyStringView::visit(Visitor &&v) const
+{
+ if (isUtf16())
+ return std::forward<Visitor>(v)(asStringView());
+ else if (isLatin1())
+ return std::forward<Visitor>(v)(asLatin1StringView());
+ else
+ return std::forward<Visitor>(v)(asUtf8StringView());
+}
+
+//
+// QAnyStringView members that require QAnyStringView::visit()
+//
+
+constexpr QChar QAnyStringView::front() const
+{
+ return visit([] (auto that) { return QAnyStringView::toQChar(that.front()); });
+}
+constexpr QChar QAnyStringView::back() const
+{
+ return visit([] (auto that) { return QAnyStringView::toQChar(that.back()); });
+}
+
class Q_CORE_EXPORT QString
{
typedef QTypedArrayData<char16_t> Data;
+
+ friend class ::tst_QString;
+
+ template <typename Iterator>
+ static constexpr bool is_contiguous_iterator_v =
+ // Can't use contiguous_iterator_tag here, as STL impls can't agree on feature macro.
+ // To avoid differences in C++20 and C++17 builds, treat only pointers as contiguous
+ // for now:
+ // std::contiguous_iterator<Iterator>;
+ std::is_pointer_v<Iterator>;
+
+ template <typename Char>
+ using is_compatible_char_helper = std::disjunction<
+ QtPrivate::IsCompatibleCharType<Char>,
+ QtPrivate::IsCompatibleChar32Type<Char>,
+ QtPrivate::IsCompatibleChar8Type<Char>,
+ std::is_same<Char, QLatin1Char> // special case
+ >;
+
+ template <typename Iterator>
+ static constexpr bool is_compatible_iterator_v = std::conjunction_v<
+ std::is_convertible<
+ typename std::iterator_traits<Iterator>::iterator_category,
+ std::input_iterator_tag
+ >,
+ is_compatible_char_helper<typename std::iterator_traits<Iterator>::value_type>
+ >;
+
+ template <typename Iterator>
+ using if_compatible_iterator = std::enable_if_t<is_compatible_iterator_v<Iterator>, bool>;
+
public:
typedef QStringPrivate DataPointer;
- inline QString() noexcept;
- explicit QString(const QChar *unicode, int size = -1);
+ constexpr QString() noexcept;
+ explicit QString(const QChar *unicode, qsizetype size = -1);
QString(QChar c);
- QString(int size, QChar c);
- inline QString(QLatin1String latin1);
+ QString(qsizetype size, QChar c);
+ inline QString(QLatin1StringView latin1);
+ explicit QString(QStringView sv) : QString(sv.data(), sv.size()) {}
+#if defined(__cpp_char8_t) || defined(Q_QDOC)
+ Q_WEAK_OVERLOAD
+ inline QString(const char8_t *str)
+ : QString(fromUtf8(str))
+ {}
+#endif
inline QString(const QString &) noexcept;
inline ~QString();
QString &operator=(QChar c);
QString &operator=(const QString &) noexcept;
- QString &operator=(QLatin1String latin1);
+ QString &operator=(QLatin1StringView latin1);
inline QString(QString &&other) noexcept
- { qSwap(d, other.d); }
- inline QString &operator=(QString &&other) noexcept
- { qSwap(d, other.d); return *this; }
- inline void swap(QString &other) noexcept { qSwap(d, other.d); }
- inline int size() const { return int(d.size); }
- inline int count() const { return int(d.size); }
- inline int length() const;
- inline bool isEmpty() const;
- void resize(int size);
- void resize(int size, QChar fillChar);
-
- QString &fill(QChar c, int size = -1);
- void truncate(int pos);
- void chop(int n);
-
- inline int capacity() const;
- inline void reserve(int size);
+ = default;
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QString)
+ void swap(QString &other) noexcept { d.swap(other.d); }
+ inline qsizetype size() const noexcept { return d.size; }
+#if QT_DEPRECATED_SINCE(6, 4)
+ QT_DEPRECATED_VERSION_X_6_4("Use size() or length() instead.")
+ inline qsizetype count() const { return d.size; }
+#endif
+ inline qsizetype length() const noexcept { return d.size; }
+ inline bool isEmpty() const noexcept { return d.size == 0; }
+ void resize(qsizetype size);
+ void resize(qsizetype size, QChar fillChar);
+ void resizeForOverwrite(qsizetype size);
+
+ QString &fill(QChar c, qsizetype size = -1);
+ void truncate(qsizetype pos);
+ void chop(qsizetype n);
+
+ QString &slice(qsizetype pos)
+ { verify(pos, 0); return remove(0, pos); }
+ QString &slice(qsizetype pos, qsizetype n)
+ {
+ verify(pos, n);
+ if (isNull())
+ return *this;
+ resize(pos + n);
+ return remove(0, pos);
+ }
+
+ inline qsizetype capacity() const;
+ inline void reserve(qsizetype size);
inline void squeeze();
inline const QChar *unicode() const;
@@ -313,61 +221,56 @@ public:
inline void detach();
inline bool isDetached() const;
inline bool isSharedWith(const QString &other) const { return d.isSharedWith(other.d); }
- void clear();
-
- inline const QChar at(int i) const;
- const QChar operator[](int i) const;
- Q_REQUIRED_RESULT QChar &operator[](int i);
-
- Q_REQUIRED_RESULT inline QChar front() const { return at(0); }
- Q_REQUIRED_RESULT inline QChar &front();
- Q_REQUIRED_RESULT inline QChar back() const { return at(size() - 1); }
- Q_REQUIRED_RESULT inline QChar &back();
-
- Q_REQUIRED_RESULT QString arg(qlonglong a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(qulonglong a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(long a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(ulong a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(int a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(uint a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(short a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(ushort a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(double a, int fieldWidth = 0, char fmt = 'g', int prec = -1,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(char a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(QChar a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
-#if QT_STRINGVIEW_LEVEL < 2
- Q_REQUIRED_RESULT QString arg(const QString &a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
-#endif
- Q_REQUIRED_RESULT QString arg(QStringView a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(QLatin1String a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
+ inline void clear();
+
+ inline const QChar at(qsizetype i) const;
+ inline const QChar operator[](qsizetype i) const;
+ [[nodiscard]] inline QChar &operator[](qsizetype i);
+
+ [[nodiscard]] inline QChar front() const { return at(0); }
+ [[nodiscard]] inline QChar &front();
+ [[nodiscard]] inline QChar back() const { return at(size() - 1); }
+ [[nodiscard]] inline QChar &back();
+
+ [[nodiscard]] QString arg(qlonglong a, int fieldwidth=0, int base=10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] QString arg(qulonglong a, int fieldwidth=0, int base=10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(long a, int fieldwidth=0, int base=10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(ulong a, int fieldwidth=0, int base=10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(int a, int fieldWidth = 0, int base = 10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(uint a, int fieldWidth = 0, int base = 10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(short a, int fieldWidth = 0, int base = 10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(ushort a, int fieldWidth = 0, int base = 10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] QString arg(double a, int fieldWidth = 0, char format = 'g', int precision = -1,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] QString arg(char a, int fieldWidth = 0,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] QString arg(QChar a, int fieldWidth = 0,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] QString arg(const QString &a, int fieldWidth = 0,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] QString arg(QStringView a, int fieldWidth = 0,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] QString arg(QLatin1StringView a, int fieldWidth = 0,
+ QChar fillChar = u' ') const;
private:
template <typename T>
- struct is_convertible_to_view_or_qstring_helper
- : std::integral_constant<bool,
- std::is_convertible<T, QString>::value ||
- std::is_convertible<T, QStringView>::value ||
- std::is_convertible<T, QLatin1String>::value> {};
- template <typename T>
- struct is_convertible_to_view_or_qstring
- : is_convertible_to_view_or_qstring_helper<typename std::decay<T>::type> {};
+ using is_convertible_to_view_or_qstring = std::disjunction<
+ std::is_convertible<T, QString>,
+ std::is_convertible<T, QStringView>,
+ std::is_convertible<T, QLatin1StringView>
+ >;
public:
template <typename...Args>
- Q_REQUIRED_RESULT
-#ifdef Q_CLANG_QDOC
+ [[nodiscard]]
+#ifdef Q_QDOC
QString
#else
typename std::enable_if<
@@ -384,39 +287,51 @@ public:
static QString vasprintf(const char *format, va_list ap) Q_ATTRIBUTE_FORMAT_PRINTF(1, 0);
static QString asprintf(const char *format, ...) Q_ATTRIBUTE_FORMAT_PRINTF(1, 2);
- int indexOf(QChar c, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int indexOf(QLatin1String s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
- int indexOf(const QString &s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- Q_REQUIRED_RESULT int indexOf(QStringView s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return int(QtPrivate::findString(*this, from, s, cs)); } // ### Qt6: qsizetype
- int lastIndexOf(QChar c, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(QLatin1String s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
- int lastIndexOf(const QString &s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
-
- Q_REQUIRED_RESULT int lastIndexOf(QStringView s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return int(QtPrivate::lastIndexOf(*this, from, s, cs)); } // ### Qt6: qsizetype
-
- inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
- inline bool contains(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- inline bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- int count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int count(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int count(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] QT_CORE_INLINE_SINCE(6, 7)
+ qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] qsizetype indexOf(QLatin1StringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] qsizetype indexOf(const QString &s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] qsizetype indexOf(QStringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::findString(*this, from, s, cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(c, -1, cs); }
+ [[nodiscard]] QT_CORE_INLINE_SINCE(6, 7)
+ qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ { return lastIndexOf(s, size(), cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] qsizetype lastIndexOf(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ { return lastIndexOf(s, size(), cs); }
+ [[nodiscard]] qsizetype lastIndexOf(const QString &s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+
+ [[nodiscard]] qsizetype lastIndexOf(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(s, size(), cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QStringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::lastIndexOf(*this, from, s, cs); }
+
+ [[nodiscard]] inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] inline bool contains(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] inline bool contains(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] inline bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] qsizetype count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] qsizetype count(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] qsizetype count(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
#if QT_CONFIG(regularexpression)
- int indexOf(const QRegularExpression &re, int from = 0,
- QRegularExpressionMatch *rmatch = nullptr) const;
- int lastIndexOf(const QRegularExpression &re, int from = -1,
- QRegularExpressionMatch *rmatch = nullptr) const;
- bool contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch = nullptr) const;
- int count(const QRegularExpression &re) const;
+ [[nodiscard]] qsizetype indexOf(const QRegularExpression &re, qsizetype from = 0,
+ QRegularExpressionMatch *rmatch = nullptr) const;
+#ifdef Q_QDOC
+ [[nodiscard]] qsizetype lastIndexOf(const QRegularExpression &re, QRegularExpressionMatch *rmatch = nullptr) const;
+#else
+ // prevent an ambiguity when called like this: lastIndexOf(re, 0)
+ template <typename T = QRegularExpressionMatch, std::enable_if_t<std::is_same_v<T, QRegularExpressionMatch>, bool> = false>
+ [[nodiscard]] qsizetype lastIndexOf(const QRegularExpression &re, T *rmatch = nullptr) const
+ { return lastIndexOf(re, size(), rmatch); }
+#endif
+ [[nodiscard]] qsizetype lastIndexOf(const QRegularExpression &re, qsizetype from,
+ QRegularExpressionMatch *rmatch = nullptr) const;
+ [[nodiscard]] bool contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch = nullptr) const;
+ [[nodiscard]] qsizetype count(const QRegularExpression &re) const;
#endif
enum SectionFlag {
@@ -428,147 +343,239 @@ public:
};
Q_DECLARE_FLAGS(SectionFlags, SectionFlag)
- QString section(QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault) const;
- QString section(const QString &in_sep, int start, int end = -1, SectionFlags flags = SectionDefault) const;
+ [[nodiscard]] inline QString section(QChar sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault) const;
+ [[nodiscard]] QString section(const QString &in_sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault) const;
#if QT_CONFIG(regularexpression)
- QString section(const QRegularExpression &re, int start, int end = -1, SectionFlags flags = SectionDefault) const;
+ [[nodiscard]] QString section(const QRegularExpression &re, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault) const;
#endif
- Q_REQUIRED_RESULT QString left(int n) const;
- Q_REQUIRED_RESULT QString right(int n) const;
- Q_REQUIRED_RESULT QString mid(int position, int n = -1) const;
-
- Q_REQUIRED_RESULT QString first(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QString(data(), int(n)); }
- Q_REQUIRED_RESULT QString last(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QString(data() + size() - n, int(n)); }
- Q_REQUIRED_RESULT QString from(qsizetype pos) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(pos <= size()); return QString(data() + pos, size() - int(pos)); }
- Q_REQUIRED_RESULT QString sliced(qsizetype pos, qsizetype n) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(n >= 0); Q_ASSERT(size_t(pos) + size_t(n) <= size_t(size())); return QString(data() + pos, int(n)); }
- Q_REQUIRED_RESULT QString chopped(int n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return first(size() - n); }
-
-
- Q_REQUIRED_RESULT QStringRef leftRef(int n) const;
- Q_REQUIRED_RESULT QStringRef rightRef(int n) const;
- Q_REQUIRED_RESULT QStringRef midRef(int position, int n = -1) const;
-
-#if QT_STRINGVIEW_LEVEL < 2
- bool startsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+
+#if QT_CORE_REMOVED_SINCE(6, 7)
+ QString left(qsizetype n) const;
+ QString right(qsizetype n) const;
+ QString mid(qsizetype position, qsizetype n = -1) const;
+
+ QString first(qsizetype n) const;
+ QString last(qsizetype n) const;
+ QString sliced(qsizetype pos) const;
+ QString sliced(qsizetype pos, qsizetype n) const;
+ QString chopped(qsizetype n) const;
+#else
+ [[nodiscard]] QString left(qsizetype n) const &
+ {
+ if (size_t(n) >= size_t(size()))
+ return *this;
+ return first(n);
+ }
+ [[nodiscard]] QString left(qsizetype n) &&
+ {
+ if (size_t(n) >= size_t(size()))
+ return std::move(*this);
+ return std::move(*this).first(n);
+ }
+ [[nodiscard]] QString right(qsizetype n) const &
+ {
+ if (size_t(n) >= size_t(size()))
+ return *this;
+ return last(n);
+ }
+ [[nodiscard]] QString right(qsizetype n) &&
+ {
+ if (size_t(n) >= size_t(size()))
+ return std::move(*this);
+ return std::move(*this).last(n);
+ }
+ [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1) const &;
+ [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1) &&;
+
+ [[nodiscard]] QString first(qsizetype n) const &
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] QString last(qsizetype n) const &
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] QString sliced(qsizetype pos) const &
+ { verify(pos, 0); return sliced(pos, size() - pos); }
+ [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) const &
+ { verify(pos, n); return QString(begin() + pos, n); }
+ [[nodiscard]] QString chopped(qsizetype n) const &
+ { verify(0, n); return sliced(0, size() - n); }
+
+ [[nodiscard]] QString first(qsizetype n) &&
+ {
+ verify(0, n);
+ resize(n); // may detach and allocate memory
+ return std::move(*this);
+ }
+ [[nodiscard]] QString last(qsizetype n) &&
+ { verify(0, n); return sliced_helper(*this, size() - n, n); }
+ [[nodiscard]] QString sliced(qsizetype pos) &&
+ { verify(pos, 0); return sliced_helper(*this, pos, size() - pos); }
+ [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) &&
+ { verify(pos, n); return sliced_helper(*this, pos, n); }
+ [[nodiscard]] QString chopped(qsizetype n) &&
+ { verify(0, n); return std::move(*this).first(size() - n); }
#endif
- Q_REQUIRED_RESULT bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ bool startsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::startsWith(*this, s, cs); }
- bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ bool startsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
bool endsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- Q_REQUIRED_RESULT bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ [[nodiscard]] bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::endsWith(*this, s, cs); }
- bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ bool endsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
bool isUpper() const;
bool isLower() const;
- Q_REQUIRED_RESULT QString leftJustified(int width, QChar fill = QLatin1Char(' '), bool trunc = false) const;
- Q_REQUIRED_RESULT QString rightJustified(int width, QChar fill = QLatin1Char(' '), bool trunc = false) const;
-
-#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QSTRING_COMPAT_CPP) && !defined(Q_CLANG_QDOC)
-# if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL) && !__has_cpp_attribute(nodiscard)
- // required due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61941
-# pragma push_macro("Q_REQUIRED_RESULT")
-# undef Q_REQUIRED_RESULT
-# define Q_REQUIRED_RESULT
-# define Q_REQUIRED_RESULT_pushed
-# endif
- Q_REQUIRED_RESULT QString toLower() const &
+ [[nodiscard]] QString leftJustified(qsizetype width, QChar fill = u' ', bool trunc = false) const;
+ [[nodiscard]] QString rightJustified(qsizetype width, QChar fill = u' ', bool trunc = false) const;
+
+#if !defined(Q_QDOC)
+ [[nodiscard]] QString toLower() const &
{ return toLower_helper(*this); }
- Q_REQUIRED_RESULT QString toLower() &&
+ [[nodiscard]] QString toLower() &&
{ return toLower_helper(*this); }
- Q_REQUIRED_RESULT QString toUpper() const &
+ [[nodiscard]] QString toUpper() const &
{ return toUpper_helper(*this); }
- Q_REQUIRED_RESULT QString toUpper() &&
+ [[nodiscard]] QString toUpper() &&
{ return toUpper_helper(*this); }
- Q_REQUIRED_RESULT QString toCaseFolded() const &
+ [[nodiscard]] QString toCaseFolded() const &
{ return toCaseFolded_helper(*this); }
- Q_REQUIRED_RESULT QString toCaseFolded() &&
+ [[nodiscard]] QString toCaseFolded() &&
{ return toCaseFolded_helper(*this); }
- Q_REQUIRED_RESULT QString trimmed() const &
+ [[nodiscard]] QString trimmed() const &
{ return trimmed_helper(*this); }
- Q_REQUIRED_RESULT QString trimmed() &&
+ [[nodiscard]] QString trimmed() &&
{ return trimmed_helper(*this); }
- Q_REQUIRED_RESULT QString simplified() const &
+ [[nodiscard]] QString simplified() const &
{ return simplified_helper(*this); }
- Q_REQUIRED_RESULT QString simplified() &&
+ [[nodiscard]] QString simplified() &&
{ return simplified_helper(*this); }
-# ifdef Q_REQUIRED_RESULT_pushed
-# pragma pop_macro("Q_REQUIRED_RESULT")
-# endif
#else
- Q_REQUIRED_RESULT QString toLower() const;
- Q_REQUIRED_RESULT QString toUpper() const;
- Q_REQUIRED_RESULT QString toCaseFolded() const;
- Q_REQUIRED_RESULT QString trimmed() const;
- Q_REQUIRED_RESULT QString simplified() const;
+ [[nodiscard]] QString toLower() const;
+ [[nodiscard]] QString toUpper() const;
+ [[nodiscard]] QString toCaseFolded() const;
+ [[nodiscard]] QString trimmed() const;
+ [[nodiscard]] QString simplified() const;
#endif
- Q_REQUIRED_RESULT QString toHtmlEscaped() const;
+ [[nodiscard]] QString toHtmlEscaped() const;
- QString &insert(int i, QChar c);
- QString &insert(int i, const QChar *uc, int len);
-#if QT_STRINGVIEW_LEVEL < 2
- inline QString &insert(int i, const QString &s) { return insert(i, s.constData(), s.length()); }
-#endif
- inline QString &insert(int i, QStringView v) { return insert(i, v.data(), v.length()); }
- QString &insert(int i, QLatin1String s);
+ QString &insert(qsizetype i, QChar c);
+ QString &insert(qsizetype i, const QChar *uc, qsizetype len);
+ inline QString &insert(qsizetype i, const QString &s) { return insert(i, s.constData(), s.size()); }
+ inline QString &insert(qsizetype i, QStringView v) { return insert(i, v.data(), v.size()); }
+ QString &insert(qsizetype i, QLatin1StringView s);
+ QString &insert(qsizetype i, QUtf8StringView s);
QString &append(QChar c);
- QString &append(const QChar *uc, int len);
-#if QT_STRINGVIEW_LEVEL < 2
+ QString &append(const QChar *uc, qsizetype len);
QString &append(const QString &s);
-#endif
- inline QString &append(QStringView v) { return append(v.data(), v.length()); }
- QString &append(QLatin1String s);
+ inline QString &append(QStringView v) { return append(v.data(), v.size()); }
+ QString &append(QLatin1StringView s);
+ QString &append(QUtf8StringView s);
inline QString &prepend(QChar c) { return insert(0, c); }
- inline QString &prepend(const QChar *uc, int len) { return insert(0, uc, len); }
-#if QT_STRINGVIEW_LEVEL < 2
+ inline QString &prepend(const QChar *uc, qsizetype len) { return insert(0, uc, len); }
inline QString &prepend(const QString &s) { return insert(0, s); }
-#endif
- inline QString &prepend(QStringView v) { return prepend(v.data(), v.length()); }
- inline QString &prepend(QLatin1String s) { return insert(0, s); }
-
- inline QString &operator+=(QChar c) {
- if (d->needsDetach() || int(d.size + 1) > capacity())
- reallocData(uint(d.size) + 2u, true);
- d->data()[d.size++] = c.unicode();
- d->data()[d.size] = '\0';
- return *this;
+ inline QString &prepend(QStringView v) { return prepend(v.data(), v.size()); }
+ inline QString &prepend(QLatin1StringView s) { return insert(0, s); }
+ QString &prepend(QUtf8StringView s) { return insert(0, s); }
+
+ QString &assign(QAnyStringView s);
+ inline QString &assign(qsizetype n, QChar c)
+ {
+ Q_ASSERT(n >= 0);
+ return fill(c, n);
}
+ template <typename InputIterator, if_compatible_iterator<InputIterator> = true>
+ QString &assign(InputIterator first, InputIterator last)
+ {
+ using V = typename std::iterator_traits<InputIterator>::value_type;
+ constexpr bool IsL1C = std::is_same_v<std::remove_cv_t<V>, QLatin1Char>;
+ constexpr bool IsFwdIt = std::is_convertible_v<
+ typename std::iterator_traits<InputIterator>::iterator_category,
+ std::forward_iterator_tag
+ >;
+
+ if constexpr (is_contiguous_iterator_v<InputIterator>) {
+ const auto p = q20::to_address(first);
+ const auto len = qsizetype(last - first);
+ if constexpr (IsL1C)
+ return assign(QLatin1StringView(reinterpret_cast<const char*>(p), len));
+ else if constexpr (sizeof(V) == 4)
+ return assign_helper(p, len);
+ else
+ return assign(QAnyStringView(p, len));
+ } else if constexpr (sizeof(V) == 4) { // non-contiguous iterator, feed data piecemeal
+ resize(0);
+ if constexpr (IsFwdIt) {
+ const qsizetype requiredCapacity = 2 * std::distance(first, last);
+ reserve(requiredCapacity);
+ }
+ while (first != last) {
+ append(QChar::fromUcs4(*first));
+ ++first;
+ }
+ return *this;
+ } else if constexpr (QtPrivate::IsCompatibleChar8Type<V>::value) {
+ assign_helper_char8(first, last);
+ d.data()[d.size] = u'\0';
+ return *this;
+ } else {
+ d.assign(first, last, [](QChar ch) -> char16_t { return ch.unicode(); });
+ d.data()[d.size] = u'\0';
+ return *this;
+ }
+ }
+
+ inline QString &operator+=(QChar c) { return append(c); }
-#if QT_STRINGVIEW_LEVEL < 2
inline QString &operator+=(const QString &s) { return append(s); }
-#endif
inline QString &operator+=(QStringView v) { return append(v); }
- inline QString &operator+=(QLatin1String s) { return append(s); }
+ inline QString &operator+=(QLatin1StringView s) { return append(s); }
+ QString &operator+=(QUtf8StringView s) { return append(s); }
- QString &remove(int i, int len);
+#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ template <qsizetype N>
+ QString &insert(qsizetype i, const char (&ch)[N]) { return insert(i, QUtf8StringView(ch)); }
+ template <qsizetype N>
+ QString &append(const char (&ch)[N]) { return append(QUtf8StringView(ch)); }
+ template <qsizetype N>
+ QString &prepend(const char (&ch)[N]) { return prepend(QUtf8StringView(ch)); }
+ template <qsizetype N>
+ QString &operator+=(const char (&ch)[N]) { return append(QUtf8StringView(ch)); }
+#endif
+
+ QString &remove(qsizetype i, qsizetype len);
QString &remove(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &remove(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &remove(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
QString &remove(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(int i, int len, QChar after);
- QString &replace(int i, int len, const QChar *s, int slen);
- QString &replace(int i, int len, const QString &after);
+
+ QString &removeAt(qsizetype pos)
+ { return size_t(pos) < size_t(size()) ? remove(pos, 1) : *this; }
+ QString &removeFirst() { return !isEmpty() ? remove(0, 1) : *this; }
+ QString &removeLast() { return !isEmpty() ? remove(size() - 1, 1) : *this; }
+
+ template <typename Predicate>
+ QString &removeIf(Predicate pred)
+ {
+ removeIf_helper(pred);
+ return *this;
+ }
+
+ QString &replace(qsizetype i, qsizetype len, QChar after);
+ QString &replace(qsizetype i, qsizetype len, const QChar *s, qsizetype slen);
+ QString &replace(qsizetype i, qsizetype len, const QString &after);
QString &replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(const QChar *before, int blen, const QChar *after, int alen, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(QLatin1String before, QLatin1String after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(QLatin1String before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(const QString &before, QLatin1String after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &replace(const QChar *before, qsizetype blen, const QChar *after, qsizetype alen, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &replace(QLatin1StringView before, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &replace(QLatin1StringView before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &replace(const QString &before, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
QString &replace(const QString &before, const QString &after,
Qt::CaseSensitivity cs = Qt::CaseSensitive);
QString &replace(QChar c, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &replace(QChar c, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
#if QT_CONFIG(regularexpression)
QString &replace(const QRegularExpression &re, const QString &after);
inline QString &remove(const QRegularExpression &re)
@@ -576,40 +583,32 @@ public:
#endif
public:
- Q_REQUIRED_RESULT
+ [[nodiscard]]
QStringList split(const QString &sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- Q_REQUIRED_RESULT
- QList<QStringRef> splitRef(const QString &sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- Q_REQUIRED_RESULT
+ [[nodiscard]]
QStringList split(QChar sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- Q_REQUIRED_RESULT
- QList<QStringRef> splitRef(QChar sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
#ifndef QT_NO_REGULAREXPRESSION
- Q_REQUIRED_RESULT
+ [[nodiscard]]
QStringList split(const QRegularExpression &sep,
Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const;
- Q_REQUIRED_RESULT
- QList<QStringRef> splitRef(const QRegularExpression &sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const;
#endif
template <typename Needle, typename...Flags>
- Q_REQUIRED_RESULT inline auto tokenize(Needle &&needle, Flags...flags) const &
+ [[nodiscard]] inline auto tokenize(Needle &&needle, Flags...flags) const &
noexcept(noexcept(qTokenize(std::declval<const QString &>(), std::forward<Needle>(needle), flags...)))
-> decltype(qTokenize(*this, std::forward<Needle>(needle), flags...))
{ return qTokenize(qToStringViewIgnoringNull(*this), std::forward<Needle>(needle), flags...); }
template <typename Needle, typename...Flags>
- Q_REQUIRED_RESULT inline auto tokenize(Needle &&needle, Flags...flags) const &&
+ [[nodiscard]] inline auto tokenize(Needle &&needle, Flags...flags) const &&
noexcept(noexcept(qTokenize(std::declval<const QString>(), std::forward<Needle>(needle), flags...)))
-> decltype(qTokenize(std::move(*this), std::forward<Needle>(needle), flags...))
{ return qTokenize(std::move(*this), std::forward<Needle>(needle), flags...); }
template <typename Needle, typename...Flags>
- Q_REQUIRED_RESULT inline auto tokenize(Needle &&needle, Flags...flags) &&
+ [[nodiscard]] inline auto tokenize(Needle &&needle, Flags...flags) &&
noexcept(noexcept(qTokenize(std::declval<QString>(), std::forward<Needle>(needle), flags...)))
-> decltype(qTokenize(std::move(*this), std::forward<Needle>(needle), flags...))
{ return qTokenize(std::move(*this), std::forward<Needle>(needle), flags...); }
@@ -621,80 +620,84 @@ public:
NormalizationForm_KD,
NormalizationForm_KC
};
- Q_REQUIRED_RESULT QString normalized(NormalizationForm mode, QChar::UnicodeVersion version = QChar::Unicode_Unassigned) const;
+ [[nodiscard]] QString normalized(NormalizationForm mode, QChar::UnicodeVersion version = QChar::Unicode_Unassigned) const;
- Q_REQUIRED_RESULT QString repeated(int times) const;
+ [[nodiscard]] QString repeated(qsizetype times) const;
- const ushort *utf16() const;
+ const ushort *utf16() const; // ### Qt 7 char16_t
-#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QSTRING_COMPAT_CPP) && !defined(Q_CLANG_QDOC)
- Q_REQUIRED_RESULT QByteArray toLatin1() const &
+#if !defined(Q_QDOC)
+ [[nodiscard]] QByteArray toLatin1() const &
{ return toLatin1_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toLatin1() &&
+ [[nodiscard]] QByteArray toLatin1() &&
{ return toLatin1_helper_inplace(*this); }
- Q_REQUIRED_RESULT QByteArray toUtf8() const &
+ [[nodiscard]] QByteArray toUtf8() const &
{ return toUtf8_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toUtf8() &&
+ [[nodiscard]] QByteArray toUtf8() &&
{ return toUtf8_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toLocal8Bit() const &
+ [[nodiscard]] QByteArray toLocal8Bit() const &
{ return toLocal8Bit_helper(isNull() ? nullptr : constData(), size()); }
- Q_REQUIRED_RESULT QByteArray toLocal8Bit() &&
+ [[nodiscard]] QByteArray toLocal8Bit() &&
{ return toLocal8Bit_helper(isNull() ? nullptr : constData(), size()); }
#else
- Q_REQUIRED_RESULT QByteArray toLatin1() const;
- Q_REQUIRED_RESULT QByteArray toUtf8() const;
- Q_REQUIRED_RESULT QByteArray toLocal8Bit() const;
+ [[nodiscard]] QByteArray toLatin1() const;
+ [[nodiscard]] QByteArray toUtf8() const;
+ [[nodiscard]] QByteArray toLocal8Bit() const;
#endif
- Q_REQUIRED_RESULT QList<uint> toUcs4() const;
+ [[nodiscard]] QList<uint> toUcs4() const; // ### Qt 7 char32_t
// note - this are all inline so we can benefit from strlen() compile time optimizations
- static inline QString fromLatin1(const char *str, int size = -1)
+ static QString fromLatin1(QByteArrayView ba);
+ Q_WEAK_OVERLOAD
+ static inline QString fromLatin1(const QByteArray &ba) { return fromLatin1(QByteArrayView(ba)); }
+ static inline QString fromLatin1(const char *str, qsizetype size)
{
- return QString(fromLatin1_helper(str, (str && size == -1) ? int(strlen(str)) : size));
+ return fromLatin1(QByteArrayView(str, !str || size < 0 ? qstrlen(str) : size));
}
- static inline QString fromUtf8(const char *str, int size = -1)
+ static QString fromUtf8(QByteArrayView utf8);
+ Q_WEAK_OVERLOAD
+ static inline QString fromUtf8(const QByteArray &ba) { return fromUtf8(QByteArrayView(ba)); }
+ static inline QString fromUtf8(const char *utf8, qsizetype size)
{
- return fromUtf8_helper(str, (str && size == -1) ? int(strlen(str)) : size);
+ return fromUtf8(QByteArrayView(utf8, !utf8 || size < 0 ? qstrlen(utf8) : size));
}
-#ifdef __cpp_char8_t
+#if defined(__cpp_char8_t) || defined(Q_QDOC)
Q_WEAK_OVERLOAD
- static inline QString fromUtf8(const char8_t *str, qsizetype size = -1)
- { return fromUtf8(reinterpret_cast<const char *>(str), int(size)); }
+ static inline QString fromUtf8(const char8_t *str)
+ { return fromUtf8(reinterpret_cast<const char *>(str)); }
+ Q_WEAK_OVERLOAD
+ static inline QString fromUtf8(const char8_t *str, qsizetype size)
+ { return fromUtf8(reinterpret_cast<const char *>(str), size); }
#endif
- static inline QString fromLocal8Bit(const char *str, int size = -1)
+ static QString fromLocal8Bit(QByteArrayView ba);
+ Q_WEAK_OVERLOAD
+ static inline QString fromLocal8Bit(const QByteArray &ba) { return fromLocal8Bit(QByteArrayView(ba)); }
+ static inline QString fromLocal8Bit(const char *str, qsizetype size)
{
- return fromLocal8Bit_helper(str, (str && size == -1) ? int(strlen(str)) : size);
+ return fromLocal8Bit(QByteArrayView(str, !str || size < 0 ? qstrlen(str) : size));
}
- static inline QString fromLatin1(const QByteArray &str)
- { return str.isNull() ? QString() : fromLatin1(str.data(), qstrnlen(str.constData(), str.size())); }
- static inline QString fromUtf8(const QByteArray &str)
- { return str.isNull() ? QString() : fromUtf8(str.data(), qstrnlen(str.constData(), str.size())); }
- static inline QString fromLocal8Bit(const QByteArray &str)
- { return str.isNull() ? QString() : fromLocal8Bit(str.data(), qstrnlen(str.constData(), str.size())); }
- static QString fromUtf16(const char16_t *, int size = -1);
- static QString fromUcs4(const char32_t *, int size = -1);
- static QString fromRawData(const QChar *, int size);
+ static QString fromUtf16(const char16_t *, qsizetype size = -1);
+ static QString fromUcs4(const char32_t *, qsizetype size = -1);
+ static QString fromRawData(const QChar *, qsizetype size);
#if QT_DEPRECATED_SINCE(6, 0)
QT_DEPRECATED_VERSION_X_6_0("Use char16_t* overload.")
- static QString fromUtf16(const ushort *str, int size = -1)
+ static QString fromUtf16(const ushort *str, qsizetype size = -1)
{ return fromUtf16(reinterpret_cast<const char16_t *>(str), size); }
QT_DEPRECATED_VERSION_X_6_0("Use char32_t* overload.")
- static QString fromUcs4(const uint *str, int size = -1)
+ static QString fromUcs4(const uint *str, qsizetype size = -1)
{ return fromUcs4(reinterpret_cast<const char32_t *>(str), size); }
#endif
- inline int toWCharArray(wchar_t *array) const;
- Q_REQUIRED_RESULT static inline QString fromWCharArray(const wchar_t *string, int size = -1);
+ inline qsizetype toWCharArray(wchar_t *array) const;
+ [[nodiscard]] static inline QString fromWCharArray(const wchar_t *string, qsizetype size = -1);
- QString &setRawData(const QChar *unicode, int size);
- QString &setUnicode(const QChar *unicode, int size);
- inline QString &setUtf16(const ushort *utf16, int size);
+ QString &setRawData(const QChar *unicode, qsizetype size);
+ QString &setUnicode(const QChar *unicode, qsizetype size);
+ inline QString &setUtf16(const ushort *utf16, qsizetype size); // ### Qt 7 char16_t
-#if QT_STRINGVIEW_LEVEL < 2
int compare(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
-#endif
- int compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ int compare(QLatin1StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
inline int compare(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
int compare(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return compare(QStringView{&ch, 1}, cs); }
@@ -703,10 +706,10 @@ public:
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept
{ return s1.compare(s2, cs); }
- static inline int compare(const QString &s1, QLatin1String s2,
+ static inline int compare(const QString &s1, QLatin1StringView s2,
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept
{ return s1.compare(s2, cs); }
- static inline int compare(QLatin1String s1, const QString &s2,
+ static inline int compare(QLatin1StringView s1, const QString &s2,
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept
{ return -s2.compare(s1, cs); }
static int compare(const QString &s1, QStringView s2, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept
@@ -715,34 +718,41 @@ public:
{ return -s2.compare(s1, cs); }
int localeAwareCompare(const QString& s) const;
- int localeAwareCompare(QStringView s) const;
+ inline int localeAwareCompare(QStringView s) const;
static int localeAwareCompare(const QString& s1, const QString& s2)
{ return s1.localeAwareCompare(s2); }
- static int localeAwareCompare(QStringView s1, QStringView s2);
-
- // ### Qt6: make inline except for the long long versions
- short toShort(bool *ok=nullptr, int base=10) const;
- ushort toUShort(bool *ok=nullptr, int base=10) const;
- int toInt(bool *ok=nullptr, int base=10) const;
- uint toUInt(bool *ok=nullptr, int base=10) const;
- long toLong(bool *ok=nullptr, int base=10) const;
- ulong toULong(bool *ok=nullptr, int base=10) const;
+ static inline int localeAwareCompare(QStringView s1, QStringView s2);
+
+ short toShort(bool *ok=nullptr, int base=10) const
+ { return toIntegral_helper<short>(*this, ok, base); }
+ ushort toUShort(bool *ok=nullptr, int base=10) const
+ { return toIntegral_helper<ushort>(*this, ok, base); }
+ int toInt(bool *ok=nullptr, int base=10) const
+ { return toIntegral_helper<int>(*this, ok, base); }
+ uint toUInt(bool *ok=nullptr, int base=10) const
+ { return toIntegral_helper<uint>(*this, ok, base); }
+ long toLong(bool *ok=nullptr, int base=10) const
+ { return toIntegral_helper<long>(*this, ok, base); }
+ ulong toULong(bool *ok=nullptr, int base=10) const
+ { return toIntegral_helper<ulong>(*this, ok, base); }
+ QT_CORE_INLINE_SINCE(6, 5)
qlonglong toLongLong(bool *ok=nullptr, int base=10) const;
+ QT_CORE_INLINE_SINCE(6, 5)
qulonglong toULongLong(bool *ok=nullptr, int base=10) const;
float toFloat(bool *ok=nullptr) const;
double toDouble(bool *ok=nullptr) const;
- QString &setNum(short, int base=10);
- QString &setNum(ushort, int base=10);
- QString &setNum(int, int base=10);
- QString &setNum(uint, int base=10);
- QString &setNum(long, int base=10);
- QString &setNum(ulong, int base=10);
+ inline QString &setNum(short, int base=10);
+ inline QString &setNum(ushort, int base=10);
+ inline QString &setNum(int, int base=10);
+ inline QString &setNum(uint, int base=10);
+ inline QString &setNum(long, int base=10);
+ inline QString &setNum(ulong, int base=10);
QString &setNum(qlonglong, int base=10);
QString &setNum(qulonglong, int base=10);
- QString &setNum(float, char f='g', int prec=6);
- QString &setNum(double, char f='g', int prec=6);
+ inline QString &setNum(float, char format='g', int precision=6);
+ QString &setNum(double, char format='g', int precision=6);
static QString number(int, int base=10);
static QString number(uint, int base=10);
@@ -750,94 +760,170 @@ public:
static QString number(ulong, int base=10);
static QString number(qlonglong, int base=10);
static QString number(qulonglong, int base=10);
- static QString number(double, char f='g', int prec=6);
-
- friend Q_CORE_EXPORT bool operator==(const QString &s1, const QString &s2) noexcept;
- friend Q_CORE_EXPORT bool operator<(const QString &s1, const QString &s2) noexcept;
- friend inline bool operator>(const QString &s1, const QString &s2) noexcept { return s2 < s1; }
- friend inline bool operator!=(const QString &s1, const QString &s2) noexcept { return !(s1 == s2); }
- friend inline bool operator<=(const QString &s1, const QString &s2) noexcept { return !(s1 > s2); }
- friend inline bool operator>=(const QString &s1, const QString &s2) noexcept { return !(s1 < s2); }
-
- bool operator==(QLatin1String s) const noexcept;
- bool operator<(QLatin1String s) const noexcept;
- bool operator>(QLatin1String s) const noexcept;
- inline bool operator!=(QLatin1String s) const noexcept { return !operator==(s); }
- inline bool operator<=(QLatin1String s) const noexcept { return !operator>(s); }
- inline bool operator>=(QLatin1String s) const noexcept { return !operator<(s); }
+ static QString number(double, char format='g', int precision=6);
+
+ friend bool comparesEqual(const QString &s1, const QString &s2) noexcept
+ { return comparesEqual(QStringView(s1), QStringView(s2)); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, const QString &s2) noexcept
+ { return compareThreeWay(QStringView(s1), QStringView(s2)); }
+ Q_DECLARE_STRONGLY_ORDERED(QString)
+
+ Q_WEAK_OVERLOAD
+ friend bool comparesEqual(const QString &s1, QUtf8StringView s2) noexcept
+ { return QtPrivate::equalStrings(s1, s2); }
+ Q_WEAK_OVERLOAD
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, QUtf8StringView s2) noexcept
+ {
+ const int res = QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QUtf8StringView, Q_WEAK_OVERLOAD)
+
+#ifdef __cpp_char8_t
+ friend bool comparesEqual(const QString &s1, const char8_t *s2) noexcept
+ { return comparesEqual(s1, QUtf8StringView(s2)); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, const char8_t *s2) noexcept
+ { return compareThreeWay(s1, QUtf8StringView(s2)); }
+ Q_DECLARE_STRONGLY_ORDERED(QString, const char8_t *)
+#endif // __cpp_char8_t
+
+ friend bool comparesEqual(const QString &s1, QLatin1StringView s2) noexcept
+ { return (s1.size() == s2.size()) && QtPrivate::equalStrings(s1, s2); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QString &s1, QLatin1StringView s2) noexcept
+ {
+ const int res = QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QLatin1StringView)
+
+ // Check isEmpty() instead of isNull() for backwards compatibility.
+ friend bool comparesEqual(const QString &s1, std::nullptr_t) noexcept
+ { return s1.isEmpty(); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, std::nullptr_t) noexcept
+ { return s1.isEmpty() ? Qt::strong_ordering::equivalent : Qt::strong_ordering::greater; }
+ Q_DECLARE_STRONGLY_ORDERED(QString, std::nullptr_t)
+
+ friend bool comparesEqual(const QString &s1, const char16_t *s2) noexcept
+ { return comparesEqual(s1, QStringView(s2)); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, const char16_t *s2) noexcept
+ { return compareThreeWay(s1, QStringView(s2)); }
+ Q_DECLARE_STRONGLY_ORDERED(QString, const char16_t *)
+
+ // QChar <> QString
+ friend bool comparesEqual(const QString &lhs, QChar rhs) noexcept
+ { return lhs.size() == 1 && rhs == lhs.front(); }
+ friend Qt::strong_ordering compareThreeWay(const QString &lhs, QChar rhs) noexcept
+ {
+ const int res = compare_helper(lhs.data(), lhs.size(), &rhs, 1);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QChar)
// ASCII compatibility
#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
- template <int N>
+ template <qsizetype N>
inline QString(const char (&ch)[N])
: QString(fromUtf8(ch))
{}
- template <int N>
+ template <qsizetype N>
QString(char (&)[N]) = delete;
- template <int N>
+ template <qsizetype N>
inline QString &operator=(const char (&ch)[N])
{ return (*this = fromUtf8(ch, N - 1)); }
- template <int N>
+ template <qsizetype N>
QString &operator=(char (&)[N]) = delete;
#endif
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- inline QT_ASCII_CAST_WARN QString(const char *ch)
+ QT_ASCII_CAST_WARN inline QString(const char *ch)
: QString(fromUtf8(ch))
{}
- inline QT_ASCII_CAST_WARN QString(const QByteArray &a)
+ QT_ASCII_CAST_WARN inline QString(const QByteArray &a)
: QString(fromUtf8(a))
{}
- inline QT_ASCII_CAST_WARN QString &operator=(const char *ch)
- { return (*this = fromUtf8(ch)); }
- inline QT_ASCII_CAST_WARN QString &operator=(const QByteArray &a)
- { return (*this = fromUtf8(a)); }
-
+ QT_ASCII_CAST_WARN inline QString &operator=(const char *ch)
+ {
+ if (!ch) {
+ clear();
+ return *this;
+ }
+ return assign(ch);
+ }
+ QT_ASCII_CAST_WARN inline QString &operator=(const QByteArray &a)
+ {
+ if (a.isNull()) {
+ clear();
+ return *this;
+ }
+ return assign(a);
+ }
// these are needed, so it compiles with STL support enabled
- inline QT_ASCII_CAST_WARN QString &prepend(const char *s)
- { return prepend(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &prepend(const QByteArray &s)
- { return prepend(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &append(const char *s)
- { return append(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &append(const QByteArray &s)
- { return append(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &insert(int i, const char *s)
- { return insert(i, QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &insert(int i, const QByteArray &s)
- { return insert(i, QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &operator+=(const char *s)
- { return append(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &operator+=(const QByteArray &s)
- { return append(QString::fromUtf8(s)); }
-
- inline QT_ASCII_CAST_WARN bool operator==(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const char *s) const;
-
- inline QT_ASCII_CAST_WARN bool operator==(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator<(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator>(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const QByteArray &s) const;
-
- friend inline QT_ASCII_CAST_WARN bool operator==(const char *s1, const QString &s2);
- friend inline QT_ASCII_CAST_WARN bool operator!=(const char *s1, const QString &s2);
- friend inline QT_ASCII_CAST_WARN bool operator<(const char *s1, const QString &s2);
- friend inline QT_ASCII_CAST_WARN bool operator>(const char *s1, const QString &s2);
- friend inline QT_ASCII_CAST_WARN bool operator<=(const char *s1, const QString &s2);
- friend inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, const QString &s2);
-
- friend inline QT_ASCII_CAST_WARN bool operator==(const char *s1, const QStringRef &s2);
- friend inline QT_ASCII_CAST_WARN bool operator!=(const char *s1, const QStringRef &s2);
- friend inline QT_ASCII_CAST_WARN bool operator<(const char *s1, const QStringRef &s2);
- friend inline QT_ASCII_CAST_WARN bool operator>(const char *s1, const QStringRef &s2);
- friend inline QT_ASCII_CAST_WARN bool operator<=(const char *s1, const QStringRef &s2);
- friend inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, const QStringRef &s2);
-#endif
+ QT_ASCII_CAST_WARN inline QString &prepend(const char *s)
+ { return prepend(QUtf8StringView(s)); }
+ QT_ASCII_CAST_WARN inline QString &prepend(const QByteArray &s)
+ { return prepend(QUtf8StringView(s)); }
+ QT_ASCII_CAST_WARN inline QString &append(const char *s)
+ { return append(QUtf8StringView(s)); }
+ QT_ASCII_CAST_WARN inline QString &append(const QByteArray &s)
+ { return append(QUtf8StringView(s)); }
+ QT_ASCII_CAST_WARN inline QString &insert(qsizetype i, const char *s)
+ { return insert(i, QUtf8StringView(s)); }
+ QT_ASCII_CAST_WARN inline QString &insert(qsizetype i, const QByteArray &s)
+ { return insert(i, QUtf8StringView(s)); }
+ QT_ASCII_CAST_WARN inline QString &operator+=(const char *s)
+ { return append(QUtf8StringView(s)); }
+ QT_ASCII_CAST_WARN inline QString &operator+=(const QByteArray &s)
+ { return append(QUtf8StringView(s)); }
+
+#if QT_CORE_REMOVED_SINCE(6, 8)
+ QT_ASCII_CAST_WARN inline bool operator==(const char *s) const;
+ QT_ASCII_CAST_WARN inline bool operator!=(const char *s) const;
+ QT_ASCII_CAST_WARN inline bool operator<(const char *s) const;
+ QT_ASCII_CAST_WARN inline bool operator<=(const char *s) const;
+ QT_ASCII_CAST_WARN inline bool operator>(const char *s) const;
+ QT_ASCII_CAST_WARN inline bool operator>=(const char *s) const;
+
+ QT_ASCII_CAST_WARN inline bool operator==(const QByteArray &s) const;
+ QT_ASCII_CAST_WARN inline bool operator!=(const QByteArray &s) const;
+ QT_ASCII_CAST_WARN inline bool operator<(const QByteArray &s) const;
+ QT_ASCII_CAST_WARN inline bool operator>(const QByteArray &s) const;
+ QT_ASCII_CAST_WARN inline bool operator<=(const QByteArray &s) const;
+ QT_ASCII_CAST_WARN inline bool operator>=(const QByteArray &s) const;
+#else
+ friend bool comparesEqual(const QString &lhs, QByteArrayView rhs) noexcept
+ {
+ return QString::compare_helper(lhs.constData(), lhs.size(),
+ rhs.constData(), rhs.size()) == 0;
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QString &lhs, QByteArrayView rhs) noexcept
+ {
+ const int res = QString::compare_helper(lhs.constData(), lhs.size(),
+ rhs.constData(), rhs.size());
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QByteArrayView, QT_ASCII_CAST_WARN)
+
+ friend bool comparesEqual(const QString &lhs, const QByteArray &rhs) noexcept
+ { return comparesEqual(lhs, QByteArrayView(rhs)); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QString &lhs, const QByteArray &rhs) noexcept
+ {
+ return compareThreeWay(lhs, QByteArrayView(rhs));
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QByteArray, QT_ASCII_CAST_WARN)
+
+ friend bool comparesEqual(const QString &lhs, const char *rhs) noexcept
+ { return comparesEqual(lhs, QByteArrayView(rhs)); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QString &lhs, const char *rhs) noexcept
+ {
+ return compareThreeWay(lhs, QByteArrayView(rhs));
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, const char *, QT_ASCII_CAST_WARN)
+#endif // QT_CORE_REMOVED_SINCE(6, 8)
+
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
typedef QChar *iterator;
typedef const QChar *const_iterator;
@@ -861,7 +947,7 @@ public:
const_reverse_iterator crend() const { return const_reverse_iterator(begin()); }
// STL compatibility
- typedef int size_type;
+ typedef qsizetype size_type;
typedef qptrdiff difference_type;
typedef const QChar & const_reference;
typedef QChar & reference;
@@ -873,18 +959,25 @@ public:
inline void push_front(QChar c) { prepend(c); }
inline void push_front(const QString &s) { prepend(s); }
void shrink_to_fit() { squeeze(); }
+ iterator erase(const_iterator first, const_iterator last);
+ inline iterator erase(const_iterator it) { return erase(it, it + 1); }
+ static constexpr qsizetype max_size() noexcept
+ {
+ // -1 to deal with the NUL terminator
+ return Data::max_size() - 1;
+ }
static inline QString fromStdString(const std::string &s);
inline std::string toStdString() const;
static inline QString fromStdWString(const std::wstring &s);
inline std::wstring toStdWString() const;
-#if defined(Q_STDLIB_UNICODE_STRINGS) || defined(Q_QDOC)
static inline QString fromStdU16String(const std::u16string &s);
inline std::u16string toStdU16String() const;
static inline QString fromStdU32String(const std::u32string &s);
inline std::u32string toStdU32String() const;
-#endif
+
+ Q_IMPLICIT inline operator std::u16string_view() const noexcept;
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
static QString fromCFString(CFStringRef string);
@@ -893,16 +986,19 @@ public:
NSString *toNSString() const Q_DECL_NS_RETURNS_AUTORELEASED;
#endif
- inline bool isNull() const { return d->isNull(); }
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+ static QString fromEcmaString(emscripten::val jsString);
+ emscripten::val toEcmaString() const;
+#endif
+ inline bool isNull() const { return d->isNull(); }
- bool isSimpleText() const;
bool isRightToLeft() const;
- Q_REQUIRED_RESULT bool isValidUtf16() const noexcept
+ [[nodiscard]] bool isValidUtf16() const noexcept
{ return QStringView(*this).isValidUtf16(); }
- QString(int size, Qt::Initialization);
- explicit QString(DataPointer dd) : d(dd) {}
+ QString(qsizetype size, Qt::Initialization);
+ explicit QString(DataPointer &&dd) : d(std::move(dd)) {}
private:
#if defined(QT_NO_CAST_FROM_ASCII)
@@ -915,32 +1011,24 @@ private:
#endif
DataPointer d;
-
- friend inline bool operator==(QChar, const QString &) noexcept;
- friend inline bool operator< (QChar, const QString &) noexcept;
- friend inline bool operator> (QChar, const QString &) noexcept;
- friend inline bool operator==(QChar, const QStringRef &) noexcept;
- friend inline bool operator< (QChar, const QStringRef &) noexcept;
- friend inline bool operator> (QChar, const QStringRef &) noexcept;
- friend inline bool operator==(QChar, QLatin1String) noexcept;
- friend inline bool operator< (QChar, QLatin1String) noexcept;
- friend inline bool operator> (QChar, QLatin1String) noexcept;
-
- void reallocData(uint alloc, bool grow = false);
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- void expand(int i);
-#endif
- static int compare_helper(const QChar *data1, int length1,
- const QChar *data2, int length2,
+ static const char16_t _empty;
+
+ void reallocData(qsizetype alloc, QArrayData::AllocationOption option);
+ void reallocGrowData(qsizetype n);
+ // ### remove once QAnyStringView supports UTF-32:
+ QString &assign_helper(const char32_t *data, qsizetype len);
+ // Defined in qstringconverter.h
+ template <typename InputIterator>
+ void assign_helper_char8(InputIterator first, InputIterator last);
+ static int compare_helper(const QChar *data1, qsizetype length1,
+ const QChar *data2, qsizetype length2,
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
- static int compare_helper(const QChar *data1, int length1,
- const char *data2, int length2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive);
- static int compare_helper(const QChar *data1, int length1,
- QLatin1String s2,
+ static int compare_helper(const QChar *data1, qsizetype length1,
+ const char *data2, qsizetype length2,
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
- static int localeAwareCompare_helper(const QChar *data1, int length1,
- const QChar *data2, int length2);
+ static int localeAwareCompare_helper(const QChar *data1, qsizetype length1,
+ const QChar *data2, qsizetype length2);
+ static QString sliced_helper(QString &str, qsizetype pos, qsizetype n);
static QString toLower_helper(const QString &str);
static QString toLower_helper(QString &str);
static QString toUpper_helper(const QString &str);
@@ -951,22 +1039,30 @@ private:
static QString trimmed_helper(QString &str);
static QString simplified_helper(const QString &str);
static QString simplified_helper(QString &str);
- static DataPointer fromLatin1_helper(const char *str, int size = -1);
- static QString fromUtf8_helper(const char *str, int size);
- static QString fromLocal8Bit_helper(const char *, int size);
static QByteArray toLatin1_helper(const QString &);
static QByteArray toLatin1_helper_inplace(QString &);
static QByteArray toUtf8_helper(const QString &);
- static QByteArray toLocal8Bit_helper(const QChar *data, int size);
- static int toUcs4_helper(const ushort *uc, int length, uint *out);
+ static QByteArray toLocal8Bit_helper(const QChar *data, qsizetype size);
+#if QT_CORE_REMOVED_SINCE(6, 6)
+ static qsizetype toUcs4_helper(const ushort *uc, qsizetype length, uint *out);
+#endif
+ static qsizetype toUcs4_helper(const char16_t *uc, qsizetype length, char32_t *out);
static qlonglong toIntegral_helper(QStringView string, bool *ok, int base);
static qulonglong toIntegral_helper(QStringView string, bool *ok, uint base);
- void replace_helper(uint *indices, int nIndices, int blen, const QChar *after, int alen);
- friend class QStringRef;
+ template <typename Predicate>
+ qsizetype removeIf_helper(Predicate pred)
+ {
+ const qsizetype result = d->eraseIf(pred);
+ if (result > 0)
+ d.data()[d.size] = u'\0';
+ return result;
+ }
+
friend class QStringView;
friend class QByteArray;
- friend class QCollator;
friend struct QAbstractConcatenable;
+ template <typename T> friend qsizetype erase(QString &s, const T &t);
+ template <typename Predicate> friend qsizetype erase_if(QString &s, Predicate pred);
template <typename T> static
T toIntegral_helper(QStringView string, bool *ok, int base)
@@ -984,21 +1080,46 @@ private:
return T(val);
}
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= d.size);
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= d.size - pos);
+ }
+
public:
inline DataPointer &data_ptr() { return d; }
+ inline const DataPointer &data_ptr() const { return d; }
};
//
-// QLatin1String inline members that require QString:
+// QLatin1StringView inline members that require QUtf8StringView:
//
-QString QLatin1String::toString() const { return *this; }
+int QLatin1StringView::compare(QUtf8StringView other, Qt::CaseSensitivity cs) const noexcept
+{ return QtPrivate::compareStrings(*this, other, cs); }
+
+//
+// QLatin1StringView inline members that require QString:
+//
+
+QString QLatin1StringView::toString() const { return *this; }
+
+//
+// QStringView inline members that require QUtf8StringView:
+//
+
+int QStringView::compare(QUtf8StringView other, Qt::CaseSensitivity cs) const noexcept
+{ return QtPrivate::compareStrings(*this, other, cs); }
//
// QStringView inline members that require QString:
//
+
QString QStringView::toString() const
-{ return Q_ASSERT(size() == length()), QString(data(), length()); }
+{ return QString(*this); }
qint64 QStringView::toLongLong(bool *ok, int base) const
{ return QString::toIntegral_helper<qint64>(*this, ok, base); }
@@ -1018,324 +1139,349 @@ ushort QStringView::toUShort(bool *ok, int base) const
{ return QString::toIntegral_helper<ushort>(*this, ok, base); }
//
+// QUtf8StringView inline members that require QStringView:
+//
+
+template <bool UseChar8T>
+int QBasicUtf8StringView<UseChar8T>::compare(QChar other, Qt::CaseSensitivity cs) const noexcept
+{
+ return QtPrivate::compareStrings(*this, QStringView(&other, 1), cs);
+}
+
+template <bool UseChar8T>
+int QBasicUtf8StringView<UseChar8T>::compare(QStringView other, Qt::CaseSensitivity cs) const noexcept
+{
+ return QtPrivate::compareStrings(*this, other, cs);
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(QChar other) const noexcept
+{
+ return QtPrivate::equalStrings(*this, QStringView(&other, 1));
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(QStringView other) const noexcept
+{
+ return QtPrivate::equalStrings(*this, other);
+}
+
+//
+// QUtf8StringView inline members that require QString, QL1SV or QBA:
+//
+
+template <bool UseChar8T>
+QString QBasicUtf8StringView<UseChar8T>::toString() const
+{
+ return QString::fromUtf8(data(), size());
+}
+
+template<bool UseChar8T>
+[[nodiscard]] int QBasicUtf8StringView<UseChar8T>::compare(QLatin1StringView other,
+ Qt::CaseSensitivity cs) const noexcept
+{
+ return QtPrivate::compareStrings(*this, other, cs);
+}
+
+template<bool UseChar8T>
+[[nodiscard]] int QBasicUtf8StringView<UseChar8T>::compare(const QByteArray &other,
+ Qt::CaseSensitivity cs) const noexcept
+{
+ return QtPrivate::compareStrings(*this,
+ QBasicUtf8StringView<UseChar8T>(other.data(), other.size()),
+ cs);
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(QLatin1StringView other) const noexcept
+{
+ return QtPrivate::equalStrings(*this, other);
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(const QByteArray &other) const noexcept
+{
+ return size() == other.size()
+ && QtPrivate::equalStrings(*this, QBasicUtf8StringView<UseChar8T>(other.data(),
+ other.size()));
+}
+
+//
+// QAnyStringView inline members that require QString:
+//
+
+QAnyStringView::QAnyStringView(const QByteArray &str) noexcept
+ : QAnyStringView{str.isNull() ? nullptr : str.data(), str.size()} {}
+QAnyStringView::QAnyStringView(const QString &str) noexcept
+ : QAnyStringView{str.isNull() ? nullptr : str.data(), str.size()} {}
+
+QString QAnyStringView::toString() const
+{ return QtPrivate::convertToQString(*this); }
+
+//
// QString inline members
//
-inline QString::QString(QLatin1String aLatin1) : d(fromLatin1_helper(aLatin1.latin1(), aLatin1.size()))
-{ }
-inline int QString::length() const
-{ return int(d.size); }
-inline const QChar QString::at(int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return QChar(d.data()[i]); }
-inline const QChar QString::operator[](int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return QChar(d.data()[i]); }
-inline bool QString::isEmpty() const
-{ return d.size == 0; }
-inline const QChar *QString::unicode() const
-{ return reinterpret_cast<const QChar*>(d.data()); }
-inline const QChar *QString::data() const
-{ return reinterpret_cast<const QChar*>(d.data()); }
-inline QChar *QString::data()
-{ detach(); return reinterpret_cast<QChar*>(d.data()); }
-inline const QChar *QString::constData() const
-{ return reinterpret_cast<const QChar*>(d.data()); }
-inline void QString::detach()
-{ if (d->needsDetach()) reallocData(d.size + 1u); }
-inline bool QString::isDetached() const
+QString::QString(QLatin1StringView latin1)
+{ *this = QString::fromLatin1(latin1.data(), latin1.size()); }
+const QChar QString::at(qsizetype i) const
+{ verify(i, 1); return QChar(d.data()[i]); }
+const QChar QString::operator[](qsizetype i) const
+{ verify(i, 1); return QChar(d.data()[i]); }
+const QChar *QString::unicode() const
+{ return data(); }
+const QChar *QString::data() const
+{
+#if QT5_NULL_STRINGS == 1
+ return reinterpret_cast<const QChar *>(d.data() ? d.data() : &_empty);
+#else
+ return reinterpret_cast<const QChar *>(d.data());
+#endif
+}
+QChar *QString::data()
+{
+ detach();
+ Q_ASSERT(d.data());
+ return reinterpret_cast<QChar *>(d.data());
+}
+const QChar *QString::constData() const
+{ return data(); }
+void QString::detach()
+{ if (d->needsDetach()) reallocData(d.size, QArrayData::KeepSize); }
+bool QString::isDetached() const
{ return !d->isShared(); }
-inline void QString::clear()
+void QString::clear()
{ if (!isNull()) *this = QString(); }
-inline QString::QString(const QString &other) noexcept : d(other.d)
+QString::QString(const QString &other) noexcept : d(other.d)
{ }
-inline int QString::capacity() const
-{ const auto realCapacity = d->constAllocatedCapacity(); return realCapacity ? int(realCapacity) - 1 : 0; }
-inline QString &QString::setNum(short n, int base)
+qsizetype QString::capacity() const { return qsizetype(d->constAllocatedCapacity()); }
+QString &QString::setNum(short n, int base)
{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(ushort n, int base)
+QString &QString::setNum(ushort n, int base)
{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(int n, int base)
+QString &QString::setNum(int n, int base)
{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(uint n, int base)
+QString &QString::setNum(uint n, int base)
{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(long n, int base)
+QString &QString::setNum(long n, int base)
{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(ulong n, int base)
+QString &QString::setNum(ulong n, int base)
{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(float n, char f, int prec)
+QString &QString::setNum(float n, char f, int prec)
{ return setNum(double(n),f,prec); }
-inline QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(uint a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(uint a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(long a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(long a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(ulong a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(ulong a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(short a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(short a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(ushort a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(ushort a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::section(QChar asep, int astart, int aend, SectionFlags aflags) const
+QString QString::section(QChar asep, qsizetype astart, qsizetype aend, SectionFlags aflags) const
{ return section(QString(asep), astart, aend, aflags); }
QT_WARNING_PUSH
QT_WARNING_DISABLE_MSVC(4127) // "conditional expression is constant"
QT_WARNING_DISABLE_INTEL(111) // "statement is unreachable"
-inline int QString::toWCharArray(wchar_t *array) const
+qsizetype QString::toWCharArray(wchar_t *array) const
{
return qToStringViewIgnoringNull(*this).toWCharArray(array);
}
-int QStringView::toWCharArray(wchar_t *array) const
+qsizetype QStringView::toWCharArray(wchar_t *array) const
{
if (sizeof(wchar_t) == sizeof(QChar)) {
if (auto src = data())
memcpy(array, src, sizeof(QChar) * size());
- return int(size()); // ### q6sizetype
+ return size();
} else {
- return QString::toUcs4_helper(reinterpret_cast<const ushort *>(data()), int(size()),
- reinterpret_cast<uint *>(array));
+ return QString::toUcs4_helper(utf16(), size(), reinterpret_cast<char32_t *>(array));
}
}
QT_WARNING_POP
-inline QString QString::fromWCharArray(const wchar_t *string, int size)
+QString QString::fromWCharArray(const wchar_t *string, qsizetype size)
{
- return sizeof(wchar_t) == sizeof(QChar) ? fromUtf16(reinterpret_cast<const char16_t *>(string), size)
- : fromUcs4(reinterpret_cast<const char32_t *>(string), size);
+ if constexpr (sizeof(wchar_t) == sizeof(QChar)) {
+ return QString(reinterpret_cast<const QChar *>(string), size);
+ } else {
+#ifdef QT_BOOTSTRAPPED
+ Q_UNREACHABLE_RETURN(QString());
+#else
+ return fromUcs4(reinterpret_cast<const char32_t *>(string), size);
+#endif
+ }
}
-inline QString::QString() noexcept {}
-inline QString::~QString() {}
+constexpr QString::QString() noexcept {}
+QString::~QString() {}
-inline void QString::reserve(int asize)
+void QString::reserve(qsizetype asize)
{
- if (d->needsDetach() || asize >= capacity())
- reallocData(uint(qMax(asize, size())) + 1u);
-
- // we're not shared anymore, for sure
- d->flags() |= Data::CapacityReserved;
+ if (d->needsDetach() || asize >= capacity() - d.freeSpaceAtBegin())
+ reallocData(qMax(asize, size()), QArrayData::KeepSize);
+ if (d->constAllocatedCapacity())
+ d->setFlag(Data::CapacityReserved);
}
-inline void QString::squeeze()
+void QString::squeeze()
{
- if ((d->flags() & Data::CapacityReserved) == 0)
+ if (!d.isMutable())
return;
- if (d->needsDetach() || int(d.size) < capacity())
- reallocData(uint(d.size) + 1u);
-
- // we're not shared anymore, for sure
- d->flags() &= uint(~Data::CapacityReserved);
+ if (d->needsDetach() || size() < capacity())
+ reallocData(d.size, QArrayData::KeepSize);
+ if (d->constAllocatedCapacity())
+ d->clearFlag(Data::CapacityReserved);
}
-inline QString &QString::setUtf16(const ushort *autf16, int asize)
+QString &QString::setUtf16(const ushort *autf16, qsizetype asize)
{ return setUnicode(reinterpret_cast<const QChar *>(autf16), asize); }
-inline QChar &QString::operator[](int i)
-{ Q_ASSERT(i >= 0 && i < size()); return data()[i]; }
-inline QChar &QString::front() { return operator[](0); }
-inline QChar &QString::back() { return operator[](size() - 1); }
-inline QString::iterator QString::begin()
+QChar &QString::operator[](qsizetype i)
+{ verify(i, 1); return data()[i]; }
+QChar &QString::front() { return operator[](0); }
+QChar &QString::back() { return operator[](size() - 1); }
+QString::iterator QString::begin()
{ detach(); return reinterpret_cast<QChar*>(d.data()); }
-inline QString::const_iterator QString::begin() const
+QString::const_iterator QString::begin() const
{ return reinterpret_cast<const QChar*>(d.data()); }
-inline QString::const_iterator QString::cbegin() const
+QString::const_iterator QString::cbegin() const
{ return reinterpret_cast<const QChar*>(d.data()); }
-inline QString::const_iterator QString::constBegin() const
+QString::const_iterator QString::constBegin() const
{ return reinterpret_cast<const QChar*>(d.data()); }
-inline QString::iterator QString::end()
+QString::iterator QString::end()
{ detach(); return reinterpret_cast<QChar*>(d.data() + d.size); }
-inline QString::const_iterator QString::end() const
+QString::const_iterator QString::end() const
{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
-inline QString::const_iterator QString::cend() const
+QString::const_iterator QString::cend() const
{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
-inline QString::const_iterator QString::constEnd() const
+QString::const_iterator QString::constEnd() const
{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
-#if QT_STRINGVIEW_LEVEL < 2
-inline bool QString::contains(const QString &s, Qt::CaseSensitivity cs) const
+bool QString::contains(const QString &s, Qt::CaseSensitivity cs) const
{ return indexOf(s, 0, cs) != -1; }
-#endif
-inline bool QString::contains(QLatin1String s, Qt::CaseSensitivity cs) const
+bool QString::contains(QLatin1StringView s, Qt::CaseSensitivity cs) const
{ return indexOf(s, 0, cs) != -1; }
-inline bool QString::contains(QChar c, Qt::CaseSensitivity cs) const
+bool QString::contains(QChar c, Qt::CaseSensitivity cs) const
{ return indexOf(c, 0, cs) != -1; }
-inline bool QString::contains(QStringView s, Qt::CaseSensitivity cs) const noexcept
+bool QString::contains(QStringView s, Qt::CaseSensitivity cs) const noexcept
{ return indexOf(s, 0, cs) != -1; }
-inline bool operator==(QLatin1String s1, QLatin1String s2) noexcept
-{ return s1.size() == s2.size() && (!s1.size() || !memcmp(s1.latin1(), s2.latin1(), s1.size())); }
-inline bool operator!=(QLatin1String s1, QLatin1String s2) noexcept
-{ return !operator==(s1, s2); }
-inline bool operator<(QLatin1String s1, QLatin1String s2) noexcept
-{
- const int len = qMin(s1.size(), s2.size());
- const int r = len ? memcmp(s1.latin1(), s2.latin1(), len) : 0;
- return r < 0 || (r == 0 && s1.size() < s2.size());
-}
-inline bool operator>(QLatin1String s1, QLatin1String s2) noexcept
-{ return operator<(s2, s1); }
-inline bool operator<=(QLatin1String s1, QLatin1String s2) noexcept
-{ return !operator>(s1, s2); }
-inline bool operator>=(QLatin1String s1, QLatin1String s2) noexcept
-{ return !operator<(s1, s2); }
-
-inline bool QLatin1String::operator==(const QString &s) const noexcept
-{ return s == *this; }
-inline bool QLatin1String::operator!=(const QString &s) const noexcept
-{ return s != *this; }
-inline bool QLatin1String::operator>(const QString &s) const noexcept
-{ return s < *this; }
-inline bool QLatin1String::operator<(const QString &s) const noexcept
-{ return s > *this; }
-inline bool QLatin1String::operator>=(const QString &s) const noexcept
-{ return s <= *this; }
-inline bool QLatin1String::operator<=(const QString &s) const noexcept
-{ return s >= *this; }
-
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-inline bool QString::operator==(const char *s) const
+#if QT_CORE_REMOVED_SINCE(6, 8)
+bool QString::operator==(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) == 0; }
-inline bool QString::operator!=(const char *s) const
+bool QString::operator!=(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) != 0; }
-inline bool QString::operator<(const char *s) const
+bool QString::operator<(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) < 0; }
-inline bool QString::operator>(const char *s) const
+bool QString::operator>(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) > 0; }
-inline bool QString::operator<=(const char *s) const
+bool QString::operator<=(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) <= 0; }
-inline bool QString::operator>=(const char *s) const
+bool QString::operator>=(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) >= 0; }
-inline QT_ASCII_CAST_WARN bool operator==(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) == 0; }
-inline QT_ASCII_CAST_WARN bool operator!=(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) != 0; }
-inline QT_ASCII_CAST_WARN bool operator<(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) > 0; }
-inline QT_ASCII_CAST_WARN bool operator>(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) < 0; }
-inline QT_ASCII_CAST_WARN bool operator<=(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) >= 0; }
-inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) <= 0; }
-
-inline QT_ASCII_CAST_WARN bool operator==(const char *s1, QLatin1String s2)
-{ return QString::fromUtf8(s1) == s2; }
-inline QT_ASCII_CAST_WARN bool operator!=(const char *s1, QLatin1String s2)
-{ return QString::fromUtf8(s1) != s2; }
-inline QT_ASCII_CAST_WARN bool operator<(const char *s1, QLatin1String s2)
-{ return (QString::fromUtf8(s1) < s2); }
-inline QT_ASCII_CAST_WARN bool operator>(const char *s1, QLatin1String s2)
-{ return (QString::fromUtf8(s1) > s2); }
-inline QT_ASCII_CAST_WARN bool operator<=(const char *s1, QLatin1String s2)
-{ return (QString::fromUtf8(s1) <= s2); }
-inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, QLatin1String s2)
-{ return (QString::fromUtf8(s1) >= s2); }
-
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator==(const char *s) const
-{ return QString::fromUtf8(s) == *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator!=(const char *s) const
-{ return QString::fromUtf8(s) != *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator<(const char *s) const
-{ return QString::fromUtf8(s) > *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator>(const char *s) const
-{ return QString::fromUtf8(s) < *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator<=(const char *s) const
-{ return QString::fromUtf8(s) >= *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator>=(const char *s) const
-{ return QString::fromUtf8(s) <= *this; }
-
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator==(const QByteArray &s) const
-{ return QString::fromUtf8(s) == *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator!=(const QByteArray &s) const
-{ return QString::fromUtf8(s) != *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator<(const QByteArray &s) const
-{ return QString::fromUtf8(s) > *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator>(const QByteArray &s) const
-{ return QString::fromUtf8(s) < *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator<=(const QByteArray &s) const
-{ return QString::fromUtf8(s) >= *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator>=(const QByteArray &s) const
-{ return QString::fromUtf8(s) <= *this; }
-
-inline QT_ASCII_CAST_WARN bool QString::operator==(const QByteArray &s) const
-{ return QString::compare_helper(constData(), size(), s.constData(), qstrnlen(s.constData(), s.size())) == 0; }
-inline QT_ASCII_CAST_WARN bool QString::operator!=(const QByteArray &s) const
-{ return QString::compare_helper(constData(), size(), s.constData(), qstrnlen(s.constData(), s.size())) != 0; }
-inline QT_ASCII_CAST_WARN bool QString::operator<(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator==(const QByteArray &s) const
+{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) == 0; }
+QT_ASCII_CAST_WARN bool QString::operator!=(const QByteArray &s) const
+{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) != 0; }
+QT_ASCII_CAST_WARN bool QString::operator<(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) < 0; }
-inline QT_ASCII_CAST_WARN bool QString::operator>(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator>(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) > 0; }
-inline QT_ASCII_CAST_WARN bool QString::operator<=(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator<=(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) <= 0; }
-inline QT_ASCII_CAST_WARN bool QString::operator>=(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator>=(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) >= 0; }
+bool QByteArray::operator==(const QString &s) const
+{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) == 0; }
+bool QByteArray::operator!=(const QString &s) const
+{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) != 0; }
+bool QByteArray::operator<(const QString &s) const
+{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) > 0; }
+bool QByteArray::operator>(const QString &s) const
+{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) < 0; }
+bool QByteArray::operator<=(const QString &s) const
+{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) >= 0; }
+bool QByteArray::operator>=(const QString &s) const
+{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) <= 0; }
+#endif // QT_CORE_REMOVED_SINCE(6, 8)
#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
#if !defined(QT_USE_FAST_OPERATOR_PLUS) && !defined(QT_USE_QSTRINGBUILDER)
-inline const QString operator+(const QString &s1, const QString &s2)
+inline QString operator+(const QString &s1, const QString &s2)
{ QString t(s1); t += s2; return t; }
-inline const QString operator+(const QString &s1, QChar s2)
+inline QString operator+(QString &&lhs, const QString &rhs)
+{ return std::move(lhs += rhs); }
+inline QString operator+(const QString &s1, QChar s2)
{ QString t(s1); t += s2; return t; }
-inline const QString operator+(QChar s1, const QString &s2)
+inline QString operator+(QString &&lhs, QChar rhs)
+{ return std::move(lhs += rhs); }
+inline QString operator+(QChar s1, const QString &s2)
{ QString t(s1); t += s2; return t; }
# if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-inline QT_ASCII_CAST_WARN const QString operator+(const QString &s1, const char *s2)
-{ QString t(s1); t += QString::fromUtf8(s2); return t; }
-inline QT_ASCII_CAST_WARN const QString operator+(const char *s1, const QString &s2)
+QT_ASCII_CAST_WARN inline QString operator+(const QString &s1, const char *s2)
+{ QString t(s1); t += QUtf8StringView(s2); return t; }
+QT_ASCII_CAST_WARN inline QString operator+(QString &&lhs, const char *rhs)
+{ QT_IGNORE_DEPRECATIONS(return std::move(lhs += rhs);) }
+QT_ASCII_CAST_WARN inline QString operator+(const char *s1, const QString &s2)
{ QString t = QString::fromUtf8(s1); t += s2; return t; }
-inline QT_ASCII_CAST_WARN const QString operator+(const QByteArray &ba, const QString &s)
+QT_ASCII_CAST_WARN inline QString operator+(const QByteArray &ba, const QString &s)
{ QString t = QString::fromUtf8(ba); t += s; return t; }
-inline QT_ASCII_CAST_WARN const QString operator+(const QString &s, const QByteArray &ba)
-{ QString t(s); t += QString::fromUtf8(ba); return t; }
+QT_ASCII_CAST_WARN inline QString operator+(const QString &s, const QByteArray &ba)
+{ QString t(s); t += QUtf8StringView(ba); return t; }
+QT_ASCII_CAST_WARN inline QString operator+(QString &&lhs, const QByteArray &rhs)
+{ QT_IGNORE_DEPRECATIONS(return std::move(lhs += rhs);) }
# endif // QT_NO_CAST_FROM_ASCII
#endif // QT_USE_QSTRINGBUILDER
-inline std::string QString::toStdString() const
+std::string QString::toStdString() const
{ return toUtf8().toStdString(); }
-inline QString QString::fromStdString(const std::string &s)
-{ return fromUtf8(s.data(), int(s.size())); }
+QString QString::fromStdString(const std::string &s)
+{ return fromUtf8(s.data(), qsizetype(s.size())); }
-inline std::wstring QString::toStdWString() const
+std::wstring QString::toStdWString() const
{
std::wstring str;
- str.resize(length());
-#if __cplusplus >= 201703L
+ str.resize(size());
str.resize(toWCharArray(str.data()));
-#else
- if (length())
- str.resize(toWCharArray(&str.front()));
-#endif
return str;
}
-inline QString QString::fromStdWString(const std::wstring &s)
-{ return fromWCharArray(s.data(), int(s.size())); }
+QString QString::fromStdWString(const std::wstring &s)
+{ return fromWCharArray(s.data(), qsizetype(s.size())); }
-#if defined(Q_STDLIB_UNICODE_STRINGS)
-inline QString QString::fromStdU16String(const std::u16string &s)
-{ return fromUtf16(s.data(), int(s.size())); }
+QString QString::fromStdU16String(const std::u16string &s)
+{ return fromUtf16(s.data(), qsizetype(s.size())); }
-inline std::u16string QString::toStdU16String() const
-{ return std::u16string(reinterpret_cast<const char16_t*>(utf16()), length()); }
+std::u16string QString::toStdU16String() const
+{ return std::u16string(reinterpret_cast<const char16_t*>(data()), size()); }
-inline QString QString::fromStdU32String(const std::u32string &s)
-{ return fromUcs4(s.data(), int(s.size())); }
+QString QString::fromStdU32String(const std::u32string &s)
+{ return fromUcs4(s.data(), qsizetype(s.size())); }
-inline std::u32string QString::toStdU32String() const
+std::u32string QString::toStdU32String() const
{
- std::u32string u32str(length(), char32_t(0));
- int len = toUcs4_helper(reinterpret_cast<const ushort *>(constData()), length(),
- reinterpret_cast<uint*>(&u32str[0]));
+ std::u32string u32str(size(), char32_t(0));
+ const qsizetype len = toUcs4_helper(reinterpret_cast<const char16_t *>(data()),
+ size(), u32str.data());
u32str.resize(len);
return u32str;
}
-#endif
-#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE))
+QString::operator std::u16string_view() const noexcept
+{
+ return std::u16string_view(d.data(), size_t(d.size));
+}
+
+#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QString &);
Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QString &);
#endif
@@ -1343,454 +1489,60 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QString &);
Q_DECLARE_SHARED(QString)
Q_DECLARE_OPERATORS_FOR_FLAGS(QString::SectionFlags)
+int QString::compare(QStringView s, Qt::CaseSensitivity cs) const noexcept
+{ return -s.compare(*this, cs); }
-class Q_CORE_EXPORT QStringRef {
- const QString *m_string;
- int m_position;
- int m_size;
-public:
- typedef QString::size_type size_type;
- typedef QString::value_type value_type;
- typedef const QChar *const_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef QString::const_pointer const_pointer;
- typedef QString::const_reference const_reference;
-
- // ### Qt 6: make this constructor constexpr, after the destructor is made trivial
- inline QStringRef() : m_string(nullptr), m_position(0), m_size(0) {}
- inline QStringRef(const QString *string, int position, int size);
- inline QStringRef(const QString *string);
-
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
- // ### Qt 6: remove all of these, the implicit ones are fine
- QStringRef(const QStringRef &other) noexcept
- :m_string(other.m_string), m_position(other.m_position), m_size(other.m_size)
- {}
- QStringRef(QStringRef &&other) noexcept : m_string(other.m_string), m_position(other.m_position), m_size(other.m_size) {}
- QStringRef &operator=(QStringRef &&other) noexcept { return *this = other; }
- QStringRef &operator=(const QStringRef &other) noexcept
- {
- m_string = other.m_string; m_position = other.m_position;
- m_size = other.m_size; return *this;
- }
- inline ~QStringRef(){}
-#endif // Qt < 6.0.0
-
- inline const QString *string() const { return m_string; }
- inline int position() const { return m_position; }
- inline int size() const { return m_size; }
- inline int count() const { return m_size; }
- inline int length() const { return m_size; }
-
-#if QT_STRINGVIEW_LEVEL < 2
- int indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int indexOf(const QStringRef &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- Q_REQUIRED_RESULT int indexOf(QStringView s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return int(QtPrivate::findString(*this, from, s, cs)); } // ### Qt6: qsizetype
- int indexOf(QChar ch, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int indexOf(QLatin1String str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
- int lastIndexOf(const QStringRef &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(const QString &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- int lastIndexOf(QChar ch, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(QLatin1String str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- Q_REQUIRED_RESULT int lastIndexOf(QStringView s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return int(QtPrivate::lastIndexOf(*this, from, s, cs)); } // ### Qt6: qsizetype
-
-#if QT_STRINGVIEW_LEVEL < 2
- inline bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- inline bool contains(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
-
- int count(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int count(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- Q_REQUIRED_RESULT
- QList<QStringRef> split(const QString &sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- Q_REQUIRED_RESULT
- QList<QStringRef> split(QChar sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- Q_REQUIRED_RESULT QStringRef left(int n) const;
- Q_REQUIRED_RESULT QStringRef right(int n) const;
- Q_REQUIRED_RESULT QStringRef mid(int pos, int n = -1) const;
- Q_REQUIRED_RESULT QStringRef chopped(int n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return left(size() - n); }
-
- void truncate(int pos) noexcept { m_size = qBound(0, pos, m_size); }
- void chop(int n) noexcept
- {
- if (n >= m_size)
- m_size = 0;
- else if (n > 0)
- m_size -= n;
- }
+int QString::localeAwareCompare(QStringView s) const
+{ return localeAwareCompare_helper(constData(), size(), s.constData(), s.size()); }
+int QString::localeAwareCompare(QStringView s1, QStringView s2)
+{ return localeAwareCompare_helper(s1.constData(), s1.size(), s2.constData(), s2.size()); }
+int QStringView::localeAwareCompare(QStringView other) const
+{ return QString::localeAwareCompare(*this, other); }
- bool isRightToLeft() const;
+#if QT_CORE_INLINE_IMPL_SINCE(6, 5)
+qint64 QString::toLongLong(bool *ok, int base) const
+{
+ return toIntegral_helper<qlonglong>(*this, ok, base);
+}
- Q_REQUIRED_RESULT bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::startsWith(*this, s, cs); }
- bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
- bool startsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool startsWith(const QStringRef &c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+quint64 QString::toULongLong(bool *ok, int base) const
+{
+ return toIntegral_helper<qulonglong>(*this, ok, base);
+}
#endif
-
- Q_REQUIRED_RESULT bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::endsWith(*this, s, cs); }
- bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
- bool endsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool endsWith(const QStringRef &c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+#if QT_CORE_INLINE_IMPL_SINCE(6, 7)
+qsizetype QString::indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
+{
+ return qToStringViewIgnoringNull(*this).indexOf(ch, from, cs);
+}
+qsizetype QString::lastIndexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
+{
+ return qToStringViewIgnoringNull(*this).lastIndexOf(ch, from, cs);
+}
#endif
- inline QStringRef &operator=(const QString *string);
-
- inline const QChar *unicode() const
- {
- if (!m_string)
- return reinterpret_cast<const QChar *>(QString::Data::sharedNullData());
- return m_string->unicode() + m_position;
- }
- inline const QChar *data() const { return unicode(); }
- inline const QChar *constData() const { return unicode(); }
-
- inline const_iterator begin() const { return unicode(); }
- inline const_iterator cbegin() const { return unicode(); }
- inline const_iterator constBegin() const { return unicode(); }
- inline const_iterator end() const { return unicode() + size(); }
- inline const_iterator cend() const { return unicode() + size(); }
- inline const_iterator constEnd() const { return unicode() + size(); }
- inline const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
- inline const_reverse_iterator crbegin() const { return rbegin(); }
- inline const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
- inline const_reverse_iterator crend() const { return rend(); }
-
- Q_REQUIRED_RESULT QByteArray toLatin1() const;
- Q_REQUIRED_RESULT QByteArray toUtf8() const;
- Q_REQUIRED_RESULT QByteArray toLocal8Bit() const;
- Q_REQUIRED_RESULT QList<uint> toUcs4() const;
-
- inline void clear() { m_string = nullptr; m_position = m_size = 0; }
- QString toString() const;
- inline bool isEmpty() const { return m_size == 0; }
- inline bool isNull() const { return m_string == nullptr || m_string->isNull(); }
-
- QStringRef appendTo(QString *string) const;
-
- inline const QChar at(int i) const
- { Q_ASSERT(uint(i) < uint(size())); return m_string->at(i + m_position); }
- QChar operator[](int i) const { return at(i); }
- Q_REQUIRED_RESULT QChar front() const { return at(0); }
- Q_REQUIRED_RESULT QChar back() const { return at(size() - 1); }
+namespace QtPrivate {
+// used by qPrintable() and qUtf8Printable() macros
+inline const QString &asString(const QString &s) { return s; }
+inline QString &&asString(QString &&s) { return std::move(s); }
+}
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- // ASCII compatibility
- inline QT_ASCII_CAST_WARN bool operator==(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const char *s) const;
+#ifndef qPrintable
+# define qPrintable(string) QtPrivate::asString(string).toLocal8Bit().constData()
#endif
- int compare(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- int compare(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- int compare(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::compareStrings(*this, QStringView(&c, 1), cs); }
- int compare(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- int compare(const QByteArray &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- { return QString::compare_helper(unicode(), size(), s.data(), qstrnlen(s.data(), s.size()), cs); }
+#ifndef qUtf8Printable
+# define qUtf8Printable(string) QtPrivate::asString(string).toUtf8().constData()
#endif
- static int compare(const QStringRef &s1, const QString &s2,
- Qt::CaseSensitivity = Qt::CaseSensitive) noexcept;
- static int compare(const QStringRef &s1, const QStringRef &s2,
- Qt::CaseSensitivity = Qt::CaseSensitive) noexcept;
- static int compare(const QStringRef &s1, QLatin1String s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-
- int localeAwareCompare(const QString &s) const;
- int localeAwareCompare(const QStringRef &s) const;
- static int localeAwareCompare(const QStringRef &s1, const QString &s2);
- static int localeAwareCompare(const QStringRef &s1, const QStringRef &s2);
-
- Q_REQUIRED_RESULT QStringRef trimmed() const;
- short toShort(bool *ok = nullptr, int base = 10) const;
- ushort toUShort(bool *ok = nullptr, int base = 10) const;
- int toInt(bool *ok = nullptr, int base = 10) const;
- uint toUInt(bool *ok = nullptr, int base = 10) const;
- long toLong(bool *ok = nullptr, int base = 10) const;
- ulong toULong(bool *ok = nullptr, int base = 10) const;
- qlonglong toLongLong(bool *ok = nullptr, int base = 10) const;
- qulonglong toULongLong(bool *ok = nullptr, int base = 10) const;
- float toFloat(bool *ok = nullptr) const;
- double toDouble(bool *ok = nullptr) const;
-};
-Q_DECLARE_TYPEINFO(QStringRef, Q_PRIMITIVE_TYPE);
-
-inline QStringRef &QStringRef::operator=(const QString *aString)
-{ m_string = aString; m_position = 0; m_size = aString?aString->size():0; return *this; }
-
-inline QStringRef::QStringRef(const QString *aString, int aPosition, int aSize)
- :m_string(aString), m_position(aPosition), m_size(aSize){}
-
-inline QStringRef::QStringRef(const QString *aString)
- :m_string(aString), m_position(0), m_size(aString?aString->size() : 0){}
-
-// QStringRef <> QStringRef
-Q_CORE_EXPORT bool operator==(const QStringRef &s1, const QStringRef &s2) noexcept;
-inline bool operator!=(const QStringRef &s1, const QStringRef &s2) noexcept
-{ return !(s1 == s2); }
-Q_CORE_EXPORT bool operator<(const QStringRef &s1, const QStringRef &s2) noexcept;
-inline bool operator>(const QStringRef &s1, const QStringRef &s2) noexcept
-{ return s2 < s1; }
-inline bool operator<=(const QStringRef &s1, const QStringRef &s2) noexcept
-{ return !(s1 > s2); }
-inline bool operator>=(const QStringRef &s1, const QStringRef &s2) noexcept
-{ return !(s1 < s2); }
-
-// QString <> QStringRef
-Q_CORE_EXPORT bool operator==(const QString &lhs, const QStringRef &rhs) noexcept;
-inline bool operator!=(const QString &lhs, const QStringRef &rhs) noexcept { return lhs.compare(rhs) != 0; }
-inline bool operator< (const QString &lhs, const QStringRef &rhs) noexcept { return lhs.compare(rhs) < 0; }
-inline bool operator> (const QString &lhs, const QStringRef &rhs) noexcept { return lhs.compare(rhs) > 0; }
-inline bool operator<=(const QString &lhs, const QStringRef &rhs) noexcept { return lhs.compare(rhs) <= 0; }
-inline bool operator>=(const QString &lhs, const QStringRef &rhs) noexcept { return lhs.compare(rhs) >= 0; }
-
-inline bool operator==(const QStringRef &lhs, const QString &rhs) noexcept { return rhs == lhs; }
-inline bool operator!=(const QStringRef &lhs, const QString &rhs) noexcept { return rhs != lhs; }
-inline bool operator< (const QStringRef &lhs, const QString &rhs) noexcept { return rhs > lhs; }
-inline bool operator> (const QStringRef &lhs, const QString &rhs) noexcept { return rhs < lhs; }
-inline bool operator<=(const QStringRef &lhs, const QString &rhs) noexcept { return rhs >= lhs; }
-inline bool operator>=(const QStringRef &lhs, const QString &rhs) noexcept { return rhs <= lhs; }
-
-inline int QString::compare(QStringView s, Qt::CaseSensitivity cs) const noexcept
-{ return -s.compare(*this, cs); }
-inline int QStringRef::compare(const QString &s, Qt::CaseSensitivity cs) const noexcept
-{ return QString::compare_helper(constData(), length(), s.constData(), s.length(), cs); }
-inline int QStringRef::compare(const QStringRef &s, Qt::CaseSensitivity cs) const noexcept
-{ return QString::compare_helper(constData(), length(), s.constData(), s.length(), cs); }
-inline int QStringRef::compare(QLatin1String s, Qt::CaseSensitivity cs) const noexcept
-{ return QString::compare_helper(constData(), length(), s, cs); }
-inline int QStringRef::compare(const QStringRef &s1, const QString &s2, Qt::CaseSensitivity cs) noexcept
-{ return QString::compare_helper(s1.constData(), s1.length(), s2.constData(), s2.length(), cs); }
-inline int QStringRef::compare(const QStringRef &s1, const QStringRef &s2, Qt::CaseSensitivity cs) noexcept
-{ return QString::compare_helper(s1.constData(), s1.length(), s2.constData(), s2.length(), cs); }
-inline int QStringRef::compare(const QStringRef &s1, QLatin1String s2, Qt::CaseSensitivity cs) noexcept
-{ return QString::compare_helper(s1.constData(), s1.length(), s2, cs); }
-
-// QLatin1String <> QStringRef
-Q_CORE_EXPORT bool operator==(QLatin1String lhs, const QStringRef &rhs) noexcept;
-inline bool operator!=(QLatin1String lhs, const QStringRef &rhs) noexcept { return rhs.compare(lhs) != 0; }
-inline bool operator< (QLatin1String lhs, const QStringRef &rhs) noexcept { return rhs.compare(lhs) > 0; }
-inline bool operator> (QLatin1String lhs, const QStringRef &rhs) noexcept { return rhs.compare(lhs) < 0; }
-inline bool operator<=(QLatin1String lhs, const QStringRef &rhs) noexcept { return rhs.compare(lhs) >= 0; }
-inline bool operator>=(QLatin1String lhs, const QStringRef &rhs) noexcept { return rhs.compare(lhs) <= 0; }
-
-inline bool operator==(const QStringRef &lhs, QLatin1String rhs) noexcept { return rhs == lhs; }
-inline bool operator!=(const QStringRef &lhs, QLatin1String rhs) noexcept { return rhs != lhs; }
-inline bool operator< (const QStringRef &lhs, QLatin1String rhs) noexcept { return rhs > lhs; }
-inline bool operator> (const QStringRef &lhs, QLatin1String rhs) noexcept { return rhs < lhs; }
-inline bool operator<=(const QStringRef &lhs, QLatin1String rhs) noexcept { return rhs >= lhs; }
-inline bool operator>=(const QStringRef &lhs, QLatin1String rhs) noexcept { return rhs <= lhs; }
-
-// QChar <> QString
-inline bool operator==(QChar lhs, const QString &rhs) noexcept
-{ return rhs.size() == 1 && lhs == rhs.front(); }
-inline bool operator< (QChar lhs, const QString &rhs) noexcept
-{ return QString::compare_helper(&lhs, 1, rhs.data(), rhs.size()) < 0; }
-inline bool operator> (QChar lhs, const QString &rhs) noexcept
-{ return QString::compare_helper(&lhs, 1, rhs.data(), rhs.size()) > 0; }
-
-inline bool operator!=(QChar lhs, const QString &rhs) noexcept { return !(lhs == rhs); }
-inline bool operator<=(QChar lhs, const QString &rhs) noexcept { return !(lhs > rhs); }
-inline bool operator>=(QChar lhs, const QString &rhs) noexcept { return !(lhs < rhs); }
-
-inline bool operator==(const QString &lhs, QChar rhs) noexcept { return rhs == lhs; }
-inline bool operator!=(const QString &lhs, QChar rhs) noexcept { return !(rhs == lhs); }
-inline bool operator< (const QString &lhs, QChar rhs) noexcept { return rhs > lhs; }
-inline bool operator> (const QString &lhs, QChar rhs) noexcept { return rhs < lhs; }
-inline bool operator<=(const QString &lhs, QChar rhs) noexcept { return !(rhs < lhs); }
-inline bool operator>=(const QString &lhs, QChar rhs) noexcept { return !(rhs > lhs); }
-
-// QChar <> QStringRef
-inline bool operator==(QChar lhs, const QStringRef &rhs) noexcept
-{ return rhs.size() == 1 && lhs == rhs.front(); }
-inline bool operator< (QChar lhs, const QStringRef &rhs) noexcept
-{ return QString::compare_helper(&lhs, 1, rhs.data(), rhs.size()) < 0; }
-inline bool operator> (QChar lhs, const QStringRef &rhs) noexcept
-{ return QString::compare_helper(&lhs, 1, rhs.data(), rhs.size()) > 0; }
-
-inline bool operator!=(QChar lhs, const QStringRef &rhs) noexcept { return !(lhs == rhs); }
-inline bool operator<=(QChar lhs, const QStringRef &rhs) noexcept { return !(lhs > rhs); }
-inline bool operator>=(QChar lhs, const QStringRef &rhs) noexcept { return !(lhs < rhs); }
-
-inline bool operator==(const QStringRef &lhs, QChar rhs) noexcept { return rhs == lhs; }
-inline bool operator!=(const QStringRef &lhs, QChar rhs) noexcept { return !(rhs == lhs); }
-inline bool operator< (const QStringRef &lhs, QChar rhs) noexcept { return rhs > lhs; }
-inline bool operator> (const QStringRef &lhs, QChar rhs) noexcept { return rhs < lhs; }
-inline bool operator<=(const QStringRef &lhs, QChar rhs) noexcept { return !(rhs < lhs); }
-inline bool operator>=(const QStringRef &lhs, QChar rhs) noexcept { return !(rhs > lhs); }
-
-// QChar <> QLatin1String
-inline bool operator==(QChar lhs, QLatin1String rhs) noexcept
-{ return rhs.size() == 1 && lhs == rhs.front(); }
-inline bool operator< (QChar lhs, QLatin1String rhs) noexcept
-{ return QString::compare_helper(&lhs, 1, rhs) < 0; }
-inline bool operator> (QChar lhs, QLatin1String rhs) noexcept
-{ return QString::compare_helper(&lhs, 1, rhs) > 0; }
-
-inline bool operator!=(QChar lhs, QLatin1String rhs) noexcept { return !(lhs == rhs); }
-inline bool operator<=(QChar lhs, QLatin1String rhs) noexcept { return !(lhs > rhs); }
-inline bool operator>=(QChar lhs, QLatin1String rhs) noexcept { return !(lhs < rhs); }
-
-inline bool operator==(QLatin1String lhs, QChar rhs) noexcept { return rhs == lhs; }
-inline bool operator!=(QLatin1String lhs, QChar rhs) noexcept { return !(rhs == lhs); }
-inline bool operator< (QLatin1String lhs, QChar rhs) noexcept { return rhs > lhs; }
-inline bool operator> (QLatin1String lhs, QChar rhs) noexcept { return rhs < lhs; }
-inline bool operator<=(QLatin1String lhs, QChar rhs) noexcept { return !(rhs < lhs); }
-inline bool operator>=(QLatin1String lhs, QChar rhs) noexcept { return !(rhs > lhs); }
-
-// QStringView <> QStringView
-inline bool operator==(QStringView lhs, QStringView rhs) noexcept { return lhs.size() == rhs.size() && QtPrivate::compareStrings(lhs, rhs) == 0; }
-inline bool operator!=(QStringView lhs, QStringView rhs) noexcept { return !(lhs == rhs); }
-inline bool operator< (QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) < 0; }
-inline bool operator<=(QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) <= 0; }
-inline bool operator> (QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) > 0; }
-inline bool operator>=(QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) >= 0; }
-
-// QStringView <> QChar
-inline bool operator==(QStringView lhs, QChar rhs) noexcept { return lhs == QStringView(&rhs, 1); }
-inline bool operator!=(QStringView lhs, QChar rhs) noexcept { return lhs != QStringView(&rhs, 1); }
-inline bool operator< (QStringView lhs, QChar rhs) noexcept { return lhs < QStringView(&rhs, 1); }
-inline bool operator<=(QStringView lhs, QChar rhs) noexcept { return lhs <= QStringView(&rhs, 1); }
-inline bool operator> (QStringView lhs, QChar rhs) noexcept { return lhs > QStringView(&rhs, 1); }
-inline bool operator>=(QStringView lhs, QChar rhs) noexcept { return lhs >= QStringView(&rhs, 1); }
-
-inline bool operator==(QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) == rhs; }
-inline bool operator!=(QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) != rhs; }
-inline bool operator< (QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) < rhs; }
-inline bool operator<=(QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) <= rhs; }
-inline bool operator> (QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) > rhs; }
-inline bool operator>=(QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) >= rhs; }
-
-// QStringView <> QLatin1String
-inline bool operator==(QStringView lhs, QLatin1String rhs) noexcept { return lhs.size() == rhs.size() && QtPrivate::compareStrings(lhs, rhs) == 0; }
-inline bool operator!=(QStringView lhs, QLatin1String rhs) noexcept { return !(lhs == rhs); }
-inline bool operator< (QStringView lhs, QLatin1String rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) < 0; }
-inline bool operator<=(QStringView lhs, QLatin1String rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) <= 0; }
-inline bool operator> (QStringView lhs, QLatin1String rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) > 0; }
-inline bool operator>=(QStringView lhs, QLatin1String rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) >= 0; }
-
-inline bool operator==(QLatin1String lhs, QStringView rhs) noexcept { return lhs.size() == rhs.size() && QtPrivate::compareStrings(lhs, rhs) == 0; }
-inline bool operator!=(QLatin1String lhs, QStringView rhs) noexcept { return !(lhs == rhs); }
-inline bool operator< (QLatin1String lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) < 0; }
-inline bool operator<=(QLatin1String lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) <= 0; }
-inline bool operator> (QLatin1String lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) > 0; }
-inline bool operator>=(QLatin1String lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) >= 0; }
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-// QStringRef <> QByteArray
-inline QT_ASCII_CAST_WARN bool operator==(const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) == 0; }
-inline QT_ASCII_CAST_WARN bool operator!=(const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) != 0; }
-inline QT_ASCII_CAST_WARN bool operator< (const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) < 0; }
-inline QT_ASCII_CAST_WARN bool operator> (const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) > 0; }
-inline QT_ASCII_CAST_WARN bool operator<=(const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) <= 0; }
-inline QT_ASCII_CAST_WARN bool operator>=(const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) >= 0; }
-
-inline QT_ASCII_CAST_WARN bool operator==(const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) == 0; }
-inline QT_ASCII_CAST_WARN bool operator!=(const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) != 0; }
-inline QT_ASCII_CAST_WARN bool operator< (const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) > 0; }
-inline QT_ASCII_CAST_WARN bool operator> (const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) < 0; }
-inline QT_ASCII_CAST_WARN bool operator<=(const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) >= 0; }
-inline QT_ASCII_CAST_WARN bool operator>=(const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) <= 0; }
-
-// QStringRef <> const char *
-inline QT_ASCII_CAST_WARN bool QStringRef::operator==(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) == 0; }
-inline QT_ASCII_CAST_WARN bool QStringRef::operator!=(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) != 0; }
-inline QT_ASCII_CAST_WARN bool QStringRef::operator<(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) < 0; }
-inline QT_ASCII_CAST_WARN bool QStringRef::operator<=(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) <= 0; }
-inline QT_ASCII_CAST_WARN bool QStringRef::operator>(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) > 0; }
-inline QT_ASCII_CAST_WARN bool QStringRef::operator>=(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) >= 0; }
-
-inline QT_ASCII_CAST_WARN bool operator==(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) == 0; }
-inline QT_ASCII_CAST_WARN bool operator!=(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) != 0; }
-inline QT_ASCII_CAST_WARN bool operator<(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) > 0; }
-inline QT_ASCII_CAST_WARN bool operator<=(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) >= 0; }
-inline QT_ASCII_CAST_WARN bool operator>(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) < 0; }
-inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) <= 0; }
-#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-
-inline int QString::localeAwareCompare(QStringView s) const
-{ return localeAwareCompare_helper(constData(), length(), s.constData(), s.length()); }
-inline int QString::localeAwareCompare(QStringView s1, QStringView s2)
-{ return localeAwareCompare_helper(s1.constData(), s1.length(), s2.constData(), s2.length()); }
-inline int QStringRef::localeAwareCompare(const QString &s) const
-{ return QString::localeAwareCompare_helper(constData(), length(), s.constData(), s.length()); }
-inline int QStringRef::localeAwareCompare(const QStringRef &s) const
-{ return QString::localeAwareCompare_helper(constData(), length(), s.constData(), s.length()); }
-inline int QStringRef::localeAwareCompare(const QStringRef &s1, const QString &s2)
-{ return QString::localeAwareCompare_helper(s1.constData(), s1.length(), s2.constData(), s2.length()); }
-inline int QStringRef::localeAwareCompare(const QStringRef &s1, const QStringRef &s2)
-{ return QString::localeAwareCompare_helper(s1.constData(), s1.length(), s2.constData(), s2.length()); }
-
-#if QT_STRINGVIEW_LEVEL < 2
-inline bool QStringRef::contains(const QString &s, Qt::CaseSensitivity cs) const
-{ return indexOf(s, 0, cs) != -1; }
-inline bool QStringRef::contains(const QStringRef &s, Qt::CaseSensitivity cs) const
-{ return indexOf(s, 0, cs) != -1; }
+/*
+ Wrap QString::utf16() with enough casts to allow passing it
+ to QString::asprintf("%ls") without warnings.
+*/
+#ifndef qUtf16Printable
+# define qUtf16Printable(string) \
+ static_cast<const wchar_t*>(static_cast<const void*>(QtPrivate::asString(string).utf16()))
#endif
-inline bool QStringRef::contains(QLatin1String s, Qt::CaseSensitivity cs) const
-{ return indexOf(s, 0, cs) != -1; }
-inline bool QStringRef::contains(QChar c, Qt::CaseSensitivity cs) const
-{ return indexOf(c, 0, cs) != -1; }
-inline bool QStringRef::contains(QStringView s, Qt::CaseSensitivity cs) const noexcept
-{ return indexOf(s, 0, cs) != -1; }
-
-#if !defined(QT_USE_FAST_OPERATOR_PLUS) && !defined(QT_USE_QSTRINGBUILDER)
-inline QString operator+(const QString &s1, const QStringRef &s2)
-{ QString t; t.reserve(s1.size() + s2.size()); t += s1; t += s2; return t; }
-inline QString operator+(const QStringRef &s1, const QString &s2)
-{ QString t; t.reserve(s1.size() + s2.size()); t += s1; t += s2; return t; }
-inline QString operator+(const QStringRef &s1, QLatin1String s2)
-{ QString t; t.reserve(s1.size() + s2.size()); t += s1; t += s2; return t; }
-inline QString operator+(QLatin1String s1, const QStringRef &s2)
-{ QString t; t.reserve(s1.size() + s2.size()); t += s1; t += s2; return t; }
-inline QString operator+(const QStringRef &s1, const QStringRef &s2)
-{ QString t; t.reserve(s1.size() + s2.size()); t += s1; t += s2; return t; }
-inline QString operator+(const QStringRef &s1, QChar s2)
-{ QString t; t.reserve(s1.size() + 1); t += s1; t += s2; return t; }
-inline QString operator+(QChar s1, const QStringRef &s2)
-{ QString t; t.reserve(1 + s2.size()); t += s1; t += s2; return t; }
-#endif // !(QT_USE_FAST_OPERATOR_PLUS || QT_USE_QSTRINGBUILDER)
-
-namespace QtPrivate {
-// used by qPrintable() and qUtf8Printable() macros
-inline const QString &asString(const QString &s) { return s; }
-inline QString &&asString(QString &&s) { return std::move(s); }
-}
//
// QStringView::arg() implementation
@@ -1805,29 +1557,29 @@ struct ArgBase {
struct QStringViewArg : ArgBase {
QStringView string;
QStringViewArg() = default;
- Q_DECL_CONSTEXPR explicit QStringViewArg(QStringView v) noexcept : ArgBase{U16}, string{v} {}
+ constexpr explicit QStringViewArg(QStringView v) noexcept : ArgBase{U16}, string{v} {}
};
struct QLatin1StringArg : ArgBase {
- QLatin1String string;
+ QLatin1StringView string;
QLatin1StringArg() = default;
- Q_DECL_CONSTEXPR explicit QLatin1StringArg(QLatin1String v) noexcept : ArgBase{L1}, string{v} {}
+ constexpr explicit QLatin1StringArg(QLatin1StringView v) noexcept : ArgBase{L1}, string{v} {}
};
-Q_REQUIRED_RESULT Q_CORE_EXPORT QString argToQString(QStringView pattern, size_t n, const ArgBase **args);
-Q_REQUIRED_RESULT Q_CORE_EXPORT QString argToQString(QLatin1String pattern, size_t n, const ArgBase **args);
+[[nodiscard]] Q_CORE_EXPORT QString argToQString(QStringView pattern, size_t n, const ArgBase **args);
+[[nodiscard]] Q_CORE_EXPORT QString argToQString(QLatin1StringView pattern, size_t n, const ArgBase **args);
template <typename StringView, typename...Args>
-Q_REQUIRED_RESULT Q_ALWAYS_INLINE QString argToQStringDispatch(StringView pattern, const Args &...args)
+[[nodiscard]] Q_ALWAYS_INLINE QString argToQStringDispatch(StringView pattern, const Args &...args)
{
const ArgBase *argBases[] = {&args..., /* avoid zero-sized array */ nullptr};
return QtPrivate::argToQString(pattern, sizeof...(Args), argBases);
}
- inline QStringViewArg qStringLikeToArg(const QString &s) noexcept { return QStringViewArg{qToStringViewIgnoringNull(s)}; }
-Q_DECL_CONSTEXPR inline QStringViewArg qStringLikeToArg(QStringView s) noexcept { return QStringViewArg{s}; }
- inline QStringViewArg qStringLikeToArg(const QChar &c) noexcept { return QStringViewArg{QStringView{&c, 1}}; }
-Q_DECL_CONSTEXPR inline QLatin1StringArg qStringLikeToArg(QLatin1String s) noexcept { return QLatin1StringArg{s}; }
+ inline QStringViewArg qStringLikeToArg(const QString &s) noexcept { return QStringViewArg{qToStringViewIgnoringNull(s)}; }
+constexpr inline QStringViewArg qStringLikeToArg(QStringView s) noexcept { return QStringViewArg{s}; }
+ inline QStringViewArg qStringLikeToArg(const QChar &c) noexcept { return QStringViewArg{QStringView{&c, 1}}; }
+constexpr inline QLatin1StringArg qStringLikeToArg(QLatin1StringView s) noexcept { return QLatin1StringArg{s}; }
} // namespace QtPrivate
@@ -1840,15 +1592,54 @@ QString QStringView::arg(Args &&...args) const
template <typename...Args>
Q_ALWAYS_INLINE
-QString QLatin1String::arg(Args &&...args) const
+QString QLatin1StringView::arg(Args &&...args) const
{
return QtPrivate::argToQStringDispatch(*this, QtPrivate::qStringLikeToArg(args)...);
}
+template <typename T>
+qsizetype erase(QString &s, const T &t)
+{
+ return s.removeIf_helper([&t](const auto &e) { return t == e; });
+}
+
+template <typename Predicate>
+qsizetype erase_if(QString &s, Predicate pred)
+{
+ return s.removeIf_helper(pred);
+}
+
+namespace Qt {
+inline namespace Literals {
+inline namespace StringLiterals {
+inline QString operator""_s(const char16_t *str, size_t size) noexcept
+{
+ return QString(QStringPrivate(nullptr, const_cast<char16_t *>(str), qsizetype(size)));
+}
+
+} // StringLiterals
+} // Literals
+} // Qt
+
+inline namespace QtLiterals {
+#if QT_DEPRECATED_SINCE(6, 8)
+
+QT_DEPRECATED_VERSION_X_6_8("Use _s from Qt::StringLiterals namespace instead.")
+inline QString operator""_qs(const char16_t *str, size_t size) noexcept
+{
+ return Qt::StringLiterals::operator""_s(str, size);
+}
+
+#endif // QT_DEPRECATED_SINCE(6, 8)
+} // QtLiterals
+
QT_END_NAMESPACE
-#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
#include <QtCore/qstringbuilder.h>
+#include <QtCore/qstringconverter.h>
+
+#ifdef Q_L1S_VIEW_IS_PRIMARY
+# undef Q_L1S_VIEW_IS_PRIMARY
#endif
#endif // QSTRING_H
diff --git a/src/corelib/text/qstring_compat.cpp b/src/corelib/text/qstring_compat.cpp
deleted file mode 100644
index 45bb816e4b..0000000000
--- a/src/corelib/text/qstring_compat.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#if defined(QSTRING_H) || defined(QBYTEARRAY_H)
-# error "This file cannot be compiled with pre-compiled headers"
-#endif
-#define QT_COMPILING_QSTRING_COMPAT_CPP
-
-#include "qbytearray.h"
-#include "qstring.h"
-
-QT_BEGIN_NAMESPACE
-
-// all these implementations must be the same as the inline versions in qstring.h
-QString QString::trimmed() const
-{
- return trimmed_helper(*this);
-}
-
-QString QString::simplified() const
-{
- return simplified_helper(*this);
-}
-
-QString QString::toLower() const
-{
- return toLower_helper(*this);
-}
-
-QString QString::toCaseFolded() const
-{
- return toCaseFolded_helper(*this);
-}
-
-QString QString::toUpper() const
-{
- return toUpper_helper(*this);
-}
-
-QByteArray QString::toLatin1() const
-{
- return toLatin1_helper(*this);
-}
-
-QByteArray QString::toLocal8Bit() const
-{
- return toLocal8Bit_helper(isNull() ? nullptr : constData(), size());
-}
-
-QByteArray QString::toUtf8() const
-{
- return toUtf8_helper(*this);
-}
-
-// ditto, for qbytearray.h (because we're lazy)
-QByteArray QByteArray::toLower() const
-{
- return toLower_helper(*this);
-}
-
-QByteArray QByteArray::toUpper() const
-{
- return toUpper_helper(*this);
-}
-
-QByteArray QByteArray::trimmed() const
-{
- return trimmed_helper(*this);
-}
-
-QByteArray QByteArray::simplified() const
-{
- return simplified_helper(*this);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/text/qstring_mips_dsp_asm.S b/src/corelib/text/qstring_mips_dsp_asm.S
index 202f322310..da764b2e9a 100644
--- a/src/corelib/text/qstring_mips_dsp_asm.S
+++ b/src/corelib/text/qstring_mips_dsp_asm.S
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "../../gui/painting/qt_mips_asm_dsp_p.h"
diff --git a/src/corelib/text/qstringalgorithms.h b/src/corelib/text/qstringalgorithms.h
index 4a0f7dce9a..71a1dbd526 100644
--- a/src/corelib/text/qstringalgorithms.h
+++ b/src/corelib/text/qstringalgorithms.h
@@ -1,109 +1,209 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGALGORITHMS_H
#define QSTRINGALGORITHMS_H
-#include <QtCore/qnamespace.h>
+#include <QtCore/qbytearrayalgorithms.h>
#include <QtCore/qcontainerfwd.h>
+#include <QtCore/qnamespace.h>
+#include <QtCore/qstringfwd.h>
#if 0
#pragma qt_class(QStringAlgorithms)
#endif
-QT_BEGIN_NAMESPACE
-
-class QByteArray;
-class QLatin1String;
-class QStringView;
-class QChar;
-
-namespace QtPrivate {
-
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype qustrlen(const char16_t *str) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION const char16_t *qustrchr(QStringView str, char16_t ch) noexcept;
-
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QLatin1String rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1String lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1String lhs, QLatin1String rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-
+#include <algorithm> // std::find
+#include <iterator> // std::size
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+#include <QtCore/q20type_traits.h> // q20::is_constant_evaluated
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QStringView haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QLatin1String haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QLatin1String haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+QT_BEGIN_NAMESPACE
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QLatin1String haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QLatin1String haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+namespace QtPrivate {
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QStringView trimmed(QStringView s) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QLatin1String trimmed(QLatin1String s) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype qustrlen(const char16_t *str) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype qustrnlen(const char16_t *str, qsizetype maxlen) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION const char16_t *qustrchr(QStringView str, char16_t ch) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION const char16_t *qustrcasechr(QStringView str, char16_t ch) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1StringView lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1StringView lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QBasicUtf8StringView<false> lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QStringView lhs, QStringView rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QStringView lhs, QLatin1StringView rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QStringView lhs, QBasicUtf8StringView<false> rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QLatin1StringView lhs, QStringView rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QLatin1StringView lhs, QLatin1StringView rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QBasicUtf8StringView<false> lhs, QStringView rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findStringInsensitive(QStringView haystack, qsizetype from, char16_t needle) noexcept;
+[[nodiscard]] inline qsizetype findString(QStringView str, qsizetype from, QChar needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QStringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QLatin1StringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, char16_t needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QLatin1StringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QStringView trimmed(QStringView s) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QLatin1StringView trimmed(QLatin1StringView s) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isLower(QStringView s) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isUpper(QStringView s) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QChar needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QLatin1StringView haystack, QChar needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+
+#if QT_CONFIG(regularexpression)
+// ### Qt 7: unify these overloads;
+// remove the ones taking only a QStringView, export the others, adjust callers
+[[nodiscard]] qsizetype indexOf(QStringView viewHaystack,
+ const QString *stringHaystack,
+ const QRegularExpression &re,
+ qsizetype from = 0,
+ QRegularExpressionMatch *rmatch = nullptr);
+[[nodiscard]] Q_CORE_EXPORT qsizetype indexOf(QStringView haystack,
+ const QRegularExpression &re,
+ qsizetype from = 0,
+ QRegularExpressionMatch *rmatch = nullptr);
+[[nodiscard]] qsizetype lastIndexOf(QStringView viewHaystack,
+ const QString *stringHaystack,
+ const QRegularExpression &re,
+ qsizetype from = -1,
+ QRegularExpressionMatch *rmatch = nullptr);
+[[nodiscard]] Q_CORE_EXPORT qsizetype lastIndexOf(QStringView haystack,
+ const QRegularExpression &re,
+ qsizetype from = -1,
+ QRegularExpressionMatch *rmatch = nullptr);
+[[nodiscard]] bool contains(QStringView viewHaystack,
+ const QString *stringHaystack,
+ const QRegularExpression &re,
+ QRegularExpressionMatch *rmatch = nullptr);
+[[nodiscard]] Q_CORE_EXPORT bool contains(QStringView haystack,
+ const QRegularExpression &re,
+ QRegularExpressionMatch *rmatch = nullptr);
+[[nodiscard]] Q_CORE_EXPORT qsizetype count(QStringView haystack, const QRegularExpression &re);
+#endif
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QChar needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT QString convertToQString(QAnyStringView s);
+
+[[nodiscard]] Q_CORE_EXPORT QByteArray convertToLatin1(QStringView str);
+[[nodiscard]] Q_CORE_EXPORT QByteArray convertToUtf8(QStringView str);
+[[nodiscard]] Q_CORE_EXPORT QByteArray convertToLocal8Bit(QStringView str);
+[[nodiscard]] Q_CORE_EXPORT QList<uint> convertToUcs4(QStringView str); // ### Qt 7 char32_t
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isRightToLeft(QStringView string) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QLatin1StringView s) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QStringView s) noexcept;
+[[nodiscard]] constexpr inline bool isLatin1(QLatin1StringView s) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isLatin1(QStringView s) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isValidUtf16(QStringView s) noexcept;
+
+template <typename Char, size_t N> [[nodiscard]] constexpr Q_ALWAYS_INLINE
+qsizetype lengthHelperContainerLoop(const Char (&str)[N])
+{
+#if defined(__cpp_lib_constexpr_algorithms) && defined(Q_CC_GNU_ONLY)
+ // libstdc++'s std::find / std::find_if manages to execute more steps
+ // than the loop below
+ const auto it = std::find(str, str + N, Char(0));
+ return it - str;
+#else
+ // std::char_traits<C> is deprecated for C not one of the standard char
+ // types, so we have to roll out our own loop.
+ for (size_t i = 0; i < N; ++i) {
+ if (str[i] == Char(0))
+ return qsizetype(i);
+ }
+ return qsizetype(N);
+#endif
+}
+
+template <typename Char, size_t N> [[nodiscard]] constexpr Q_ALWAYS_INLINE
+std::enable_if_t<sizeof(Char) == sizeof(char16_t), qsizetype>
+lengthHelperContainer(const Char (&str)[N])
+{
+ // The following values were empirically determined to detect the threshold
+ // at which the compiler gives up pre-calculating the std::find() below and
+ // instead inserts code to be executed at runtime.
+ constexpr size_t RuntimeThreshold =
+#if defined(Q_CC_CLANG)
+ // tested on Clang 15, 16 & 17
+ 1023
+#elif defined(Q_CC_GNU)
+ // tested through GCC 13.1 at -O3 compilation level
+ // note: at -O2, GCC always generates a loop!
+ __cplusplus >= 202002L ? 39 : 17
+#else
+ 0
+#endif
+ ;
+ if constexpr (N == 1) {
+ return str[0] == Char(0) ? 0 : 1;
+ } else if constexpr (N > RuntimeThreshold) {
+#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATED
+ if (!q20::is_constant_evaluated())
+ return QtPrivate::qustrnlen(reinterpret_cast<const char16_t *>(str), N);
+#endif
+ }
-Q_REQUIRED_RESULT Q_CORE_EXPORT QByteArray convertToLatin1(QStringView str);
-Q_REQUIRED_RESULT Q_CORE_EXPORT QByteArray convertToUtf8(QStringView str);
-Q_REQUIRED_RESULT Q_CORE_EXPORT QByteArray convertToLocal8Bit(QStringView str);
-Q_REQUIRED_RESULT Q_CORE_EXPORT QList<uint> convertToUcs4(QStringView str);
+ return lengthHelperContainerLoop(str);
+}
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isRightToLeft(QStringView string) noexcept;
+inline qsizetype qstrnlen_helper(const char *str, size_t maxlen)
+{
+#if !defined(Q_COMPILER_SLOW_QSTRNLEN_COMPILATION)
+ return qstrnlen(str, maxlen);
+#else
+ return strnlen_s(str, maxlen);
+#endif
+}
+
+template <typename Char, size_t N> [[nodiscard]] constexpr inline
+std::enable_if_t<sizeof(Char) == 1, qsizetype> lengthHelperContainer(const Char (&str)[N])
+{
+#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATED
+ if (!q20::is_constant_evaluated())
+ return qstrnlen_helper(reinterpret_cast<const char *>(str), N);
+#endif
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QLatin1String s) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QStringView s) noexcept;
-Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline bool isLatin1(QLatin1String s) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isLatin1(QStringView s) noexcept;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isValidUtf16(QStringView s) noexcept;
+ return lengthHelperContainerLoop(str);
+}
-} // namespace QtPRivate
+template <typename Container>
+constexpr qsizetype lengthHelperContainer(const Container &c) noexcept
+{
+ return qsizetype(std::size(c));
+}
+} // namespace QtPrivate
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringalgorithms_p.h b/src/corelib/text/qstringalgorithms_p.h
index 64d9f2e676..f34acb01e8 100644
--- a/src/corelib/text/qstringalgorithms_p.h
+++ b/src/corelib/text/qstringalgorithms_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGALGORITHMS_P_H
#define QSTRINGALGORITHMS_P_H
@@ -83,26 +47,34 @@ template <typename StringType> struct QStringAlgorithms
static inline StringType trimmed_helper_inplace(const NakedStringType &, const Char *, const Char *)
{
// can't happen
- Q_UNREACHABLE();
- return StringType();
+ Q_UNREACHABLE_RETURN(StringType());
}
- static inline void trimmed_helper_positions(const Char *&begin, const Char *&end)
+ struct TrimPositions {
+ const Char *begin;
+ const Char *end;
+ };
+ // Returns {begin, end} where:
+ // - "begin" refers to the first non-space character
+ // - if there is a sequence of one or more space chacaters at the end,
+ // "end" refers to the first character in that sequence, otherwise
+ // "end" is str.cend()
+ [[nodiscard]] static TrimPositions trimmed_helper_positions(const StringType &str)
{
+ const Char *begin = str.cbegin();
+ const Char *end = str.cend();
// skip white space from end
while (begin < end && isSpace(end[-1]))
--end;
// skip white space from start
while (begin < end && isSpace(*begin))
begin++;
+ return {begin, end};
}
static inline StringType trimmed_helper(StringType &str)
{
- const Char *begin = str.cbegin();
- const Char *end = str.cend();
- trimmed_helper_positions(begin, end);
-
+ const auto [begin, end] = trimmed_helper_positions(str);
if (begin == str.cbegin() && end == str.cend())
return str;
if (!isConst && str.isDetached())
@@ -137,7 +109,7 @@ template <typename StringType> struct QStringAlgorithms
if (ptr != dst && ptr[-1] == QChar::Space)
--ptr;
- int newlen = ptr - dst;
+ qsizetype newlen = ptr - dst;
if (isConst && newlen == str.size() && unmodified) {
// nothing happened, return the original
return str;
diff --git a/src/corelib/text/qstringbuilder.cpp b/src/corelib/text/qstringbuilder.cpp
index 4e47ba0922..738ce833ef 100644
--- a/src/corelib/text/qstringbuilder.cpp
+++ b/src/corelib/text/qstringbuilder.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstringbuilder.h"
#include <private/qstringconverter_p.h>
@@ -72,9 +36,9 @@ QT_BEGIN_NAMESPACE
For building QStrings:
\list
- \li QString, QStringRef, (since 5.10:) QStringView
+ \li QString, (since 5.10:) QStringView
\li QChar, QLatin1Char, (since 5.10:) \c char16_t,
- \li QLatin1String,
+ \li QLatin1StringView,
\li (since 5.10:) \c{const char16_t[]} (\c{u"foo"}),
\li QByteArray, \c char, \c{const char[]}.
\endlist
@@ -93,45 +57,61 @@ QT_BEGIN_NAMESPACE
if there are three or more of them, and performs equally well in other
cases.
- \sa QLatin1String, QString
+ \note Defining \c QT_USE_QSTRINGBUILDER at build time (this is the
+ default when building Qt libraries and tools), will make using \c {'+'}
+ when concatenating strings work the same way as \c operator%().
+
+ \sa QLatin1StringView, QString
*/
-/*! \fn template <typename A, typename B> QStringBuilder<A, B>::QStringBuilder(const A &a, const B &b)
- Constructs a QStringBuilder from \a a and \a b.
+/*!
+ \internal
+ \fn template <typename A, typename B> QStringBuilder<A, B>::QStringBuilder(const A &a, const B &b)
+
+ Constructs a QStringBuilder from \a a and \a b.
*/
-/* \fn template <typename A, typename B> QStringBuilder<A, B>::operator%(const A &a, const B &b)
+/*!
+ \internal
+ \fn template <typename A, typename B> QStringBuilder<A, B>::operator%(const A &a, const B &b)
Returns a \c QStringBuilder object that is converted to a QString object
when assigned to a variable of QString type or passed to a function that
takes a QString parameter.
- This function is usable with arguments of type \c QString,
- \c QLatin1String, \c QStringRef,
- \c QChar, \c QLatin1Char, and \c char.
+ This function is usable with arguments of any of the following types:
+ \list
+ \li \c QAnyStringView,
+ \li \c QString, \c QStringView
+ \li \c QByteArray, \c QByteArrayView, \c QLatin1StringView
+ \li \c QChar, \c QLatin1Char, \c char, (since 5.10:) \c char16_t
+ \li (since 5.10:) \c{const char16_t[]} (\c{u"foo"}),
+ \endlist
*/
-/* \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toLatin1() const
- Returns a Latin-1 representation of the string as a QByteArray. The
- returned byte array is undefined if the string contains non-Latin1
- characters.
- */
-/* \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toUtf8() const
- Returns a UTF-8 representation of the string as a QByteArray.
+/*!
+ \internal
+ \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toLatin1() const
+
+ Returns a Latin-1 representation of the string as a QByteArray. It
+ is undefined behavior if the string contains non-Latin1 characters.
*/
+/*!
+ \internal
+ \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toUtf8() const
+
+ Returns a UTF-8 representation of the string as a QByteArray.
+ */
/*!
\internal
+ Converts the UTF-8 string viewed by \a in to UTF-16 and writes the result
+ to the buffer starting at \a out.
*/
-void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out) noexcept
+void QAbstractConcatenable::convertFromUtf8(QByteArrayView in, QChar *&out) noexcept
{
- if (Q_UNLIKELY(len == -1)) {
- if (!a)
- return;
- len = int(strlen(a));
- }
- out = QUtf8::convertToUnicode(out, a, len);
+ out = QUtf8::convertToUnicode(out, in);
}
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringbuilder.h b/src/corelib/text/qstringbuilder.h
index 6ba01c0e30..853033b2d9 100644
--- a/src/corelib/text/qstringbuilder.h
+++ b/src/corelib/text/qstringbuilder.h
@@ -1,41 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <QtCore/qstring.h>
#ifndef QSTRINGBUILDER_H
#define QSTRINGBUILDER_H
@@ -47,7 +13,6 @@
#pragma qt_sync_stop_processing
#endif
-#include <QtCore/qstring.h>
#include <QtCore/qbytearray.h>
#include <string.h>
@@ -58,21 +23,33 @@ QT_BEGIN_NAMESPACE
struct Q_CORE_EXPORT QAbstractConcatenable
{
protected:
- static void convertFromAscii(const char *a, int len, QChar *&out) noexcept;
+ static void convertFromUtf8(QByteArrayView in, QChar *&out) noexcept;
static inline void convertFromAscii(char a, QChar *&out) noexcept
{
*out++ = QLatin1Char(a);
}
- static void appendLatin1To(const char *a, int len, QChar *out) noexcept;
+ static void appendLatin1To(QLatin1StringView in, QChar *out) noexcept;
};
-template <typename T> struct QConcatenable {};
+template <typename T> struct QConcatenable;
+
+template <typename T>
+using QConcatenableEx = QConcatenable<q20::remove_cvref_t<T>>;
namespace QtStringBuilder {
template <typename A, typename B> struct ConvertToTypeHelper
{ typedef A ConvertTo; };
template <typename T> struct ConvertToTypeHelper<T, QString>
{ typedef QString ConvertTo; };
+
+ template <typename T> using HasIsNull = decltype(std::declval<const T &>().isNull());
+ template <typename T> bool isNull(const T &t)
+ {
+ if constexpr (qxp::is_detected_v<HasIsNull, T>)
+ return t.isNull();
+ else
+ return false;
+ }
}
template<typename Builder, typename T>
@@ -99,28 +76,50 @@ struct QStringBuilderBase<Builder, QString> : public QStringBuilderCommon<Builde
};
template <typename A, typename B>
-class QStringBuilder : public QStringBuilderBase<QStringBuilder<A, B>, typename QtStringBuilder::ConvertToTypeHelper<typename QConcatenable<A>::ConvertTo, typename QConcatenable<B>::ConvertTo>::ConvertTo>
+class QStringBuilder : public QStringBuilderBase<QStringBuilder<A, B>,
+ typename QtStringBuilder::ConvertToTypeHelper<
+ typename QConcatenableEx<A>::ConvertTo,
+ typename QConcatenableEx<B>::ConvertTo
+ >::ConvertTo
+ >
{
public:
- QStringBuilder(const A &a_, const B &b_) : a(a_), b(b_) {}
+ QStringBuilder(A &&a_, B &&b_) : a(std::forward<A>(a_)), b(std::forward<B>(b_)) {}
+
+ QStringBuilder(QStringBuilder &&) = default;
+ QStringBuilder(const QStringBuilder &) = default;
+ ~QStringBuilder() = default;
+
private:
friend class QByteArray;
friend class QString;
template <typename T> T convertTo() const
{
- const uint len = QConcatenable< QStringBuilder<A, B> >::size(*this);
- T s(len, Qt::Uninitialized);
+ if (isNull()) {
+ // appending two null strings must give back a null string,
+ // so we're special casing this one out, QTBUG-114206
+ return T();
+ }
- // we abuse const_cast / constData here because we know we've just
- // allocated the data and we're the only reference count
- typename T::iterator d = const_cast<typename T::iterator>(s.constData());
- typename T::const_iterator const start = d;
- QConcatenable< QStringBuilder<A, B> >::appendTo(*this, d);
+ const qsizetype len = Concatenable::size(*this);
+ T s(len, Qt::Uninitialized);
- if (!QConcatenable< QStringBuilder<A, B> >::ExactSize && int(len) != d - start) {
- // this resize is necessary since we allocate a bit too much
- // when dealing with variable sized 8-bit encodings
- s.resize(int(d - start));
+ // Using data_ptr() here (private API) so we can bypass the
+ // isDetached() and the replacement of a null pointer with _empty in
+ // both QString and QByteArray's data() and constData(). The result is
+ // the same if len != 0.
+ auto d = reinterpret_cast<typename T::iterator>(s.data_ptr().data());
+ const auto start = d;
+ Concatenable::appendTo(*this, d);
+
+ if constexpr (Concatenable::ExactSize) {
+ Q_UNUSED(start)
+ } else {
+ if (len != d - start) {
+ // this resize is necessary since we allocate a bit too much
+ // when dealing with variable sized 8-bit encodings
+ s.resize(d - start);
+ }
}
return s;
}
@@ -130,55 +129,29 @@ public:
typedef typename Concatenable::ConvertTo ConvertTo;
operator ConvertTo() const { return convertTo<ConvertTo>(); }
- int size() const { return Concatenable::size(*this); }
-
- const A &a;
- const B &b;
-};
-
-template <>
-class QStringBuilder <QString, QString> : public QStringBuilderBase<QStringBuilder<QString, QString>, QString>
-{
- public:
- QStringBuilder(const QString &a_, const QString &b_) : a(a_), b(b_) {}
- QStringBuilder(const QStringBuilder &other) : a(other.a), b(other.b) {}
-
- operator QString() const
- { QString r(a); r += b; return r; }
-
- const QString &a;
- const QString &b;
-
- private:
- QStringBuilder &operator=(const QStringBuilder &) = delete;
-};
+ qsizetype size() const { return Concatenable::size(*this); }
-template <>
-class QStringBuilder <QByteArray, QByteArray> : public QStringBuilderBase<QStringBuilder<QByteArray, QByteArray>, QByteArray>
-{
- public:
- QStringBuilder(const QByteArray &a_, const QByteArray &b_) : a(a_), b(b_) {}
- QStringBuilder(const QStringBuilder &other) : a(other.a), b(other.b) {}
-
- operator QByteArray() const
- { QByteArray r(a); r += b; return r; }
+ bool isNull() const
+ {
+ return QtStringBuilder::isNull(a) && QtStringBuilder::isNull(b);
+ }
- const QByteArray &a;
- const QByteArray &b;
+ A a;
+ B b;
- private:
- QStringBuilder &operator=(const QStringBuilder &) = delete;
+private:
+ QStringBuilder &operator=(QStringBuilder &&) = delete;
+ QStringBuilder &operator=(const QStringBuilder &) = delete;
};
-
template <> struct QConcatenable<char> : private QAbstractConcatenable
{
typedef char type;
typedef QByteArray ConvertTo;
enum { ExactSize = true };
- static int size(const char) { return 1; }
+ static qsizetype size(const char) { return 1; }
#ifndef QT_NO_CAST_FROM_ASCII
- static inline QT_ASCII_CAST_WARN void appendTo(const char c, QChar *&out)
+ QT_ASCII_CAST_WARN static inline void appendTo(const char c, QChar *&out)
{
QAbstractConcatenable::convertFromAscii(c, out);
}
@@ -187,24 +160,43 @@ template <> struct QConcatenable<char> : private QAbstractConcatenable
{ *out++ = c; }
};
-#if defined(Q_COMPILER_UNICODE_STRINGS)
+template <> struct QConcatenable<QByteArrayView> : private QAbstractConcatenable
+{
+ typedef QByteArrayView type;
+ typedef QByteArray ConvertTo;
+ enum { ExactSize = true };
+ static qsizetype size(QByteArrayView bav) { return bav.size(); }
+#ifndef QT_NO_CAST_FROM_ASCII
+ QT_ASCII_CAST_WARN static inline void appendTo(QByteArrayView bav, QChar *&out)
+ {
+ QAbstractConcatenable::convertFromUtf8(bav, out);
+ }
+#endif
+ static inline void appendTo(QByteArrayView bav, char *&out)
+ {
+ qsizetype n = bav.size();
+ if (n)
+ memcpy(out, bav.data(), n);
+ out += n;
+ }
+};
+
template <> struct QConcatenable<char16_t> : private QAbstractConcatenable
{
typedef char16_t type;
typedef QString ConvertTo;
enum { ExactSize = true };
- static Q_DECL_CONSTEXPR int size(char16_t) { return 1; }
+ static constexpr qsizetype size(char16_t) { return 1; }
static inline void appendTo(char16_t c, QChar *&out)
{ *out++ = c; }
};
-#endif
template <> struct QConcatenable<QLatin1Char>
{
typedef QLatin1Char type;
typedef QString ConvertTo;
enum { ExactSize = true };
- static int size(const QLatin1Char) { return 1; }
+ static qsizetype size(const QLatin1Char) { return 1; }
static inline void appendTo(const QLatin1Char c, QChar *&out)
{ *out++ = c; }
static inline void appendTo(const QLatin1Char c, char *&out)
@@ -216,7 +208,7 @@ template <> struct QConcatenable<QChar> : private QAbstractConcatenable
typedef QChar type;
typedef QString ConvertTo;
enum { ExactSize = true };
- static int size(const QChar) { return 1; }
+ static qsizetype size(const QChar) { return 1; }
static inline void appendTo(const QChar c, QChar *&out)
{ *out++ = c; }
};
@@ -226,23 +218,23 @@ template <> struct QConcatenable<QChar::SpecialCharacter> : private QAbstractCon
typedef QChar::SpecialCharacter type;
typedef QString ConvertTo;
enum { ExactSize = true };
- static int size(const QChar::SpecialCharacter) { return 1; }
+ static qsizetype size(const QChar::SpecialCharacter) { return 1; }
static inline void appendTo(const QChar::SpecialCharacter c, QChar *&out)
{ *out++ = c; }
};
-template <> struct QConcatenable<QLatin1String> : private QAbstractConcatenable
+template <> struct QConcatenable<QLatin1StringView> : private QAbstractConcatenable
{
- typedef QLatin1String type;
+ typedef QLatin1StringView type;
typedef QString ConvertTo;
enum { ExactSize = true };
- static int size(const QLatin1String a) { return a.size(); }
- static inline void appendTo(const QLatin1String a, QChar *&out)
+ static qsizetype size(const QLatin1StringView a) { return a.size(); }
+ static inline void appendTo(const QLatin1StringView a, QChar *&out)
{
- appendLatin1To(a.latin1(), a.size(), out);
+ appendLatin1To(a, out);
out += a.size();
}
- static inline void appendTo(const QLatin1String a, char *&out)
+ static inline void appendTo(const QLatin1StringView a, char *&out)
{
if (const char *data = a.data()) {
memcpy(out, data, a.size());
@@ -256,25 +248,12 @@ template <> struct QConcatenable<QString> : private QAbstractConcatenable
typedef QString type;
typedef QString ConvertTo;
enum { ExactSize = true };
- static int size(const QString &a) { return a.size(); }
+ static qsizetype size(const QString &a) { return a.size(); }
static inline void appendTo(const QString &a, QChar *&out)
{
- const int n = a.size();
- memcpy(out, reinterpret_cast<const char*>(a.constData()), sizeof(QChar) * n);
- out += n;
- }
-};
-
-template <> struct QConcatenable<QStringRef> : private QAbstractConcatenable
-{
- typedef QStringRef type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(const QStringRef &a) { return a.size(); }
- static inline void appendTo(const QStringRef &a, QChar *&out)
- {
- const int n = a.size();
- memcpy(out, reinterpret_cast<const char*>(a.constData()), sizeof(QChar) * n);
+ const qsizetype n = a.size();
+ if (n)
+ memcpy(out, reinterpret_cast<const char*>(a.constData()), sizeof(QChar) * n);
out += n;
}
};
@@ -284,25 +263,26 @@ template <> struct QConcatenable<QStringView> : private QAbstractConcatenable
typedef QStringView type;
typedef QString ConvertTo;
enum { ExactSize = true };
- static int size(QStringView a) { return a.length(); }
+ static qsizetype size(QStringView a) { return a.size(); }
static inline void appendTo(QStringView a, QChar *&out)
{
const auto n = a.size();
- memcpy(out, a.data(), sizeof(QChar) * n);
+ if (n)
+ memcpy(out, a.data(), sizeof(QChar) * n);
out += n;
}
};
-template <int N> struct QConcatenable<const char[N]> : private QAbstractConcatenable
+template <qsizetype N> struct QConcatenable<const char[N]> : private QAbstractConcatenable
{
typedef const char type[N];
typedef QByteArray ConvertTo;
enum { ExactSize = false };
- static int size(const char[N]) { return N - 1; }
+ static qsizetype size(const char[N]) { return N - 1; }
#ifndef QT_NO_CAST_FROM_ASCII
- static inline void QT_ASCII_CAST_WARN appendTo(const char a[N], QChar *&out)
+ QT_ASCII_CAST_WARN static inline void appendTo(const char a[N], QChar *&out)
{
- QAbstractConcatenable::convertFromAscii(a, N - 1, out);
+ QAbstractConcatenable::convertFromUtf8(QByteArrayView(a, N - 1), out);
}
#endif
static inline void appendTo(const char a[N], char *&out)
@@ -312,7 +292,7 @@ template <int N> struct QConcatenable<const char[N]> : private QAbstractConcaten
}
};
-template <int N> struct QConcatenable<char[N]> : QConcatenable<const char[N]>
+template <qsizetype N> struct QConcatenable<char[N]> : QConcatenable<const char[N]>
{
typedef char type[N];
};
@@ -322,10 +302,10 @@ template <> struct QConcatenable<const char *> : private QAbstractConcatenable
typedef const char *type;
typedef QByteArray ConvertTo;
enum { ExactSize = false };
- static int size(const char *a) { return qstrlen(a); }
+ static qsizetype size(const char *a) { return qstrlen(a); }
#ifndef QT_NO_CAST_FROM_ASCII
- static inline void QT_ASCII_CAST_WARN appendTo(const char *a, QChar *&out)
- { QAbstractConcatenable::convertFromAscii(a, -1, out); }
+ QT_ASCII_CAST_WARN static inline void appendTo(const char *a, QChar *&out)
+ { QAbstractConcatenable::convertFromUtf8(QByteArrayView(a), out); }
#endif
static inline void appendTo(const char *a, char *&out)
{
@@ -341,21 +321,20 @@ template <> struct QConcatenable<char *> : QConcatenable<const char*>
typedef char *type;
};
-#if defined(Q_COMPILER_UNICODE_STRINGS)
-template <int N> struct QConcatenable<const char16_t[N]> : private QAbstractConcatenable
+template <qsizetype N> struct QConcatenable<const char16_t[N]> : private QAbstractConcatenable
{
using type = const char16_t[N];
using ConvertTo = QString;
enum { ExactSize = true };
- static int size(const char16_t[N]) { return N - 1; }
+ static qsizetype size(const char16_t[N]) { return N - 1; }
static void appendTo(const char16_t a[N], QChar *&out)
{
- memcpy(out, a, (N - 1) * sizeof(char16_t));
+ memcpy(static_cast<void *>(out), a, (N - 1) * sizeof(char16_t));
out += N - 1;
}
};
-template <int N> struct QConcatenable<char16_t[N]> : QConcatenable<const char16_t[N]>
+template <qsizetype N> struct QConcatenable<char16_t[N]> : QConcatenable<const char16_t[N]>
{
using type = char16_t[N];
};
@@ -365,8 +344,8 @@ template <> struct QConcatenable<const char16_t *> : private QAbstractConcatenab
using type = const char16_t *;
using ConvertTo = QString;
enum { ExactSize = true };
- static int size(const char16_t *a) { return QStringView(a).length(); }
- static inline void QT_ASCII_CAST_WARN appendTo(const char16_t *a, QChar *&out)
+ static qsizetype size(const char16_t *a) { return QStringView(a).size(); }
+ QT_ASCII_CAST_WARN static inline void appendTo(const char16_t *a, QChar *&out)
{
if (!a)
return;
@@ -379,26 +358,25 @@ template <> struct QConcatenable<char16_t *> : QConcatenable<const char16_t*>
{
typedef char16_t *type;
};
-#endif // UNICODE_STRINGS
template <> struct QConcatenable<QByteArray> : private QAbstractConcatenable
{
typedef QByteArray type;
typedef QByteArray ConvertTo;
enum { ExactSize = false };
- static int size(const QByteArray &ba) { return ba.size(); }
+ static qsizetype size(const QByteArray &ba) { return ba.size(); }
#ifndef QT_NO_CAST_FROM_ASCII
- static inline QT_ASCII_CAST_WARN void appendTo(const QByteArray &ba, QChar *&out)
+ QT_ASCII_CAST_WARN static inline void appendTo(const QByteArray &ba, QChar *&out)
{
- QAbstractConcatenable::convertFromAscii(ba.constData(), ba.size(), out);
+ QAbstractConcatenable::convertFromUtf8(ba, out);
}
#endif
static inline void appendTo(const QByteArray &ba, char *&out)
{
- const char *a = ba.constData();
- const char * const end = ba.end();
- while (a != end)
- *out++ = *a++;
+ const qsizetype n = ba.size();
+ if (n)
+ memcpy(out, ba.begin(), n);
+ out += n;
}
};
@@ -407,34 +385,37 @@ template <typename A, typename B>
struct QConcatenable< QStringBuilder<A, B> >
{
typedef QStringBuilder<A, B> type;
- typedef typename QtStringBuilder::ConvertToTypeHelper<typename QConcatenable<A>::ConvertTo, typename QConcatenable<B>::ConvertTo>::ConvertTo ConvertTo;
- enum { ExactSize = QConcatenable<A>::ExactSize && QConcatenable<B>::ExactSize };
- static int size(const type &p)
+ using ConvertTo = typename QtStringBuilder::ConvertToTypeHelper<
+ typename QConcatenableEx<A>::ConvertTo,
+ typename QConcatenableEx<B>::ConvertTo
+ >::ConvertTo;
+ enum { ExactSize = QConcatenableEx<A>::ExactSize && QConcatenableEx<B>::ExactSize };
+ static qsizetype size(const type &p)
{
- return QConcatenable<A>::size(p.a) + QConcatenable<B>::size(p.b);
+ return QConcatenableEx<A>::size(p.a) + QConcatenableEx<B>::size(p.b);
}
template<typename T> static inline void appendTo(const type &p, T *&out)
{
- QConcatenable<A>::appendTo(p.a, out);
- QConcatenable<B>::appendTo(p.b, out);
+ QConcatenableEx<A>::appendTo(p.a, out);
+ QConcatenableEx<B>::appendTo(p.b, out);
}
};
-template <typename A, typename B>
-QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>
-operator%(const A &a, const B &b)
+template <typename A, typename B,
+ typename = std::void_t<typename QConcatenableEx<A>::type, typename QConcatenableEx<B>::type>>
+auto operator%(A &&a, B &&b)
{
- return QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>(a, b);
+ return QStringBuilder<A, B>(std::forward<A>(a), std::forward<B>(b));
}
// QT_USE_FAST_OPERATOR_PLUS was introduced in 4.7, QT_USE_QSTRINGBUILDER is to be used from 4.8 onwards
// QT_USE_FAST_OPERATOR_PLUS does not remove the normal operator+ for QByteArray
#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
-template <typename A, typename B>
-QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>
-operator+(const A &a, const B &b)
+template <typename A, typename B,
+ typename = std::void_t<typename QConcatenableEx<A>::type, typename QConcatenableEx<B>::type>>
+auto operator+(A &&a, B &&b)
{
- return QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>(a, b);
+ return std::forward<A>(a) % std::forward<B>(b);
}
#endif
@@ -443,8 +424,10 @@ template <typename A, typename B>
QByteArray &appendToByteArray(QByteArray &a, const QStringBuilder<A, B> &b, char)
{
// append 8-bit data to a byte array
- int len = a.size() + QConcatenable< QStringBuilder<A, B> >::size(b);
- a.reserve(len);
+ qsizetype len = a.size() + QConcatenable< QStringBuilder<A, B> >::size(b);
+ a.detach(); // a detach() in a.data() could reset a.capacity() to a.size()
+ if (len > a.data_ptr().freeSpaceAtEnd()) // capacity() was broken when prepend()-optimization landed
+ a.reserve(qMax(len, 2 * a.capacity()));
char *it = a.data() + a.size();
QConcatenable< QStringBuilder<A, B> >::appendTo(b, it);
a.resize(len); //we need to resize after the appendTo for the case str+=foo+str
@@ -470,15 +453,17 @@ QByteArray &operator+=(QByteArray &a, const QStringBuilder<A, B> &b)
template <typename A, typename B>
QString &operator+=(QString &a, const QStringBuilder<A, B> &b)
{
- int len = a.size() + QConcatenable< QStringBuilder<A, B> >::size(b);
- a.reserve(len);
+ qsizetype len = a.size() + QConcatenable< QStringBuilder<A, B> >::size(b);
+ a.detach(); // a detach() in a.data() could reset a.capacity() to a.size()
+ if (len > a.data_ptr().freeSpaceAtEnd()) // capacity() was broken when prepend()-optimization landed
+ a.reserve(qMax(len, 2 * a.capacity()));
QChar *it = a.data() + a.size();
QConcatenable< QStringBuilder<A, B> >::appendTo(b, it);
- a.resize(int(it - a.constData())); //may be smaller than len if there was conversion from utf8
+ // we need to resize after the appendTo for the case str+=foo+str
+ a.resize(it - a.constData()); //may be smaller than len if there was conversion from utf8
return a;
}
-
QT_END_NAMESPACE
#endif // QSTRINGBUILDER_H
diff --git a/src/corelib/text/qstringconverter.cpp b/src/corelib/text/qstringconverter.cpp
index 30da0add8f..565e3e598b 100644
--- a/src/corelib/text/qstringconverter.cpp
+++ b/src/corelib/text/qstringconverter.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qstringconverter.h>
#include <private/qstringconverter_p.h>
@@ -44,33 +8,64 @@
#include "private/qsimd_p.h"
#include "private/qstringiterator_p.h"
+#include "private/qtools_p.h"
#include "qbytearraymatcher.h"
+#include "qcontainertools_impl.h"
+#include <QtCore/qbytearraylist.h>
+
+#if QT_CONFIG(icu)
+#include <unicode/ucnv.h>
+#include <unicode/ucnv_cb.h>
+#include <unicode/ucnv_err.h>
+#include <unicode/ustring.h>
+#endif
#ifdef Q_OS_WIN
#include <qt_windows.h>
+#ifndef QT_BOOTSTRAPPED
+#include <QtCore/qvarlengtharray.h>
+#include <QtCore/q20iterator.h>
+#include <QtCore/private/qnumeric_p.h>
+#endif // !QT_BOOTSTRAPPED
+#endif
+
+#include <array>
+
+#if __has_include(<bit>) && __cplusplus > 201703L
+#include <bit>
#endif
QT_BEGIN_NAMESPACE
+using namespace QtMiscUtils;
+
+static_assert(std::is_nothrow_move_constructible_v<QStringEncoder>);
+static_assert(std::is_nothrow_move_assignable_v<QStringEncoder>);
+static_assert(std::is_nothrow_move_constructible_v<QStringDecoder>);
+static_assert(std::is_nothrow_move_assignable_v<QStringDecoder>);
+
enum { Endian = 0, Data = 1 };
static const uchar utf8bom[] = { 0xef, 0xbb, 0xbf };
-#if (defined(__SSE2__) && defined(QT_COMPILER_SUPPORTS_SSE2)) \
- || (defined(__ARM_NEON__) && defined(Q_PROCESSOR_ARM_64))
+#if defined(__SSE2__) || defined(__ARM_NEON__)
static Q_ALWAYS_INLINE uint qBitScanReverse(unsigned v) noexcept
{
+#if defined(__cpp_lib_int_pow2) && __cpp_lib_int_pow2 >= 202002L
+ return std::bit_width(v) - 1;
+#else
uint result = qCountLeadingZeroBits(v);
// Now Invert the result: clz will count *down* from the msb to the lsb, so the msb index is 31
// and the lsb index is 0. The result for _bit_scan_reverse is expected to be the index when
// counting up: msb index is 0 (because it starts there), and the lsb index is 31.
result ^= sizeof(unsigned) * 8 - 1;
return result;
+#endif
}
#endif
-#if defined(__SSE2__) && defined(QT_COMPILER_SUPPORTS_SSE2)
-static inline bool simdEncodeAscii(uchar *&dst, const ushort *&nextAscii, const ushort *&src, const ushort *end)
+#if defined(__SSE2__)
+static inline bool simdEncodeAscii(uchar *&dst, const char16_t *&nextAscii, const char16_t *&src, const char16_t *end)
{
// do sixteen characters at a time
for ( ; end - src >= 16; src += 16, dst += 16) {
@@ -134,7 +129,7 @@ static inline bool simdEncodeAscii(uchar *&dst, const ushort *&nextAscii, const
return src == end;
}
-static inline bool simdDecodeAscii(ushort *&dst, const uchar *&nextAscii, const uchar *&src, const uchar *end)
+static inline bool simdDecodeAscii(char16_t *&dst, const uchar *&nextAscii, const uchar *&src, const uchar *end)
{
// do sixteen characters at a time
for ( ; end - src >= 16; src += 16, dst += 16) {
@@ -206,14 +201,14 @@ static inline const uchar *simdFindNonAscii(const uchar *src, const uchar *end,
#ifdef __AVX2__
// do 32 characters at a time
// (this is similar to simdTestMask in qstring.cpp)
- const __m256i mask = _mm256_set1_epi8(0x80);
+ const __m256i mask = _mm256_set1_epi8(char(0x80));
for ( ; end - src >= 32; src += 32) {
__m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(src));
if (_mm256_testz_si256(mask, data))
continue;
uint n = _mm256_movemask_epi8(data);
- Q_ASSUME(n);
+ Q_ASSERT(n);
// find the next probable ASCII character
// we don't want to load 32 bytes again in this loop if we know there are non-ASCII
@@ -260,8 +255,100 @@ static inline const uchar *simdFindNonAscii(const uchar *src, const uchar *end,
nextAscii = end;
return src;
}
-#elif defined(__ARM_NEON__) && defined(Q_PROCESSOR_ARM_64) // vaddv is only available on Aarch64
-static inline bool simdEncodeAscii(uchar *&dst, const ushort *&nextAscii, const ushort *&src, const ushort *end)
+
+// Compare only the US-ASCII beginning of [src8, end8) and [src16, end16)
+// and advance src8 and src16 to the first character that could not be compared
+static void simdCompareAscii(const qchar8_t *&src8, const qchar8_t *end8, const char16_t *&src16, const char16_t *end16)
+{
+ int bitSpacing = 1;
+ qptrdiff len = qMin(end8 - src8, end16 - src16);
+ qptrdiff offset = 0;
+ uint mask = 0;
+
+ // do sixteen characters at a time
+ for ( ; offset + 16 < len; offset += 16) {
+ __m128i data8 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src8 + offset));
+#ifdef __AVX2__
+ // AVX2 version, use 256-bit registers and VPMOVXZBW
+ __m256i data16 = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(src16 + offset));
+
+ // expand US-ASCII as if it were Latin1 and confirm it's US-ASCII
+ __m256i datax8 = _mm256_cvtepu8_epi16(data8);
+ mask = _mm256_movemask_epi8(datax8);
+ if (mask)
+ break;
+
+ // compare Latin1 to UTF-16
+ __m256i latin1cmp = _mm256_cmpeq_epi16(datax8, data16);
+ mask = ~_mm256_movemask_epi8(latin1cmp);
+ if (mask)
+ break;
+#else
+ // non-AVX2 code
+ __m128i datalo16 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src16 + offset));
+ __m128i datahi16 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src16 + offset) + 1);
+
+ // expand US-ASCII as if it were Latin1, we'll confirm later
+ __m128i datalo8 = _mm_unpacklo_epi8(data8, _mm_setzero_si128());
+ __m128i datahi8 = _mm_unpackhi_epi8(data8, _mm_setzero_si128());
+
+ // compare Latin1 to UTF-16
+ __m128i latin1cmplo = _mm_cmpeq_epi16(datalo8, datalo16);
+ __m128i latin1cmphi = _mm_cmpeq_epi16(datahi8, datahi16);
+ mask = _mm_movemask_epi8(latin1cmphi) << 16;
+ mask |= ushort(_mm_movemask_epi8(latin1cmplo));
+ mask = ~mask;
+ if (mask)
+ break;
+
+ // confirm it was US-ASCII
+ mask = _mm_movemask_epi8(data8);
+ if (mask) {
+ bitSpacing = 0;
+ break;
+ }
+#endif
+ }
+
+ // helper for comparing 4 or 8 characters
+ auto cmp_lt_16 = [&mask, &offset](int n, __m128i data8, __m128i data16) {
+ // n = 4 -> sizemask = 0xff
+ // n = 8 -> sizemask = 0xffff
+ unsigned sizemask = (1U << (2 * n)) - 1;
+
+ // expand as if Latin1
+ data8 = _mm_unpacklo_epi8(data8, _mm_setzero_si128());
+
+ // compare and confirm it's US-ASCII
+ __m128i latin1cmp = _mm_cmpeq_epi16(data8, data16);
+ mask = ~_mm_movemask_epi8(latin1cmp) & sizemask;
+ mask |= _mm_movemask_epi8(data8);
+ if (mask == 0)
+ offset += n;
+ };
+
+ // do eight characters at a time
+ if (mask == 0 && offset + 8 < len) {
+ __m128i data8 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src8 + offset));
+ __m128i data16 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src16 + offset));
+ cmp_lt_16(8, data8, data16);
+ }
+
+ // do four characters
+ if (mask == 0 && offset + 4 < len) {
+ __m128i data8 = _mm_cvtsi32_si128(qFromUnaligned<quint32>(src8 + offset));
+ __m128i data16 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src16 + offset));
+ cmp_lt_16(4, data8, data16);
+ }
+
+ // correct the source pointers to point to the first character we couldn't deal with
+ if (mask)
+ offset += qCountTrailingZeroBits(mask) >> bitSpacing;
+ src8 += offset;
+ src16 += offset;
+}
+#elif defined(__ARM_NEON__)
+static inline bool simdEncodeAscii(uchar *&dst, const char16_t *&nextAscii, const char16_t *&src, const char16_t *end)
{
uint16x8_t maxAscii = vdupq_n_u16(0x7f);
uint16x8_t mask1 = { 1, 1 << 2, 1 << 4, 1 << 6, 1 << 8, 1 << 10, 1 << 12, 1 << 14 };
@@ -270,7 +357,7 @@ static inline bool simdEncodeAscii(uchar *&dst, const ushort *&nextAscii, const
// do sixteen characters at a time
for ( ; end - src >= 16; src += 16, dst += 16) {
// load 2 lanes (or: "load interleaved")
- uint16x8x2_t in = vld2q_u16(src);
+ uint16x8x2_t in = vld2q_u16(reinterpret_cast<const uint16_t *>(src));
// check if any of the elements > 0x7f, select 1 bit per element (element 0 -> bit 0, element 1 -> bit 1, etc),
// add those together into a scalar, and merge the scalars.
@@ -298,7 +385,7 @@ static inline bool simdEncodeAscii(uchar *&dst, const ushort *&nextAscii, const
return src == end;
}
-static inline bool simdDecodeAscii(ushort *&dst, const uchar *&nextAscii, const uchar *&src, const uchar *end)
+static inline bool simdDecodeAscii(char16_t *&dst, const uchar *&nextAscii, const uchar *&src, const uchar *end)
{
// do eight characters at a time
uint8x8_t msb_mask = vdup_n_u8(0x80);
@@ -308,7 +395,7 @@ static inline bool simdDecodeAscii(ushort *&dst, const uchar *&nextAscii, const
uint8_t n = vaddv_u8(vand_u8(vcge_u8(c, msb_mask), add_mask));
if (!n) {
// store
- vst1q_u16(dst, vmovl_u8(c));
+ vst1q_u16(reinterpret_cast<uint16_t *>(dst), vmovl_u8(c));
continue;
}
@@ -356,13 +443,17 @@ static inline const uchar *simdFindNonAscii(const uchar *src, const uchar *end,
nextAscii = end;
return src;
}
+
+static void simdCompareAscii(const qchar8_t *&, const qchar8_t *, const char16_t *&, const char16_t *)
+{
+}
#else
-static inline bool simdEncodeAscii(uchar *, const ushort *, const ushort *, const ushort *)
+static inline bool simdEncodeAscii(uchar *, const char16_t *, const char16_t *, const char16_t *)
{
return false;
}
-static inline bool simdDecodeAscii(ushort *, const uchar *, const uchar *, const uchar *)
+static inline bool simdDecodeAscii(char16_t *, const uchar *, const uchar *, const uchar *)
{
return false;
}
@@ -372,26 +463,32 @@ static inline const uchar *simdFindNonAscii(const uchar *src, const uchar *end,
nextAscii = end;
return src;
}
+
+static void simdCompareAscii(const qchar8_t *&, const qchar8_t *, const char16_t *&, const char16_t *)
+{
+}
#endif
enum { HeaderDone = 1 };
-QByteArray QUtf8::convertFromUnicode(const QChar *uc, qsizetype len)
+QByteArray QUtf8::convertFromUnicode(QStringView in)
{
+ qsizetype len = in.size();
+
// create a QByteArray with the worst case scenario size
QByteArray result(len * 3, Qt::Uninitialized);
uchar *dst = reinterpret_cast<uchar *>(const_cast<char *>(result.constData()));
- const ushort *src = reinterpret_cast<const ushort *>(uc);
- const ushort *const end = src + len;
+ const char16_t *src = reinterpret_cast<const char16_t *>(in.data());
+ const char16_t *const end = src + len;
while (src != end) {
- const ushort *nextAscii = end;
+ const char16_t *nextAscii = end;
if (simdEncodeAscii(dst, nextAscii, src, end))
break;
do {
- ushort uc = *src++;
- int res = QUtf8Functions::toUtf8<QUtf8BaseTraits>(uc, dst, src, end);
+ char16_t u = *src++;
+ int res = QUtf8Functions::toUtf8<QUtf8BaseTraits>(u, dst, src, end);
if (res < 0) {
// encoding error - append '?'
*dst++ = '?';
@@ -403,10 +500,10 @@ QByteArray QUtf8::convertFromUnicode(const QChar *uc, qsizetype len)
return result;
}
-QByteArray QUtf8::convertFromUnicode(const QChar *uc, qsizetype len, QStringConverterBase::State *state)
+QByteArray QUtf8::convertFromUnicode(QStringView in, QStringConverterBase::State *state)
{
- QByteArray ba(3*len +3, Qt::Uninitialized);
- char *end = convertFromUnicode(ba.data(), QStringView(uc, len), state);
+ QByteArray ba(3*in.size() +3, Qt::Uninitialized);
+ char *end = convertFromUnicode(ba.data(), in, state);
ba.truncate(end - ba.data());
return ba;
}
@@ -414,8 +511,7 @@ QByteArray QUtf8::convertFromUnicode(const QChar *uc, qsizetype len, QStringConv
char *QUtf8::convertFromUnicode(char *out, QStringView in, QStringConverter::State *state)
{
Q_ASSERT(state);
- const QChar *uc = in.data();
- qsizetype len = in.length();
+ qsizetype len = in.size();
if (!len)
return out;
@@ -432,8 +528,8 @@ char *QUtf8::convertFromUnicode(char *out, QStringView in, QStringConverter::Sta
};
uchar *cursor = reinterpret_cast<uchar *>(out);
- const ushort *src = reinterpret_cast<const ushort *>(uc);
- const ushort *const end = src + len;
+ const char16_t *src = in.utf16();
+ const char16_t *const end = src + len;
if (!(state->flags & QStringDecoder::Flag::Stateless)) {
if (state->remainingChars) {
@@ -452,12 +548,12 @@ char *QUtf8::convertFromUnicode(char *out, QStringView in, QStringConverter::Sta
}
while (src != end) {
- const ushort *nextAscii = end;
+ const char16_t *nextAscii = end;
if (simdEncodeAscii(cursor, nextAscii, src, end))
break;
do {
- ushort uc = *src++;
+ char16_t uc = *src++;
int res = QUtf8Functions::toUtf8<QUtf8BaseTraits>(uc, cursor, src, end);
if (Q_LIKELY(res >= 0))
continue;
@@ -482,7 +578,22 @@ char *QUtf8::convertFromUnicode(char *out, QStringView in, QStringConverter::Sta
return reinterpret_cast<char *>(cursor);
}
-QString QUtf8::convertToUnicode(const char *chars, qsizetype len)
+char *QUtf8::convertFromLatin1(char *out, QLatin1StringView in)
+{
+ // ### SIMD-optimize:
+ for (uchar ch : in) {
+ if (ch < 128) {
+ *out++ = ch;
+ } else {
+ // as per https://en.wikipedia.org/wiki/UTF-8#Encoding, 2nd row
+ *out++ = 0b110'0'0000u | (ch >> 6);
+ *out++ = 0b10'00'0000u | (ch & 0b0011'1111);
+ }
+ }
+ return out;
+}
+
+QString QUtf8::convertToUnicode(QByteArrayView in)
{
// UTF-8 to UTF-16 always needs the exact same number of words or less:
// UTF-8 UTF-16
@@ -496,21 +607,21 @@ QString QUtf8::convertToUnicode(const char *chars, qsizetype len)
//
// The table holds for invalid sequences too: we'll insert one replacement char
// per invalid byte.
- QString result(len, Qt::Uninitialized);
+ QString result(in.size(), Qt::Uninitialized);
QChar *data = const_cast<QChar*>(result.constData()); // we know we're not shared
- const QChar *end = convertToUnicode(data, chars, len);
+ const QChar *end = convertToUnicode(data, in);
result.truncate(end - data);
return result;
}
-/*!
- \since 5.7
+/*! \internal
+ \since 6.6
\overload
- Converts the UTF-8 sequence of \a len octets beginning at \a chars to
- a sequence of QChar starting at \a buffer. The buffer is expected to be
- large enough to hold the result. An upper bound for the size of the
- buffer is \a len QChars.
+ Converts the UTF-8 sequence of bytes viewed by \a in to a sequence of
+ QChar starting at \a dst in the destination buffer. The buffer is expected
+ to be large enough to hold the result. An upper bound for the size of the
+ buffer is \c in.size() QChars.
If, during decoding, an error occurs, a QChar::ReplacementCharacter is
written.
@@ -518,20 +629,22 @@ QString QUtf8::convertToUnicode(const char *chars, qsizetype len)
Returns a pointer to one past the last QChar written.
This function never throws.
-*/
-QChar *QUtf8::convertToUnicode(QChar *buffer, const char *chars, qsizetype len) noexcept
+ For QChar buffers, instead of casting manually, you can use the static
+ QUtf8::convertToUnicode(QChar *, QByteArrayView) directly.
+*/
+char16_t *QUtf8::convertToUnicode(char16_t *dst, QByteArrayView in) noexcept
{
- ushort *dst = reinterpret_cast<ushort *>(buffer);
- const uchar *src = reinterpret_cast<const uchar *>(chars);
- const uchar *end = src + len;
+ const uchar *const start = reinterpret_cast<const uchar *>(in.data());
+ const uchar *src = start;
+ const uchar *end = src + in.size();
// attempt to do a full decoding in SIMD
const uchar *nextAscii = end;
if (!simdDecodeAscii(dst, nextAscii, src, end)) {
// at least one non-ASCII entry
// check if we failed to decode the UTF-8 BOM; if so, skip it
- if (Q_UNLIKELY(src == reinterpret_cast<const uchar *>(chars))
+ if (Q_UNLIKELY(src == start)
&& end - src >= 3
&& Q_UNLIKELY(src[0] == utf8bom[0] && src[1] == utf8bom[1] && src[2] == utf8bom[2])) {
src += 3;
@@ -544,7 +657,7 @@ QChar *QUtf8::convertToUnicode(QChar *buffer, const char *chars, qsizetype len)
do {
uchar b = *src++;
- int res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, dst, src, end);
+ const qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, dst, src, end);
if (res < 0) {
// decoding error
*dst++ = QChar::ReplacementCharacter;
@@ -553,10 +666,10 @@ QChar *QUtf8::convertToUnicode(QChar *buffer, const char *chars, qsizetype len)
}
}
- return reinterpret_cast<QChar *>(dst);
+ return dst;
}
-QString QUtf8::convertToUnicode(const char *chars, qsizetype len, QStringConverter::State *state)
+QString QUtf8::convertToUnicode(QByteArrayView in, QStringConverter::State *state)
{
// See above for buffer requirements for stateless decoding. However, that
// fails if the state is not empty. The following situations can add to the
@@ -568,28 +681,29 @@ QString QUtf8::convertToUnicode(const char *chars, qsizetype len, QStringConvert
// 1 of 2 bytes invalid continuation +1 (need to insert replacement and restart)
// 2 of 3 bytes same +1 (same)
// 3 of 4 bytes same +1 (same)
- QString result(len + 1, Qt::Uninitialized);
- QChar *end = convertToUnicode(result.data(), chars, len, state);
+ QString result(in.size() + 1, Qt::Uninitialized);
+ QChar *end = convertToUnicode(result.data(), in, state);
result.truncate(end - result.constData());
return result;
}
-QChar *QUtf8::convertToUnicode(QChar *out, const char *chars, qsizetype len, QStringConverter::State *state)
+char16_t *QUtf8::convertToUnicode(char16_t *dst, QByteArrayView in, QStringConverter::State *state)
{
+ qsizetype len = in.size();
+
Q_ASSERT(state);
if (!len)
- return out;
+ return dst;
- ushort replacement = QChar::ReplacementCharacter;
+ char16_t replacement = QChar::ReplacementCharacter;
if (state->flags & QStringConverter::Flag::ConvertInvalidToNull)
replacement = QChar::Null;
- int res;
+ qsizetype res;
uchar ch = 0;
- ushort *dst = reinterpret_cast<ushort *>(out);
- const uchar *src = reinterpret_cast<const uchar *>(chars);
+ const uchar *src = reinterpret_cast<const uchar *>(in.data());
const uchar *end = src + len;
if (!(state->flags & QStringConverter::Flag::Stateless)) {
@@ -616,7 +730,7 @@ QChar *QUtf8::convertToUnicode(QChar *out, const char *chars, qsizetype len, QSt
// copy to our state and return
state->remainingChars = remainingCharsCount + newCharsToCopy;
memcpy(&state->state_data[0], remainingCharsData, state->remainingChars);
- return out;
+ return dst;
} else if (!headerdone) {
// eat the UTF-8 BOM
if (dst[-1] == 0xfeff)
@@ -672,20 +786,20 @@ QChar *QUtf8::convertToUnicode(QChar *out, const char *chars, qsizetype len, QSt
state->remainingChars = 0;
}
- return reinterpret_cast<QChar *>(dst);
+ return dst;
}
struct QUtf8NoOutputTraits : public QUtf8BaseTraitsNoAscii
{
struct NoOutput {};
- static void appendUtf16(const NoOutput &, ushort) {}
- static void appendUcs4(const NoOutput &, uint) {}
+ static void appendUtf16(const NoOutput &, char16_t) {}
+ static void appendUcs4(const NoOutput &, char32_t) {}
};
-QUtf8::ValidUtf8Result QUtf8::isValidUtf8(const char *chars, qsizetype len)
+QUtf8::ValidUtf8Result QUtf8::isValidUtf8(QByteArrayView in)
{
- const uchar *src = reinterpret_cast<const uchar *>(chars);
- const uchar *end = src + len;
+ const uchar *src = reinterpret_cast<const uchar *>(in.data());
+ const uchar *end = src + in.size();
const uchar *nextAscii = src;
bool isValidAscii = true;
@@ -702,7 +816,7 @@ QUtf8::ValidUtf8Result QUtf8::isValidUtf8(const char *chars, qsizetype len)
isValidAscii = false;
QUtf8NoOutputTraits::NoOutput output;
- int res = QUtf8Functions::fromUtf8<QUtf8NoOutputTraits>(b, output, src, end);
+ const qsizetype res = QUtf8Functions::fromUtf8<QUtf8NoOutputTraits>(b, output, src, end);
if (res < 0) {
// decoding error
return { false, false };
@@ -713,49 +827,113 @@ QUtf8::ValidUtf8Result QUtf8::isValidUtf8(const char *chars, qsizetype len)
return { true, isValidAscii };
}
-int QUtf8::compareUtf8(const char *utf8, qsizetype u8len, const QChar *utf16, qsizetype u16len)
+int QUtf8::compareUtf8(QByteArrayView utf8, QStringView utf16, Qt::CaseSensitivity cs) noexcept
{
- uint uc1, uc2;
- auto src1 = reinterpret_cast<const uchar *>(utf8);
- auto end1 = src1 + u8len;
- QStringIterator src2(utf16, utf16 + u16len);
+ auto src1 = reinterpret_cast<const qchar8_t *>(utf8.data());
+ auto end1 = src1 + utf8.size();
+ auto src2 = reinterpret_cast<const char16_t *>(utf16.data());
+ auto end2 = src2 + utf16.size();
+
+ do {
+ simdCompareAscii(src1, end1, src2, end2);
+
+ if (src1 < end1 && src2 < end2) {
+ char32_t uc1 = *src1++;
+ char32_t uc2 = *src2++;
+
+ if (uc1 >= 0x80) {
+ char32_t *output = &uc1;
+ qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraitsNoAscii>(uc1, output, src1, end1);
+ if (res < 0) {
+ // decoding error
+ uc1 = QChar::ReplacementCharacter;
+ }
- while (src1 < end1 && src2.hasNext()) {
+ // Only decode the UTF-16 surrogate pair if the UTF-8 code point
+ // wasn't US-ASCII (a surrogate cannot match US-ASCII).
+ if (QChar::isHighSurrogate(uc2) && src2 < end2 && QChar::isLowSurrogate(*src2))
+ uc2 = QChar::surrogateToUcs4(uc2, *src2++);
+ }
+ if (cs == Qt::CaseInsensitive) {
+ uc1 = QChar::toCaseFolded(uc1);
+ uc2 = QChar::toCaseFolded(uc2);
+ }
+ if (uc1 != uc2)
+ return int(uc1) - int(uc2);
+ }
+ } while (src1 < end1 && src2 < end2);
+
+ // the shorter string sorts first
+ return (end1 > src1) - int(end2 > src2);
+}
+
+int QUtf8::compareUtf8(QByteArrayView utf8, QLatin1StringView s, Qt::CaseSensitivity cs)
+{
+ char32_t uc1 = QChar::Null;
+ auto src1 = reinterpret_cast<const uchar *>(utf8.data());
+ auto end1 = src1 + utf8.size();
+ auto src2 = reinterpret_cast<const uchar *>(s.latin1());
+ auto end2 = src2 + s.size();
+
+ while (src1 < end1 && src2 < end2) {
uchar b = *src1++;
- uint *output = &uc1;
- int res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src1, end1);
+ char32_t *output = &uc1;
+ const qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src1, end1);
if (res < 0) {
// decoding error
uc1 = QChar::ReplacementCharacter;
}
- uc2 = src2.next();
+ char32_t uc2 = *src2++;
+ if (cs == Qt::CaseInsensitive) {
+ uc1 = QChar::toCaseFolded(uc1);
+ uc2 = QChar::toCaseFolded(uc2);
+ }
if (uc1 != uc2)
return int(uc1) - int(uc2);
}
// the shorter string sorts first
- return (end1 > src1) - int(src2.hasNext());
+ return (end1 > src1) - (end2 > src2);
}
-int QUtf8::compareUtf8(const char *utf8, qsizetype u8len, QLatin1String s)
+int QUtf8::compareUtf8(QByteArrayView lhs, QByteArrayView rhs, Qt::CaseSensitivity cs) noexcept
{
- uint uc1;
- auto src1 = reinterpret_cast<const uchar *>(utf8);
- auto end1 = src1 + u8len;
- auto src2 = reinterpret_cast<const uchar *>(s.latin1());
- auto end2 = src2 + s.size();
+ if (lhs.isEmpty())
+ return qt_lencmp(0, rhs.size());
+
+ if (cs == Qt::CaseSensitive) {
+ const auto l = std::min(lhs.size(), rhs.size());
+ int r = memcmp(lhs.data(), rhs.data(), l);
+ return r ? r : qt_lencmp(lhs.size(), rhs.size());
+ }
+
+ char32_t uc1 = QChar::Null;
+ auto src1 = reinterpret_cast<const uchar *>(lhs.data());
+ auto end1 = src1 + lhs.size();
+ char32_t uc2 = QChar::Null;
+ auto src2 = reinterpret_cast<const uchar *>(rhs.data());
+ auto end2 = src2 + rhs.size();
while (src1 < end1 && src2 < end2) {
uchar b = *src1++;
- uint *output = &uc1;
- int res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src1, end1);
+ char32_t *output = &uc1;
+ qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src1, end1);
if (res < 0) {
// decoding error
uc1 = QChar::ReplacementCharacter;
}
- uint uc2 = *src2++;
+ b = *src2++;
+ output = &uc2;
+ res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src2, end2);
+ if (res < 0) {
+ // decoding error
+ uc2 = QChar::ReplacementCharacter;
+ }
+
+ uc1 = QChar::toCaseFolded(uc1);
+ uc2 = QChar::toCaseFolded(uc2);
if (uc1 != uc2)
return int(uc1) - int(uc2);
}
@@ -764,16 +942,17 @@ int QUtf8::compareUtf8(const char *utf8, qsizetype u8len, QLatin1String s)
return (end1 > src1) - (end2 > src2);
}
-QByteArray QUtf16::convertFromUnicode(const QChar *uc, qsizetype len, QStringConverter::State *state, DataEndianness endian)
+#ifndef QT_BOOTSTRAPPED
+QByteArray QUtf16::convertFromUnicode(QStringView in, QStringConverter::State *state, DataEndianness endian)
{
bool writeBom = !(state->internalState & HeaderDone) && state->flags & QStringConverter::Flag::WriteBom;
- qsizetype length = 2*len;
+ qsizetype length = 2 * in.size();
if (writeBom)
length += 2;
QByteArray d(length, Qt::Uninitialized);
- char *end = convertFromUnicode(d.data(), QStringView(uc, len), state, endian);
- Q_ASSERT(end - d.constData() == d.length());
+ char *end = convertFromUnicode(d.data(), in, state, endian);
+ Q_ASSERT(end - d.constData() == d.size());
Q_UNUSED(end);
return d;
}
@@ -787,6 +966,7 @@ char *QUtf16::convertFromUnicode(char *out, QStringView in, QStringConverter::St
endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) ? BigEndianness : LittleEndianness;
if (writeBom) {
+ // set them up the BOM
QChar bom(QChar::ByteOrderMark);
if (endian == BigEndianness)
qToBigEndian(bom.unicode(), out);
@@ -795,25 +975,28 @@ char *QUtf16::convertFromUnicode(char *out, QStringView in, QStringConverter::St
out += 2;
}
if (endian == BigEndianness)
- qToBigEndian<ushort>(in.data(), in.length(), out);
+ qToBigEndian<char16_t>(in.data(), in.size(), out);
else
- qToLittleEndian<ushort>(in.data(), in.length(), out);
+ qToLittleEndian<char16_t>(in.data(), in.size(), out);
state->remainingChars = 0;
state->internalState |= HeaderDone;
- return out + 2*in.length();
+ return out + 2*in.size();
}
-QString QUtf16::convertToUnicode(const char *chars, qsizetype len, QStringConverter::State *state, DataEndianness endian)
+QString QUtf16::convertToUnicode(QByteArrayView in, QStringConverter::State *state, DataEndianness endian)
{
- QString result((len + 1) >> 1, Qt::Uninitialized); // worst case
- QChar *qch = convertToUnicode(result.data(), chars, len, state, endian);
+ QString result((in.size() + 1) >> 1, Qt::Uninitialized); // worst case
+ QChar *qch = convertToUnicode(result.data(), in, state, endian);
result.truncate(qch - result.constData());
return result;
}
-QChar *QUtf16::convertToUnicode(QChar *out, const char *chars, qsizetype len, QStringConverter::State *state, DataEndianness endian)
+QChar *QUtf16::convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::State *state, DataEndianness endian)
{
+ qsizetype len = in.size();
+ const char *chars = in.data();
+
Q_ASSERT(state);
if (endian == DetectEndianness)
@@ -846,6 +1029,7 @@ QChar *QUtf16::convertToUnicode(QChar *out, const char *chars, qsizetype len, QS
state->internalState |= HeaderDone;
QChar ch(buf, *chars++);
if (endian == DetectEndianness) {
+ // someone set us up the BOM
if (ch == QChar::ByteOrderSwapped) {
endian = BigEndianness;
} else if (ch == QChar::ByteOrderMark) {
@@ -866,11 +1050,11 @@ QChar *QUtf16::convertToUnicode(QChar *out, const char *chars, qsizetype len, QS
endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) ? BigEndianness : LittleEndianness;
}
- int nPairs = (end - chars) >> 1;
+ qsizetype nPairs = (end - chars) >> 1;
if (endian == BigEndianness)
- qFromBigEndian<ushort>(chars, nPairs, out);
+ qFromBigEndian<char16_t>(chars, nPairs, out);
else
- qFromLittleEndian<ushort>(chars, nPairs, out);
+ qFromLittleEndian<char16_t>(chars, nPairs, out);
out += nPairs;
state->state_data[Endian] = endian;
@@ -889,16 +1073,15 @@ QChar *QUtf16::convertToUnicode(QChar *out, const char *chars, qsizetype len, QS
return out;
}
-QByteArray QUtf32::convertFromUnicode(const QChar *uc, qsizetype len, QStringConverter::State *state, DataEndianness endian)
+QByteArray QUtf32::convertFromUnicode(QStringView in, QStringConverter::State *state, DataEndianness endian)
{
bool writeBom = !(state->internalState & HeaderDone) && state->flags & QStringConverter::Flag::WriteBom;
- int length = 4*len;
+ qsizetype length = 4*in.size();
if (writeBom)
length += 4;
QByteArray ba(length, Qt::Uninitialized);
- char *end = convertFromUnicode(ba.data(), QStringView(uc, len), state, endian);
- Q_ASSERT(end - ba.constData() == length);
- Q_UNUSED(end);
+ char *end = convertFromUnicode(ba.data(), in, state, endian);
+ ba.truncate(end - ba.constData());
return ba;
}
@@ -907,14 +1090,11 @@ char *QUtf32::convertFromUnicode(char *out, QStringView in, QStringConverter::St
Q_ASSERT(state);
bool writeBom = !(state->internalState & HeaderDone) && state->flags & QStringConverter::Flag::WriteBom;
- qsizetype length = 4*in.length();
- if (writeBom)
- length += 4;
-
if (endian == DetectEndianness)
endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) ? BigEndianness : LittleEndianness;
if (writeBom) {
+ // set them up the BOM
if (endian == BigEndianness) {
out[0] = 0;
out[1] = 0;
@@ -931,11 +1111,13 @@ char *QUtf32::convertFromUnicode(char *out, QStringView in, QStringConverter::St
}
const QChar *uc = in.data();
- const QChar *end = in.data() + in.length();
+ const QChar *end = in.data() + in.size();
QChar ch;
- uint ucs4;
+ char32_t ucs4;
if (state->remainingChars == 1) {
- ch = state->state_data[Data];
+ auto character = state->state_data[Data];
+ Q_ASSERT(character <= 0xFFFF);
+ ch = QChar(character);
// this is ugly, but shortcuts a whole lot of logic that would otherwise be required
state->remainingChars = 0;
goto decode_surrogate;
@@ -973,17 +1155,20 @@ decode_surrogate:
return out;
}
-QString QUtf32::convertToUnicode(const char *chars, qsizetype len, QStringConverter::State *state, DataEndianness endian)
+QString QUtf32::convertToUnicode(QByteArrayView in, QStringConverter::State *state, DataEndianness endian)
{
QString result;
- result.resize((len + 7) >> 1); // worst case
- QChar *end = convertToUnicode(result.data(), chars, len, state, endian);
+ result.resize((in.size() + 7) >> 1); // worst case
+ QChar *end = convertToUnicode(result.data(), in, state, endian);
result.truncate(end - result.constData());
return result;
}
-QChar *QUtf32::convertToUnicode(QChar *out, const char *chars, qsizetype len, QStringConverter::State *state, DataEndianness endian)
+QChar *QUtf32::convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::State *state, DataEndianness endian)
{
+ qsizetype len = in.size();
+ const char *chars = in.data();
+
Q_ASSERT(state);
if (endian == DetectEndianness)
endian = (DataEndianness)state->state_data[Endian];
@@ -1011,13 +1196,14 @@ QChar *QUtf32::convertToUnicode(QChar *out, const char *chars, qsizetype len, QS
if (state->flags & QStringConverter::Flag::ConvertInitialBom)
headerdone = true;
- int num = state->remainingChars;
+ qsizetype num = state->remainingChars;
state->remainingChars = 0;
if (!headerdone || endian == DetectEndianness || num) {
while (num < 4)
tuple[num++] = *chars++;
if (endian == DetectEndianness) {
+ // someone set us up the BOM?
if (tuple[0] == 0xff && tuple[1] == 0xfe && tuple[2] == 0 && tuple[3] == 0) {
endian = LittleEndianness;
} else if (tuple[0] == 0 && tuple[1] == 0 && tuple[2] == 0xfe && tuple[3] == 0xff) {
@@ -1028,7 +1214,7 @@ QChar *QUtf32::convertToUnicode(QChar *out, const char *chars, qsizetype len, QS
endian = LittleEndianness;
}
}
- uint code = (endian == BigEndianness) ? qFromBigEndian<quint32>(tuple) : qFromLittleEndian<quint32>(tuple);
+ char32_t code = (endian == BigEndianness) ? qFromBigEndian<char32_t>(tuple) : qFromLittleEndian<char32_t>(tuple);
if (headerdone || code != QChar::ByteOrderMark) {
if (QChar::requiresSurrogates(code)) {
*out++ = QChar(QChar::highSurrogate(code));
@@ -1047,7 +1233,7 @@ QChar *QUtf32::convertToUnicode(QChar *out, const char *chars, qsizetype len, QS
while (chars < end) {
tuple[num++] = *chars++;
if (num == 4) {
- uint code = (endian == BigEndianness) ? qFromBigEndian<quint32>(tuple) : qFromLittleEndian<quint32>(tuple);
+ char32_t code = (endian == BigEndianness) ? qFromBigEndian<char32_t>(tuple) : qFromLittleEndian<char32_t>(tuple);
for (char16_t c : QChar::fromUcs4(code))
*out++ = c;
num = 0;
@@ -1066,205 +1252,378 @@ QChar *QUtf32::convertToUnicode(QChar *out, const char *chars, qsizetype len, QS
return out;
}
+#endif // !QT_BOOTSTRAPPED
-QString qFromUtfEncoded(const QByteArray &ba)
+#if defined(Q_OS_WIN) && !defined(QT_BOOTSTRAPPED)
+int QLocal8Bit::checkUtf8()
{
- const qsizetype arraySize = ba.size();
- const uchar *buf = reinterpret_cast<const uchar *>(ba.constData());
- const uint bom = 0xfeff;
-
- if (arraySize > 3) {
- uint uc = qFromUnaligned<uint>(buf);
- if (uc == qToBigEndian(bom) || uc == qToLittleEndian(bom))
- return QUtf32::convertToUnicode(ba.constData(), ba.length(), nullptr); // utf-32
- }
+ return GetACP() == CP_UTF8 ? 1 : -1;
+}
- if (arraySize > 1) {
- ushort uc = qFromUnaligned<ushort>(buf);
- if (uc == qToBigEndian(ushort(bom)) || qToLittleEndian(ushort(bom)))
- return QUtf16::convertToUnicode(ba.constData(), ba.length(), nullptr); // utf-16
- }
- return QUtf8::convertToUnicode(ba.constData(), ba.length());
+QString QLocal8Bit::convertToUnicode_sys(QByteArrayView in, QStringConverter::State *state)
+{
+ return convertToUnicode_sys(in, CP_ACP, state);
}
-#if defined(Q_OS_WIN) && !defined(QT_BOOTSTRAPPED)
-static QString convertToUnicodeCharByChar(const char *chars, qsizetype length, QStringConverter::State *state)
+QString QLocal8Bit::convertToUnicode_sys(QByteArrayView in, quint32 codePage,
+ QStringConverter::State *state)
{
+ const char *mb = in.data();
+ qsizetype mblen = in.size();
+
Q_ASSERT(state);
- if (state->flags & QStringConverter::Flag::Stateless) // temporary
+ qsizetype &invalidChars = state->invalidChars;
+ using Flag = QStringConverter::Flag;
+ const bool useNullForReplacement = !!(state->flags & Flag::ConvertInvalidToNull);
+ const char16_t replacementCharacter = useNullForReplacement ? QChar::Null
+ : QChar::ReplacementCharacter;
+ if (state->flags & Flag::Stateless) {
+ Q_ASSERT(state->remainingChars == 0);
state = nullptr;
-
- if (!chars || !length)
- return QString();
-
- int copyLocation = 0;
- int extra = 2;
- if (state && state->remainingChars) {
- copyLocation = state->remainingChars;
- extra += copyLocation;
- }
- int newLength = length + extra;
- char *mbcs = new char[newLength];
- //ensure that we have a NULL terminated string
- mbcs[newLength-1] = 0;
- mbcs[newLength-2] = 0;
- memcpy(&(mbcs[copyLocation]), chars, length);
- if (copyLocation) {
- //copy the last character from the state
- mbcs[0] = (char)state->state_data[0];
- state->remainingChars = 0;
- }
- const char *mb = mbcs;
- const char *next = 0;
- QString s;
- while ((next = CharNextExA(CP_ACP, mb, 0)) != mb) {
- wchar_t wc[2] ={0};
- int charlength = next - mb;
- int len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, mb, charlength, wc, 2);
- if (len>0) {
- s.append(QChar(wc[0]));
- } else {
- int r = GetLastError();
- //check if the character being dropped is the last character
- if (r == ERROR_NO_UNICODE_TRANSLATION && mb == (mbcs+newLength -3) && state) {
- state->remainingChars = 1;
- state->state_data[0] = (char)*mb;
- }
- }
- mb = next;
}
- delete [] mbcs;
- return s;
-}
-
-
-QString QLocal8Bit::convertToUnicode(const char *chars, qsizetype length, QStringConverter::State *state)
-{
- Q_ASSERT(length < INT_MAX); // ### FIXME
- const char *mb = chars;
- int mblen = length;
if (!mb || !mblen)
return QString();
- QVarLengthArray<wchar_t, 4096> wc(4096);
- int len;
+ // Use a local stack-buffer at first to allow us a decently large container
+ // to avoid a lot of resizing, without also returning an overallocated
+ // QString to the user for small strings.
+ // Then we can be fast for small strings and take the hit of extra resizes
+ // and measuring how much storage is needed for large strings.
+ std::array<wchar_t, 4096> buf;
+ wchar_t *out = buf.data();
+ qsizetype outlen = buf.size();
+
QString sp;
- bool prepend = false;
- char state_data = 0;
- int remainingChars = 0;
-
- //save the current state information
- if (state) {
- state_data = (char)state->state_data[0];
- remainingChars = state->remainingChars;
- }
- //convert the pending character (if available)
- if (state && remainingChars) {
- char prev[3] = {0};
- prev[0] = state_data;
- prev[1] = mb[0];
- remainingChars = 0;
- len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
- prev, 2, wc.data(), wc.length());
- if (len) {
- sp.append(QChar(wc[0]));
- if (mblen == 1) {
- state->remainingChars = 0;
- return sp;
- }
- prepend = true;
- mb++;
- mblen--;
- wc[0] = 0;
+ // Return a pointer to storage where we have enough space for `size`
+ const auto growOut = [&](qsizetype size) -> std::tuple<wchar_t *, qsizetype> {
+ if (outlen >= size)
+ return {out, outlen};
+ const bool wasStackBuffer = sp.isEmpty();
+ const auto begin = wasStackBuffer ? buf.data() : reinterpret_cast<wchar_t *>(sp.data());
+ const qsizetype offset = qsizetype(std::distance(begin, out));
+ qsizetype newSize = 0;
+ if (Q_UNLIKELY(qAddOverflow(offset, size, &newSize))) {
+ Q_CHECK_PTR(false);
+ return {nullptr, 0};
}
+ sp.resize(newSize);
+ auto it = reinterpret_cast<wchar_t *>(sp.data());
+ if (wasStackBuffer)
+ it = std::copy_n(buf.data(), offset, it);
+ else
+ it += offset;
+ return {it, size};
+ };
+
+ // Convert the pending characters (if available)
+ while (state && state->remainingChars && mblen) {
+ QStringConverter::State localState;
+ localState.flags = state->flags;
+ // Use at most 6 characters as a guess for the longest encoded character
+ // in any multibyte encoding.
+ // Even with a total of 2 bytes of overhead that would leave around
+ // 2^(4 * 8) possible characters
+ std::array<char, 6> prev = {0};
+ Q_ASSERT(state->remainingChars <= q20::ssize(state->state_data));
+ qsizetype index = 0;
+ for (; index < state->remainingChars; ++index)
+ prev[index] = state->state_data[index];
+ const qsizetype toCopy = std::min(q20::ssize(prev) - index, mblen);
+ for (qsizetype i = 0; i < toCopy; ++i, ++index)
+ prev[index] = mb[i];
+ mb += toCopy;
+ mblen -= toCopy;
+
+ // Recursing:
+ // Since we are using a clean local state it will try to decode what was
+ // stored in our state + some extra octets from input (`prev`). If some
+ // part fails we will have those characters stored in the local state's
+ // storage, and we can extract those. It may also output some
+ // replacement characters, which we'll count in the invalidChars.
+ // In the best case we only do this once, but we will loop until we have
+ // resolved all the remaining characters or we have run out of new input
+ // in which case we may still have remaining characters.
+ const QString tmp = convertToUnicode_sys(QByteArrayView(prev.data(), index), codePage,
+ &localState);
+ std::tie(out, outlen) = growOut(tmp.size());
+ if (!out)
+ return {};
+ out = std::copy_n(reinterpret_cast<const wchar_t *>(tmp.constData()), tmp.size(), out);
+ outlen -= tmp.size();
+ const qsizetype tail = toCopy - localState.remainingChars;
+ if (tail >= 0) {
+ // Everything left to process comes from `in`, so we can stop
+ // looping. Adjust the window for `in` and unset remainingChars to
+ // signal that we're done.
+ mb -= localState.remainingChars;
+ mblen += localState.remainingChars;
+ localState.remainingChars = 0;
+ }
+ state->remainingChars = localState.remainingChars;
+ state->invalidChars += localState.invalidChars;
+ std::copy_n(localState.state_data, state->remainingChars, state->state_data);
}
- while (!(len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS,
- mb, mblen, wc.data(), wc.length()))) {
- int r = GetLastError();
- if (r == ERROR_INSUFFICIENT_BUFFER) {
- const int wclen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
- mb, mblen, 0, 0);
- wc.resize(wclen);
- } else if (r == ERROR_NO_UNICODE_TRANSLATION) {
- //find the last non NULL character
- while (mblen > 1 && !(mb[mblen-1]))
- mblen--;
- //check whether, we hit an invalid character in the middle
- if ((mblen <= 1) || (remainingChars && state_data))
- return convertToUnicodeCharByChar(chars, length, state);
- //Remove the last character and try again...
- state_data = mb[mblen-1];
- remainingChars = 1;
- mblen--;
+ Q_ASSERT(!state || state->remainingChars == 0 || mblen == 0);
+
+ // Need it in this scope, since we try to decrease our window size if we
+ // encounter an error
+ int nextIn = qt_saturate<int>(mblen);
+ while (mblen > 0) {
+ std::tie(out, outlen) = growOut(1); // Need space for at least one character
+ if (!out)
+ return {};
+ const int nextOut = qt_saturate<int>(outlen);
+ int len = MultiByteToWideChar(codePage, MB_ERR_INVALID_CHARS, mb, nextIn, out, nextOut);
+ if (len) {
+ mb += nextIn;
+ mblen -= nextIn;
+ out += len;
+ outlen -= len;
} else {
- // Fail.
- qWarning("MultiByteToWideChar: Cannot convert multibyte text");
- break;
+ int r = GetLastError();
+ if (r == ERROR_INSUFFICIENT_BUFFER) {
+ const int wclen = MultiByteToWideChar(codePage, 0, mb, nextIn, 0, 0);
+ std::tie(out, outlen) = growOut(wclen);
+ if (!out)
+ return {};
+ } else if (r == ERROR_NO_UNICODE_TRANSLATION) {
+ // Can't decode the current window, so either store the state,
+ // reduce window size or output a replacement character.
+
+ // Check if we can store all remaining characters in the state
+ // to be used next time we're called:
+ if (state && mblen <= q20::ssize(state->state_data)) {
+ state->remainingChars = mblen;
+ std::copy_n(mb, mblen, state->state_data);
+ mb += mblen;
+ mblen = 0;
+ break;
+ }
+
+ // .. if not, try to find the last valid character in the window
+ // and try again with a shrunken window:
+ if (nextIn > 1) {
+ // There may be some incomplete data at the end of our current
+ // window, so decrease the window size and try again.
+ // In the worst case scenario there is gigs of undecodable
+ // garbage, but what are we supposed to do about that?
+ const auto it = CharPrevExA(codePage, mb, mb + nextIn, 0);
+ if (it != mb)
+ nextIn = int(it - mb);
+ else
+ --nextIn;
+ continue;
+ }
+
+ // Finally, we are forced to output a replacement character for
+ // the first byte in the window:
+ std::tie(out, outlen) = growOut(1);
+ if (!out)
+ return {};
+ *out = replacementCharacter;
+ ++invalidChars;
+ ++out;
+ --outlen;
+ ++mb;
+ --mblen;
+ } else {
+ // Fail.
+ qWarning("MultiByteToWideChar: Cannot convert multibyte text");
+ break;
+ }
}
+ nextIn = qt_saturate<int>(mblen);
}
- if (len <= 0)
- return QString();
+ if (sp.isEmpty()) {
+ // We must have only used the stack buffer
+ if (out != buf.data()) // else: we return null-string
+ sp = QStringView(buf.data(), out).toString();
+ } else{
+ const auto begin = reinterpret_cast<wchar_t *>(sp.data());
+ sp.truncate(std::distance(begin, out));
+ }
- if (wc[len-1] == 0) // len - 1: we don't want terminator
- --len;
+ if (sp.size() && sp.back().isNull())
+ sp.chop(1);
- //save the new state information
- if (state) {
- state->state_data[0] = (char)state_data;
- state->remainingChars = remainingChars;
+ if (!state && mblen > 0) {
+ // We have trailing character(s) that could not be converted, and
+ // nowhere to cache them
+ sp.resize(sp.size() + mblen, replacementCharacter);
+ invalidChars += mblen;
}
- QString s((QChar*)wc.data(), len);
- if (prepend) {
- return sp+s;
- }
- return s;
+ return sp;
+}
+
+QByteArray QLocal8Bit::convertFromUnicode_sys(QStringView in, QStringConverter::State *state)
+{
+ return convertFromUnicode_sys(in, CP_ACP, state);
}
-QByteArray QLocal8Bit::convertFromUnicode(const QChar *ch, qsizetype uclen, QStringConverter::State *state)
+QByteArray QLocal8Bit::convertFromUnicode_sys(QStringView in, quint32 codePage,
+ QStringConverter::State *state)
{
- Q_ASSERT(uclen < INT_MAX); // ### FIXME
+ const wchar_t *ch = reinterpret_cast<const wchar_t *>(in.data());
+ qsizetype uclen = in.size();
+
Q_ASSERT(state);
- Q_UNUSED(state); // ### Fixme
- if (state->flags & QStringConverter::Flag::Stateless) // temporary
+ // The Windows API has a *boolean* out-parameter that says if a replacement
+ // character was used, but it gives us no way to know _how many_ were used.
+ // Since we cannot simply scan the string for replacement characters
+ // (which is potentially a question mark, and thus a valid character),
+ // we simply do not track the number of invalid characters here.
+ // auto &invalidChars = state->invalidChars;
+
+ using Flag = QStringConverter::Flag;
+ if (state->flags & Flag::Stateless) { // temporary
+ Q_ASSERT(state->remainingChars == 0);
state = nullptr;
+ }
if (!ch)
return QByteArray();
if (uclen == 0)
return QByteArray("");
- BOOL used_def;
- QByteArray mb(4096, 0);
- int len;
- while (!(len=WideCharToMultiByte(CP_ACP, 0, (const wchar_t*)ch, uclen,
- mb.data(), mb.size()-1, 0, &used_def)))
- {
- int r = GetLastError();
- if (r == ERROR_INSUFFICIENT_BUFFER) {
- mb.resize(1+WideCharToMultiByte(CP_ACP, 0,
- (const wchar_t*)ch, uclen,
- 0, 0, 0, &used_def));
- // and try again...
+
+ // Use a local stack-buffer at first to allow us a decently large container
+ // to avoid a lot of resizing, without also returning an overallocated
+ // QByteArray to the user for small strings.
+ // Then we can be fast for small strings and take the hit of extra resizes
+ // and measuring how much storage is needed for large strings.
+ std::array<char, 4096> buf;
+ char *out = buf.data();
+ qsizetype outlen = buf.size();
+ QByteArray mb;
+
+ if (state && state->remainingChars > 0) {
+ Q_ASSERT(state->remainingChars == 1);
+ // Let's try to decode the pending character
+ wchar_t wc[2] = { wchar_t(state->state_data[0]), ch[0] };
+ // Check if the second character is a valid low surrogate,
+ // otherwise we'll just decode the first character, for which windows
+ // will output a replacement character.
+ const bool validCodePoint = QChar::isLowSurrogate(wc[1]);
+ int len = WideCharToMultiByte(codePage, 0, wc, validCodePoint ? 2 : 1, out, outlen, nullptr,
+ nullptr);
+ if (!len)
+ return {}; // Cannot recover, and I refuse to believe it was a size limitation
+ out += len;
+ outlen -= len;
+ if (validCodePoint) {
+ ++ch;
+ --uclen;
+ }
+ state->remainingChars = 0;
+ state->state_data[0] = 0;
+ if (uclen == 0)
+ return QByteArrayView(buf.data(), len).toByteArray();
+ }
+
+ if (state && QChar::isHighSurrogate(ch[uclen - 1])) {
+ // We can handle a missing low surrogate at the end of the string,
+ // so if there is one, exclude it now and store it in the state.
+ state->remainingChars = 1;
+ state->state_data[0] = ch[uclen - 1];
+ --uclen;
+ if (uclen == 0)
+ return QByteArray();
+ }
+
+ Q_ASSERT(uclen > 0);
+
+ // Return a pointer to storage where we have enough space for `size`
+ const auto growOut = [&](qsizetype size) -> std::tuple<char *, qsizetype> {
+ if (outlen >= size)
+ return {out, outlen};
+ const bool wasStackBuffer = mb.isEmpty();
+ const auto begin = wasStackBuffer ? buf.data() : mb.data();
+ const qsizetype offset = qsizetype(std::distance(begin, out));
+ qsizetype newSize = 0;
+ if (Q_UNLIKELY(qAddOverflow(offset, size, &newSize))) {
+ Q_CHECK_PTR(false);
+ return {nullptr, 0};
+ }
+ mb.resize(newSize);
+ auto it = mb.data();
+ if (wasStackBuffer)
+ it = std::copy_n(buf.data(), offset, it);
+ else
+ it += offset;
+ return {it, size};
+ };
+
+ const auto getNextWindowSize = [&]() {
+ int nextIn = qt_saturate<int>(uclen);
+ // The Windows API has some issues if the current window ends in the
+ // middle of a surrogate pair, so we avoid that:
+ if (nextIn > 1 && QChar::isHighSurrogate(ch[nextIn - 1]))
+ --nextIn;
+ return nextIn;
+ };
+
+ int len = 0;
+ while (uclen > 0) {
+ const int nextIn = getNextWindowSize();
+ std::tie(out, outlen) = growOut(1); // We need at least one byte
+ if (!out)
+ return {};
+ const int nextOut = qt_saturate<int>(outlen);
+ len = WideCharToMultiByte(codePage, 0, ch, nextIn, out, nextOut, nullptr, nullptr);
+ if (len > 0) {
+ ch += nextIn;
+ uclen -= nextIn;
+ out += len;
+ outlen -= len;
} else {
- // Fail. Probably can't happen in fact (dwFlags is 0).
+ int r = GetLastError();
+ if (r == ERROR_INSUFFICIENT_BUFFER) {
+ int neededLength = WideCharToMultiByte(codePage, 0, ch, nextIn, nullptr, 0,
+ nullptr, nullptr);
+ if (neededLength <= 0) {
+ // Fail. Observed with UTF8 where the input window was max int and ended in an
+ // incomplete sequence, probably a Windows bug. We try to avoid that from
+ // happening by reducing the window size in that case. But let's keep this
+ // branch just in case of other bugs.
+#ifndef QT_NO_DEBUG
+ r = GetLastError();
+ fprintf(stderr,
+ "WideCharToMultiByte: Cannot convert multibyte text (error %d)\n", r);
+#endif // !QT_NO_DEBUG
+ break;
+ }
+ std::tie(out, outlen) = growOut(neededLength);
+ if (!out)
+ return {};
+ // and try again...
+ } else {
+ // Fail. Probably can't happen in fact (dwFlags is 0).
#ifndef QT_NO_DEBUG
- // Can't use qWarning(), as it'll recurse to handle %ls
- fprintf(stderr,
- "WideCharToMultiByte: Cannot convert multibyte text (error %d): %ls\n",
- r, reinterpret_cast<const wchar_t*>(QString(ch, uclen).utf16()));
+ // Can't use qWarning(), as it'll recurse to handle %ls
+ fprintf(stderr,
+ "WideCharToMultiByte: Cannot convert multibyte text (error %d): %ls\n", r,
+ reinterpret_cast<const wchar_t *>(
+ QStringView(ch, uclen).left(100).toString().utf16()));
#endif
- break;
+ break;
+ }
}
}
- mb.resize(len);
+ if (mb.isEmpty()) {
+ // We must have only used the stack buffer
+ if (out != buf.data()) // else: we return null-array
+ mb = QByteArrayView(buf.data(), out).toByteArray();
+ } else {
+ mb.truncate(std::distance(mb.data(), out));
+ }
return mb;
}
#endif
-void QStringConverter::State::clear()
+void QStringConverter::State::clear() noexcept
{
if (clearFn)
clearFn(this);
@@ -1275,9 +1634,25 @@ void QStringConverter::State::clear()
internalState = 0;
}
-static QChar *fromUtf16(QChar *out, const char *in, qsizetype length, QStringConverter::State *state)
+void QStringConverter::State::reset() noexcept
{
- return QUtf16::convertToUnicode(out, in, length, state, DetectEndianness);
+ if (flags & Flag::UsesIcu) {
+#if QT_CONFIG(icu)
+ UConverter *converter = static_cast<UConverter *>(d[0]);
+ if (converter)
+ ucnv_reset(converter);
+#else
+ Q_UNREACHABLE();
+#endif
+ } else {
+ clear();
+ }
+}
+
+#ifndef QT_BOOTSTRAPPED
+static QChar *fromUtf16(QChar *out, QByteArrayView in, QStringConverter::State *state)
+{
+ return QUtf16::convertToUnicode(out, in, state, DetectEndianness);
}
static char *toUtf16(char *out, QStringView in, QStringConverter::State *state)
@@ -1285,9 +1660,9 @@ static char *toUtf16(char *out, QStringView in, QStringConverter::State *state)
return QUtf16::convertFromUnicode(out, in, state, DetectEndianness);
}
-static QChar *fromUtf16BE(QChar *out, const char *in, qsizetype length, QStringConverter::State *state)
+static QChar *fromUtf16BE(QChar *out, QByteArrayView in, QStringConverter::State *state)
{
- return QUtf16::convertToUnicode(out, in, length, state, BigEndianness);
+ return QUtf16::convertToUnicode(out, in, state, BigEndianness);
}
static char *toUtf16BE(char *out, QStringView in, QStringConverter::State *state)
@@ -1295,9 +1670,9 @@ static char *toUtf16BE(char *out, QStringView in, QStringConverter::State *state
return QUtf16::convertFromUnicode(out, in, state, BigEndianness);
}
-static QChar *fromUtf16LE(QChar *out, const char *in, qsizetype length, QStringConverter::State *state)
+static QChar *fromUtf16LE(QChar *out, QByteArrayView in, QStringConverter::State *state)
{
- return QUtf16::convertToUnicode(out, in, length, state, LittleEndianness);
+ return QUtf16::convertToUnicode(out, in, state, LittleEndianness);
}
static char *toUtf16LE(char *out, QStringView in, QStringConverter::State *state)
@@ -1305,9 +1680,9 @@ static char *toUtf16LE(char *out, QStringView in, QStringConverter::State *state
return QUtf16::convertFromUnicode(out, in, state, LittleEndianness);
}
-static QChar *fromUtf32(QChar *out, const char *in, qsizetype length, QStringConverter::State *state)
+static QChar *fromUtf32(QChar *out, QByteArrayView in, QStringConverter::State *state)
{
- return QUtf32::convertToUnicode(out, in, length, state, DetectEndianness);
+ return QUtf32::convertToUnicode(out, in, state, DetectEndianness);
}
static char *toUtf32(char *out, QStringView in, QStringConverter::State *state)
@@ -1315,9 +1690,9 @@ static char *toUtf32(char *out, QStringView in, QStringConverter::State *state)
return QUtf32::convertFromUnicode(out, in, state, DetectEndianness);
}
-static QChar *fromUtf32BE(QChar *out, const char *in, qsizetype length, QStringConverter::State *state)
+static QChar *fromUtf32BE(QChar *out, QByteArrayView in, QStringConverter::State *state)
{
- return QUtf32::convertToUnicode(out, in, length, state, BigEndianness);
+ return QUtf32::convertToUnicode(out, in, state, BigEndianness);
}
static char *toUtf32BE(char *out, QStringView in, QStringConverter::State *state)
@@ -1325,37 +1700,26 @@ static char *toUtf32BE(char *out, QStringView in, QStringConverter::State *state
return QUtf32::convertFromUnicode(out, in, state, BigEndianness);
}
-static QChar *fromUtf32LE(QChar *out, const char *in, qsizetype length, QStringConverter::State *state)
+static QChar *fromUtf32LE(QChar *out, QByteArrayView in, QStringConverter::State *state)
{
- return QUtf32::convertToUnicode(out, in, length, state, LittleEndianness);
+ return QUtf32::convertToUnicode(out, in, state, LittleEndianness);
}
static char *toUtf32LE(char *out, QStringView in, QStringConverter::State *state)
{
return QUtf32::convertFromUnicode(out, in, state, LittleEndianness);
}
+#endif // !QT_BOOTSTRAPPED
-void qt_from_latin1(char16_t *dst, const char *str, size_t size) noexcept;
-
-static QChar *fromLatin1(QChar *out, const char *chars, qsizetype len, QStringConverter::State *state)
-{
- Q_ASSERT(state);
- Q_UNUSED(state);
-
- qt_from_latin1(reinterpret_cast<char16_t *>(out), chars, size_t(len));
- return out + len;
-}
-
-
-static char *toLatin1(char *out, QStringView in, QStringConverter::State *state)
+char *QLatin1::convertFromUnicode(char *out, QStringView in, QStringConverter::State *state) noexcept
{
Q_ASSERT(state);
if (state->flags & QStringConverter::Flag::Stateless) // temporary
state = nullptr;
const char replacement = (state && state->flags & QStringConverter::Flag::ConvertInvalidToNull) ? 0 : '?';
- int invalid = 0;
- for (qsizetype i = 0; i < in.length(); ++i) {
+ qsizetype invalid = 0;
+ for (qsizetype i = 0; i < in.size(); ++i) {
if (in[i] > QChar(0xff)) {
*out = replacement;
++invalid;
@@ -1369,29 +1733,31 @@ static char *toLatin1(char *out, QStringView in, QStringConverter::State *state)
return out;
}
-static QChar *fromLocal8Bit(QChar *out, const char *in, qsizetype length, QStringConverter::State *state)
+static QChar *fromLocal8Bit(QChar *out, QByteArrayView in, QStringConverter::State *state)
{
- QString s = QLocal8Bit::convertToUnicode(in, length, state);
- memcpy(out, s.constData(), s.length()*sizeof(QChar));
- return out + s.length();
+ QString s = QLocal8Bit::convertToUnicode(in, state);
+ memcpy(out, s.constData(), s.size()*sizeof(QChar));
+ return out + s.size();
}
static char *toLocal8Bit(char *out, QStringView in, QStringConverter::State *state)
{
- QByteArray s = QLocal8Bit::convertFromUnicode(in.data(), in.length(), state);
- memcpy(out, s.constData(), s.length());
- return out + s.length();
+ QByteArray s = QLocal8Bit::convertFromUnicode(in, state);
+ memcpy(out, s.constData(), s.size());
+ return out + s.size();
}
static qsizetype fromUtf8Len(qsizetype l) { return l + 1; }
static qsizetype toUtf8Len(qsizetype l) { return 3*(l + 1); }
+#ifndef QT_BOOTSTRAPPED
static qsizetype fromUtf16Len(qsizetype l) { return l/2 + 2; }
static qsizetype toUtf16Len(qsizetype l) { return 2*(l + 1); }
static qsizetype fromUtf32Len(qsizetype l) { return l/2 + 2; }
static qsizetype toUtf32Len(qsizetype l) { return 4*(l + 1); }
+#endif
static qsizetype fromLatin1Len(qsizetype l) { return l + 1; }
static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
@@ -1424,7 +1790,7 @@ static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
operation, encoding UTF-16 encoded data (usually in the form of a QString) to
the requested encoding.
- The supported encodings are:
+ The following encodings are always supported:
\list
\li UTF-8
@@ -1438,6 +1804,10 @@ static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
\li The system encoding
\endlist
+ QStringConverter may support more encodings depending on how Qt was
+ compiled. If more codecs are supported, they can be listed using
+ availableCodecs().
+
\l {QStringConverter}s can be used as follows to convert some encoded
string to and from UTF-16.
@@ -1496,6 +1866,7 @@ static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
\value Stateless Ignore possible converter states between different function calls
to encode or decode strings. This will also cause the QStringConverter to raise an error if an incomplete
sequence of data is encountered.
+ \omitvalue UsesIcu
*/
/*!
@@ -1504,17 +1875,18 @@ static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
\value Utf16 Create a converter to or from UTF-16. When decoding, the byte order will get automatically
detected by a leading byte order mark. If none exists or when encoding, the system byte order will
be assumed.
- \value Utf16BE Create a converter to or from big endian UTF-16.
- \value Utf16LE Create a converter to or from litte endian UTF-16.
+ \value Utf16BE Create a converter to or from big-endian UTF-16.
+ \value Utf16LE Create a converter to or from little-endian UTF-16.
\value Utf32 Create a converter to or from UTF-32. When decoding, the byte order will get automatically
detected by a leading byte order mark. If none exists or when encoding, the system byte order will
be assumed.
- \value Utf32BE Create a converter to or from big endian UTF-32.
- \value Utf32LE Create a converter to or from litte endian UTF-32.
+ \value Utf32BE Create a converter to or from big-endian UTF-32.
+ \value Utf32LE Create a converter to or from little-endian UTF-32.
\value Latin1 Create a converter to or from ISO-8859-1 (Latin1).
\value System Create a converter to or from the underlying encoding of the
operating systems locale. This is always assumed to be UTF-8 for Unix based
systems. On Windows, this converts to and from the locale code page.
+ \omitvalue LastEncoding
*/
/*!
@@ -1525,34 +1897,31 @@ static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
const QStringConverter::Interface QStringConverter::encodingInterfaces[QStringConverter::LastEncoding + 1] =
{
{ "UTF-8", QUtf8::convertToUnicode, fromUtf8Len, QUtf8::convertFromUnicode, toUtf8Len },
+#ifndef QT_BOOTSTRAPPED
{ "UTF-16", fromUtf16, fromUtf16Len, toUtf16, toUtf16Len },
{ "UTF-16LE", fromUtf16LE, fromUtf16Len, toUtf16LE, toUtf16Len },
{ "UTF-16BE", fromUtf16BE, fromUtf16Len, toUtf16BE, toUtf16Len },
{ "UTF-32", fromUtf32, fromUtf32Len, toUtf32, toUtf32Len },
{ "UTF-32LE", fromUtf32LE, fromUtf32Len, toUtf32LE, toUtf32Len },
{ "UTF-32BE", fromUtf32BE, fromUtf32Len, toUtf32BE, toUtf32Len },
- { "ISO-8859-1", fromLatin1, fromLatin1Len, toLatin1, toLatin1Len },
+#endif
+ { "ISO-8859-1", QLatin1::convertToUnicode, fromLatin1Len, QLatin1::convertFromUnicode, toLatin1Len },
{ "Locale", fromLocal8Bit, fromUtf8Len, toLocal8Bit, toUtf8Len }
};
// match names case insensitive and skipping '-' and '_'
static bool nameMatch(const char *a, const char *b)
{
- while (*a && *b) {
- if (*a == '-' || *a == '_') {
+ do {
+ while (*a == '-' || *a == '_')
++a;
- continue;
- }
- if (*b == '-' || *b == '_') {
+ while (*b == '-' || *b == '_')
++b;
- continue;
- }
- if (toupper(*a) != toupper(*b))
- return false;
- ++a;
- ++b;
- }
- return !*a && !*b;
+ if (!*a && !*b) // end of both strings
+ return true;
+ } while (QtMiscUtils::toAsciiLower(*a++) == QtMiscUtils::toAsciiLower(*b++));
+
+ return false;
}
@@ -1566,6 +1935,234 @@ static bool nameMatch(const char *a, const char *b)
\internal
*/
+
+#if QT_CONFIG(icu)
+// only derives from QStringConverter to get access to protected types
+struct QStringConverterICU : QStringConverter
+{
+ static void clear_function(QStringConverterBase::State *state) noexcept
+ {
+ ucnv_close(static_cast<UConverter *>(state->d[0]));
+ state->d[0] = nullptr;
+ }
+
+ static void ensureConverter(QStringConverter::State *state)
+ {
+ // old code might reset the state via clear instead of reset
+ // in that case, the converter has been closed, and we have to reopen it
+ if (state->d[0] == nullptr)
+ state->d[0] = createConverterForName(static_cast<const char *>(state->d[1]), state);
+ }
+
+ static QChar *toUtf16(QChar *out, QByteArrayView in, QStringConverter::State *state)
+ {
+ ensureConverter(state);
+
+ auto icu_conv = static_cast<UConverter *>(state->d[0]);
+ UErrorCode err = U_ZERO_ERROR;
+ auto source = in.data();
+ auto sourceLimit = in.data() + in.size();
+
+ qsizetype length = toLen(in.size());
+
+ UChar *target = reinterpret_cast<UChar *>(out);
+ auto targetLimit = target + length;
+ // We explicitly clean up anyway, so no need to set flush to true,
+ // which would just reset the converter.
+ UBool flush = false;
+
+ // If the QStringConverter was moved, the state that we used as a context is stale now.
+ UConverterToUCallback action;
+ const void *context;
+ ucnv_getToUCallBack(icu_conv, &action, &context);
+ if (context != state)
+ ucnv_setToUCallBack(icu_conv, action, state, nullptr, nullptr, &err);
+
+ ucnv_toUnicode(icu_conv, &target, targetLimit, &source, sourceLimit, nullptr, flush, &err);
+ // We did reserve enough space:
+ Q_ASSERT(err != U_BUFFER_OVERFLOW_ERROR);
+ if (state->flags.testFlag(QStringConverter::Flag::Stateless)) {
+ if (auto leftOver = ucnv_toUCountPending(icu_conv, &err)) {
+ ucnv_reset(icu_conv);
+ state->invalidChars += leftOver;
+ }
+ }
+ return reinterpret_cast<QChar *>(target);
+ }
+
+ static char *fromUtf16(char *out, QStringView in, QStringConverter::State *state)
+ {
+ ensureConverter(state);
+ auto icu_conv = static_cast<UConverter *>(state->d[0]);
+ UErrorCode err = U_ZERO_ERROR;
+ auto source = reinterpret_cast<const UChar *>(in.data());
+ auto sourceLimit = reinterpret_cast<const UChar *>(in.data() + in.size());
+
+ qsizetype length = UCNV_GET_MAX_BYTES_FOR_STRING(in.size(), ucnv_getMaxCharSize(icu_conv));
+
+ char *target = out;
+ char *targetLimit = out + length;
+ UBool flush = false;
+
+ // If the QStringConverter was moved, the state that we used as a context is stale now.
+ UConverterFromUCallback action;
+ const void *context;
+ ucnv_getFromUCallBack(icu_conv, &action, &context);
+ if (context != state)
+ ucnv_setFromUCallBack(icu_conv, action, state, nullptr, nullptr, &err);
+
+ ucnv_fromUnicode(icu_conv, &target, targetLimit, &source, sourceLimit, nullptr, flush, &err);
+ // We did reserve enough space:
+ Q_ASSERT(err != U_BUFFER_OVERFLOW_ERROR);
+ if (state->flags.testFlag(QStringConverter::Flag::Stateless)) {
+ if (auto leftOver = ucnv_fromUCountPending(icu_conv, &err)) {
+ ucnv_reset(icu_conv);
+ state->invalidChars += leftOver;
+ }
+ }
+ return target;
+ }
+
+ Q_DISABLE_COPY_MOVE(QStringConverterICU)
+
+ template<qsizetype X>
+ static qsizetype fromLen(qsizetype inLength)
+ {
+ return X * inLength * sizeof(UChar);
+ }
+
+ static qsizetype toLen(qsizetype inLength)
+ {
+
+ /* Assumption: each input char might map to a different codepoint
+ Each codepoint can take up to 4 bytes == 2 QChar
+ We can ignore reserving space for a BOM, as only UTF encodings use one
+ and those are not handled by the ICU converter.
+ */
+ return 2 * inLength;
+ }
+
+ static constexpr QStringConverter::Interface forLength[] = {
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<1>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<2>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<3>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<4>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<5>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<6>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<7>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<8>}
+ };
+
+ static UConverter *createConverterForName(const char *name, const State *state)
+ {
+ Q_ASSERT(name);
+ Q_ASSERT(state);
+ UErrorCode status = U_ZERO_ERROR;
+ UConverter *conv = ucnv_open(name, &status);
+ if (status != U_ZERO_ERROR && status != U_AMBIGUOUS_ALIAS_WARNING) {
+ ucnv_close(conv);
+ return nullptr;
+ }
+
+ if (state->flags.testFlag(Flag::ConvertInvalidToNull)) {
+ UErrorCode error = U_ZERO_ERROR;
+
+ auto nullToSubstituter = [](const void *context, UConverterToUnicodeArgs *toUArgs,
+ const char *, int32_t length,
+ UConverterCallbackReason reason, UErrorCode *err) {
+ if (reason <= UCNV_IRREGULAR) {
+ *err = U_ZERO_ERROR;
+ UChar c = '\0';
+ ucnv_cbToUWriteUChars(toUArgs, &c, 1, 0, err);
+ // Recover outer scope's state (which isn't const) from context:
+ auto state = const_cast<State *>(static_cast<const State *>(context));
+ state->invalidChars += length;
+ }
+ };
+ ucnv_setToUCallBack(conv, nullToSubstituter, state, nullptr, nullptr, &error);
+
+ auto nullFromSubstituter = [](const void *context, UConverterFromUnicodeArgs *fromUArgs,
+ const UChar *, int32_t length,
+ UChar32, UConverterCallbackReason reason, UErrorCode *err) {
+ if (reason <= UCNV_IRREGULAR) {
+ *err = U_ZERO_ERROR;
+ const UChar replacement[] = { 0 };
+ const UChar *stringBegin = std::begin(replacement);
+ ucnv_cbFromUWriteUChars(fromUArgs, &stringBegin, std::end(replacement), 0, err);
+ // Recover outer scope's state (which isn't const) from context:
+ auto state = const_cast<State *>(static_cast<const State *>(context));
+ state->invalidChars += length;
+ }
+ };
+ ucnv_setFromUCallBack(conv, nullFromSubstituter, state, nullptr, nullptr, &error);
+ } else {
+ UErrorCode error = U_ZERO_ERROR;
+
+ auto qmarkToSubstituter = [](const void *context, UConverterToUnicodeArgs *toUArgs,
+ const char *codeUnits,int32_t length,
+ UConverterCallbackReason reason, UErrorCode *err) {
+ if (reason <= UCNV_IRREGULAR) {
+ // Recover outer scope's state (which isn't const) from context:
+ auto state = const_cast<State *>(static_cast<const State *>(context));
+ state->invalidChars += length;
+ }
+ // use existing ICU callback for logic
+ UCNV_TO_U_CALLBACK_SUBSTITUTE(nullptr, toUArgs, codeUnits, length, reason, err);
+
+ };
+ ucnv_setToUCallBack(conv, qmarkToSubstituter, state, nullptr, nullptr, &error);
+
+ auto qmarkFromSubstituter = [](const void *context, UConverterFromUnicodeArgs *fromUArgs,
+ const UChar *codeUnits, int32_t length,
+ UChar32 codePoint, UConverterCallbackReason reason, UErrorCode *err) {
+ if (reason <= UCNV_IRREGULAR) {
+ // Recover outer scope's state (which isn't const) from context:
+ auto state = const_cast<State *>(static_cast<const State *>(context));
+ state->invalidChars += length;
+ }
+ // use existing ICU callback for logic
+ UCNV_FROM_U_CALLBACK_SUBSTITUTE(nullptr, fromUArgs, codeUnits, length,
+ codePoint, reason, err);
+ };
+ ucnv_setFromUCallBack(conv, qmarkFromSubstituter, state, nullptr, nullptr, &error);
+ }
+ return conv;
+ }
+
+ static const QStringConverter::Interface *make_icu_converter(
+ QStringConverterBase::State *state,
+ const char *name)
+ {
+ UErrorCode status = U_ZERO_ERROR;
+ UConverter *conv = createConverterForName(name, state);
+ if (!conv)
+ return nullptr;
+
+ const char *icuName = ucnv_getName(conv, &status);
+ // ucnv_getStandardName returns a name which is owned by the library
+ // we can thus store it in the state without worrying aobut its lifetime
+ const char *persistentName = ucnv_getStandardName(icuName, "MIME", &status);
+ if (U_FAILURE(status) || !persistentName) {
+ status = U_ZERO_ERROR;
+ persistentName = ucnv_getStandardName(icuName, "IANA", &status);
+ }
+ state->d[1] = const_cast<char *>(persistentName);
+ state->d[0] = conv;
+ state->flags |= QStringConverterBase::Flag::UsesIcu;
+ qsizetype maxCharSize = ucnv_getMaxCharSize(conv);
+ state->clearFn = QStringConverterICU::clear_function;
+ if (maxCharSize > 8 || maxCharSize < 1) {
+ qWarning("Encountered unexpected codec \"%s\" which requires >8x space", name);
+ return nullptr;
+ } else {
+ return &forLength[maxCharSize - 1];
+ }
+
+ }
+
+};
+#endif
+
/*!
\internal
*/
@@ -1574,7 +2171,27 @@ QStringConverter::QStringConverter(const char *name, Flags f)
{
auto e = encodingForName(name);
if (e)
- iface = encodingInterfaces + int(e.value());
+ iface = encodingInterfaces + int(*e);
+#if QT_CONFIG(icu)
+ else
+ iface = QStringConverterICU::make_icu_converter(&state, name);
+#endif
+}
+
+
+const char *QStringConverter::name() const noexcept
+{
+ if (!iface)
+ return nullptr;
+ if (state.flags & QStringConverter::Flag::UsesIcu) {
+#if QT_CONFIG(icu)
+ return static_cast<const char*>(state.d[1]);
+#else
+ return nullptr;
+#endif
+ } else {
+ return iface->name;
+ }
}
/*!
@@ -1607,17 +2224,26 @@ QStringConverter::QStringConverter(const char *name, Flags f)
Returns the canonical name of the encoding this QStringConverter can encode or decode.
Returns a nullptr if the converter is not valid.
+ The returned name is UTF-8 encoded.
\sa isValid()
*/
/*!
- Returns an optional encoding for \a name. The optional is empty if the name could
- not get converted to a valid encoding.
+ Convert \a name to the corresponding \l Encoding member, if there is one.
+
+ If the \a name is not the name of a codec listed in the Encoding enumeration,
+ \c{std::nullopt} is returned. Such a name may, none the less, be accepted by
+ the QStringConverter constructor when Qt is built with ICU, if ICU provides a
+ converter with the given name.
+
+ \a name is expected to be UTF-8 encoded.
*/
-std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(const char *name)
+std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(const char *name) noexcept
{
- for (int i = 0; i < LastEncoding + 1; ++i) {
+ if (!name)
+ return std::nullopt;
+ for (qsizetype i = 0; i < LastEncoding + 1; ++i) {
if (nameMatch(encodingInterfaces[i].name, name))
return QStringConverter::Encoding(i);
}
@@ -1626,20 +2252,24 @@ std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(cons
return std::nullopt;
}
+#ifndef QT_BOOTSTRAPPED
/*!
- Returns the encoding for the content of \a buf if it can be determined.
+ Returns the encoding for the content of \a data if it can be determined.
\a expectedFirstCharacter can be passed as an additional hint to help determine
the encoding.
The returned optional is empty, if the encoding is unclear.
*/
-std::optional<QStringConverter::Encoding> QStringConverter::encodingForData(const char *buf, qsizetype arraySize, char16_t expectedFirstCharacter)
+std::optional<QStringConverter::Encoding>
+QStringConverter::encodingForData(QByteArrayView data, char16_t expectedFirstCharacter) noexcept
{
+ // someone set us up the BOM?
+ qsizetype arraySize = data.size();
if (arraySize > 3) {
- uint uc = qFromUnaligned<uint>(buf);
- if (uc == qToBigEndian(uint(QChar::ByteOrderMark)))
+ char32_t uc = qFromUnaligned<char32_t>(data.data());
+ if (uc == qToBigEndian(char32_t(QChar::ByteOrderMark)))
return QStringConverter::Utf32BE;
- if (uc == qToLittleEndian(uint(QChar::ByteOrderMark)))
+ if (uc == qToLittleEndian(char32_t(QChar::ByteOrderMark)))
return QStringConverter::Utf32LE;
if (expectedFirstCharacter) {
// catch also anything starting with the expected character
@@ -1651,16 +2281,15 @@ std::optional<QStringConverter::Encoding> QStringConverter::encodingForData(cons
}
if (arraySize > 2) {
- static const char utf8bom[] = "\xef\xbb\xbf";
- if (memcmp(buf, utf8bom, sizeof(utf8bom) - 1) == 0)
+ if (memcmp(data.data(), utf8bom, sizeof(utf8bom)) == 0)
return QStringConverter::Utf8;
}
if (arraySize > 1) {
- ushort uc = qFromUnaligned<ushort>(buf);
- if (uc == qToBigEndian(ushort(QChar::ByteOrderMark)))
+ char16_t uc = qFromUnaligned<char16_t>(data.data());
+ if (uc == qToBigEndian(char16_t(QChar::ByteOrderMark)))
return QStringConverter::Utf16BE;
- if (uc == qToLittleEndian(ushort(QChar::ByteOrderMark)))
+ if (uc == qToLittleEndian(char16_t(QChar::ByteOrderMark)))
return QStringConverter::Utf16LE;
if (expectedFirstCharacter) {
// catch also anything starting with the expected character
@@ -1673,52 +2302,149 @@ std::optional<QStringConverter::Encoding> QStringConverter::encodingForData(cons
return std::nullopt;
}
-/*!
- Tries to determine the encoding of the HTML in \a buf by looking at leading byte order marks or
- a charset specifier in the HTML meta tag. If the optional is empty, the encoding specified is
- not supported by QStringConverter. If no encoding is detected, the method returns Utf8.
- */
-std::optional<QStringConverter::Encoding> QStringConverter::encodingForHtml(const char *buf, qsizetype arraySize)
+static QByteArray parseHtmlMetaForEncoding(QByteArrayView data)
{
- // determine charset
- auto encoding = encodingForData(buf, arraySize);
- if (encoding)
- // trust the initial BOM
- return encoding;
+ static constexpr auto metaSearcher = qMakeStaticByteArrayMatcher("meta ");
+ static constexpr auto charsetSearcher = qMakeStaticByteArrayMatcher("charset=");
- QByteArray header = QByteArray(buf, qMin(arraySize, qsizetype(1024))).toLower();
- int pos = header.indexOf("meta ");
+ QByteArray header = data.first(qMin(data.size(), qsizetype(1024))).toByteArray().toLower();
+ qsizetype pos = metaSearcher.indexIn(header);
if (pos != -1) {
- pos = header.indexOf("charset=", pos);
+ pos = charsetSearcher.indexIn(header, pos);
if (pos != -1) {
pos += qstrlen("charset=");
if (pos < header.size() && (header.at(pos) == '\"' || header.at(pos) == '\''))
++pos;
- int pos2 = pos;
+ qsizetype pos2 = pos;
// The attribute can be closed with either """, "'", ">" or "/",
// none of which are valid charset characters.
while (++pos2 < header.size()) {
char ch = header.at(pos2);
if (ch == '\"' || ch == '\'' || ch == '>' || ch == '/') {
QByteArray name = header.mid(pos, pos2 - pos);
- int colon = name.indexOf(':');
+ qsizetype colon = name.indexOf(':');
if (colon > 0)
name = name.left(colon);
name = name.simplified();
if (name == "unicode") // QTBUG-41998, ICU will return UTF-16.
name = QByteArrayLiteral("UTF-8");
if (!name.isEmpty())
- return encodingForName(name);
+ return name;
}
}
}
}
+ return QByteArray();
+}
+
+/*!
+ Tries to determine the encoding of the HTML in \a data by looking at leading byte
+ order marks or a charset specifier in the HTML meta tag. If the optional is empty,
+ the encoding specified is not supported by QStringConverter. If no encoding is
+ detected, the method returns Utf8.
+
+ \sa QStringDecoder::decoderForHtml()
+*/
+std::optional<QStringConverter::Encoding> QStringConverter::encodingForHtml(QByteArrayView data)
+{
+ // determine charset
+ std::optional<QStringConverter::Encoding> encoding = encodingForData(data);
+ if (encoding)
+ // trust the initial BOM
+ return encoding;
+
+ QByteArray encodingTag = parseHtmlMetaForEncoding(data);
+ if (!encodingTag.isEmpty())
+ return encodingForName(encodingTag);
+
return Utf8;
}
+static qsizetype availableCodecCount()
+{
+#if !QT_CONFIG(icu)
+ return QStringConverter::Encoding::LastEncoding;
+#else
+ /* icu contains also the names of what Qt provides
+ except for the special Locale one (so add one for it)
+ */
+ return 1 + ucnv_countAvailable();
+#endif
+}
+
/*!
- Returns the canonical name for \a encoding.
+ Returns a list of names of supported codecs. The names returned
+ by this function can be passed to QStringEncoder's and
+ QStringDecoder's constructor to create a en- or decoder for
+ the given codec.
+
+ This function may be used to obtain a listing of additional codecs beyond
+ the standard ones. Support for additional codecs requires Qt be compiled
+ with support for the ICU library.
+
+ \note The order of codecs is an internal implementation detail
+ and not guaranteed to be stable.
+ */
+QStringList QStringConverter::availableCodecs()
+{
+ auto availableCodec = [](qsizetype index) -> QString
+ {
+ #if !QT_CONFIG(icu)
+ return QString::fromLatin1(encodingInterfaces[index].name);
+ #else
+ if (index == 0) // "Locale", not provided by icu
+ return QString::fromLatin1(
+ encodingInterfaces[QStringConverter::Encoding::System].name);
+ // this mirrors the setup we do to set a converters name
+ UErrorCode status = U_ZERO_ERROR;
+ auto icuName = ucnv_getAvailableName(int32_t(index - 1));
+ const char *standardName = ucnv_getStandardName(icuName, "MIME", &status);
+ if (U_FAILURE(status) || !standardName) {
+ status = U_ZERO_ERROR;
+ standardName = ucnv_getStandardName(icuName, "IANA", &status);
+ }
+ if (!standardName)
+ standardName = icuName;
+ return QString::fromLatin1(standardName);
+ #endif
+ };
+
+ qsizetype codecCount = availableCodecCount();
+ QStringList result;
+ result.reserve(codecCount);
+ for (qsizetype i = 0; i < codecCount; ++i)
+ result.push_back(availableCodec(i));
+ return result;
+}
+
+/*!
+ Tries to determine the encoding of the HTML in \a data by looking at leading byte
+ order marks or a charset specifier in the HTML meta tag and returns a QStringDecoder
+ matching the encoding. If the returned decoder is not valid,
+ the encoding specified is not supported by QStringConverter. If no encoding is
+ detected, the method returns a decoder for Utf8.
+
+ \sa isValid()
+*/
+QStringDecoder QStringDecoder::decoderForHtml(QByteArrayView data)
+{
+ // determine charset
+ std::optional<QStringConverter::Encoding> encoding = encodingForData(data);
+ if (encoding)
+ // trust the initial BOM
+ return QStringDecoder(encoding.value());
+
+ QByteArray encodingTag = parseHtmlMetaForEncoding(data);
+ if (!encodingTag.isEmpty())
+ return QStringDecoder(encodingTag);
+
+ return QStringDecoder(Utf8);
+}
+#endif // !QT_BOOTSTRAPPED
+
+/*!
+ Returns the canonical name for encoding \a e.
*/
const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
{
@@ -1784,26 +2510,14 @@ const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
*/
/*!
- \fn QByteArray QStringEncoder::operator()(const QString &in)
- \fn QByteArray QStringEncoder::encode(const QString &in)
-
- Converts \a in and returns the data as a byte array.
-*/
-
-/*!
- \fn QByteArray QStringEncoder::operator()(QStringView in)
- \fn QByteArray QStringEncoder::encode(QStringView in)
- \overload
-
- Converts \a in and returns the data as a byte array.
-*/
+ \fn QStringEncoder::DecodedData<const QString &> QStringEncoder::encode(const QString &in)
+ \fn QStringEncoder::DecodedData<QStringView> QStringEncoder::encode(QStringView in)
+ \fn QStringEncoder::DecodedData<const QString &> QStringEncoder::operator()(const QString &in)
+ \fn QStringEncoder::DecodedData<QStringView> QStringEncoder::operator()(QStringView in)
-/*!
- \fn QByteArray QStringEncoder::operator()(const QChar *in, qsizetype length)
- \fn QByteArray QStringEncoder::encode(const QChar *in, qsizetype length)
- \overload
+ Converts \a in and returns a struct that is implicitly convertible to QByteArray.
- Converts \a length QChars from \a in and returns the data as a byte array.
+ \snippet code/src_corelib_text_qstringconverter.cpp 5
*/
/*!
@@ -1812,20 +2526,20 @@ const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
Returns the maximum amount of characters required to be able to process
\a inputLength decoded data.
- \sa appendToBuffer
+ \sa appendToBuffer()
*/
/*!
- \fn char *QStringEncoder::appendToBuffer(char *out, const QChar *in, qsizetype length)
+ \fn char *QStringEncoder::appendToBuffer(char *out, QStringView in)
- Encodes \a length QChars from \a in and writes the encoded result into the buffer
- starting at \a out. Returns a pointer to the end of data written.
+ Encodes \a in and writes the encoded result into the buffer
+ starting at \a out. Returns a pointer to the end of the data written.
- \a out needs to be large enough to be able to hold all the decoded data. Use
- \l{requiredSpace} to determine the maximum size requirements to be able to encode
- a QChar buffer of \a length.
+ \note \a out must be large enough to be able to hold all the decoded data. Use
+ requiredSpace() to determine the maximum size requirement to be able to encode
+ \a in.
- \sa requiredSpace
+ \sa requiredSpace()
*/
/*!
@@ -1887,28 +2601,15 @@ const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
*/
/*!
- \fn QString QStringDecoder::operator()(const QByteArray &ba)
- \fn QString QStringDecoder::decode(const QByteArray &ba)
-
- Converts \a ba and returns the data as a QString.
-*/
-
-/*!
- \fn QString QStringDecoder::operator()(const char *in, qsizetype size)
- \fn QString QStringDecoder::decode(const char *in, qsizetype size)
- \overload
+ \fn QStringDecoder::EncodedData<const QByteArray &> QStringDecoder::operator()(const QByteArray &ba)
+ \fn QStringDecoder::EncodedData<const QByteArray &> QStringDecoder::decode(const QByteArray &ba)
+ \fn QStringDecoder::EncodedData<QByteArrayView> QStringDecoder::operator()(QByteArrayView ba)
+ \fn QStringDecoder::EncodedData<QByteArrayView> QStringDecoder::decode(QByteArrayView ba)
- Converts a byte array containing the first \a size bytes of the array \a in
- and returns the data as a QString.
-*/
+ Converts \a ba and returns a struct that is implicitly convertible to QString.
-/*!
- \fn QString QStringDecoder::operator()(const char *chars)
- \fn QString QStringDecoder::decode(const char *chars)
- \overload
- Converts \a chars and returns the data as a QString. \a chars is assumed to
- point to a \c{\0}-terminated string and its length is determined dynamically.
+ \snippet code/src_corelib_text_qstringconverter.cpp 4
*/
/*!
@@ -1921,16 +2622,22 @@ const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
*/
/*!
- \fn QChar *QStringDecoder::appendToBuffer(QChar *out, const char *in, qsizetype length)
+ \fn QChar *QStringDecoder::appendToBuffer(QChar *out, QByteArrayView in)
- Decodes \a length bytes from \a in and writes the decoded result into the buffer
- starting at \a out. Returns a pointer to the end of data written.
+ Decodes the sequence of bytes viewed by \a in and writes the decoded result into
+ the buffer starting at \a out. Returns a pointer to the end of data written.
\a out needs to be large enough to be able to hold all the decoded data. Use
\l{requiredSpace} to determine the maximum size requirements to decode an encoded
- data buffer of \a length.
+ data buffer of \c in.size() bytes.
\sa requiredSpace
*/
+/*!
+ \fn char16_t *QStringDecoder::appendToBuffer(char16_t *out, QByteArrayView in)
+ \since 6.6
+ \overload
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringconverter.h b/src/corelib/text/qstringconverter.h
index 8766968e6d..055019836a 100644
--- a/src/corelib/text/qstringconverter.h
+++ b/src/corelib/text/qstringconverter.h
@@ -1,247 +1,75 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#if 0
+// keep existing syncqt header working after the move of the class
+// into qstringconverter_base
+#pragma qt_class(QStringConverter)
+#pragma qt_class(QStringConverterBase)
+#endif
#ifndef QSTRINGCONVERTER_H
#define QSTRINGCONVERTER_H
+#include <QtCore/qstringconverter_base.h>
#include <QtCore/qstring.h>
-#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
#include <QtCore/qstringbuilder.h>
-#endif
-
-#include <optional>
QT_BEGIN_NAMESPACE
-// work around a compiler bug in GCC 7
-#if defined(Q_CC_GNU) && __GNUC__ == 7
-#define QSTRINGCONVERTER_CONSTEXPR
-#else
-#define QSTRINGCONVERTER_CONSTEXPR constexpr
-#endif
-
-class QStringConverterBase
-{
-public:
- enum class Flag {
- Default = 0,
- Stateless = 0x1,
- ConvertInvalidToNull = 0x2,
- WriteBom = 0x4,
- ConvertInitialBom = 0x8
- };
- Q_DECLARE_FLAGS(Flags, Flag)
-
- struct State {
- constexpr State(Flags f = Flag::Default)
- : flags(f), state_data{0, 0, 0, 0} {}
- ~State() { clear(); }
- State(State &&other)
- : flags(other.flags),
- remainingChars(other.remainingChars),
- invalidChars(other.invalidChars),
- d{other.d[0], other.d[1]},
- clearFn(other.clearFn)
- { other.clearFn = nullptr; }
- State &operator=(State &&other)
- {
- clear();
- flags = other.flags;
- remainingChars = other.remainingChars;
- invalidChars = other.invalidChars;
- d[0] = other.d[0];
- d[1] = other.d[1];
- clearFn = other.clearFn;
- other.clearFn = nullptr;
- return *this;
- }
- Q_CORE_EXPORT void clear();
-
- Flags flags;
- int internalState = 0;
- qsizetype remainingChars = 0;
- qsizetype invalidChars = 0;
-
- union {
- uint state_data[4];
- void *d[2];
- };
- using ClearDataFn = void (*)(State *);
- ClearDataFn clearFn = nullptr;
- private:
- Q_DISABLE_COPY(State)
- };
-};
-Q_DECLARE_OPERATORS_FOR_FLAGS(QStringConverterBase::Flags)
-
-class QStringConverter : public QStringConverterBase
-{
-public:
-
- enum Encoding {
- Utf8,
- Utf16,
- Utf16LE,
- Utf16BE,
- Utf32,
- Utf32LE,
- Utf32BE,
- Latin1,
- System,
- LastEncoding = System
- };
-#ifdef Q_QDOC
- // document the flags here
- enum class Flag {
- Default = 0,
- Stateless = 0x1,
- ConvertInvalidToNull = 0x2,
- WriteBom = 0x4,
- ConvertInitialBom = 0x8
- };
- Q_DECLARE_FLAGS(Flags, Flag)
-#endif
-
-protected:
-
- struct Interface
- {
- // ### FIXME: need a QByteArrayView
- using DecoderFn = QChar * (*)(QChar *out, const char *in, qsizetype length, State *state);
- using LengthFn = qsizetype (*)(qsizetype inLength);
- using EncoderFn = char * (*)(char *out, QStringView in, State *state);
- const char *name = nullptr;
- DecoderFn toUtf16 = nullptr;
- LengthFn toUtf16Len = nullptr;
- EncoderFn fromUtf16 = nullptr;
- LengthFn fromUtf16Len = nullptr;
- };
-
- QSTRINGCONVERTER_CONSTEXPR QStringConverter()
- : iface(nullptr)
- {}
- QSTRINGCONVERTER_CONSTEXPR QStringConverter(Encoding encoding, Flags f)
- : iface(&encodingInterfaces[int(encoding)]), state(f)
- {}
- QSTRINGCONVERTER_CONSTEXPR QStringConverter(const Interface *i)
- : iface(i)
- {}
- Q_CORE_EXPORT QStringConverter(const char *name, Flags f);
-
-
-public:
- bool isValid() const { return iface != nullptr; }
-
- void resetState()
- {
- state.clear();
- }
- bool hasError() const { return state.invalidChars != 0; }
-
- const char *name() const
- { return isValid() ? iface->name : nullptr; }
-
- Q_CORE_EXPORT static std::optional<Encoding> encodingForName(const char *name);
- Q_CORE_EXPORT static const char *nameForEncoding(Encoding e);
- Q_CORE_EXPORT static std::optional<Encoding> encodingForData(const char *buf, qsizetype arraySize, char16_t expectedFirstCharacter = 0);
- Q_CORE_EXPORT static std::optional<Encoding> encodingForHtml(const char *buf, qsizetype arraySize);
-
-protected:
- const Interface *iface;
- State state;
-private:
- Q_CORE_EXPORT static const Interface encodingInterfaces[Encoding::LastEncoding + 1];
-};
-
class QStringEncoder : public QStringConverter
{
protected:
- QSTRINGCONVERTER_CONSTEXPR QStringEncoder(const Interface *i)
+ constexpr explicit QStringEncoder(const Interface *i) noexcept
: QStringConverter(i)
{}
public:
- QSTRINGCONVERTER_CONSTEXPR QStringEncoder()
+ constexpr QStringEncoder() noexcept
: QStringConverter()
{}
- QSTRINGCONVERTER_CONSTEXPR QStringEncoder(Encoding encoding, Flags flags = Flag::Default)
+ constexpr explicit QStringEncoder(Encoding encoding, Flags flags = Flag::Default)
: QStringConverter(encoding, flags)
{}
- QStringEncoder(const char *name, Flags flags = Flag::Default)
+ explicit QStringEncoder(const char *name, Flags flags = Flag::Default)
: QStringConverter(name, flags)
{}
-#if defined(Q_QDOC)
- QByteArray operator()(const QString &in);
- QByteArray operator()(QStringView in);
- QByteArray operator()(const QChar *in, qsizetype length);
- QByteArray encode(const QString &in);
- QByteArray encode(QStringView in);
- QByteArray encode(const QChar *in, qsizetype length);
-#else
template<typename T>
struct DecodedData
{
QStringEncoder *encoder;
T data;
- operator QByteArray() const { return encoder->encodeAsByteArray(QStringView(data)); }
+ operator QByteArray() const { return encoder->encodeAsByteArray(data); }
};
+ Q_WEAK_OVERLOAD
DecodedData<const QString &> operator()(const QString &str)
{ return DecodedData<const QString &>{this, str}; }
DecodedData<QStringView> operator()(QStringView in)
{ return DecodedData<QStringView>{this, in}; }
- DecodedData<QStringView> operator()(const QChar *in, qsizetype length)
- { return (*this)(QStringView(in, length)); }
+ Q_WEAK_OVERLOAD
DecodedData<const QString &> encode(const QString &str)
{ return DecodedData<const QString &>{this, str}; }
DecodedData<QStringView> encode(QStringView in)
{ return DecodedData<QStringView>{this, in}; }
- DecodedData<QStringView> encode(const QChar *in, qsizetype length)
- { return (*this)(QStringView(in, length)); }
-#endif
qsizetype requiredSpace(qsizetype inputLength) const
- { return iface->fromUtf16Len(inputLength); }
- char *appendToBuffer(char *out, const QChar *in, qsizetype length)
- { return iface->fromUtf16(out, QStringView(in, length), &state); }
+ { return iface ? iface->fromUtf16Len(inputLength) : 0; }
+ char *appendToBuffer(char *out, QStringView in)
+ {
+ if (!iface) {
+ state.invalidChars = 1;
+ return out;
+ }
+ return iface->fromUtf16(out, in, &state);
+ }
private:
QByteArray encodeAsByteArray(QStringView in)
{
+ if (!iface) {
+ // ensure that hasError returns true
+ state.invalidChars = 1;
+ return {};
+ }
QByteArray result(iface->fromUtf16Len(in.size()), Qt::Uninitialized);
char *out = result.data();
out = iface->fromUtf16(out, in, &state);
@@ -253,68 +81,64 @@ private:
class QStringDecoder : public QStringConverter
{
- struct View {
- const char *ch;
- qsizetype l;
- const char *data() const { return ch; }
- qsizetype length() const { return l; }
- };
-
protected:
- QSTRINGCONVERTER_CONSTEXPR QStringDecoder(const Interface *i)
+ constexpr explicit QStringDecoder(const Interface *i) noexcept
: QStringConverter(i)
{}
public:
- QSTRINGCONVERTER_CONSTEXPR QStringDecoder(Encoding encoding, Flags flags = Flag::Default)
+ constexpr explicit QStringDecoder(Encoding encoding, Flags flags = Flag::Default)
: QStringConverter(encoding, flags)
{}
- QSTRINGCONVERTER_CONSTEXPR QStringDecoder()
+ constexpr QStringDecoder() noexcept
: QStringConverter()
{}
- QStringDecoder(const char *name, Flags f = Flag::Default)
+ explicit QStringDecoder(const char *name, Flags f = Flag::Default)
: QStringConverter(name, f)
{}
-#if defined(Q_QDOC)
- QString operator()(const QByteArray &ba);
- QString operator()(const char *in, qsizetype size);
- QString operator()(const char *chars);
- QString decode(const QByteArray &ba);
- QString decode(const char *in, qsizetype size);
- QString decode(const char *chars);
-#else
template<typename T>
struct EncodedData
{
QStringDecoder *decoder;
T data;
- operator QString() const { return decoder->decodeAsString(data.data(), data.length()); }
+ operator QString() const { return decoder->decodeAsString(data); }
};
+ Q_WEAK_OVERLOAD
EncodedData<const QByteArray &> operator()(const QByteArray &ba)
{ return EncodedData<const QByteArray &>{this, ba}; }
- EncodedData<View> operator()(const char *in, qsizetype length)
- { return EncodedData<View>{this, {in, length}}; }
- EncodedData<View> operator()(const char *chars)
- { return EncodedData<View>{this, {chars, qsizetype(strlen(chars))}}; }
+ EncodedData<QByteArrayView> operator()(QByteArrayView ba)
+ { return EncodedData<QByteArrayView>{this, ba}; }
+ Q_WEAK_OVERLOAD
EncodedData<const QByteArray &> decode(const QByteArray &ba)
{ return EncodedData<const QByteArray &>{this, ba}; }
- EncodedData<View> decode(const char *in, qsizetype length)
- { return EncodedData<View>{this, {in, length}}; }
- EncodedData<View> decode(const char *chars)
- { return EncodedData<View>{this, {chars, qsizetype(strlen(chars))}}; }
-#endif
+ EncodedData<QByteArrayView> decode(QByteArrayView ba)
+ { return EncodedData<QByteArrayView>{this, ba}; }
qsizetype requiredSpace(qsizetype inputLength) const
- { return iface->toUtf16Len(inputLength); }
- QChar *appendToBuffer(QChar *out, const char *in, qsizetype length)
- { return iface->toUtf16(out, in, length, &state); }
+ { return iface ? iface->toUtf16Len(inputLength) : 0; }
+ QChar *appendToBuffer(QChar *out, QByteArrayView ba)
+ {
+ if (!iface) {
+ state.invalidChars = 1;
+ return out;
+ }
+ return iface->toUtf16(out, ba, &state);
+ }
+ char16_t *appendToBuffer(char16_t *out, QByteArrayView ba)
+ { return reinterpret_cast<char16_t *>(appendToBuffer(reinterpret_cast<QChar *>(out), ba)); }
+
+ Q_CORE_EXPORT static QStringDecoder decoderForHtml(QByteArrayView data);
+
private:
- QString decodeAsString(const char *in, qsizetype length)
+ QString decodeAsString(QByteArrayView in)
{
- QString result(iface->toUtf16Len(length), Qt::Uninitialized);
- QChar *out = result.data();
- // ### Fixme: state handling needs to be moved into the conversion methods
- out = iface->toUtf16(out, in, length, &state);
+ if (!iface) {
+ // ensure that hasError returns true
+ state.invalidChars = 1;
+ return {};
+ }
+ QString result(iface->toUtf16Len(in.size()), Qt::Uninitialized);
+ const QChar *out = iface->toUtf16(result.data(), in, &state);
result.truncate(out - result.constData());
return result;
}
@@ -329,10 +153,10 @@ struct QConcatenable<QStringDecoder::EncodedData<T>>
typedef QChar type;
typedef QString ConvertTo;
enum { ExactSize = false };
- static qsizetype size(const QStringDecoder::EncodedData<T> &s) { return s.decoder->requiredSpace(s.data.length()); }
+ static qsizetype size(const QStringDecoder::EncodedData<T> &s) { return s.decoder->requiredSpace(s.data.size()); }
static inline void appendTo(const QStringDecoder::EncodedData<T> &s, QChar *&out)
{
- out = s.decoder->appendToBuffer(out, s.data.data(), s.data.length());
+ out = s.decoder->appendToBuffer(out, s.data);
}
};
@@ -343,10 +167,10 @@ struct QConcatenable<QStringEncoder::DecodedData<T>>
typedef char type;
typedef QByteArray ConvertTo;
enum { ExactSize = false };
- static qsizetype size(const QStringEncoder::DecodedData<T> &s) { return s.encoder->requiredSpace(s.data.length()); }
+ static qsizetype size(const QStringEncoder::DecodedData<T> &s) { return s.encoder->requiredSpace(s.data.size()); }
static inline void appendTo(const QStringEncoder::DecodedData<T> &s, char *&out)
{
- out = s.encoder->appendToBuffer(out, s.data.data(), s.data.length());
+ out = s.encoder->appendToBuffer(out, s.data);
}
};
@@ -373,8 +197,66 @@ QByteArray &operator+=(QByteArray &a, const QStringEncoder::DecodedData<T> &b)
}
#endif
-QT_END_NAMESPACE
+template <typename InputIterator>
+void QString::assign_helper_char8(InputIterator first, InputIterator last)
+{
+ static_assert(!QString::is_contiguous_iterator_v<InputIterator>,
+ "Internal error: Should have been handed over to the QAnyStringView overload."
+ );
+
+ using ValueType = typename std::iterator_traits<InputIterator>::value_type;
+ constexpr bool IsFwdIt = std::is_convertible_v<
+ typename std::iterator_traits<InputIterator>::iterator_category,
+ std::forward_iterator_tag
+ >;
+
+ resize(0);
+ // In case of not being shared, there is the possibility of having free space at begin
+ // even after the resize to zero.
+ if (const auto offset = d.freeSpaceAtBegin())
+ d.setBegin(d.begin() - offset);
+
+ if constexpr (IsFwdIt)
+ reserve(static_cast<qsizetype>(std::distance(first, last)));
+
+ auto toUtf16 = QStringDecoder(QStringDecoder::Utf8);
+ auto availableCapacity = d.constAllocatedCapacity();
+ auto *dst = d.data();
+ auto *dend = d.data() + availableCapacity;
+
+ while (true) {
+ if (first == last) { // ran out of input elements
+ Q_ASSERT(!std::less<>{}(dend, dst));
+ d.size = dst - d.begin();
+ return;
+ }
+ const ValueType next = *first; // decays proxies, if any
+ const auto chunk = QUtf8StringView(&next, 1);
+ // UTF-8 characters can have a maximum size of 4 bytes and may result in a surrogate
+ // pair of UTF-16 code units. In the input-iterator case, we don't know the size
+ // and would need to always reserve space for 2 code units. To keep our promise
+ // of 'not allocating if it fits', we have to pre-check this condition.
+ // We know that it fits in the forward-iterator case.
+ if constexpr (!IsFwdIt) {
+ constexpr qsizetype Pair = 2;
+ char16_t buf[Pair];
+ const qptrdiff n = toUtf16.appendToBuffer(buf, chunk) - buf;
+ if (dend - dst < n) { // ran out of allocated memory
+ const auto offset = dst - d.begin();
+ reallocData(d.constAllocatedCapacity() + Pair, QArrayData::Grow);
+ // update the pointers since we've re-allocated
+ availableCapacity = d.constAllocatedCapacity();
+ dst = d.data() + offset;
+ dend = d.data() + availableCapacity;
+ }
+ dst = std::copy_n(buf, n, dst);
+ } else { // take the fast path
+ dst = toUtf16.appendToBuffer(dst, chunk);
+ }
+ ++first;
+ }
+}
-#undef QSTRINGCONVERTER_CONSTEXPR
+QT_END_NAMESPACE
#endif
diff --git a/src/corelib/text/qstringconverter_base.h b/src/corelib/text/qstringconverter_base.h
new file mode 100644
index 0000000000..d6b6fcb484
--- /dev/null
+++ b/src/corelib/text/qstringconverter_base.h
@@ -0,0 +1,176 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSTRINGCONVERTER_BASE_H
+#define QSTRINGCONVERTER_BASE_H
+
+#if 0
+// QStringConverter(Base) class are handled in qstringconverter
+#pragma qt_sync_stop_processing
+#endif
+
+#include <optional>
+
+#include <QtCore/qglobal.h> // QT_{BEGIN,END}_NAMESPACE
+#include <QtCore/qflags.h> // Q_DECLARE_FLAGS
+#include <QtCore/qcontainerfwd.h>
+
+#include <cstring>
+
+QT_BEGIN_NAMESPACE
+
+class QByteArrayView;
+class QChar;
+class QByteArrayView;
+class QStringView;
+
+class QStringConverterBase
+{
+public:
+ enum class Flag {
+ Default = 0,
+ Stateless = 0x1,
+ ConvertInvalidToNull = 0x2,
+ WriteBom = 0x4,
+ ConvertInitialBom = 0x8,
+ UsesIcu = 0x10,
+ };
+ Q_DECLARE_FLAGS(Flags, Flag)
+
+ struct State {
+ constexpr State(Flags f = Flag::Default) noexcept
+ : flags(f), state_data{0, 0, 0, 0} {}
+ ~State() { clear(); }
+
+ State(State &&other) noexcept
+ : flags(other.flags),
+ remainingChars(other.remainingChars),
+ invalidChars(other.invalidChars),
+ state_data{other.state_data[0], other.state_data[1],
+ other.state_data[2], other.state_data[3]},
+ clearFn(other.clearFn)
+ { other.clearFn = nullptr; }
+ State &operator=(State &&other) noexcept
+ {
+ clear();
+ flags = other.flags;
+ remainingChars = other.remainingChars;
+ invalidChars = other.invalidChars;
+ std::memmove(state_data, other.state_data, sizeof state_data); // self-assignment-safe
+ clearFn = other.clearFn;
+ other.clearFn = nullptr;
+ return *this;
+ }
+ Q_CORE_EXPORT void clear() noexcept;
+ Q_CORE_EXPORT void reset() noexcept;
+
+ Flags flags;
+ int internalState = 0;
+ qsizetype remainingChars = 0;
+ qsizetype invalidChars = 0;
+
+ union {
+ uint state_data[4];
+ void *d[2];
+ };
+ using ClearDataFn = void (*)(State *) noexcept;
+ ClearDataFn clearFn = nullptr;
+ private:
+ Q_DISABLE_COPY(State)
+ };
+protected:
+ ~QStringConverterBase() = default;
+};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QStringConverterBase::Flags)
+
+class QStringConverter : public QStringConverterBase
+{
+public:
+
+ enum Encoding {
+ Utf8,
+#ifndef QT_BOOTSTRAPPED
+ Utf16,
+ Utf16LE,
+ Utf16BE,
+ Utf32,
+ Utf32LE,
+ Utf32BE,
+#endif
+ Latin1,
+ System,
+ LastEncoding = System
+ };
+#ifdef Q_QDOC
+ // document the flags here
+ enum class Flag {
+ Default = 0,
+ Stateless = 0x1,
+ ConvertInvalidToNull = 0x2,
+ WriteBom = 0x4,
+ ConvertInitialBom = 0x8,
+ UsesIcu = 0x10,
+ };
+ Q_DECLARE_FLAGS(Flags, Flag)
+#endif
+
+protected:
+
+ struct Interface
+ {
+ using DecoderFn = QChar * (*)(QChar *out, QByteArrayView in, State *state);
+ using LengthFn = qsizetype (*)(qsizetype inLength);
+ using EncoderFn = char * (*)(char *out, QStringView in, State *state);
+ const char *name = nullptr;
+ DecoderFn toUtf16 = nullptr;
+ LengthFn toUtf16Len = nullptr;
+ EncoderFn fromUtf16 = nullptr;
+ LengthFn fromUtf16Len = nullptr;
+ };
+
+ constexpr QStringConverter() noexcept
+ : iface(nullptr)
+ {}
+ constexpr explicit QStringConverter(Encoding encoding, Flags f)
+ : iface(&encodingInterfaces[qsizetype(encoding)]), state(f)
+ {}
+ constexpr explicit QStringConverter(const Interface *i) noexcept
+ : iface(i)
+ {}
+ Q_CORE_EXPORT explicit QStringConverter(const char *name, Flags f);
+
+
+ ~QStringConverter() = default;
+
+public:
+ QStringConverter(QStringConverter &&) = default;
+ QStringConverter &operator=(QStringConverter &&) = default;
+
+ bool isValid() const noexcept { return iface != nullptr; }
+
+ void resetState() noexcept
+ {
+ state.reset();
+ }
+ bool hasError() const noexcept { return state.invalidChars != 0; }
+
+ Q_CORE_EXPORT const char *name() const noexcept;
+
+ Q_CORE_EXPORT static std::optional<Encoding> encodingForName(const char *name) noexcept;
+ Q_CORE_EXPORT static const char *nameForEncoding(Encoding e);
+ Q_CORE_EXPORT static std::optional<Encoding>
+ encodingForData(QByteArrayView data, char16_t expectedFirstCharacter = 0) noexcept;
+ Q_CORE_EXPORT static std::optional<Encoding> encodingForHtml(QByteArrayView data);
+
+ Q_CORE_EXPORT static QStringList availableCodecs();
+
+protected:
+ const Interface *iface;
+ State state;
+private:
+ Q_CORE_EXPORT static const Interface encodingInterfaces[Encoding::LastEncoding + 1];
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/corelib/text/qstringconverter_p.h b/src/corelib/text/qstringconverter_p.h
index 83ffb889cb..e68ffb2bb0 100644
--- a/src/corelib/text/qstringconverter_p.h
+++ b/src/corelib/text/qstringconverter_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGCONVERTER_P_H
#define QSTRINGCONVERTER_P_H
@@ -55,9 +19,42 @@
#include <QtCore/qstring.h>
#include <QtCore/qendian.h>
#include <QtCore/qstringconverter.h>
+#include <QtCore/private/qglobal_p.h>
QT_BEGIN_NAMESPACE
+#ifndef __cpp_char8_t
+enum qchar8_t : uchar {};
+#else
+using qchar8_t = char8_t;
+#endif
+
+struct QLatin1
+{
+ // Defined in qstring.cpp
+ static char16_t *convertToUnicode(char16_t *dst, QLatin1StringView in) noexcept;
+
+ static QChar *convertToUnicode(QChar *buffer, QLatin1StringView in) noexcept
+ {
+ char16_t *dst = reinterpret_cast<char16_t *>(buffer);
+ dst = convertToUnicode(dst, in);
+ return reinterpret_cast<QChar *>(dst);
+ }
+
+ static QChar *convertToUnicode(QChar *dst, QByteArrayView in,
+ [[maybe_unused]] QStringConverterBase::State *state) noexcept
+ {
+ Q_ASSERT(state);
+
+ return convertToUnicode(dst, QLatin1StringView(in.data(), in.size()));
+ }
+
+ static char *convertFromUnicode(char *out, QStringView in, QStringConverter::State *state) noexcept;
+
+ // Defined in qstring.cpp
+ static char *convertFromUnicode(char *out, QStringView in) noexcept;
+};
+
struct QUtf8BaseTraits
{
static const bool isTrusted = false;
@@ -66,44 +63,59 @@ struct QUtf8BaseTraits
static const int Error = -1;
static const int EndOfString = -2;
- static bool isValidCharacter(uint u)
- { return int(u) >= 0; }
-
static void appendByte(uchar *&ptr, uchar b)
{ *ptr++ = b; }
+ static void appendByte(qchar8_t *&ptr, qchar8_t b)
+ { *ptr++ = b; }
+
+ static uchar peekByte(const char *ptr, qsizetype n = 0)
+ { return ptr[n]; }
+
static uchar peekByte(const uchar *ptr, qsizetype n = 0)
{ return ptr[n]; }
+ static uchar peekByte(const qchar8_t *ptr, qsizetype n = 0)
+ { return ptr[n]; }
+
+ static qptrdiff availableBytes(const char *ptr, const char *end)
+ { return end - ptr; }
+
static qptrdiff availableBytes(const uchar *ptr, const uchar *end)
{ return end - ptr; }
+ static qptrdiff availableBytes(const qchar8_t *ptr, const qchar8_t *end)
+ { return end - ptr; }
+
+ static void advanceByte(const char *&ptr, qsizetype n = 1)
+ { ptr += n; }
+
static void advanceByte(const uchar *&ptr, qsizetype n = 1)
{ ptr += n; }
- static void appendUtf16(ushort *&ptr, ushort uc)
- { *ptr++ = uc; }
+ static void advanceByte(const qchar8_t *&ptr, qsizetype n = 1)
+ { ptr += n; }
+
+ static void appendUtf16(char16_t *&ptr, char16_t uc)
+ { *ptr++ = char16_t(uc); }
- static void appendUcs4(ushort *&ptr, uint uc)
+ static void appendUcs4(char16_t *&ptr, char32_t uc)
{
appendUtf16(ptr, QChar::highSurrogate(uc));
appendUtf16(ptr, QChar::lowSurrogate(uc));
}
- static ushort peekUtf16(const ushort *ptr, qsizetype n = 0)
- { return ptr[n]; }
+ static char16_t peekUtf16(const char16_t *ptr, qsizetype n = 0) { return ptr[n]; }
- static qptrdiff availableUtf16(const ushort *ptr, const ushort *end)
+ static qptrdiff availableUtf16(const char16_t *ptr, const char16_t *end)
{ return end - ptr; }
- static void advanceUtf16(const ushort *&ptr, qsizetype n = 1)
- { ptr += n; }
+ static void advanceUtf16(const char16_t *&ptr, qsizetype n = 1) { ptr += n; }
- // it's possible to output to UCS-4 too
- static void appendUtf16(uint *&ptr, ushort uc)
- { *ptr++ = uc; }
+ static void appendUtf16(char32_t *&ptr, char16_t uc)
+ { *ptr++ = char32_t(uc); }
- static void appendUcs4(uint *&ptr, uint uc)
+ static void appendUcs4(char32_t *&ptr, char32_t uc)
{ *ptr++ = uc; }
};
@@ -119,7 +131,7 @@ namespace QUtf8Functions
/// if \a u is a high surrogate, Error if the next isn't a low one,
/// EndOfString if we run into the end of the string.
template <typename Traits, typename OutputPtr, typename InputPtr> inline
- int toUtf8(ushort u, OutputPtr &dst, InputPtr &src, InputPtr end)
+ int toUtf8(char16_t u, OutputPtr &dst, InputPtr &src, InputPtr end)
{
if (!Traits::skipAsciiHandling && u < 0x80) {
// U+0000 to U+007F (US-ASCII) - one byte
@@ -143,14 +155,14 @@ namespace QUtf8Functions
if (Traits::availableUtf16(src, end) == 0)
return Traits::EndOfString;
- ushort low = Traits::peekUtf16(src);
+ char16_t low = Traits::peekUtf16(src);
if (!QChar::isHighSurrogate(u))
return Traits::Error;
if (!QChar::isLowSurrogate(low))
return Traits::Error;
Traits::advanceUtf16(src);
- uint ucs4 = QChar::surrogateToUcs4(u, low);
+ char32_t ucs4 = QChar::surrogateToUcs4(u, low);
if (!Traits::allowNonCharacters && QChar::isNonCharacter(ucs4))
return Traits::Error;
@@ -162,7 +174,7 @@ namespace QUtf8Functions
Traits::appendByte(dst, 0x80 | (uchar(ucs4 >> 12) & 0x3f));
// for the rest of the bytes
- u = ushort(ucs4);
+ u = char16_t(ucs4);
}
// second to last byte
@@ -185,8 +197,8 @@ namespace QUtf8Functions
qsizetype fromUtf8(uchar b, OutputPtr &dst, InputPtr &src, InputPtr end)
{
qsizetype charsNeeded;
- uint min_uc;
- uint uc;
+ char32_t min_uc;
+ char32_t uc;
if (!Traits::skipAsciiHandling && b < 0x80) {
// US-ASCII
@@ -266,7 +278,7 @@ namespace QUtf8Functions
if (!QChar::requiresSurrogates(uc)) {
// UTF-8 decoded and no surrogates are required
// detach if necessary
- Traits::appendUtf16(dst, ushort(uc));
+ Traits::appendUtf16(dst, char16_t(uc));
} else {
// UTF-8 decoded to something that requires a surrogate pair
Traits::appendUcs4(dst, uc);
@@ -286,57 +298,98 @@ enum DataEndianness
struct QUtf8
{
- static QChar *convertToUnicode(QChar *, const char *, qsizetype) noexcept;
- static QString convertToUnicode(const char *, qsizetype);
- Q_CORE_EXPORT static QString convertToUnicode(const char *, qsizetype, QStringConverter::State *);
- static QChar *convertToUnicode(QChar *out, const char *in, qsizetype length, QStringConverter::State *state);
- static QByteArray convertFromUnicode(const QChar *, qsizetype);
- Q_CORE_EXPORT static QByteArray convertFromUnicode(const QChar *, qsizetype, QStringConverter::State *);
+ static QChar *convertToUnicode(QChar *buffer, QByteArrayView in) noexcept
+ {
+ char16_t *dst = reinterpret_cast<char16_t *>(buffer);
+ dst = QUtf8::convertToUnicode(dst, in);
+ return reinterpret_cast<QChar *>(dst);
+ }
+
+ Q_CORE_EXPORT static char16_t* convertToUnicode(char16_t *dst, QByteArrayView in) noexcept;
+ static QString convertToUnicode(QByteArrayView in);
+ Q_CORE_EXPORT static QString convertToUnicode(QByteArrayView in, QStringConverter::State *state);
+
+ static QChar *convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::State *state)
+ {
+ char16_t *buffer = reinterpret_cast<char16_t *>(out);
+ buffer = convertToUnicode(buffer, in, state);
+ return reinterpret_cast<QChar *>(buffer);
+ }
+
+ static char16_t *convertToUnicode(char16_t *dst, QByteArrayView in, QStringConverter::State *state);
+
+ Q_CORE_EXPORT static QByteArray convertFromUnicode(QStringView in);
+ Q_CORE_EXPORT static QByteArray convertFromUnicode(QStringView in, QStringConverterBase::State *state);
static char *convertFromUnicode(char *out, QStringView in, QStringConverter::State *state);
+ Q_CORE_EXPORT static char *convertFromLatin1(char *out, QLatin1StringView in);
struct ValidUtf8Result {
bool isValidUtf8;
bool isValidAscii;
};
- static ValidUtf8Result isValidUtf8(const char *, qsizetype);
- static int compareUtf8(const char *, qsizetype, const QChar *, qsizetype);
- static int compareUtf8(const char *, qsizetype, QLatin1String s);
+ static ValidUtf8Result isValidUtf8(QByteArrayView in);
+ static int compareUtf8(QByteArrayView utf8, QStringView utf16,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+ static int compareUtf8(QByteArrayView utf8, QLatin1StringView s,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ static int compareUtf8(QByteArrayView lhs, QByteArrayView rhs,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
};
struct QUtf16
{
- Q_CORE_EXPORT static QString convertToUnicode(const char *, qsizetype, QStringConverter::State *, DataEndianness = DetectEndianness);
- static QChar *convertToUnicode(QChar *out, const char *chars, qsizetype len, QStringConverter::State *state, DataEndianness endian);
- Q_CORE_EXPORT static QByteArray convertFromUnicode(const QChar *, qsizetype, QStringConverter::State *, DataEndianness = DetectEndianness);
+ Q_CORE_EXPORT static QString convertToUnicode(QByteArrayView, QStringConverter::State *, DataEndianness = DetectEndianness);
+ static QChar *convertToUnicode(QChar *out, QByteArrayView, QStringConverter::State *state, DataEndianness endian);
+ Q_CORE_EXPORT static QByteArray convertFromUnicode(QStringView, QStringConverter::State *, DataEndianness = DetectEndianness);
static char *convertFromUnicode(char *out, QStringView in, QStringConverter::State *state, DataEndianness endian);
};
struct QUtf32
{
- static QChar *convertToUnicode(QChar *out, const char *chars, qsizetype len, QStringConverter::State *state, DataEndianness endian);
- Q_CORE_EXPORT static QString convertToUnicode(const char *, qsizetype, QStringConverter::State *, DataEndianness = DetectEndianness);
- Q_CORE_EXPORT static QByteArray convertFromUnicode(const QChar *, qsizetype, QStringConverter::State *, DataEndianness = DetectEndianness);
+ static QChar *convertToUnicode(QChar *out, QByteArrayView, QStringConverter::State *state, DataEndianness endian);
+ Q_CORE_EXPORT static QString convertToUnicode(QByteArrayView, QStringConverter::State *, DataEndianness = DetectEndianness);
+ Q_CORE_EXPORT static QByteArray convertFromUnicode(QStringView, QStringConverter::State *, DataEndianness = DetectEndianness);
static char *convertFromUnicode(char *out, QStringView in, QStringConverter::State *state, DataEndianness endian);
};
struct Q_CORE_EXPORT QLocal8Bit
{
#if !defined(Q_OS_WIN) || defined(QT_BOOTSTRAPPED)
- static QString convertToUnicode(const char *chars, qsizetype len, QStringConverter::State *state)
- { return QUtf8::convertToUnicode(chars, len, state); }
- static QByteArray convertFromUnicode(const QChar *chars, qsizetype len, QStringConverter::State *state)
- { return QUtf8::convertFromUnicode(chars, len, state); }
+ static QString convertToUnicode(QByteArrayView in, QStringConverter::State *state)
+ { return QUtf8::convertToUnicode(in, state); }
+ static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state)
+ { return QUtf8::convertFromUnicode(in, state); }
#else
- static QString convertToUnicode(const char *, qsizetype, QStringConverter::State *);
- static QByteArray convertFromUnicode(const QChar *, qsizetype, QStringConverter::State *);
+ static int checkUtf8();
+ static bool isUtf8()
+ {
+ Q_CONSTINIT
+ static QBasicAtomicInteger<qint8> result = { 0 };
+ int r = result.loadRelaxed();
+ if (r == 0) {
+ r = checkUtf8();
+ result.storeRelaxed(r);
+ }
+ return r > 0;
+ }
+ static QString convertToUnicode_sys(QByteArrayView, quint32, QStringConverter::State *);
+ static QString convertToUnicode_sys(QByteArrayView, QStringConverter::State *);
+ static QString convertToUnicode(QByteArrayView in, QStringConverter::State *state)
+ {
+ if (isUtf8())
+ return QUtf8::convertToUnicode(in, state);
+ return convertToUnicode_sys(in, state);
+ }
+ static QByteArray convertFromUnicode_sys(QStringView, quint32, QStringConverter::State *);
+ static QByteArray convertFromUnicode_sys(QStringView, QStringConverter::State *);
+ static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state)
+ {
+ if (isUtf8())
+ return QUtf8::convertFromUnicode(in, state);
+ return convertFromUnicode_sys(in, state);
+ }
#endif
};
-/*
- Converts from different utf encodings looking at a possible byte order mark at the
- beginning of the string. If no BOM exists, utf-8 is assumed.
- */
-Q_CORE_EXPORT QString qFromUtfEncoded(const QByteArray &ba);
-
QT_END_NAMESPACE
#endif // QSTRINGCONVERTER_P_H
diff --git a/src/corelib/text/qstringfwd.h b/src/corelib/text/qstringfwd.h
new file mode 100644
index 0000000000..2e3c9e8248
--- /dev/null
+++ b/src/corelib/text/qstringfwd.h
@@ -0,0 +1,56 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <QtCore/qglobal.h>
+
+#ifndef QSTRINGFWD_H
+#define QSTRINGFWD_H
+
+QT_BEGIN_NAMESPACE
+
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
+# define QT_BEGIN_HAS_CHAR8_T_NAMESPACE inline namespace q_has_char8_t {
+# define QT_BEGIN_NO_CHAR8_T_NAMESPACE namespace q_no_char8_t {
+#else
+# define QT_BEGIN_HAS_CHAR8_T_NAMESPACE namespace q_has_char8_t {
+# define QT_BEGIN_NO_CHAR8_T_NAMESPACE inline namespace q_no_char8_t {
+#endif
+#define QT_END_HAS_CHAR8_T_NAMESPACE }
+#define QT_END_NO_CHAR8_T_NAMESPACE }
+
+// declare namespaces:
+QT_BEGIN_HAS_CHAR8_T_NAMESPACE
+QT_END_HAS_CHAR8_T_NAMESPACE
+QT_BEGIN_NO_CHAR8_T_NAMESPACE
+QT_END_NO_CHAR8_T_NAMESPACE
+
+class QByteArray;
+class QByteArrayView;
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED) || defined(Q_QDOC)
+class QLatin1StringView;
+using QLatin1String = QLatin1StringView;
+#else
+class QLatin1String;
+using QLatin1StringView = QLatin1String;
+#endif
+class QStringView;
+template <bool> class QBasicUtf8StringView;
+class QAnyStringView;
+class QChar;
+class QRegularExpression;
+class QRegularExpressionMatch;
+
+#ifndef Q_QDOC
+// ### Qt 7: remove the non-char8_t version of QUtf8StringView
+QT_BEGIN_NO_CHAR8_T_NAMESPACE
+using QUtf8StringView = QBasicUtf8StringView<false>;
+QT_END_NO_CHAR8_T_NAMESPACE
+
+QT_BEGIN_HAS_CHAR8_T_NAMESPACE
+using QUtf8StringView = QBasicUtf8StringView<true>;
+QT_END_HAS_CHAR8_T_NAMESPACE
+#endif // Q_QDOC
+
+QT_END_NAMESPACE
+
+#endif // QSTRINGFWD_H
diff --git a/src/corelib/text/qstringiterator.qdoc b/src/corelib/text/qstringiterator.qdoc
index 9be610161f..9b1e43163e 100644
--- a/src/corelib/text/qstringiterator.qdoc
+++ b/src/corelib/text/qstringiterator.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QStringIterator
diff --git a/src/corelib/text/qstringiterator_p.h b/src/corelib/text/qstringiterator_p.h
index 0ee5eb0e53..bb1a861637 100644
--- a/src/corelib/text/qstringiterator_p.h
+++ b/src/corelib/text/qstringiterator_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGITERATOR_H
#define QSTRINGITERATOR_H
@@ -61,6 +25,8 @@ class QStringIterator
{
QString::const_iterator i, pos, e;
static_assert((std::is_same<QString::const_iterator, const QChar *>::value));
+ static bool less(const QChar *lhs, const QChar *rhs) noexcept
+ { return std::less{}(lhs, rhs); }
public:
explicit QStringIterator(QStringView string, qsizetype idx = 0)
: i(string.begin()),
@@ -76,7 +42,7 @@ public:
{
}
- inline explicit QStringIterator(const QChar *begin, int idx, const QChar *end)
+ explicit QStringIterator(const QChar *begin, qsizetype idx, const QChar *end)
: i(begin),
pos(begin + idx),
e(end)
@@ -88,14 +54,15 @@ public:
return pos;
}
- inline int index() const
+ qsizetype index() const
{
- return int(pos - i);
+ return pos - i;
}
inline void setPosition(QString::const_iterator position)
{
- Q_ASSERT_X(i <= position && position <= e, Q_FUNC_INFO, "position out of bounds");
+ Q_ASSERT_X(!less(position, i) && !less(e, position),
+ Q_FUNC_INFO, "position out of bounds");
pos = position;
}
@@ -103,7 +70,7 @@ public:
inline bool hasNext() const
{
- return pos < e;
+ return less(pos, e);
}
inline void advance()
@@ -120,16 +87,20 @@ public:
{
Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
- if (Q_UNLIKELY((pos++)->isHighSurrogate()))
+ if (Q_UNLIKELY((pos++)->isHighSurrogate())) {
+ Q_ASSERT(hasNext() && pos->isLowSurrogate());
++pos;
+ }
}
inline char32_t peekNextUnchecked() const
{
Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
- if (Q_UNLIKELY(pos->isHighSurrogate()))
+ if (Q_UNLIKELY(pos->isHighSurrogate())) {
+ Q_ASSERT(less(pos + 1, e) && pos[1].isLowSurrogate());
return QChar::surrogateToUcs4(pos[0], pos[1]);
+ }
return pos->unicode();
}
@@ -155,8 +126,10 @@ public:
Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
const QChar cur = *pos++;
- if (Q_UNLIKELY(cur.isHighSurrogate()))
+ if (Q_UNLIKELY(cur.isHighSurrogate())) {
+ Q_ASSERT(hasNext() && pos->isLowSurrogate());
return QChar::surrogateToUcs4(cur, *pos++);
+ }
return cur.unicode();
}
@@ -166,7 +139,7 @@ public:
const QChar uc = *pos++;
if (Q_UNLIKELY(uc.isSurrogate())) {
- if (Q_LIKELY(uc.isHighSurrogate() && pos < e && pos->isLowSurrogate()))
+ if (Q_LIKELY(uc.isHighSurrogate() && hasNext() && pos->isLowSurrogate()))
return QChar::surrogateToUcs4(uc, *pos++);
return invalidAs;
}
@@ -178,7 +151,7 @@ public:
inline bool hasPrevious() const
{
- return pos > i;
+ return less(i, pos);
}
inline void recede()
@@ -196,16 +169,20 @@ public:
{
Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
- if (Q_UNLIKELY((--pos)->isLowSurrogate()))
+ if (Q_UNLIKELY((--pos)->isLowSurrogate())) {
+ Q_ASSERT(hasPrevious() && pos[-1].isHighSurrogate());
--pos;
+ }
}
inline char32_t peekPreviousUnchecked() const
{
Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
- if (Q_UNLIKELY(pos[-1].isLowSurrogate()))
+ if (Q_UNLIKELY(pos[-1].isLowSurrogate())) {
+ Q_ASSERT(less(i + 1, pos) && pos[-2].isHighSurrogate());
return QChar::surrogateToUcs4(pos[-2], pos[-1]);
+ }
return pos[-1].unicode();
}
@@ -230,8 +207,10 @@ public:
Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
const QChar cur = *--pos;
- if (Q_UNLIKELY(cur.isLowSurrogate()))
+ if (Q_UNLIKELY(cur.isLowSurrogate())) {
+ Q_ASSERT(hasPrevious() && pos[-1].isHighSurrogate());
return QChar::surrogateToUcs4(*--pos, cur);
+ }
return cur.unicode();
}
@@ -241,7 +220,7 @@ public:
const QChar uc = *--pos;
if (Q_UNLIKELY(uc.isSurrogate())) {
- if (Q_LIKELY(uc.isLowSurrogate() && pos > i && pos[-1].isHighSurrogate()))
+ if (Q_LIKELY(uc.isLowSurrogate() && hasPrevious() && pos[-1].isHighSurrogate()))
return QChar::surrogateToUcs4(*--pos, uc);
return invalidAs;
}
diff --git a/src/corelib/text/qstringlist.cpp b/src/corelib/text/qstringlist.cpp
index 942b1fdf97..61923e0b3f 100644
--- a/src/corelib/text/qstringlist.cpp
+++ b/src/corelib/text/qstringlist.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qstringlist.h>
#include <qset.h>
@@ -108,7 +72,7 @@ QT_BEGIN_NAMESPACE
\section1 Adding Strings
Strings can be added to a list using the \l
- {QList::insert()}{insert()} \l
+ {QList::insert()}{insert()}, \l
{QList::append()}{append()}, \l
{QList::operator+=()}{operator+=()} and \l
{operator<<()} functions.
@@ -120,25 +84,7 @@ QT_BEGIN_NAMESPACE
\section1 Iterating Over the Strings
- To iterate over a list, you can either use index positions or
- QList's Java-style and STL-style iterator types:
-
- Indexing:
-
- \snippet qstringlist/main.cpp 1
-
- Java-style iterator:
-
- \snippet qstringlist/main.cpp 2
-
- STL-style iterator:
-
- \snippet qstringlist/main.cpp 3
-
- The QStringListIterator class is simply a type definition for
- QListIterator<QString>. QStringList also provide the
- QMutableStringListIterator class which is a type definition for
- QMutableListIterator<QString>.
+ See \l {Iterating over Containers}.
\section1 Manipulating the Strings
@@ -185,12 +131,6 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QStringList::QStringList()
-
- Constructs an empty string list.
-*/
-
-/*!
\fn QStringList::QStringList(const QString &str)
Constructs a string list that contains the given string, \a
@@ -249,8 +189,11 @@ QT_BEGIN_NAMESPACE
\fn void QStringList::sort(Qt::CaseSensitivity cs)
Sorts the list of strings in ascending order.
+
+//! [comparison-case-sensitivity]
If \a cs is \l Qt::CaseSensitive (the default), the string comparison
is case sensitive; otherwise the comparison is case insensitive.
+//! [comparison-case-sensitivity]
Sorting is performed using the STL's std::sort() algorithm,
which averages \l{linear-logarithmic time}, i.e. O(\e{n} log \e{n}).
@@ -263,34 +206,25 @@ QT_BEGIN_NAMESPACE
integer index.
*/
-namespace {
-struct CaseInsensitiveLessThan {
- typedef bool result_type;
- result_type operator()(const QString &s1, const QString &s2) const
- {
- return s1.compare(s2, Qt::CaseInsensitive) < 0;
- }
-};
-}
-
void QtPrivate::QStringList_sort(QStringList *that, Qt::CaseSensitivity cs)
{
- if (cs == Qt::CaseSensitive)
+ if (cs == Qt::CaseSensitive) {
std::sort(that->begin(), that->end());
- else
- std::sort(that->begin(), that->end(), CaseInsensitiveLessThan());
+ } else {
+ auto CISCompare = [](const auto &s1, const auto &s2) {
+ return s1.compare(s2, Qt::CaseInsensitive) < 0;
+ };
+ std::sort(that->begin(), that->end(), CISCompare);
+ }
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QStringList QStringList::filter(const QString &str, Qt::CaseSensitivity cs) const
Returns a list of all the strings containing the substring \a str.
- If \a cs is \l Qt::CaseSensitive (the default), the string
- comparison is case sensitive; otherwise the comparison is case
- insensitive.
+ \include qstringlist.cpp comparison-case-sensitivity
\snippet qstringlist/main.cpp 5
\snippet qstringlist/main.cpp 10
@@ -302,7 +236,17 @@ void QtPrivate::QStringList_sort(QStringList *that, Qt::CaseSensitivity cs)
\sa contains()
*/
-#endif
+
+template <typename String>
+static QStringList filter_helper(const QStringList &that, const String &needle, Qt::CaseSensitivity cs)
+{
+ QStringList res;
+ for (const auto &s : that) {
+ if (s.contains(needle, cs))
+ res.append(s);
+ }
+ return res;
+}
/*!
\fn QStringList QStringList::filter(QStringView str, Qt::CaseSensitivity cs) const
@@ -312,27 +256,47 @@ void QtPrivate::QStringList_sort(QStringList *that, Qt::CaseSensitivity cs)
QStringList QtPrivate::QStringList_filter(const QStringList *that, QStringView str,
Qt::CaseSensitivity cs)
{
- QStringMatcher matcher(str, cs);
+ return filter_helper(*that, str, cs);
+}
+
+/*!
+ \fn QStringList QStringList::filter(const QStringMatcher &matcher) const
+ \since 6.7
+ \overload
+
+ Returns a list of all the strings matched by \a matcher (i.e. for which
+ \c matcher.indexIn() returns an index >= 0).
+
+ Using a QStringMatcher may be faster when searching in large lists and/or
+ in lists with long strings (the best way to find out is benchmarking).
+
+ For example:
+ \snippet qstringlist/main.cpp 18
+
+ \sa contains()
+*/
+
+QStringList QtPrivate::QStringList_filter(const QStringList &that, const QStringMatcher &matcher)
+{
QStringList res;
- for (int i = 0; i < that->size(); ++i)
- if (matcher.indexIn(that->at(i)) != -1)
- res << that->at(i);
+ for (const auto &s : that) {
+ if (matcher.indexIn(s) != -1)
+ res.append(s);
+ }
return res;
}
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-/// Not really needed anymore, but kept for binary compatibility
-QStringList QtPrivate::QStringList_filter(const QStringList *that, const QString &str,
+/*!
+ \fn QStringList QStringList::filter(QLatin1StringView str, Qt::CaseSensitivity cs) const
+ \since 6.7
+ \overload
+*/
+
+QStringList QtPrivate::QStringList_filter(const QStringList &that, QLatin1StringView needle,
Qt::CaseSensitivity cs)
{
- QStringMatcher matcher(str, cs);
- QStringList res;
- for (int i = 0; i < that->size(); ++i)
- if (matcher.indexIn(that->at(i)) != -1)
- res << that->at(i);
- return res;
+ return filter_helper(that, needle, cs);
}
-#endif
template<typename T>
static bool stringList_contains(const QStringList &stringList, const T &str, Qt::CaseSensitivity cs)
@@ -345,26 +309,16 @@ static bool stringList_contains(const QStringList &stringList, const T &str, Qt:
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn bool QStringList::contains(const QString &str, Qt::CaseSensitivity cs) const
Returns \c true if the list contains the string \a str; otherwise
- returns \c false. The search is case insensitive if \a cs is
- Qt::CaseInsensitive; the search is case sensitive by default.
+ returns \c false.
+
+ \include qstringlist.cpp comparison-case-sensitivity
\sa indexOf(), lastIndexOf(), QString::contains()
*/
-#endif
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-/// Not really needed anymore, but kept for binary compatibility
-bool QtPrivate::QStringList_contains(const QStringList *that, const QString &str,
- Qt::CaseSensitivity cs)
-{
- return stringList_contains(*that, str, cs);
-}
-#endif
/*!
\fn bool QStringList::contains(QStringView str, Qt::CaseSensitivity cs) const
@@ -372,8 +326,9 @@ bool QtPrivate::QStringList_contains(const QStringList *that, const QString &str
\since 5.12
Returns \c true if the list contains the string \a str; otherwise
- returns \c false. The search is case insensitive if \a cs is
- Qt::CaseInsensitive; the search is case sensitive by default.
+ returns \c false.
+
+ \include qstringlist.cpp comparison-case-sensitivity
*/
bool QtPrivate::QStringList_contains(const QStringList *that, QStringView str,
Qt::CaseSensitivity cs)
@@ -382,71 +337,23 @@ bool QtPrivate::QStringList_contains(const QStringList *that, QStringView str,
}
/*!
- \fn bool QStringList::contains(QLatin1String str, Qt::CaseSensitivity cs) const
+ \fn bool QStringList::contains(QLatin1StringView str, Qt::CaseSensitivity cs) const
\overload
\since 5.10
- Returns \c true if the list contains the string \a str; otherwise
- returns \c false. The search is case insensitive if \a cs is
- Qt::CaseInsensitive; the search is case sensitive by default.
+ Returns \c true if the list contains the Latin-1 string viewed by \a str; otherwise
+ returns \c false.
+
+ \include qstringlist.cpp comparison-case-sensitivity
\sa indexOf(), lastIndexOf(), QString::contains()
*/
-bool QtPrivate::QStringList_contains(const QStringList *that, QLatin1String str,
+bool QtPrivate::QStringList_contains(const QStringList *that, QLatin1StringView str,
Qt::CaseSensitivity cs)
{
return stringList_contains(*that, str, cs);
}
-/*!
- \fn bool QStringList::indexOf(QStringView str, int from) const
- \overload
- \since 5.13
-
- Returns the index position of the first occurrence of \a str in
- the list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- \sa lastIndexOf(), contains()
- */
-
-/*!
- \fn bool QStringList::indexOf(QLatin1String str, int from) const
- \overload
- \since 5.13
-
- Returns the index position of the first occurrence of \a str in
- the list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- \sa lastIndexOf(), contains()
- */
-
-/*!
- \fn bool QStringList::lastIndexOf(QStringView str, int from) const
- \overload
- \since 5.13
-
- Returns the index position of the last occurrence of \a str in
- the list, searching backward from index position \a from. If \a
- from is -1 (the default), the search starts at the last item.
- Returns -1 if no item matched.
-
- \sa indexOf(), contains()
- */
-
-/*!
- \fn bool QStringList::lastIndexOf(QLatin1String str, int from) const
- \overload
- \since 5.13
-
- Returns the index position of the last occurrence of \a str in
- the list, searching backward from index position \a from. If \a
- from is -1 (the default), the search starts at the last item.
- Returns -1 if no item matched.
-
- \sa indexOf(), contains()
- */
#if QT_CONFIG(regularexpression)
/*!
@@ -460,22 +367,22 @@ bool QtPrivate::QStringList_contains(const QStringList *that, QLatin1String str,
QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegularExpression &re)
{
QStringList res;
- for (int i = 0; i < that->size(); ++i) {
- if (that->at(i).contains(re))
- res << that->at(i);
+ for (const auto &str : *that) {
+ if (str.contains(re))
+ res.append(str);
}
return res;
}
#endif // QT_CONFIG(regularexpression)
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QStringList &QStringList::replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs)
Returns a string list where every string has had the \a before
text replaced with the \a after text wherever the \a before text
- is found. The \a before text is matched case-sensitively or not
- depending on the \a cs flag.
+ is found.
+
+ \include qstringlist.cpp comparison-case-sensitivity
For example:
@@ -496,7 +403,6 @@ QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegula
\overload
\since 5.14
*/
-#endif
/*!
\fn QStringList &QStringList::replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs)
@@ -506,19 +412,20 @@ QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegula
void QtPrivate::QStringList_replaceInStrings(QStringList *that, QStringView before,
QStringView after, Qt::CaseSensitivity cs)
{
- for (int i = 0; i < that->size(); ++i)
- (*that)[i].replace(before.data(), before.length(), after.data(), after.length(), cs);
-}
+ // Before potentially detaching "that" list, check if any string contains "before"
+ qsizetype i = -1;
+ for (qsizetype j = 0; j < that->size(); ++j) {
+ if (that->at(j).contains(before, cs)) {
+ i = j;
+ break;
+ }
+ }
+ if (i == -1)
+ return;
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-/// Not really needed anymore, but kept for binary compatibility
-void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QString &before,
- const QString &after, Qt::CaseSensitivity cs)
-{
- for (int i = 0; i < that->size(); ++i)
- (*that)[i].replace(before, after, cs);
+ for (; i < that->size(); ++i)
+ (*that)[i].replace(before.data(), before.size(), after.data(), after.size(), cs);
}
-#endif
#if QT_CONFIG(regularexpression)
/*!
@@ -544,16 +451,28 @@ void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QString &b
\snippet qstringlist/main.cpp 5
\snippet qstringlist/main.cpp 17
*/
-void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QRegularExpression &re, const QString &after)
+void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QRegularExpression &re,
+ const QString &after)
{
- for (int i = 0; i < that->size(); ++i)
+ // Before potentially detaching "that" list, check if any string contains "before"
+ qsizetype i = -1;
+ for (qsizetype j = 0; j < that->size(); ++j) {
+ if (that->at(j).contains(re)) {
+ i = j;
+ break;
+ }
+ }
+ if (i == -1)
+ return;
+
+ for (; i < that->size(); ++i)
(*that)[i].replace(re, after);
}
#endif // QT_CONFIG(regularexpression)
-static int accumulatedSize(const QStringList &list, int seplen)
+static qsizetype accumulatedSize(const QStringList &list, qsizetype seplen)
{
- int result = 0;
+ qsizetype result = 0;
if (!list.isEmpty()) {
for (const auto &e : list)
result += e.size() + seplen;
@@ -562,7 +481,6 @@ static int accumulatedSize(const QStringList &list, int seplen)
return result;
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QString QStringList::join(const QString &separator) const
@@ -572,23 +490,22 @@ static int accumulatedSize(const QStringList &list, int seplen)
\sa QString::split()
*/
-#endif
/*!
\fn QString QStringList::join(QChar separator) const
\since 5.0
\overload join()
*/
-QString QtPrivate::QStringList_join(const QStringList *that, const QChar *sep, int seplen)
+QString QtPrivate::QStringList_join(const QStringList *that, const QChar *sep, qsizetype seplen)
{
- const int totalLength = accumulatedSize(*that, seplen);
- const int size = that->size();
+ const qsizetype totalLength = accumulatedSize(*that, seplen);
+ const qsizetype size = that->size();
QString res;
if (totalLength == 0)
return res;
res.reserve(totalLength);
- for (int i = 0; i < size; ++i) {
+ for (qsizetype i = 0; i < size; ++i) {
if (i)
res.append(sep, seplen);
res += that->at(i);
@@ -597,11 +514,11 @@ QString QtPrivate::QStringList_join(const QStringList *that, const QChar *sep, i
}
/*!
- \fn QString QStringList::join(QLatin1String separator) const
+ \fn QString QStringList::join(QLatin1StringView separator) const
\since 5.8
\overload join()
*/
-QString QtPrivate::QStringList_join(const QStringList &list, QLatin1String sep)
+QString QtPrivate::QStringList_join(const QStringList &list, QLatin1StringView sep)
{
QString result;
if (!list.isEmpty()) {
@@ -624,7 +541,7 @@ QString QtPrivate::QStringList_join(const QStringList &list, QLatin1String sep)
*/
QString QtPrivate::QStringList_join(const QStringList *that, QStringView sep)
{
- return QStringList_join(that, sep.data(), sep.length());
+ return QStringList_join(that, sep.data(), sep.size());
}
/*!
@@ -664,9 +581,105 @@ QString QtPrivate::QStringList_join(const QStringList *that, QStringView sep)
the latter string list.
*/
+/*!
+ \fn qsizetype QStringList::indexOf(const QString &str, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QStringList::indexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QStringList::indexOf(QLatin1StringView str, qsizetype from, Qt::CaseSensitivity cs) const
+
+ Returns the index position of the first match of \a str in the list,
+ searching forward from index position \a from. Returns -1 if no item
+ matched.
+
+ \include qstringlist.cpp comparison-case-sensitivity
+
+//! [overloading-base-class-methods]
+ \note The \a cs parameter was added in Qt 6.7, i.e. these methods now overload
+ the methods inherited from the base class. Prior to that these methods only
+ had two parameters. This change is source compatible and existing code should
+ continue to work.
+//! [overloading-base-class-methods]
+
+ \sa lastIndexOf()
+*/
+
+template <typename String>
+qsizetype indexOf_helper(const QStringList &that, String needle, qsizetype from,
+ Qt::CaseSensitivity cs)
+{
+ if (from < 0) // Historical behavior
+ from = qMax(from + that.size(), 0);
+
+ if (from >= that.size())
+ return -1;
+
+ for (qsizetype i = from; i < that.size(); ++i) {
+ if (needle.compare(that.at(i), cs) == 0)
+ return i;
+ }
+ return -1;
+}
+
+qsizetype QtPrivate::QStringList_indexOf(const QStringList &that, QStringView needle,
+ qsizetype from, Qt::CaseSensitivity cs)
+{
+ return indexOf_helper(that, needle, from, cs);
+}
+
+qsizetype QtPrivate::QStringList_indexOf(const QStringList &that, QLatin1StringView needle,
+ qsizetype from, Qt::CaseSensitivity cs)
+{
+ return indexOf_helper(that, needle, from, cs);
+}
+
+/*!
+ \fn qsizetype QStringList::lastIndexOf(const QString &str, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QStringList::lastIndexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QStringList::lastIndexOf(QLatin1StringView str, qsizetype from, Qt::CaseSensitivity cs) const
+
+ Returns the index position of the last match of \a str in the list,
+ searching backward from index position \a from. If \a from is -1 (the
+ default), the search starts at the last item. Returns -1 if no item
+ matched.
+
+ \include qstringlist.cpp comparison-case-sensitivity
+
+ \include qstringlist.cpp overloading-base-class-methods
+
+ \sa indexOf()
+*/
+
+template <typename String>
+qsizetype lastIndexof_helper(const QStringList &that, String needle, qsizetype from,
+ Qt::CaseSensitivity cs)
+{
+ if (from < 0)
+ from += that.size();
+ else if (from >= that.size())
+ from = that.size() - 1;
+
+ for (qsizetype i = from; i >= 0; --i) {
+ if (needle.compare(that.at(i), cs) == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+qsizetype QtPrivate::QStringList_lastIndexOf(const QStringList &that, QLatin1StringView needle,
+ qsizetype from, Qt::CaseSensitivity cs)
+{
+ return lastIndexof_helper(that, needle, from, cs);
+}
+
+qsizetype QtPrivate::QStringList_lastIndexOf(const QStringList &that, QStringView needle,
+ qsizetype from, Qt::CaseSensitivity cs)
+{
+ return lastIndexof_helper(that, needle, from, cs);
+}
+
#if QT_CONFIG(regularexpression)
/*!
- \fn int QStringList::indexOf(const QRegularExpression &re, int from) const
+ \fn qsizetype QStringList::indexOf(const QRegularExpression &re, qsizetype from) const
\overload
\since 5.0
@@ -676,15 +689,15 @@ QString QtPrivate::QStringList_join(const QStringList *that, QStringView sep)
\sa lastIndexOf()
*/
-int QtPrivate::QStringList_indexOf(const QStringList *that, const QRegularExpression &re, int from)
+qsizetype QtPrivate::QStringList_indexOf(const QStringList *that, const QRegularExpression &re, qsizetype from)
{
if (from < 0)
- from = qMax(from + that->size(), 0);
+ from = qMax(from + that->size(), qsizetype(0));
QString exactPattern = QRegularExpression::anchoredPattern(re.pattern());
QRegularExpression exactRe(exactPattern, re.patternOptions());
- for (int i = from; i < that->size(); ++i) {
+ for (qsizetype i = from; i < that->size(); ++i) {
QRegularExpressionMatch m = exactRe.match(that->at(i));
if (m.hasMatch())
return i;
@@ -693,7 +706,7 @@ int QtPrivate::QStringList_indexOf(const QStringList *that, const QRegularExpres
}
/*!
- \fn int QStringList::lastIndexOf(const QRegularExpression &re, int from) const
+ \fn qsizetype QStringList::lastIndexOf(const QRegularExpression &re, qsizetype from) const
\overload
\since 5.0
@@ -704,7 +717,7 @@ int QtPrivate::QStringList_indexOf(const QStringList *that, const QRegularExpres
\sa indexOf()
*/
-int QtPrivate::QStringList_lastIndexOf(const QStringList *that, const QRegularExpression &re, int from)
+qsizetype QtPrivate::QStringList_lastIndexOf(const QStringList *that, const QRegularExpression &re, qsizetype from)
{
if (from < 0)
from += that->size();
@@ -714,7 +727,7 @@ int QtPrivate::QStringList_lastIndexOf(const QStringList *that, const QRegularEx
QString exactPattern = QRegularExpression::anchoredPattern(re.pattern());
QRegularExpression exactRe(exactPattern, re.patternOptions());
- for (int i = from; i >= 0; --i) {
+ for (qsizetype i = from; i >= 0; --i) {
QRegularExpressionMatch m = exactRe.match(that->at(i));
if (m.hasMatch())
return i;
@@ -724,7 +737,7 @@ int QtPrivate::QStringList_lastIndexOf(const QStringList *that, const QRegularEx
#endif // QT_CONFIG(regularexpression)
/*!
- \fn int QStringList::removeDuplicates()
+ \fn qsizetype QStringList::removeDuplicates()
\since 4.5
@@ -734,41 +747,10 @@ int QtPrivate::QStringList_lastIndexOf(const QStringList *that, const QRegularEx
Returns the number of removed entries.
*/
-int QtPrivate::QStringList_removeDuplicates(QStringList *that)
+qsizetype QtPrivate::QStringList_removeDuplicates(QStringList *that)
{
- int n = that->size();
- int j = 0;
-
- QDuplicateTracker<QString> seen;
- seen.reserve(n);
- for (int i = 0; i < n; ++i) {
- const QString &s = that->at(i);
- if (seen.hasSeen(s))
- continue;
- if (j != i)
- that->swapItemsAt(i, j);
- ++j;
- }
- if (n != j)
- that->erase(that->begin() + j, that->end());
- return n - j;
+ QDuplicateTracker<QString> seen(that->size());
+ return that->removeIf([&](const QString &s) { return seen.hasSeen(s); });
}
-/*! \fn QStringList::QStringList(std::initializer_list<QString> args)
- \since 4.8
-
- Construct a list from a std::initializer_list given by \a args.
-
- This constructor is only enabled if the compiler supports C++11 initializer
- lists.
-*/
-
- /*! \fn template<typename InputIterator> QStringList::QStringList(InputIterator first, InputIterator last)
- \since 5.14
-
- Constructs a QStringList with the contents in the iterator range [\a first, \a last).
-
- The value type of \c InputIterator must be convertible to \c QString.
- */
-
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringlist.h b/src/corelib/text/qstringlist.h
index 9c4daedd4b..fc5c49bfe1 100644
--- a/src/corelib/text/qstringlist.h
+++ b/src/corelib/text/qstringlist.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qlist.h>
@@ -57,276 +21,155 @@ using QStringListIterator = QListIterator<QString>;
using QMutableStringListIterator = QMutableListIterator<QString>;
#endif
-class QStringList;
-
-#ifdef Q_QDOC
-class QStringList : public QList<QString>
-#else
-template <> struct QListSpecialMethods<QString>
-#endif
-{
-#ifndef Q_QDOC
-protected:
- ~QListSpecialMethods() = default;
-#endif
-public:
- inline void sort(Qt::CaseSensitivity cs = Qt::CaseSensitive);
- inline int removeDuplicates();
-
-#if QT_STRINGVIEW_LEVEL < 2
- inline QString join(const QString &sep) const;
-#endif
- inline QString join(QStringView sep) const;
- inline QString join(QLatin1String sep) const;
- inline QString join(QChar sep) const;
-
- inline QStringList filter(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline QStringList &replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
-#if QT_STRINGVIEW_LEVEL < 2
- inline QStringList filter(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline QStringList &replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- inline QStringList &replaceInStrings(const QString &before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- inline QStringList &replaceInStrings(QStringView before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
-#endif
-
-#if QT_CONFIG(regularexpression)
- inline QStringList filter(const QRegularExpression &re) const;
- inline QStringList &replaceInStrings(const QRegularExpression &re, const QString &after);
-#endif // QT_CONFIG(regularexpression)
-
-#ifndef Q_QDOC
-private:
- inline QStringList *self();
- inline const QStringList *self() const;
-};
-
-// ### Qt6: check if there's a better way
-class QStringList : public QList<QString>
-{
-#endif
-public:
- inline QStringList() noexcept { }
- inline explicit QStringList(const QString &i) { append(i); }
- inline QStringList(const QList<QString> &l) : QList<QString>(l) { }
- inline QStringList(QList<QString> &&l) noexcept : QList<QString>(std::move(l)) { }
- inline QStringList(std::initializer_list<QString> args) : QList<QString>(args) { }
- template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
- inline QStringList(InputIterator first, InputIterator last)
- : QList<QString>(first, last) { }
-
- QStringList &operator=(const QList<QString> &other)
- { QList<QString>::operator=(other); return *this; }
- QStringList &operator=(QList<QString> &&other) noexcept
- { QList<QString>::operator=(std::move(other)); return *this; }
-
-#if QT_STRINGVIEW_LEVEL < 2
- inline bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- inline bool contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- inline QStringList operator+(const QStringList &other) const
- { QStringList n = *this; n += other; return n; }
- inline QStringList &operator<<(const QString &str)
- { append(str); return *this; }
- inline QStringList &operator<<(const QStringList &l)
- { *this += l; return *this; }
- inline QStringList &operator<<(const QList<QString> &l)
- { *this += l; return *this; }
-
- inline int indexOf(QStringView str, int from = 0) const;
- inline int indexOf(QLatin1String str, int from = 0) const;
-
- inline int lastIndexOf(QStringView str, int from = -1) const;
- inline int lastIndexOf(QLatin1String str, int from = -1) const;
-
-#if QT_CONFIG(regularexpression)
- inline int indexOf(const QRegularExpression &re, int from = 0) const;
- inline int lastIndexOf(const QRegularExpression &re, int from = -1) const;
-#endif // QT_CONFIG(regularexpression)
-
- using QList<QString>::indexOf;
- using QList<QString>::lastIndexOf;
-};
-
-Q_DECLARE_TYPEINFO(QStringList, Q_MOVABLE_TYPE);
-
-#ifndef Q_QDOC
-inline QStringList *QListSpecialMethods<QString>::self()
-{ return static_cast<QStringList *>(this); }
-inline const QStringList *QListSpecialMethods<QString>::self() const
-{ return static_cast<const QStringList *>(this); }
namespace QtPrivate {
void Q_CORE_EXPORT QStringList_sort(QStringList *that, Qt::CaseSensitivity cs);
- int Q_CORE_EXPORT QStringList_removeDuplicates(QStringList *that);
+ qsizetype Q_CORE_EXPORT QStringList_removeDuplicates(QStringList *that);
QString Q_CORE_EXPORT QStringList_join(const QStringList *that, QStringView sep);
- QString Q_CORE_EXPORT QStringList_join(const QStringList *that, const QChar *sep, int seplen);
- Q_CORE_EXPORT QString QStringList_join(const QStringList &list, QLatin1String sep);
+ QString Q_CORE_EXPORT QStringList_join(const QStringList *that, const QChar *sep, qsizetype seplen);
+ Q_CORE_EXPORT QString QStringList_join(const QStringList &list, QLatin1StringView sep);
QStringList Q_CORE_EXPORT QStringList_filter(const QStringList *that, QStringView str,
Qt::CaseSensitivity cs);
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- QStringList Q_CORE_EXPORT QStringList_filter(const QStringList *that, const QString &str,
- Qt::CaseSensitivity cs);
-#endif
+ Q_CORE_EXPORT QStringList QStringList_filter(const QStringList &that, QLatin1StringView needle,
+ Qt::CaseSensitivity cs);
+ Q_CORE_EXPORT QStringList QStringList_filter(const QStringList &that,
+ const QStringMatcher &matcher);
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, const QString &str, Qt::CaseSensitivity cs);
-#endif
bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, QStringView str, Qt::CaseSensitivity cs);
- bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, QLatin1String str, Qt::CaseSensitivity cs);
+ bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, QLatin1StringView str, Qt::CaseSensitivity cs);
void Q_CORE_EXPORT QStringList_replaceInStrings(QStringList *that, QStringView before, QStringView after,
Qt::CaseSensitivity cs);
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- void Q_CORE_EXPORT QStringList_replaceInStrings(QStringList *that, const QString &before, const QString &after,
- Qt::CaseSensitivity cs);
-#endif
+
+ qsizetype Q_CORE_EXPORT QStringList_indexOf(const QStringList &that, QStringView str,
+ qsizetype from, Qt::CaseSensitivity cs);
+ qsizetype Q_CORE_EXPORT QStringList_indexOf(const QStringList &that, QLatin1StringView str,
+ qsizetype from, Qt::CaseSensitivity cs);
+
+ Q_CORE_EXPORT qsizetype QStringList_lastIndexOf(const QStringList &that, QStringView str,
+ qsizetype from, Qt::CaseSensitivity cs);
+ Q_CORE_EXPORT qsizetype QStringList_lastIndexOf(const QStringList &that, QLatin1StringView str,
+ qsizetype from, Qt::CaseSensitivity cs);
#if QT_CONFIG(regularexpression)
void Q_CORE_EXPORT QStringList_replaceInStrings(QStringList *that, const QRegularExpression &rx, const QString &after);
QStringList Q_CORE_EXPORT QStringList_filter(const QStringList *that, const QRegularExpression &re);
- int Q_CORE_EXPORT QStringList_indexOf(const QStringList *that, const QRegularExpression &re, int from);
- int Q_CORE_EXPORT QStringList_lastIndexOf(const QStringList *that, const QRegularExpression &re, int from);
+ qsizetype Q_CORE_EXPORT QStringList_indexOf(const QStringList *that, const QRegularExpression &re, qsizetype from);
+ qsizetype Q_CORE_EXPORT QStringList_lastIndexOf(const QStringList *that, const QRegularExpression &re, qsizetype from);
#endif // QT_CONFIG(regularexpression)
}
-inline void QListSpecialMethods<QString>::sort(Qt::CaseSensitivity cs)
-{
- QtPrivate::QStringList_sort(self(), cs);
-}
-
-inline int QListSpecialMethods<QString>::removeDuplicates()
-{
- return QtPrivate::QStringList_removeDuplicates(self());
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-inline QString QListSpecialMethods<QString>::join(const QString &sep) const
-{
- return QtPrivate::QStringList_join(self(), sep.constData(), sep.length());
-}
-#endif
-
-inline QString QListSpecialMethods<QString>::join(QStringView sep) const
-{
- return QtPrivate::QStringList_join(self(), sep);
-}
-
-QString QListSpecialMethods<QString>::join(QLatin1String sep) const
-{
- return QtPrivate::QStringList_join(*self(), sep);
-}
-
-inline QString QListSpecialMethods<QString>::join(QChar sep) const
-{
- return QtPrivate::QStringList_join(self(), &sep, 1);
-}
-
-inline QStringList QListSpecialMethods<QString>::filter(QStringView str, Qt::CaseSensitivity cs) const
-{
- return QtPrivate::QStringList_filter(self(), str, cs);
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-inline QStringList QListSpecialMethods<QString>::filter(const QString &str, Qt::CaseSensitivity cs) const
-{
- return QtPrivate::QStringList_filter(self(), str, cs);
-}
-#endif
-
-#if QT_STRINGVIEW_LEVEL < 2
-inline bool QStringList::contains(const QString &str, Qt::CaseSensitivity cs) const
-{
- return QtPrivate::QStringList_contains(this, str, cs);
-}
+#ifdef Q_QDOC
+class QStringList : public QList<QString>
+#else
+template <> struct QListSpecialMethods<QString> : QListSpecialMethodsBase<QString>
#endif
-
-inline bool QStringList::contains(QLatin1String str, Qt::CaseSensitivity cs) const
-{
- return QtPrivate::QStringList_contains(this, str, cs);
-}
-
-inline bool QStringList::contains(QStringView str, Qt::CaseSensitivity cs) const
-{
- return QtPrivate::QStringList_contains(this, str, cs);
-}
-
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs)
-{
- QtPrivate::QStringList_replaceInStrings(self(), before, after, cs);
- return *self();
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs)
{
- QtPrivate::QStringList_replaceInStrings(self(), before, after, cs);
- return *self();
-}
-
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(QStringView before, const QString &after, Qt::CaseSensitivity cs)
-{
- QtPrivate::QStringList_replaceInStrings(self(), before, qToStringViewIgnoringNull(after), cs);
- return *self();
-}
-
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(const QString &before, QStringView after, Qt::CaseSensitivity cs)
-{
- QtPrivate::QStringList_replaceInStrings(self(), QStringView(before), after, cs);
- return *self();
-}
+#ifdef Q_QDOC
+public:
+ using QList<QString>::QList;
+ QStringList(const QString &str);
+ QStringList(const QList<QString> &other);
+ QStringList(QList<QString> &&other);
+
+ QStringList &operator=(const QList<QString> &other);
+ QStringList &operator=(QList<QString> &&other);
+ QStringList operator+(const QStringList &other) const;
+ QStringList &operator<<(const QString &str);
+ QStringList &operator<<(const QStringList &other);
+ QStringList &operator<<(const QList<QString> &other);
+private:
#endif
-inline QStringList operator+(const QList<QString> &one, const QStringList &other)
-{
- QStringList n = one;
- n += other;
- return n;
-}
-
-inline int QStringList::indexOf(QStringView string, int from) const
-{
- return QtPrivate::indexOf<QString, QStringView>(*this, string, from);
-}
-
-inline int QStringList::indexOf(QLatin1String string, int from) const
-{
- return QtPrivate::indexOf<QString, QLatin1String>(*this, string, from);
-}
-
-inline int QStringList::lastIndexOf(QStringView string, int from) const
-{
- return QtPrivate::lastIndexOf<QString, QStringView>(*this, string, from);
-}
-
-inline int QStringList::lastIndexOf(QLatin1String string, int from) const
-{
- return QtPrivate::lastIndexOf<QString, QLatin1String>(*this, string, from);
-}
+public:
+ inline void sort(Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ { QtPrivate::QStringList_sort(self(), cs); }
+ inline qsizetype removeDuplicates()
+ { return QtPrivate::QStringList_removeDuplicates(self()); }
+
+ inline QString join(QStringView sep) const
+ { return QtPrivate::QStringList_join(self(), sep); }
+ inline QString join(QLatin1StringView sep) const
+ { return QtPrivate::QStringList_join(*self(), sep); }
+ inline QString join(QChar sep) const
+ { return QtPrivate::QStringList_join(self(), &sep, 1); }
+
+ QStringList filter(const QStringMatcher &matcher) const
+ { return QtPrivate::QStringList_filter(*self(), matcher); }
+ QStringList filter(QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ { return QtPrivate::QStringList_filter(*self(), needle, cs); }
+ inline QStringList filter(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ { return QtPrivate::QStringList_filter(self(), str, cs); }
+ inline QStringList &replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ {
+ QtPrivate::QStringList_replaceInStrings(self(), before, after, cs);
+ return *self();
+ }
+
+ inline QString join(const QString &sep) const
+ { return QtPrivate::QStringList_join(self(), sep.constData(), sep.size()); }
+ inline QStringList filter(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ { return QtPrivate::QStringList_filter(self(), str, cs); }
+ inline QStringList &replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ {
+ QtPrivate::QStringList_replaceInStrings(self(), before, after, cs);
+ return *self();
+ }
+ inline QStringList &replaceInStrings(const QString &before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ {
+ QtPrivate::QStringList_replaceInStrings(self(), before, after, cs);
+ return *self();
+ }
+ inline QStringList &replaceInStrings(QStringView before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ {
+ QtPrivate::QStringList_replaceInStrings(self(), before, after, cs);
+ return *self();
+ }
+ using QListSpecialMethodsBase<QString>::contains;
+ using QListSpecialMethodsBase<QString>::indexOf;
+ using QListSpecialMethodsBase<QString>::lastIndexOf;
+
+ inline bool contains(QLatin1StringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_contains(self(), str, cs); }
+ inline bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_contains(self(), str, cs); }
+
+ inline bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_contains(self(), str, cs); }
+
+ qsizetype indexOf(const QString &str, qsizetype from = 0,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return indexOf(QStringView(str), from, cs); }
+ qsizetype indexOf(QStringView needle, qsizetype from = 0,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_indexOf(*self(), needle, from, cs); }
+ qsizetype indexOf(QLatin1StringView needle, qsizetype from = 0,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_indexOf(*self(), needle, from, cs); }
+
+ qsizetype lastIndexOf(const QString &str, qsizetype from = -1,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(QStringView(str), from, cs); }
+ qsizetype lastIndexOf(QStringView str, qsizetype from = -1,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_lastIndexOf(*self(), str, from, cs); }
+ qsizetype lastIndexOf(QLatin1StringView needle, qsizetype from = -1,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_lastIndexOf(*self(), needle, from, cs); }
#if QT_CONFIG(regularexpression)
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(const QRegularExpression &rx, const QString &after)
-{
- QtPrivate::QStringList_replaceInStrings(self(), rx, after);
- return *self();
-}
-
-inline QStringList QListSpecialMethods<QString>::filter(const QRegularExpression &rx) const
-{
- return QtPrivate::QStringList_filter(self(), rx);
-}
-
-inline int QStringList::indexOf(const QRegularExpression &rx, int from) const
-{
- return QtPrivate::QStringList_indexOf(this, rx, from);
-}
-
-inline int QStringList::lastIndexOf(const QRegularExpression &rx, int from) const
-{
- return QtPrivate::QStringList_lastIndexOf(this, rx, from);
-}
+ inline QStringList filter(const QRegularExpression &re) const
+ { return QtPrivate::QStringList_filter(self(), re); }
+ inline QStringList &replaceInStrings(const QRegularExpression &re, const QString &after)
+ {
+ QtPrivate::QStringList_replaceInStrings(self(), re, after);
+ return *self();
+ }
+ inline qsizetype indexOf(const QRegularExpression &re, qsizetype from = 0) const
+ { return QtPrivate::QStringList_indexOf(self(), re, from); }
+ inline qsizetype lastIndexOf(const QRegularExpression &re, qsizetype from = -1) const
+ { return QtPrivate::QStringList_lastIndexOf(self(), re, from); }
#endif // QT_CONFIG(regularexpression)
-#endif // Q_QDOC
+};
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringliteral.h b/src/corelib/text/qstringliteral.h
index a44787c7a4..429d9c02ad 100644
--- a/src/corelib/text/qstringliteral.h
+++ b/src/corelib/text/qstringliteral.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGLITERAL_H
#define QSTRINGLITERAL_H
@@ -55,28 +19,24 @@ QT_BEGIN_NAMESPACE
// to lacking stdlib support. But QStringLiteral only needs the
// core language feature, so just use u"" here unconditionally:
-typedef char16_t qunicodechar;
+#define QT_UNICODE_LITERAL(str) u"" str
-static_assert(sizeof(qunicodechar) == 2,
- "qunicodechar must typedef an integral type of size 2");
+using QStringPrivate = QArrayDataPointer<char16_t>;
+
+namespace QtPrivate {
+template <qsizetype N>
+static Q_ALWAYS_INLINE QStringPrivate qMakeStringPrivate(const char16_t (&literal)[N])
+{
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast)
+ auto str = const_cast<char16_t *>(literal);
+ return { nullptr, str, N - 1 };
+}
+}
-#define QT_UNICODE_LITERAL(str) u"" str
#define QStringLiteral(str) \
- ([]() noexcept -> QString { \
- enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
- static const QArrayData qstring_literal = { \
- Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 \
- }; \
- QStringPrivate holder = { \
- static_cast<QTypedArrayData<char16_t> *>(const_cast<QArrayData *>(&qstring_literal)), \
- const_cast<qunicodechar *>(QT_UNICODE_LITERAL(str)), \
- Size \
- }; \
- return QString(holder); \
- }()) \
+ (QString(QtPrivate::qMakeStringPrivate(QT_UNICODE_LITERAL(str)))) \
/**/
-using QStringPrivate = QArrayDataPointer<char16_t>;
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringmatcher.cpp b/src/corelib/text/qstringmatcher.cpp
index e48d72f03e..379d555e54 100644
--- a/src/corelib/text/qstringmatcher.cpp
+++ b/src/corelib/text/qstringmatcher.cpp
@@ -1,52 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2019 Mail.ru Group.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Mail.ru Group.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstringmatcher.h"
QT_BEGIN_NAMESPACE
+static constexpr qsizetype FoldBufferCapacity = 256;
+
static void bm_init_skiptable(QStringView needle, uchar *skiptable, Qt::CaseSensitivity cs)
{
const char16_t *uc = needle.utf16();
- const qsizetype len = needle.size();
- int l = int(qMin(len, qsizetype(255)));
+ const qsizetype len =
+ cs == Qt::CaseSensitive ? needle.size() : qMin(needle.size(), FoldBufferCapacity);
+ int l = qMin(int(len), 255);
memset(skiptable, l, 256 * sizeof(uchar));
uc += len - l;
if (cs == Qt::CaseSensitive) {
@@ -73,11 +40,12 @@ static inline qsizetype bm_find(QStringView haystack, qsizetype index, QStringVi
if (pl == 0)
return index > l ? -1 : index;
- const qsizetype pl_minus_one = pl - 1;
- const char16_t *current = uc + index + pl_minus_one;
- const char16_t *end = uc + l;
if (cs == Qt::CaseSensitive) {
+ const qsizetype pl_minus_one = pl - 1;
+ const char16_t *current = uc + index + pl_minus_one;
+ const char16_t *end = uc + l;
+
while (current < end) {
qsizetype skip = skiptable[*current & 0xff];
if (!skip) {
@@ -102,21 +70,38 @@ static inline qsizetype bm_find(QStringView haystack, qsizetype index, QStringVi
current += skip;
}
} else {
+ char16_t foldBuffer[FoldBufferCapacity];
+ const qsizetype foldBufferLength = qMin(FoldBufferCapacity, pl);
+ const char16_t *start = puc;
+ for (qsizetype i = 0; i < foldBufferLength; ++i)
+ foldBuffer[i] = foldCase(&puc[i], start);
+ QStringView restNeedle = needle.sliced(foldBufferLength);
+ const qsizetype foldBufferEnd = foldBufferLength - 1;
+ const char16_t *current = uc + index + foldBufferEnd;
+ const char16_t *end = uc + l;
+
while (current < end) {
qsizetype skip = skiptable[foldCase(current, uc) & 0xff];
if (!skip) {
// possible match
- while (skip < pl) {
- if (foldCase(current - skip, uc) != foldCase(puc + pl_minus_one - skip, puc))
+ while (skip < foldBufferLength) {
+ if (foldCase(current - skip, uc) != foldBuffer[foldBufferEnd - skip])
break;
++skip;
}
- if (skip > pl_minus_one) // we have a match
- return (current - uc) - pl_minus_one;
+ if (skip > foldBufferEnd) { // Matching foldBuffer
+ qsizetype candidatePos = (current - uc) - foldBufferEnd;
+ QStringView restHaystack =
+ haystack.sliced(qMin(haystack.size(), candidatePos + foldBufferLength));
+ if (restNeedle.size() == 0
+ || restHaystack.startsWith(
+ restNeedle, Qt::CaseInsensitive)) // Check the rest of the string
+ return candidatePos;
+ }
// in case we don't have a match we are a bit inefficient as we only skip by one
// when we have the non matching char in the string.
- if (skiptable[foldCase(current - skip, uc) & 0xff] == pl)
- skip = pl - skip;
+ if (skiptable[foldCase(current - skip, uc) & 0xff] == foldBufferLength)
+ skip = foldBufferLength - skip;
else
skip = 1;
}
@@ -130,7 +115,7 @@ static inline qsizetype bm_find(QStringView haystack, qsizetype index, QStringVi
void QStringMatcher::updateSkipTable()
{
- bm_init_skiptable(p.sv, p.q_skiptable, q_cs);
+ bm_init_skiptable(q_sv, q_skiptable, q_cs);
}
/*!
@@ -156,15 +141,11 @@ void QStringMatcher::updateSkipTable()
\sa QString, QByteArrayMatcher, QRegularExpression
*/
-/*!
+/*! \fn QStringMatcher::QStringMatcher()
+
Constructs an empty string matcher that won't match anything.
Call setPattern() to give it a pattern to match.
*/
-QStringMatcher::QStringMatcher()
- : d_ptr(nullptr), q_cs(Qt::CaseSensitive)
-{
- memset(q_data, 0, sizeof(q_data));
-}
/*!
Constructs a string matcher that will search for \a pattern, with
@@ -173,23 +154,19 @@ QStringMatcher::QStringMatcher()
Call indexIn() to perform a search.
*/
QStringMatcher::QStringMatcher(const QString &pattern, Qt::CaseSensitivity cs)
- : d_ptr(nullptr), q_pattern(pattern), q_cs(cs)
+ : d_ptr(nullptr), q_cs(cs), q_pattern(pattern)
{
- p.sv = q_pattern;
+ q_sv = q_pattern;
updateSkipTable();
}
/*!
- \fn QStringMatcher::QStringMatcher(const QChar *uc, int length, Qt::CaseSensitivity cs)
+ \fn QStringMatcher::QStringMatcher(const QChar *uc, qsizetype length, Qt::CaseSensitivity cs)
\since 4.5
Constructs a string matcher that will search for the pattern referred to
by \a uc with the given \a length and case sensitivity specified by \a cs.
*/
-QStringMatcher::QStringMatcher(const QChar *uc, int len, Qt::CaseSensitivity cs)
- : QStringMatcher(QStringView(uc, len), cs)
-{
-}
/*!
\fn QStringMatcher::QStringMatcher(QStringView pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive)
@@ -201,9 +178,8 @@ QStringMatcher::QStringMatcher(const QChar *uc, int len, Qt::CaseSensitivity cs)
Call indexIn() to perform a search.
*/
QStringMatcher::QStringMatcher(QStringView str, Qt::CaseSensitivity cs)
- : d_ptr(nullptr), q_cs(cs)
+ : d_ptr(nullptr), q_cs(cs), q_sv(str)
{
- p.sv = str;
updateSkipTable();
}
/*!
@@ -231,7 +207,8 @@ QStringMatcher &QStringMatcher::operator=(const QStringMatcher &other)
if (this != &other) {
q_pattern = other.q_pattern;
q_cs = other.q_cs;
- memcpy(q_data, other.q_data, sizeof(q_data));
+ q_sv = other.q_sv;
+ memcpy(q_skiptable, other.q_skiptable, sizeof(q_skiptable));
}
return *this;
}
@@ -245,7 +222,7 @@ QStringMatcher &QStringMatcher::operator=(const QStringMatcher &other)
void QStringMatcher::setPattern(const QString &pattern)
{
q_pattern = pattern;
- p.sv = q_pattern;
+ q_sv = q_pattern;
updateSkipTable();
}
@@ -262,10 +239,19 @@ QString QStringMatcher::pattern() const
{
if (!q_pattern.isEmpty())
return q_pattern;
- return p.sv.toString();
+ return q_sv.toString();
}
/*!
+ \fn QStringView QStringMatcher::patternView() const noexcept
+ \since 6.7
+
+ Returns a string view of the pattern that this string matcher will search for.
+
+ \sa setPattern()
+*/
+
+/*!
Sets the case sensitivity setting of this string matcher to \a
cs.
@@ -279,7 +265,8 @@ void QStringMatcher::setCaseSensitivity(Qt::CaseSensitivity cs)
updateSkipTable();
}
-/*!
+/*! \fn qsizetype QStringMatcher::indexIn(const QString &str, qsizetype from) const
+
Searches the string \a str from character position \a from
(default 0, i.e. from the first character), for the string
pattern() that was set in the constructor or in the most recent
@@ -288,12 +275,8 @@ void QStringMatcher::setCaseSensitivity(Qt::CaseSensitivity cs)
\sa setPattern(), setCaseSensitivity()
*/
-int QStringMatcher::indexIn(const QString &str, int from) const
-{
- return int(indexIn(QStringView(str), from));
-}
-/*!
+/*! \fn qsizetype QStringMatcher::indexIn(const QChar *str, qsizetype length, qsizetype from) const
\since 4.5
Searches the string starting at \a str (of length \a length) from
@@ -305,10 +288,6 @@ int QStringMatcher::indexIn(const QString &str, int from) const
\sa setPattern(), setCaseSensitivity()
*/
-int QStringMatcher::indexIn(const QChar *str, int length, int from) const
-{
- return int(indexIn(QStringView(str, length), from));
-}
/*!
\since 5.14
@@ -325,7 +304,7 @@ qsizetype QStringMatcher::indexIn(QStringView str, qsizetype from) const
{
if (from < 0)
from = 0;
- return bm_find(str, from, p.sv, p.q_skiptable, q_cs);
+ return bm_find(str, from, q_sv, q_skiptable, q_cs);
}
/*!
diff --git a/src/corelib/text/qstringmatcher.h b/src/corelib/text/qstringmatcher.h
index c731efcc97..937f17df0a 100644
--- a/src/corelib/text/qstringmatcher.h
+++ b/src/corelib/text/qstringmatcher.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2019 Mail.ru Group.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Mail.ru Group.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGMATCHER_H
#define QSTRINGMATCHER_H
@@ -53,11 +17,13 @@ class Q_CORE_EXPORT QStringMatcher
{
void updateSkipTable();
public:
- QStringMatcher();
+ QStringMatcher() = default;
explicit QStringMatcher(const QString &pattern,
Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QStringMatcher(const QChar *uc, int len,
- Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QStringMatcher(const QChar *uc, qsizetype len,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ : QStringMatcher(QStringView(uc, len), cs)
+ {}
QStringMatcher(QStringView pattern,
Qt::CaseSensitivity cs = Qt::CaseSensitive);
QStringMatcher(const QStringMatcher &other);
@@ -68,24 +34,23 @@ public:
void setPattern(const QString &pattern);
void setCaseSensitivity(Qt::CaseSensitivity cs);
- int indexIn(const QString &str, int from = 0) const;
- int indexIn(const QChar *str, int length, int from = 0) const;
+ qsizetype indexIn(const QString &str, qsizetype from = 0) const
+ { return indexIn(QStringView(str), from); }
+ qsizetype indexIn(const QChar *str, qsizetype length, qsizetype from = 0) const
+ { return indexIn(QStringView(str, length), from); }
qsizetype indexIn(QStringView str, qsizetype from = 0) const;
QString pattern() const;
+ QStringView patternView() const noexcept
+ { return q_sv; }
+
inline Qt::CaseSensitivity caseSensitivity() const { return q_cs; }
private:
- QStringMatcherPrivate *d_ptr;
+ QStringMatcherPrivate *d_ptr = nullptr;
+ Qt::CaseSensitivity q_cs = Qt::CaseSensitive;
QString q_pattern;
- Qt::CaseSensitivity q_cs;
- struct Data {
- uchar q_skiptable[256];
- QStringView sv;
- };
- union {
- uint q_data[256];
- Data p;
- };
+ QStringView q_sv;
+ uchar q_skiptable[256] = {};
};
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringtokenizer.cpp b/src/corelib/text/qstringtokenizer.cpp
index 4e8ffc2c8e..fc6faed27f 100644
--- a/src/corelib/text/qstringtokenizer.cpp
+++ b/src/corelib/text/qstringtokenizer.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstringtokenizer.h"
#include "qstringalgorithms.h"
@@ -73,7 +37,7 @@ QT_BEGIN_NAMESPACE
Argument Deduction (CTAD), you may write
\c{QStringTokenizer{string, separator}} (without template
arguments). If you can't use C++17 CTAD, you must use the
- QStringView::split() or QLatin1String::split() member functions
+ QStringView::split() or QLatin1StringView::split() member functions
and store the return value only in \c{auto} variables:
\code
@@ -143,30 +107,30 @@ QT_BEGIN_NAMESPACE
use(e);
\endcode
- \sa QStringView::split(), QLatin1String::split(), QRegularExpression
+ \sa QStringView::split(), QString::split(), QRegularExpression
*/
/*!
- \typedef QStringTokenizer::value_type
+ \typealias QStringTokenizer::value_type
- Alias for \c{const QStringView} or \c{const QLatin1String},
+ Alias for \c{const QStringView} or \c{const QLatin1StringView},
depending on the tokenizer's \c Haystack template argument.
*/
/*!
- \typedef QStringTokenizer::difference_type
+ \typealias QStringTokenizer::difference_type
Alias for qsizetype.
*/
/*!
- \typedef QStringTokenizer::size_type
+ \typealias QStringTokenizer::size_type
Alias for qsizetype.
*/
/*!
- \typedef QStringTokenizer::reference
+ \typealias QStringTokenizer::reference
Alias for \c{value_type &}.
@@ -175,13 +139,13 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \typedef QStringTokenizer::const_reference
+ \typealias QStringTokenizer::const_reference
Alias for \c{value_type &}.
*/
/*!
- \typedef QStringTokenizer::pointer
+ \typealias QStringTokenizer::pointer
Alias for \c{value_type *}.
@@ -190,13 +154,13 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \typedef QStringTokenizer::const_pointer
+ \typealias QStringTokenizer::const_pointer
Alias for \c{value_type *}.
*/
/*!
- \typedef QStringTokenizer::iterator
+ \typealias QStringTokenizer::iterator
This typedef provides an STL-style const iterator for
QStringTokenizer.
@@ -217,7 +181,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \typedef QStringTokenizer::sentinel
+ \typealias QStringTokenizer::sentinel
This typedef provides an STL-style sentinel for
QStringTokenizer::iterator and QStringTokenizer::const_iterator.
@@ -226,8 +190,8 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QStringTokenizer(Haystack haystack, String needle, Qt::CaseSensitivity cs, Qt::SplitBehavior sb)
- \fn QStringTokenizer(Haystack haystack, String needle, Qt::SplitBehavior sb, Qt::CaseSensitivity cs)
+ \fn template <typename Haystack, typename Needle> QStringTokenizer<Haystack, Needle>::QStringTokenizer(Haystack haystack, Needle needle, Qt::CaseSensitivity cs, Qt::SplitBehavior sb)
+ \fn template <typename Haystack, typename Needle> QStringTokenizer<Haystack, Needle>::QStringTokenizer(Haystack haystack, Needle needle, Qt::SplitBehavior sb, Qt::CaseSensitivity cs)
Constructs a string tokenizer that splits the string \a haystack
into substrings wherever \a needle occurs, and allows iteration
@@ -238,31 +202,24 @@ QT_BEGIN_NAMESPACE
\a cs specifies whether \a needle should be matched case
sensitively or case insensitively.
- If \a sb is QString::SkipEmptyParts, empty entries don't
+ If \a sb is Qt::SkipEmptyParts, empty entries don't
appear in the result. By default, empty entries are included.
- \sa QStringView::split(), QLatin1String::split(), Qt::CaseSensitivity, Qt::SplitBehavior
+ \sa QStringView::split(), QString::split(), Qt::CaseSensitivity, Qt::SplitBehavior
*/
/*!
- \fn QStringTokenizer::const_iterator QStringTokenizer::begin() const
+ \fn template <typename Haystack, typename Needle> QStringTokenizer<Haystack, Needle>::iterator QStringTokenizer<Haystack, Needle>::begin() const
+ \fn template <typename Haystack, typename Needle> QStringTokenizer<Haystack, Needle>::iterator QStringTokenizer<Haystack, Needle>::cbegin() const
Returns a const \l{STL-style iterators}{STL-style iterator}
pointing to the first token in the list.
- \sa end(), cbegin()
+ \sa end(), cend()
*/
/*!
- \fn QStringTokenizer::const_iterator QStringTokenizer::cbegin() const
-
- Same as begin().
-
- \sa cend(), begin()
-*/
-
-/*!
- \fn QStringTokenizer::sentinel QStringTokenizer::end() const
+ \fn template <typename Haystack, typename Needle> QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer<Haystack, Needle>::end() const
Returns a const \l{STL-style iterators}{STL-style sentinel}
pointing to the imaginary token after the last token in the list.
@@ -271,7 +228,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QStringTokenizer::sentinel QStringTokenizer::cend() const
+ \fn template <typename Haystack, typename Needle> QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer<Haystack, Needle>::cend() const
Same as end().
@@ -279,19 +236,18 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QStringTokenizer::toContainer(Container &&c) const &
+ \fn template <typename Haystack, typename Needle> template<typename LContainer> LContainer QStringTokenizer<Haystack, Needle>::toContainer(LContainer &&c) const &
- Convenience method to convert the lazy sequence into a
- (typically) random-access container.
+ Converts the lazy sequence into a (typically) random-access container of
+ type \c LContainer.
This function is only available if \c Container has a \c value_type
matching this tokenizer's value_type.
- If you pass in a named container (an lvalue), then that container
- is filled, and a reference to it is returned.
-
- If you pass in a temporary container (an rvalue, incl. the default
- argument), then that container is filled, and returned by value.
+ If you pass in a named container (an lvalue) for \a c, then that container
+ is filled, and a reference to it is returned. If you pass in a temporary
+ container (an rvalue, incl. the default argument), then that container is
+ filled, and returned by value.
\code
// assuming tok's value_type is QStringView, then...
@@ -311,9 +267,12 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QStringTokenizer::toContainer(Container &&c) const &&
+ \fn template <typename Haystack, typename Needle> template<typename RContainer> RContainer QStringTokenizer<Haystack, Needle>::toContainer(RContainer &&c) const &&
\overload
+ Converts the lazy sequence into a (typically) random-access container of
+ type \c RContainer.
+
In addition to the constraints on the lvalue-this overload, this
rvalue-this overload is only available when this QStringTokenizer
does not store the haystack internally, as this could create a
@@ -341,17 +300,30 @@ QT_BEGIN_NAMESPACE
func(QStringTokenizer{QStringView{widget.text()}, u','}.toContainer());
// OK: compiler keeps widget.text() around until after func() has executed
\endcode
+
+ If you pass in a named container (an lvalue)for \a c, then that container
+ is filled, and a reference to it is returned. If you pass in a temporary
+ container (an rvalue, incl. the default argument), then that container is
+ filled, and returned by value.
*/
/*!
- \fn qTokenize(Haystack &&haystack, Needle &&needle, Flags...flags)
+ \fn template <typename Haystack, typename Needle, typename...Flags> auto qTokenize(Haystack &&haystack, Needle &&needle, Flags...flags)
\relates QStringTokenizer
\since 6.0
- Factory function for QStringTokenizer. You can use this function
- if your compiler doesn't, yet, support C++17 Class Template
- Argument Deduction (CTAD), but we recommend direct use of
- QStringTokenizer with CTAD instead.
+ Factory function for a QStringTokenizer that splits the string \a haystack
+ into substrings wherever \a needle occurs, and allows iteration
+ over those strings as they are found. If \a needle does not match
+ anywhere in \a haystack, a single element containing \a haystack
+ is produced.
+
+ Pass values from Qt::CaseSensitivity and Qt::SplitBehavior enumerators
+ as \a flags to modify the behavior of the tokenizer.
+
+ You can use this function if your compiler doesn't, yet, support C++17 Class
+ Template Argument Deduction (CTAD). We recommend direct use of QStringTokenizer
+ with CTAD instead.
*/
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringtokenizer.h b/src/corelib/text/qstringtokenizer.h
index 4db23db57f..7a627b4508 100644
--- a/src/corelib/text/qstringtokenizer.h
+++ b/src/corelib/text/qstringtokenizer.h
@@ -1,54 +1,17 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGTOKENIZER_H
#define QSTRINGTOKENIZER_H
#include <QtCore/qnamespace.h>
#include <QtCore/qcontainerfwd.h>
+#include <iterator>
QT_BEGIN_NAMESPACE
template <typename, typename> class QStringBuilder;
-#if defined(Q_QDOC) || 1 || (defined(__cpp_range_based_for) && __cpp_range_based_for >= 201603)
-# define Q_STRINGTOKENIZER_USE_SENTINEL
-#endif
+#define Q_STRINGTOKENIZER_USE_SENTINEL
class QStringTokenizerBaseBase
{
@@ -109,8 +72,8 @@ public:
iterator() noexcept = default;
// violates std::forward_iterator (returns a reference into the iterator)
- Q_REQUIRED_RESULT constexpr const Haystack* operator->() const { return Q_ASSERT(current.ok), &current.value; }
- Q_REQUIRED_RESULT constexpr const Haystack& operator*() const { return *operator->(); }
+ [[nodiscard]] constexpr const Haystack* operator->() const { return Q_ASSERT(current.ok), &current.value; }
+ [[nodiscard]] constexpr const Haystack& operator*() const { return *operator->(); }
iterator& operator++() { advance(); return *this; }
iterator operator++(int) { auto tmp = *this; advance(); return tmp; }
@@ -145,12 +108,12 @@ public:
using reference = typename iterator::reference;
using const_reference = reference;
- Q_REQUIRED_RESULT iterator begin() const noexcept { return iterator{*this}; }
- Q_REQUIRED_RESULT iterator cbegin() const noexcept { return begin(); }
+ [[nodiscard]] iterator begin() const noexcept { return iterator{*this}; }
+ [[nodiscard]] iterator cbegin() const noexcept { return begin(); }
template <bool = std::is_same<iterator, sentinel>::value> // ODR protection
- Q_REQUIRED_RESULT constexpr sentinel end() const noexcept { return {}; }
+ [[nodiscard]] constexpr sentinel end() const noexcept { return {}; }
template <bool = std::is_same<iterator, sentinel>::value> // ODR protection
- Q_REQUIRED_RESULT constexpr sentinel cend() const noexcept { return {}; }
+ [[nodiscard]] constexpr sentinel cend() const noexcept { return {}; }
private:
Haystack m_haystack;
@@ -170,10 +133,9 @@ namespace Tok {
template <typename String> struct ViewForImpl {};
template <> struct ViewForImpl<QStringView> { using type = QStringView; };
- template <> struct ViewForImpl<QLatin1String> { using type = QLatin1String; };
+ template <> struct ViewForImpl<QLatin1StringView> { using type = QLatin1StringView; };
template <> struct ViewForImpl<QChar> { using type = QChar; };
template <> struct ViewForImpl<QString> : ViewForImpl<QStringView> {};
- template <> struct ViewForImpl<QStringRef> : ViewForImpl<QStringView> {};
template <> struct ViewForImpl<QLatin1Char> : ViewForImpl<QChar> {};
template <> struct ViewForImpl<char16_t> : ViewForImpl<QChar> {};
template <> struct ViewForImpl<char16_t*> : ViewForImpl<QStringView> {};
@@ -188,7 +150,7 @@ namespace Tok {
#endif
// This metafunction maps a StringLike to a View (currently, QChar,
- // QStringView, QLatin1String). This is what QStringTokenizerBase
+ // QStringView, QLatin1StringView). This is what QStringTokenizerBase
// operates on. QStringTokenizer adds pinning to keep rvalues alive
// for the duration of the algorithm.
template <typename String>
@@ -295,14 +257,30 @@ class QStringTokenizer
using if_haystack_not_pinned = typename if_haystack_not_pinned_impl<Container, HPin>::type;
template <typename Container, typename Iterator = decltype(std::begin(std::declval<Container>()))>
using if_compatible_container = typename std::enable_if<
- std::is_same<
+ std::is_convertible<
typename Base::value_type,
typename std::iterator_traits<Iterator>::value_type
>::value,
bool
>::type;
public:
- using value_type = typename Base::value_type;
+ using value_type = typename Base::value_type;
+ using difference_type = typename Base::difference_type;
+ using size_type = typename Base::size_type;
+ using reference = typename Base::reference;
+ using const_reference = typename Base::const_reference;
+ using pointer = typename Base::pointer;
+ using const_pointer = typename Base::const_pointer;
+ using iterator = typename Base::iterator;
+ using const_iterator = typename Base::const_iterator;
+ using sentinel = typename Base::sentinel;
+
+#ifdef Q_QDOC
+ [[nodiscard]] iterator begin() const noexcept { return Base::begin(); }
+ [[nodiscard]] iterator cbegin() const noexcept { return begin(); }
+ [[nodiscard]] constexpr sentinel end() const noexcept { return {}; }
+ [[nodiscard]] constexpr sentinel cend() const noexcept { return {}; }
+#endif
constexpr explicit QStringTokenizer(Haystack haystack, Needle needle,
Qt::CaseSensitivity cs,
@@ -329,22 +307,26 @@ public:
this->needleView(needle), sb, cs}
{}
+#ifdef Q_QDOC
+ template<typename LContainer> LContainer toContainer(LContainer &&c = {}) const & {}
+ template<typename RContainer> RContainer toContainer(RContainer &&c = {}) const && {}
+#else
template<typename Container = QList<value_type>, if_compatible_container<Container> = true>
Container toContainer(Container &&c = {}) const &
{
for (auto e : *this)
c.emplace_back(e);
- return c;
+ return std::forward<Container>(c);
}
-
template<typename Container = QList<value_type>, if_compatible_container<Container> = true,
if_haystack_not_pinned<Container> = true>
Container toContainer(Container &&c = {}) const &&
{
for (auto e : *this)
c.emplace_back(e);
- return c;
+ return std::forward<Container>(c);
}
+#endif
};
namespace QtPrivate {
@@ -396,7 +378,7 @@ QStringTokenizer(Haystack&&, Needle&&, Qt::CaseSensitivity, Qt::SplitBehavior)
#undef Q_TOK_RESULT
template <typename Haystack, typename Needle, typename...Flags>
-Q_REQUIRED_RESULT constexpr auto
+[[nodiscard]] constexpr auto
qTokenize(Haystack &&h, Needle &&n, Flags...flags)
noexcept(QtPrivate::Tok::is_nothrow_constructible_from<Haystack, Needle>::value)
-> decltype(QtPrivate::Tok::TokenizerResult<Haystack, Needle>{std::forward<Haystack>(h),
@@ -417,13 +399,13 @@ auto QStringTokenizerBase<Haystack, Needle>::next(tokenizer_state state) const n
Haystack result;
if (state.end >= 0) {
// token separator found => return intermediate element:
- result = m_haystack.mid(state.start, state.end - state.start);
+ result = m_haystack.sliced(state.start, state.end - state.start);
const auto ns = QtPrivate::Tok::size(m_needle);
state.start = state.end + ns;
state.extra = (ns == 0 ? 1 : 0);
} else {
// token separator not found => return final element:
- result = m_haystack.mid(state.start);
+ result = m_haystack.sliced(state.start);
}
if ((m_sb & Qt::SkipEmptyParts) && result.isEmpty())
continue;
diff --git a/src/corelib/text/qstringview.cpp b/src/corelib/text/qstringview.cpp
index 985d87ac51..29b83ffe8f 100644
--- a/src/corelib/text/qstringview.cpp
+++ b/src/corelib/text/qstringview.cpp
@@ -1,45 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstringview.h"
-#include "qstring.h"
-#include "qlocale_p.h"
QT_BEGIN_NAMESPACE
@@ -69,8 +31,8 @@ QT_BEGIN_NAMESPACE
When used as an interface type, QStringView allows a single function to accept
a wide variety of UTF-16 string data sources. One function accepting QStringView
- thus replaces three function overloads (taking QString, QStringRef, and
- \c{(const QChar*, int)}), while at the same time enabling even more string data
+ thus replaces three function overloads (taking QString and
+ \c{(const QChar*, qsizetype)}), while at the same time enabling even more string data
sources to be passed to the function, such as \c{u"Hello World"}, a \c char16_t
string literal.
@@ -87,11 +49,11 @@ QT_BEGIN_NAMESPACE
QChar constructor by itself.
\li \e QString: if you store an unmodified copy of the string and thus would
like to take advantage of QString's implicit sharing.
- \li QLatin1String: if you can implement the function without converting the
- QLatin1String to UTF-16 first; users expect a function overloaded on
- QLatin1String to perform strictly less memory allocations than the
+ \li QLatin1StringView: if you can implement the function without converting the
+ QLatin1StringView to UTF-16 first; users expect a function overloaded on
+ QLatin1StringView to perform strictly less memory allocations than the
semantically equivalent call of the QStringView version, involving
- construction of a QString from the QLatin1String.
+ construction of a QString from the QLatin1StringView.
\endlist
QStringView can also be used as the return value of a function. If you call a
@@ -105,11 +67,7 @@ QT_BEGIN_NAMESPACE
allowed in \c constexpr functions). You can use an indexed loop and/or utf16() in
\c constexpr contexts instead.
- \note We strongly discourage the use of QList<QStringView>,
- because QList is a very inefficient container for QStringViews (it would heap-allocate
- every element). Use QList (or std::vector) to hold QStringViews instead.
-
- \sa QString, QStringRef
+ \sa QString
*/
/*!
@@ -134,11 +92,6 @@ QT_BEGIN_NAMESPACE
\typedef QStringView::size_type
Alias for qsizetype. Provided for compatibility with the STL.
-
- Unlike other Qt classes, QStringView uses qsizetype as its \c size_type, to allow
- accepting data from \c{std::basic_string} without truncation. The Qt API functions,
- for example length(), return \c int, while the STL-compatible functions, for example
- size(), return \c size_type.
*/
/*!
@@ -226,7 +179,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn template <typename Char> QStringView::QStringView(const Char *str, qsizetype len)
+ \fn template <typename Char, QStringView::if_compatible_char<Char> = true> QStringView::QStringView(const Char *str, qsizetype len)
Constructs a string view on \a str with length \a len.
@@ -242,7 +195,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn template <typename Char> QStringView::QStringView(const Char *first, const Char *last)
+ \fn template <typename Char, QStringView::if_compatible_char<Char> = true> QStringView::QStringView(const Char *first, const Char *last)
Constructs a string view on \a first with length (\a last - \a first).
@@ -282,11 +235,9 @@ QT_BEGIN_NAMESPACE
\fn template <typename Char, size_t N> QStringView::QStringView(const Char (&string)[N])
Constructs a string view on the character string literal \a string.
- The length is set to \c{N-1}, excluding the trailing \{Char(0)}.
- If you need the full array, use the constructor from pointer and
- size instead:
-
- \snippet code/src_corelib_text_qstringview.cpp 2
+ The view covers the array until the first \c{Char(0)} is encountered,
+ or \c N, whichever comes first.
+ If you need the full array, use fromArray() instead.
\a string must remain valid for the lifetime of this string view
object.
@@ -296,20 +247,12 @@ QT_BEGIN_NAMESPACE
type. The compatible character types are: \c QChar, \c ushort, \c
char16_t and (on platforms, such as Windows, where it is a 16-bit
type) \c wchar_t.
-*/
-
-/*!
- \fn QStringView::QStringView(const QString &str)
-
- Constructs a string view on \a str.
- \c{str.data()} must remain valid for the lifetime of this string view object.
-
- The string view will be null if and only if \c{str.isNull()}.
+ \sa fromArray
*/
/*!
- \fn QStringView::QStringView(const QStringRef &str)
+ \fn QStringView::QStringView(const QString &str)
Constructs a string view on \a str.
@@ -319,42 +262,59 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn template <typename StdBasicString> QStringView::QStringView(const StdBasicString &str)
+ \fn template <typename Container, QStringView::if_compatible_container<Container>> QStringView::QStringView(const Container &str)
- Constructs a string view on \a str. The length is taken from \c{str.size()}.
+ Constructs a string view on \a str. The length is taken from \c{std::size(str)}.
- \c{str.data()} must remain valid for the lifetime of this string view object.
+ \c{std::data(str)} must remain valid for the lifetime of this string view object.
- This constructor only participates in overload resolution if \c StdBasicString is an
- instantiation of \c std::basic_string with a compatible character type. The
+ This constructor only participates in overload resolution if \c Container is a
+ container with a compatible character type as \c{value_type}. The
compatible character types are: \c QChar, \c ushort, \c char16_t and
(on platforms, such as Windows, where it is a 16-bit type) \c wchar_t.
- The string view will be empty if and only if \c{str.empty()}. It is unspecified
- whether this constructor can result in a null string view (\c{str.data()} would
+ The string view will be empty if and only if \c{std::size(str) == 0}. It is unspecified
+ whether this constructor can result in a null string view (\c{std::data(str)} would
have to return \nullptr for this).
\sa isNull(), isEmpty()
*/
/*!
+ \fn template <typename Char, size_t Size, QStringView::if_compatible_char<Char> = true> static QStringView QStringView::fromArray(const Char (&string)[Size]) noexcept
+
+ Constructs a string view on the full character string literal \a string,
+ including any trailing \c{Char(0)}. If you don't want the
+ null-terminator included in the view then you can chop() it off
+ when you are certain it is at the end. Alternatively you can use
+ the constructor overload taking an array literal which will create
+ a view up to, but not including, the first null-terminator in the data.
+
+ \a string must remain valid for the lifetime of this string view
+ object.
+
+ This function will work with any array literal if \c Char is a
+ compatible character type. The compatible character types are: \c QChar, \c ushort, \c
+ char16_t and (on platforms, such as Windows, where it is a 16-bit
+ type) \c wchar_t.
+*/
+
+/*!
\fn QString QStringView::toString() const
Returns a deep copy of this string view's data as a QString.
The return value will be the null QString if and only if this string view is null.
-
- \warning QStringView can store strings with more than 2\sup{30} characters
- while QString cannot. Calling this function on a string view for which size()
- returns a value greater than \c{INT_MAX / 2} constitutes undefined behavior.
*/
/*!
\fn const QChar *QStringView::data() const
- Returns a const pointer to the first character in the string.
+//! [const-pointer-to-first-ch]
+ Returns a const pointer to the first character in the string view.
\note The character array represented by the return value is \e not null-terminated.
+//! [const-pointer-to-first-ch]
\sa begin(), end(), utf16()
*/
@@ -363,9 +323,7 @@ QT_BEGIN_NAMESPACE
\fn const QChar *QStringView::constData() const
\since 6.0
- Returns a const pointer to the first character in the string.
-
- \note The character array represented by the return value is \e not null-terminated.
+ \include qstringview.cpp const-pointer-to-first-ch
\sa data(), begin(), end(), utf16()
*/
@@ -373,12 +331,10 @@ QT_BEGIN_NAMESPACE
/*!
\fn const storage_type *QStringView::utf16() const
- Returns a const pointer to the first character in the string.
+ \include qstringview.cpp const-pointer-to-first-ch
\c{storage_type} is \c{char16_t}.
- \note The character array represented by the return value is \e not null-terminated.
-
\sa begin(), end(), data()
*/
@@ -386,11 +342,11 @@ QT_BEGIN_NAMESPACE
\fn QStringView::const_iterator QStringView::begin() const
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character in
- the string.
+ the string view.
This function is provided for STL compatibility.
- \sa end(), cbegin(), rbegin(), data()
+ \sa end(), constBegin(), cbegin(), rbegin(), data()
*/
/*!
@@ -400,7 +356,16 @@ QT_BEGIN_NAMESPACE
This function is provided for STL compatibility.
- \sa cend(), begin(), crbegin(), data()
+ \sa cend(), begin(), constBegin(), crbegin(), data()
+*/
+
+/*!
+ \fn QStringView::const_iterator QStringView::constBegin() const
+ \since 6.1
+
+ Same as begin().
+
+ \sa constEnd(), begin(), cbegin(), crbegin(), data()
*/
/*!
@@ -411,7 +376,7 @@ QT_BEGIN_NAMESPACE
This function is provided for STL compatibility.
- \sa begin(), cend(), rend()
+ \sa begin(), constEnd(), cend(), rend()
*/
/*! \fn QStringView::const_iterator QStringView::cend() const
@@ -420,14 +385,22 @@ QT_BEGIN_NAMESPACE
This function is provided for STL compatibility.
- \sa cbegin(), end(), crend()
+ \sa cbegin(), end(), constEnd(), crend()
+*/
+
+/*! \fn QStringView::const_iterator QStringView::constEnd() const
+ \since 6.1
+
+ Same as end().
+
+ \sa constBegin(), end(), cend(), crend()
*/
/*!
\fn QStringView::const_reverse_iterator QStringView::rbegin() const
Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the string, in reverse order.
+ character in the string view, in reverse order.
This function is provided for STL compatibility.
@@ -448,7 +421,7 @@ QT_BEGIN_NAMESPACE
\fn QStringView::const_reverse_iterator QStringView::rend() const
Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last character in the string, in reverse order.
+ the last character in the string view, in reverse order.
This function is provided for STL compatibility.
@@ -498,24 +471,20 @@ QT_BEGIN_NAMESPACE
/*!
\fn qsizetype QStringView::size() const
- Returns the size of this string view, in UTF-16 code points (that is,
+ Returns the size of this string view, in UTF-16 code units (that is,
surrogate pairs count as two for the purposes of this function, the same
- as in QString and QStringRef).
+ as in QString).
\sa empty(), isEmpty(), isNull(), length()
*/
/*!
- \fn int QStringView::length() const
+ \fn QStringView::length() const
- Same as size(), except returns the result as an \c int.
+ Same as size().
This function is provided for compatibility with other Qt containers.
- \warning QStringView can represent strings with more than 2\sup{31} characters.
- Calling this function on a string view for which size() returns a value greater
- than \c{INT_MAX} constitutes undefined behavior.
-
\sa empty(), isEmpty(), isNull(), size()
*/
@@ -541,7 +510,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn template <typename...Args> QString QStringView::arg(Args &&...args) const
- \fn template <typename...Args> QString QLatin1String::arg(Args &&...args) const
+ \fn template <typename...Args> QString QLatin1StringView::arg(Args &&...args) const
\fn template <typename...Args> QString QString::arg(Args &&...args) const
\since 5.14
@@ -551,7 +520,7 @@ QT_BEGIN_NAMESPACE
second of the \a args the \c{%N} with the next-lowest \c{N} etc.
\c Args can consist of anything that implicitly converts to QString,
- QStringView or QLatin1String.
+ QStringView or QLatin1StringView.
In addition, the following types are also supported: QChar, QLatin1Char.
@@ -561,12 +530,14 @@ QT_BEGIN_NAMESPACE
/*!
\fn QChar QStringView::front() const
- Returns the first character in the string. Same as first().
+ Returns the first character in the string view. Same as first().
This function is provided for STL compatibility.
+//! [calling-on-empty-is-UB]
\warning Calling this function on an empty string view constitutes
undefined behavior.
+//! [calling-on-empty-is-UB]
\sa back(), first(), last()
*/
@@ -574,12 +545,11 @@ QT_BEGIN_NAMESPACE
/*!
\fn QChar QStringView::back() const
- Returns the last character in the string. Same as last().
+ Returns the last character in the string view. Same as last().
This function is provided for STL compatibility.
- \warning Calling this function on an empty string view constitutes
- undefined behavior.
+ \include qstringview.cpp calling-on-empty-is-UB
\sa front(), first(), last()
*/
@@ -587,12 +557,11 @@ QT_BEGIN_NAMESPACE
/*!
\fn QChar QStringView::first() const
- Returns the first character in the string. Same as front().
+ Returns the first character in the string view. Same as front().
This function is provided for compatibility with other Qt containers.
- \warning Calling this function on an empty string view constitutes
- undefined behavior.
+ \include qstringview.cpp calling-on-empty-is-UB
\sa front(), back(), last()
*/
@@ -600,12 +569,11 @@ QT_BEGIN_NAMESPACE
/*!
\fn QChar QStringView::last() const
- Returns the last character in the string. Same as back().
+ Returns the last character in the string view. Same as back().
This function is provided for compatibility with other Qt containers.
- \warning Calling this function on an empty string view constitutes
- undefined behavior.
+ \include qstringview.cpp calling-on-empty-is-UB
\sa back(), front(), first()
*/
@@ -616,11 +584,11 @@ QT_BEGIN_NAMESPACE
Returns the substring of length \a length starting at position
\a start in this object.
- \obsolete Use sliced() instead in new code.
+ \deprecated Use sliced() instead in new code.
Returns an empty string view if \a start exceeds the
- length of the string. If there are less than \a length characters
- available in the string starting at \a start, or if
+ length of the string view. If there are less than \a length characters
+ available in the string view starting at \a start, or if
\a length is negative (default), the function returns all characters that
are available from \a start.
@@ -630,12 +598,12 @@ QT_BEGIN_NAMESPACE
/*!
\fn QStringView QStringView::left(qsizetype length) const
- \obsolete Use first() instead in new code.
+ \deprecated Use first() instead in new code.
Returns the substring of length \a length starting at position
0 in this object.
- The entire string is returned if \a length is greater than or equal
+ The entire string view is returned if \a length is greater than or equal
to size(), or less than zero.
\sa first(), last(), sliced(), startsWith(), chopped(), chop(), truncate()
@@ -644,12 +612,12 @@ QT_BEGIN_NAMESPACE
/*!
\fn QStringView QStringView::right(qsizetype length) const
- \obsolete Use last() instead in new code.
+ \deprecated Use last() instead in new code.
Returns the substring of length \a length starting at position
size() - \a length in this object.
- The entire string is returned if \a length is greater than or equal
+ The entire string view is returned if \a length is greater than or equal
to size(), or less than zero.
\sa first(), last(), sliced(), endsWith(), chopped(), chop(), truncate()
@@ -660,45 +628,51 @@ QT_BEGIN_NAMESPACE
\since 6.0
Returns a string view that points to the first \a n characters
- of this string.
+ of this string view.
\note The behavior is undefined when \a n < 0 or \a n > size().
- \sa last(), subString(), startsWith(), chopped(), chop(), truncate()
+ \sa last(), sliced(), startsWith(), chopped(), chop(), truncate()
*/
/*!
\fn QStringView QStringView::last(qsizetype n) const
\since 6.0
- Returns a string view that points to the last \a n characters of this string.
+ Returns a string view that points to the last \a n characters of this string
+ view.
\note The behavior is undefined when \a n < 0 or \a n > size().
- \sa first(), subString(), endsWith(), chopped(), chop(), truncate()
+ \sa first(), sliced(), endsWith(), chopped(), chop(), truncate()
*/
/*!
\fn QStringView QStringView::sliced(qsizetype pos, qsizetype n) const
\since 6.0
- Returns a string view that points to \a n characters of this string,
+ Returns a string view that points to \a n characters of this string view,
starting at position \a pos.
+//! [UB-sliced-index-length]
\note The behavior is undefined when \a pos < 0, \a n < 0,
or \a pos + \a n > size().
+//! [UB-sliced-index-length]
\sa first(), last(), chopped(), chop(), truncate()
*/
/*!
- \fn QStringView QStringView::from(qsizetype pos) const
+ \fn QStringView QStringView::sliced(qsizetype pos) const
\since 6.0
+ \overload
Returns a string view starting at position \a pos in this object,
and extending to its end.
+//! [UB-sliced-index-only]
\note The behavior is undefined when \a pos < 0 or \a pos > size().
+//! [UB-sliced-index-only]
\sa first(), last(), chopped(), chop(), truncate()
*/
@@ -754,115 +728,286 @@ QT_BEGIN_NAMESPACE
\fn int QStringView::compare(QStringView str, Qt::CaseSensitivity cs) const
\since 5.12
- Returns an integer that compares to zero as this string-view compares to the
- string-view \a str.
+ Compares this string view with string view \a str and returns a negative integer if
+ this string view is less than \a str, a positive integer if it is greater than
+ \a str, and zero if they are equal.
- If \a cs is Qt::CaseSensitive (the default), the comparison is case sensitive;
- otherwise the comparison is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
\sa operator==(), operator<(), operator>()
*/
/*!
- \fn int QStringView::compare(QLatin1String l1, Qt::CaseSensitivity cs) const
+ \fn int QStringView::compare(QUtf8StringView str, Qt::CaseSensitivity cs) const
+ \since 6.5
+
+ Compares this string view with QUtf8StringView \a str and returns a negative integer if
+ this string view is less than \a str, a positive integer if it is greater than
+ \a str, and zero if they are equal.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
+
+ \sa operator==(), operator<(), operator>()
+*/
+
+/*!
+ \fn int QStringView::compare(QLatin1StringView l1, Qt::CaseSensitivity cs) const
\fn int QStringView::compare(QChar ch) const
\fn int QStringView::compare(QChar ch, Qt::CaseSensitivity cs) const
- \since 5.14
+ \since 5.15
- Returns an integer that compares to zero as this string-view compares to the
- Latin-1 string \a l1, or character \a ch, respectively.
+ Compares this string view to the Latin-1 string view \a l1, or the character \a ch.
+ Returns a negative integer if this string view is less than \a l1 or \a ch,
+ a positive integer if it is greater than \a l1 or \a ch, and zero if they are equal.
- If \a cs is Qt::CaseSensitive (the default), the comparison is case sensitive;
- otherwise the comparison is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
\sa operator==(), operator<(), operator>()
*/
/*!
+ \fn QStringView::operator==(const QStringView &lhs, const QStringView &rhs)
+ \fn QStringView::operator!=(const QStringView &lhs, const QStringView &rhs)
+ \fn QStringView::operator< (const QStringView &lhs, const QStringView &rhs)
+ \fn QStringView::operator<=(const QStringView &lhs, const QStringView &rhs)
+ \fn QStringView::operator> (const QStringView &lhs, const QStringView &rhs)
+ \fn QStringView::operator>=(const QStringView &lhs, const QStringView &rhs)
+
+ Operators for comparing \a lhs to \a rhs.
+
+ \sa compare()
+*/
+
+/*!
+ \fn int QStringView::localeAwareCompare(QStringView other) const
+ \since 6.4
+
+ Compares this string view with the \a other string view and returns
+ an integer less than, equal to, or greater than zero if this string
+ view is less than, equal to, or greater than the \a other string view.
+
+ The comparison is performed in a locale- and also platform-dependent
+ manner. Use this function to present sorted lists of strings to the
+ user.
+
+ \sa {Comparing Strings}
+*/
+
+/*
+//! [utf16-or-latin1-or-ch]
+the UTF-16 string viewed by \a str, the Latin-1 string viewed by \a l1,
+or the character \a ch
+//! [utf16-or-latin1-or-ch]
+*/
+
+/*!
\fn bool QStringView::startsWith(QStringView str, Qt::CaseSensitivity cs) const
- \fn bool QStringView::startsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
+ \fn bool QStringView::startsWith(QLatin1StringView l1, Qt::CaseSensitivity cs) const
\fn bool QStringView::startsWith(QChar ch) const
\fn bool QStringView::startsWith(QChar ch, Qt::CaseSensitivity cs) const
- Returns \c true if this string-view starts with string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
+ Returns \c true if this string view starts with
+ \include qstringview.cpp utf16-or-latin1-or-ch
+ respectively; otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa endsWith()
*/
/*!
\fn bool QStringView::endsWith(QStringView str, Qt::CaseSensitivity cs) const
- \fn bool QStringView::endsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
+ \fn bool QStringView::endsWith(QLatin1StringView l1, Qt::CaseSensitivity cs) const
\fn bool QStringView::endsWith(QChar ch) const
\fn bool QStringView::endsWith(QChar ch, Qt::CaseSensitivity cs) const
- Returns \c true if this string-view ends with string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
+ Returns \c true if this string view ends with
+ \include qstringview.cpp utf16-or-latin1-or-ch
+ respectively; otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa startsWith()
*/
/*!
\fn qsizetype QStringView::indexOf(QStringView str, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \fn qsizetype QStringView::indexOf(QLatin1String l1, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QStringView::indexOf(QLatin1StringView l1, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
\fn qsizetype QStringView::indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
\since 5.14
- Returns the index position of the first occurrence of the string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively, in this string-view,
- searching forward from index position \a from. Returns -1 if \a str is not found.
+ Returns the index position of the first occurrence of
+ \include qstringview.cpp utf16-or-latin1-or-ch
+ respectively, in this string view, searching forward from index position
+ \a from. Returns -1 if \a str, \a l1 or \a ch is not found, respectively.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
+ \include qstring.qdocinc negative-index-start-search-from-end
\sa QString::indexOf()
*/
/*!
\fn bool QStringView::contains(QStringView str, Qt::CaseSensitivity cs) const
- \fn bool QStringView::contains(QLatin1String l1, Qt::CaseSensitivity cs) const
+ \fn bool QStringView::contains(QLatin1StringView l1, Qt::CaseSensitivity cs) const
\fn bool QStringView::contains(QChar c, Qt::CaseSensitivity cs) const
\since 5.14
- Returns \c true if this string-view contains an occurrence of the string-view
- \a str, Latin-1 string \a l1, or character \a ch; otherwise returns \c false.
+ Returns \c true if this string view contains an occurrence of
+ \include qstringview.cpp utf16-or-latin1-or-ch
+ respectively; otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (the default), the search is
- case-sensitive; otherwise the search is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa indexOf()
*/
/*!
\fn qsizetype QStringView::lastIndexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
- \fn qsizetype QStringView::lastIndexOf(QLatin1String l1, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QStringView::lastIndexOf(QLatin1StringView l1, qsizetype from, Qt::CaseSensitivity cs) const
\fn qsizetype QStringView::lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs) const
\since 5.14
- Returns the index position of the last occurrence of the string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively, in this string-view,
- searching backward from index position \a from. If \a from is -1 (default),
- the search starts at the last character; if \a from is -2, at the next to last
- character and so on. Returns -1 if \a str is not found.
+ Returns the index position of the last occurrence of
+ \include qstringview.cpp utf16-or-latin1-or-ch
+ respectively, in this string view, searching backward from index
+ position \a from.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ Returns -1 if \a str, \a l1 or \a c is not found, respectively.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \note When searching for a 0-length \a str or \a l1, the match at
+ the end of the data is excluded from the search by a negative \a
+ from, even though \c{-1} is normally thought of as searching from
+ the end of the string view: the match at the end is \e after the
+ last character, so it is excluded. To include such a final empty
+ match, either give a positive value for \a from or omit the \a from
+ parameter entirely.
+
+ \sa QString::lastIndexOf()
+*/
+
+/*!
+ \fn qsizetype QStringView::lastIndexOf(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QStringView::lastIndexOf(QLatin1StringView l1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \since 6.2
+ \overload lastIndexOf()
+
+ Returns the index position of the last occurrence of the UTF-16 string viewed
+ by \a str or the Latin-1 string viewed by \a l1 respectively, in this string
+ view searching backward from the last character of this string view. Returns
+ -1 if \a str or \a l1 is not found, respectively.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa QString::lastIndexOf()
*/
/*!
+ \fn QStringView::lastIndexOf(QChar c, Qt::CaseSensitivity cs) const
+ \since 6.3
+ \overload lastIndexOf()
+*/
+
+#if QT_CONFIG(regularexpression)
+/*!
+ \fn qsizetype QStringView::indexOf(const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch) const
+ \since 6.1
+
+ Returns the index position of the first match of the regular
+ expression \a re in the string view, searching forward from index
+ position \a from. Returns -1 if \a re didn't match anywhere.
+
+ If the match is successful and \a rmatch is not \nullptr, it also
+ writes the results of the match into the QRegularExpressionMatch object
+ pointed to by \a rmatch.
+
+ \note Due to how the regular expression matching algorithm works,
+ this function will actually match repeatedly from the beginning of
+ the string view until the position \a from is reached.
+*/
+
+/*!
+ \fn qsizetype QStringView::lastIndexOf(const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch) const
+ \since 6.1
+
+ Returns the index position of the last match of the regular
+ expression \a re in the string view, which starts before the index
+ position \a from.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if \a re didn't match anywhere.
+
+ If the match is successful and \a rmatch is not \nullptr, it also
+ writes the results of the match into the QRegularExpressionMatch object
+ pointed to by \a rmatch.
+
+ \note Due to how the regular expression matching algorithm works,
+ this function will actually match repeatedly from the beginning of
+ the string view until the position \a from is reached.
+
+ \note When searching for a regular expression \a re that may match
+ 0 characters, the match at the end of the data is excluded from the
+ search by a negative \a from, even though \c{-1} is normally
+ thought of as searching from the end of the string view: the match
+ at the end is \e after the last character, so it is excluded. To
+ include such a final empty match, either give a positive value for
+ \a from or omit the \a from parameter entirely.
+*/
+
+/*!
+ \fn qsizetype QStringView::lastIndexOf(const QRegularExpression &re, QRegularExpressionMatch *rmatch = nullptr) const
+ \since 6.2
+
+ Returns the index position of the last match of the regular
+ expression \a re in the string view. Returns -1 if \a re didn't match
+ anywhere.
+
+ If the match is successful and \a rmatch is not \nullptr, it also
+ writes the results of the match into the QRegularExpressionMatch object
+ pointed to by \a rmatch.
+
+ \note Due to how the regular expression matching algorithm works,
+ this function will actually match repeatedly from the beginning of
+ the string view until the end of the string view is reached.
+*/
+
+/*!
+ \fn bool QStringView::contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch) const
+ \since 6.1
+
+ Returns \c true if the regular expression \a re matches somewhere in this
+ string view; otherwise returns \c false.
+
+ If the match is successful and \a rmatch is not \nullptr, it also
+ writes the results of the match into the QRegularExpressionMatch object
+ pointed to by \a rmatch.
+
+ \sa QRegularExpression::match()
+*/
+
+/*!
+ \fn qsizetype QStringView::count(const QRegularExpression &re) const
+ \since 6.1
+
+ Returns the number of times the regular expression \a re matches
+ in the string view.
+
+ For historical reasons, this function counts overlapping matches.
+ This behavior is different from simply iterating over the matches
+ in the string view using QRegularExpressionMatchIterator.
+
+ \sa QRegularExpression::globalMatch()
+
+*/
+#endif // QT_CONFIG(regularexpression)
+
+/*!
\fn QByteArray QStringView::toLatin1() const
Returns a Latin-1 representation of the string as a QByteArray.
@@ -889,7 +1034,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn QByteArray QStringView::toUtf8() const
- Returns a UTF-8 representation of the string as a QByteArray.
+ Returns a UTF-8 representation of the string view as a QByteArray.
UTF-8 is a Unicode codec and can represent all characters in a Unicode
string like QString.
@@ -900,11 +1045,11 @@ QT_BEGIN_NAMESPACE
/*!
\fn QList<uint> QStringView::toUcs4() const
- Returns a UCS-4/UTF-32 representation of the string as a QList<uint>.
+ Returns a UCS-4/UTF-32 representation of the string view as a QList<uint>.
UCS-4 is a Unicode codec and therefore it is lossless. All characters from
- this string will be encoded in UCS-4. Any invalid sequence of code units in
- this string is replaced by the Unicode replacement character
+ this string view will be encoded in UCS-4. Any invalid sequence of code units in
+ this string view is replaced by the Unicode replacement character
(QChar::ReplacementCharacter, which corresponds to \c{U+FFFD}).
The returned list is not 0-terminated.
@@ -919,19 +1064,19 @@ QT_BEGIN_NAMESPACE
Convert \a s to a QStringView ignoring \c{s.isNull()}.
- Returns a string-view that references \a{s}' data, but is never null.
+ Returns a string view that references \a{s}' data, but is never null.
- This is a faster way to convert a QString or QStringRef to a QStringView,
+ This is a faster way to convert a QString to a QStringView,
if null QStrings can legitimately be treated as empty ones.
- \sa QString::isNull(), QStringRef::isNull(), QStringView
+ \sa QString::isNull(), QStringView
*/
/*!
\fn bool QStringView::isRightToLeft() const
\since 5.11
- Returns \c true if the string is read right to left.
+ Returns \c true if the string view is read right to left.
\sa QString::isRightToLeft()
*/
@@ -940,7 +1085,7 @@ QT_BEGIN_NAMESPACE
\fn bool QStringView::isValidUtf16() const
\since 5.15
- Returns \c true if the string contains valid UTF-16 encoded data,
+ Returns \c true if the string view contains valid UTF-16 encoded data,
or \c false otherwise.
Note that this function does not perform any special validation of the
@@ -952,14 +1097,40 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn bool QStringView::isLower() const
+ \since 6.7
+ Returns \c true if this view is identical to its lowercase folding.
+
+ Note that this does \e not mean that the string view does not contain
+ uppercase letters (some uppercase letters do not have a lowercase
+ folding; they are left unchanged by toString().toLower()).
+ For more information, refer to the Unicode standard, section 3.13.
+
+ \sa QChar::toLower(), isUpper()
+*/
+
+/*!
+ \fn bool QStringView::isUpper() const
+ \since 6.7
+ Returns \c true if this view is identical to its uppercase folding.
+
+ Note that this does \e not mean that the the string view does not contain
+ lowercase letters (some lowercase letters do not have a uppercase
+ folding; they are left unchanged by toString().toUpper()).
+ For more information, refer to the Unicode standard, section 3.13.
+
+ \sa QChar::toUpper(), isLower()
+*/
+
+/*!
\fn QStringView::toWCharArray(wchar_t *array) const
\since 5.14
- Transcribes this string into the given \a array.
+ Transcribes this string view into the given \a array.
The caller is responsible for ensuring \a array is large enough to hold the
- \c wchar_t encoding of this string (allocating the array with the same length
- as the string is always sufficient). The array is encoded in UTF-16 on
+ \c wchar_t encoding of this string view (allocating the array with the same length
+ as the string view is always sufficient). The array is encoded in UTF-16 on
platforms where \c wchar_t is 2 bytes wide (e.g. Windows); otherwise (Unix
systems), \c wchar_t is assumed to be 4 bytes wide and the data is written
in UCS-4.
@@ -978,10 +1149,9 @@ QT_BEGIN_NAMESPACE
\overload count()
Returns the number of occurrences of the character \a ch in the
- string reference.
+ string view.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa QString::count(), contains(), indexOf()
*/
@@ -993,10 +1163,23 @@ QT_BEGIN_NAMESPACE
\overload count()
Returns the number of (potentially overlapping) occurrences of the
- string reference \a str in this string reference.
+ string view \a str in this string view.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa QString::count(), contains(), indexOf()
+*/
+
+/*!
+ \fn qsizetype QStringView::count(QLatin1StringView l1, Qt::CaseSensitivity cs) const noexcept
+
+ \since 6.4
+ \overload count()
+
+ Returns the number of (potentially overlapping) occurrences of the
+ Latin-1 string viewed by \a l1 in this string view.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa QString::count(), contains(), indexOf()
*/
@@ -1004,15 +1187,15 @@ QT_BEGIN_NAMESPACE
/*!
\fn qint64 QStringView::toLongLong(bool *ok, int base) const
- Returns the string converted to a \c{long long} using base \a
+ Returns the string view converted to a \c{long long} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
+ If \a base is 0, the C language convention is used: if the string view
+ begins with "0x", base 16 is used; otherwise, if the string view begins with "0",
base 8 is used; otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For locale
@@ -1026,15 +1209,15 @@ QT_BEGIN_NAMESPACE
/*!
\fn quint64 QStringView::toULongLong(bool *ok, int base) const
- Returns the string converted to an \c{unsigned long long} using base \a
+ Returns the string view converted to an \c{unsigned long long} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
+ If \a base is 0, the C language convention is used: if the string view
+ begins with "0x", base 16 is used; otherwise, if the string view begins with "0",
base 8 is used; otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For locale
@@ -1048,15 +1231,15 @@ QT_BEGIN_NAMESPACE
/*!
\fn long QStringView::toLong(bool *ok, int base) const
- Returns the string converted to a \c long using base \a
+ Returns the string view converted to a \c long using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
+ If \a base is 0, the C language convention is used: if the string view
+ begins with "0x", base 16 is used; otherwise, if the string view begins with "0",
base 8 is used; otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For locale
@@ -1070,15 +1253,15 @@ QT_BEGIN_NAMESPACE
/*!
\fn ulong QStringView::toULong(bool *ok, int base) const
- Returns the string converted to an \c{unsigned long} using base \a
+ Returns the string view converted to an \c{unsigned long} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
+ If \a base is 0, the C language convention is used: if the string view
+ begins with "0x", base 16 is used; otherwise, if the string view begins with "0",
base 8 is used; otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For locale
@@ -1092,15 +1275,15 @@ QT_BEGIN_NAMESPACE
/*!
\fn int QStringView::toInt(bool *ok, int base) const
- Returns the string converted to an \c int using base \a
+ Returns the string view converted to an \c int using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
+ If \a base is 0, the C language convention is used: if the string view
+ begins with "0x", base 16 is used; otherwise, if the string view begins with "0",
base 8 is used; otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For locale
@@ -1114,15 +1297,15 @@ QT_BEGIN_NAMESPACE
/*!
\fn uint QStringView::toUInt(bool *ok, int base) const
- Returns the string converted to an \c{unsigned int} using base \a
+ Returns the string view converted to an \c{unsigned int} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
+ If \a base is 0, the C language convention is used: if the string view
+ begins with "0x", base 16 is used; otherwise, if the string view begins with "0",
base 8 is used; otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For locale
@@ -1136,15 +1319,15 @@ QT_BEGIN_NAMESPACE
/*!
\fn short QStringView::toShort(bool *ok, int base) const
- Returns the string converted to a \c short using base \a
+ Returns the string view converted to a \c short using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
+ If \a base is 0, the C language convention is used: if the string view
+ begins with "0x", base 16 is used; otherwise, if the string view begins with "0",
base 8 is used; otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For locale
@@ -1158,15 +1341,15 @@ QT_BEGIN_NAMESPACE
/*!
\fn ushort QStringView::toUShort(bool *ok, int base) const
- Returns the string converted to an \c{unsigned short} using base \a
+ Returns the string view converted to an \c{unsigned short} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
+ If \a base is 0, the C language convention is used: if the string view
+ begins with "0x", base 16 is used; otherwise, if the string view begins with "0",
base 8 is used; otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For locale
@@ -1180,7 +1363,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn double QStringView::toDouble(bool *ok) const
- Returns the string converted to a \c double value.
+ Returns the string view converted to a \c double value.
Returns an infinity if the conversion overflows or 0.0 if the
conversion fails for other reasons (e.g. underflow).
@@ -1203,7 +1386,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn float QStringView::toFloat(bool *ok) const
- Returns the string converted to a \c float value.
+ Returns the string view converted to a \c float value.
Returns an infinity if the conversion overflows or 0.0 if the
conversion fails for other reasons (e.g. underflow).
@@ -1221,11 +1404,11 @@ QT_BEGIN_NAMESPACE
/*!
- \fn QStringView::tokenize(Needle &&sep, Flags...flags) const
- \fn QLatin1String::tokenize(Needle &&sep, Flags...flags) const
- \fn QString::tokenize(Needle &&sep, Flags...flags) const &
- \fn QString::tokenize(Needle &&sep, Flags...flags) const &&
- \fn QString::tokenize(Needle &&sep, Flags...flags) &&
+ \fn template <typename Needle, typename...Flags> auto QStringView::tokenize(Needle &&sep, Flags...flags) const
+ \fn template <typename Needle, typename...Flags> auto QLatin1StringView::tokenize(Needle &&sep, Flags...flags) const
+ \fn template <typename Needle, typename...Flags> auto QString::tokenize(Needle &&sep, Flags...flags) const &
+ \fn template <typename Needle, typename...Flags> auto QString::tokenize(Needle &&sep, Flags...flags) const &&
+ \fn template <typename Needle, typename...Flags> auto QString::tokenize(Needle &&sep, Flags...flags) &&
Splits the string into substring views wherever \a sep occurs, and
returns a lazy sequence of those strings.
@@ -1261,4 +1444,13 @@ QT_BEGIN_NAMESPACE
\sa QStringTokenizer, qTokenize()
*/
+/*!
+ \fn QStringView::operator std::u16string_view() const
+ \since 6.7
+
+ Converts this QStringView object to a \c{std::u16string_view} object.
+ The returned view will have the same data pointer and length of
+ this view.
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringview.h b/src/corelib/text/qstringview.h
index 17b60fdc42..ab97d834d3 100644
--- a/src/corelib/text/qstringview.h
+++ b/src/corelib/text/qstringview.h
@@ -1,67 +1,18 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Copyright (C) 2019 Mail.ru Group.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// Copyright (C) 2019 Mail.ru Group.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGVIEW_H
#define QSTRINGVIEW_H
-/*
- This macro enables three "levels" of QStringView support:
-
- 1. offer QStringView, overload some functions taking QString with
- QStringView
-
- 2. like 1, but remove all overloads of functions taking QStringRef,
- leaving only the function taking QStringView. Do this only where
- QStringRef overloads tradionally existed.
-
- 3. like 2, but replace functions taking QString, too.
-*/
-#ifndef QT_STRINGVIEW_LEVEL
-# define QT_STRINGVIEW_LEVEL 1
-#endif
-
#include <QtCore/qchar.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qbytearray.h>
#include <QtCore/qstringliteral.h>
#include <QtCore/qstringalgorithms.h>
#include <string>
+#include <string_view>
+#include <QtCore/q20type_traits.h>
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
Q_FORWARD_DECLARE_CF_TYPE(CFString);
@@ -71,9 +22,12 @@ Q_FORWARD_DECLARE_OBJC_CLASS(NSString);
QT_BEGIN_NAMESPACE
class QString;
-class QStringRef;
class QStringView;
class QRegularExpression;
+class QRegularExpressionMatch;
+#ifdef Q_QDOC
+class QUtf8StringView;
+#endif
namespace QtPrivate {
template <typename Char>
@@ -85,7 +39,7 @@ struct IsCompatibleCharTypeHelper
(std::is_same<Char, wchar_t>::value && sizeof(wchar_t) == sizeof(QChar))> {};
template <typename Char>
struct IsCompatibleCharType
- : IsCompatibleCharTypeHelper<typename std::remove_cv<typename std::remove_reference<Char>::type>::type> {};
+ : IsCompatibleCharTypeHelper<q20::remove_cvref_t<Char>> {};
template <typename Pointer>
struct IsCompatiblePointerHelper : std::false_type {};
@@ -94,7 +48,7 @@ struct IsCompatiblePointerHelper<Char*>
: IsCompatibleCharType<Char> {};
template <typename Pointer>
struct IsCompatiblePointer
- : IsCompatiblePointerHelper<typename std::remove_cv<typename std::remove_reference<Pointer>::type>::type> {};
+ : IsCompatiblePointerHelper<q20::remove_cvref_t<Pointer>> {};
template <typename T, typename Enable = void>
struct IsContainerCompatibleWithQStringView : std::false_type {};
@@ -113,7 +67,6 @@ struct IsContainerCompatibleWithQStringView<T, std::enable_if_t<std::conjunction
// These need to be treated specially due to the empty vs null distinction
std::negation<std::is_same<std::decay_t<T>, QString>>,
- std::negation<std::is_same<std::decay_t<T>, QStringRef>>,
// Don't make an accidental copy constructor
std::negation<std::is_same<std::decay_t<T>, QStringView>>
@@ -146,22 +99,16 @@ private:
using if_compatible_pointer = typename std::enable_if<QtPrivate::IsCompatiblePointer<Pointer>::value, bool>::type;
template <typename T>
- using if_compatible_qstring_like = typename std::enable_if<std::is_same<T, QString>::value || std::is_same<T, QStringRef>::value, bool>::type;
+ using if_compatible_qstring_like = typename std::enable_if<std::is_same<T, QString>::value, bool>::type;
template <typename T>
using if_compatible_container = typename std::enable_if<QtPrivate::IsContainerCompatibleWithQStringView<T>::value, bool>::type;
template <typename Char>
- static qsizetype lengthHelperPointer(const Char *str) noexcept
+ static constexpr qsizetype lengthHelperPointer(const Char *str) noexcept
{
-#if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
- if (__builtin_constant_p(*str)) {
- qsizetype result = 0;
- while (*str++)
- ++result;
- return result;
- }
-#endif
+ if (q20::is_constant_evaluated())
+ return std::char_traits<Char>::length(str);
return QtPrivate::qustrlen(reinterpret_cast<const char16_t *>(str));
}
static qsizetype lengthHelperPointer(const QChar *str) noexcept
@@ -169,55 +116,47 @@ private:
return QtPrivate::qustrlen(reinterpret_cast<const char16_t *>(str));
}
- template <typename Container>
- static Q_DECL_CONSTEXPR qsizetype lengthHelperContainer(const Container &c) noexcept
- {
- return qsizetype(std::size(c));
- }
-
- template <typename Char, size_t N>
- static Q_DECL_CONSTEXPR qsizetype lengthHelperContainer(const Char (&)[N]) noexcept
- {
- return qsizetype(N - 1);
- }
-
template <typename Char>
static const storage_type *castHelper(const Char *str) noexcept
{ return reinterpret_cast<const storage_type*>(str); }
- static Q_DECL_CONSTEXPR const storage_type *castHelper(const storage_type *str) noexcept
+ static constexpr const storage_type *castHelper(const storage_type *str) noexcept
{ return str; }
public:
- Q_DECL_CONSTEXPR QStringView() noexcept
- : m_size(0), m_data(nullptr) {}
- Q_DECL_CONSTEXPR QStringView(std::nullptr_t) noexcept
+ constexpr QStringView() noexcept {}
+ constexpr QStringView(std::nullptr_t) noexcept
: QStringView() {}
template <typename Char, if_compatible_char<Char> = true>
- Q_DECL_CONSTEXPR QStringView(const Char *str, qsizetype len)
+ constexpr QStringView(const Char *str, qsizetype len)
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+ : m_data(castHelper(str)),
+ m_size((Q_ASSERT(len >= 0), Q_ASSERT(str || !len), len))
+#else
: m_size((Q_ASSERT(len >= 0), Q_ASSERT(str || !len), len)),
- m_data(castHelper(str)) {}
+ m_data(castHelper(str))
+#endif
+ {}
template <typename Char, if_compatible_char<Char> = true>
- Q_DECL_CONSTEXPR QStringView(const Char *f, const Char *l)
+ constexpr QStringView(const Char *f, const Char *l)
: QStringView(f, l - f) {}
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
template <typename Char, size_t N>
- Q_DECL_CONSTEXPR QStringView(const Char (&array)[N]) noexcept;
+ constexpr QStringView(const Char (&array)[N]) noexcept;
template <typename Char>
- Q_DECL_CONSTEXPR QStringView(const Char *str) noexcept;
+ constexpr QStringView(const Char *str) noexcept;
#else
template <typename Pointer, if_compatible_pointer<Pointer> = true>
- Q_DECL_CONSTEXPR QStringView(const Pointer &str) noexcept
+ constexpr QStringView(const Pointer &str) noexcept
: QStringView(str, str ? lengthHelperPointer(str) : 0) {}
#endif
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
QStringView(const QString &str) noexcept;
- QStringView(const QStringRef &str) noexcept;
#else
template <typename String, if_compatible_qstring_like<String> = true>
QStringView(const String &str) noexcept
@@ -225,214 +164,339 @@ public:
#endif
template <typename Container, if_compatible_container<Container> = true>
- Q_DECL_CONSTEXPR QStringView(const Container &c) noexcept
- : QStringView(std::data(c), lengthHelperContainer(c)) {}
+ constexpr Q_ALWAYS_INLINE QStringView(const Container &c) noexcept
+ : QStringView(std::data(c), QtPrivate::lengthHelperContainer(c)) {}
- Q_REQUIRED_RESULT inline QString toString() const; // defined in qstring.h
+ template <typename Char, size_t Size, if_compatible_char<Char> = true>
+ [[nodiscard]] constexpr static QStringView fromArray(const Char (&string)[Size]) noexcept
+ { return QStringView(string, Size); }
+
+ [[nodiscard]] inline QString toString() const; // defined in qstring.h
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
// defined in qcore_foundation.mm
- Q_REQUIRED_RESULT Q_CORE_EXPORT CFStringRef toCFString() const Q_DECL_CF_RETURNS_RETAINED;
- Q_REQUIRED_RESULT Q_CORE_EXPORT NSString *toNSString() const Q_DECL_NS_RETURNS_AUTORELEASED;
+ [[nodiscard]] Q_CORE_EXPORT CFStringRef toCFString() const Q_DECL_CF_RETURNS_RETAINED;
+ [[nodiscard]] Q_CORE_EXPORT NSString *toNSString() const Q_DECL_NS_RETURNS_AUTORELEASED;
#endif
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR qsizetype size() const noexcept { return m_size; }
- Q_REQUIRED_RESULT const_pointer data() const noexcept { return reinterpret_cast<const_pointer>(m_data); }
- Q_REQUIRED_RESULT const_pointer constData() const noexcept { return data(); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR const storage_type *utf16() const noexcept { return m_data; }
+ [[nodiscard]] constexpr qsizetype size() const noexcept { return m_size; }
+ [[nodiscard]] const_pointer data() const noexcept { return reinterpret_cast<const_pointer>(m_data); }
+ [[nodiscard]] const_pointer constData() const noexcept { return data(); }
+ [[nodiscard]] constexpr const storage_type *utf16() const noexcept { return m_data; }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar operator[](qsizetype n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n < size()), QChar(m_data[n]); }
+ [[nodiscard]] constexpr QChar operator[](qsizetype n) const
+ { verify(n, 1); return QChar(m_data[n]); }
//
// QString API
//
template <typename...Args>
- Q_REQUIRED_RESULT inline QString arg(Args &&...args) const; // defined in qstring.h
+ [[nodiscard]] inline QString arg(Args &&...args) const; // defined in qstring.h
- Q_REQUIRED_RESULT QByteArray toLatin1() const { return QtPrivate::convertToLatin1(*this); }
- Q_REQUIRED_RESULT QByteArray toUtf8() const { return QtPrivate::convertToUtf8(*this); }
- Q_REQUIRED_RESULT QByteArray toLocal8Bit() const { return QtPrivate::convertToLocal8Bit(*this); }
- Q_REQUIRED_RESULT inline QList<uint> toUcs4() const; // defined in qlist.h
+ [[nodiscard]] QByteArray toLatin1() const { return QtPrivate::convertToLatin1(*this); }
+ [[nodiscard]] QByteArray toUtf8() const { return QtPrivate::convertToUtf8(*this); }
+ [[nodiscard]] QByteArray toLocal8Bit() const { return QtPrivate::convertToLocal8Bit(*this); }
+ [[nodiscard]] inline QList<uint> toUcs4() const; // defined in qlist.h ### Qt 7 char32_t
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar at(qsizetype n) const { return (*this)[n]; }
+ [[nodiscard]] constexpr QChar at(qsizetype n) const noexcept { return (*this)[n]; }
- Q_REQUIRED_RESULT constexpr QStringView mid(qsizetype pos, qsizetype n = -1) const
+ [[nodiscard]] constexpr QStringView mid(qsizetype pos, qsizetype n = -1) const noexcept
{
using namespace QtPrivate;
auto result = QContainerImplHelper::mid(size(), &pos, &n);
return result == QContainerImplHelper::Null ? QStringView() : QStringView(m_data + pos, n);
}
- Q_REQUIRED_RESULT constexpr QStringView left(qsizetype n) const
+ [[nodiscard]] constexpr QStringView left(qsizetype n) const noexcept
{
if (size_t(n) >= size_t(size()))
n = size();
return QStringView(m_data, n);
}
- Q_REQUIRED_RESULT constexpr QStringView right(qsizetype n) const
+ [[nodiscard]] constexpr QStringView right(qsizetype n) const noexcept
{
if (size_t(n) >= size_t(size()))
n = size();
return QStringView(m_data + m_size - n, n);
}
- Q_REQUIRED_RESULT constexpr QStringView first(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QStringView(m_data, n); }
- Q_REQUIRED_RESULT constexpr QStringView last(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QStringView(m_data + size() - n, n); }
- Q_REQUIRED_RESULT constexpr QStringView from(qsizetype pos) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(pos <= size()); return QStringView(m_data + pos, size() - pos); }
- Q_REQUIRED_RESULT constexpr QStringView sliced(qsizetype pos, qsizetype n) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(n >= 0); Q_ASSERT(size_t(pos) + size_t(n) <= size_t(size())); return QStringView(m_data + pos, n); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QStringView chopped(qsizetype n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n <= size()), QStringView(m_data, m_size - n); }
+ [[nodiscard]] constexpr QStringView first(qsizetype n) const noexcept
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] constexpr QStringView last(qsizetype n) const noexcept
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] constexpr QStringView sliced(qsizetype pos) const noexcept
+ { verify(pos, 0); return QStringView(m_data + pos, size() - pos); }
+ [[nodiscard]] constexpr QStringView sliced(qsizetype pos, qsizetype n) const noexcept
+ { verify(pos, n); return QStringView(m_data + pos, n); }
+ [[nodiscard]] constexpr QStringView chopped(qsizetype n) const noexcept
+ { verify(0, n); return sliced(0, m_size - n); }
- Q_DECL_RELAXED_CONSTEXPR void truncate(qsizetype n)
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size = n; }
- Q_DECL_RELAXED_CONSTEXPR void chop(qsizetype n)
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size -= n; }
+ constexpr void truncate(qsizetype n) noexcept
+ { verify(0, n); ; m_size = n; }
+ constexpr void chop(qsizetype n) noexcept
+ { verify(0, n); m_size -= n; }
- Q_REQUIRED_RESULT QStringView trimmed() const noexcept { return QtPrivate::trimmed(*this); }
+ [[nodiscard]] QStringView trimmed() const noexcept { return QtPrivate::trimmed(*this); }
template <typename Needle, typename...Flags>
- Q_REQUIRED_RESULT constexpr inline auto tokenize(Needle &&needle, Flags...flags) const
+ [[nodiscard]] constexpr inline auto tokenize(Needle &&needle, Flags...flags) const
noexcept(noexcept(qTokenize(std::declval<const QStringView&>(), std::forward<Needle>(needle), flags...)))
-> decltype(qTokenize(*this, std::forward<Needle>(needle), flags...))
{ return qTokenize(*this, std::forward<Needle>(needle), flags...); }
- Q_REQUIRED_RESULT int compare(QStringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ [[nodiscard]] int compare(QStringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::compareStrings(*this, other, cs); }
- Q_REQUIRED_RESULT inline int compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR int compare(QChar c) const noexcept
- { return empty() || front() == c ? size() - 1 : *utf16() - c.unicode() ; }
- Q_REQUIRED_RESULT int compare(QChar c, Qt::CaseSensitivity cs) const noexcept
+ [[nodiscard]] inline int compare(QLatin1StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline int compare(QUtf8StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] constexpr int compare(QChar c) const noexcept
+ { return size() >= 1 ? compare_single_char_helper(*utf16() - c.unicode()) : -1; }
+ [[nodiscard]] int compare(QChar c, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::compareStrings(*this, QStringView(&c, 1), cs); }
- Q_REQUIRED_RESULT bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ [[nodiscard]] inline int localeAwareCompare(QStringView other) const;
+
+ [[nodiscard]] bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::startsWith(*this, s, cs); }
- Q_REQUIRED_RESULT inline bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- Q_REQUIRED_RESULT bool startsWith(QChar c) const noexcept
+ [[nodiscard]] inline bool startsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] bool startsWith(QChar c) const noexcept
{ return !empty() && front() == c; }
- Q_REQUIRED_RESULT bool startsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
+ [[nodiscard]] bool startsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::startsWith(*this, QStringView(&c, 1), cs); }
- Q_REQUIRED_RESULT bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ [[nodiscard]] bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::endsWith(*this, s, cs); }
- Q_REQUIRED_RESULT inline bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- Q_REQUIRED_RESULT bool endsWith(QChar c) const noexcept
+ [[nodiscard]] inline bool endsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] bool endsWith(QChar c) const noexcept
{ return !empty() && back() == c; }
- Q_REQUIRED_RESULT bool endsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
+ [[nodiscard]] bool endsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::endsWith(*this, QStringView(&c, 1), cs); }
- Q_REQUIRED_RESULT qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::findString(*this, from, QStringView(&c, 1), cs); }
- Q_REQUIRED_RESULT qsizetype indexOf(QStringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ [[nodiscard]] qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::findString(*this, from, c.unicode(), cs); }
+ [[nodiscard]] qsizetype indexOf(QStringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::findString(*this, from, s, cs); }
- Q_REQUIRED_RESULT inline qsizetype indexOf(QLatin1String s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline qsizetype indexOf(QLatin1StringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- Q_REQUIRED_RESULT bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ [[nodiscard]] bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return indexOf(QStringView(&c, 1), 0, cs) != qsizetype(-1); }
- Q_REQUIRED_RESULT bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ [[nodiscard]] bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return indexOf(s, 0, cs) != qsizetype(-1); }
- Q_REQUIRED_RESULT inline bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline bool contains(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- Q_REQUIRED_RESULT qsizetype count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ [[nodiscard]] qsizetype count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::count(*this, c, cs); }
- Q_REQUIRED_RESULT qsizetype count(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ [[nodiscard]] qsizetype count(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::count(*this, s, cs); }
-
- Q_REQUIRED_RESULT qsizetype lastIndexOf(QChar c, qsizetype from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::lastIndexOf(*this, from, QStringView(&c, 1), cs); }
- Q_REQUIRED_RESULT qsizetype lastIndexOf(QStringView s, qsizetype from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ [[nodiscard]] inline qsizetype count(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+
+ [[nodiscard]] qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(c, -1, cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::lastIndexOf(*this, from, c.unicode(), cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(s, size(), cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QStringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::lastIndexOf(*this, from, s, cs); }
- Q_REQUIRED_RESULT inline qsizetype lastIndexOf(QLatin1String s, qsizetype from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline qsizetype lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline qsizetype lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- Q_REQUIRED_RESULT bool isRightToLeft() const noexcept
+#if QT_CONFIG(regularexpression)
+ [[nodiscard]] qsizetype indexOf(const QRegularExpression &re, qsizetype from = 0, QRegularExpressionMatch *rmatch = nullptr) const
+ {
+ return QtPrivate::indexOf(*this, re, from, rmatch);
+ }
+#ifdef Q_QDOC
+ [[nodiscard]] qsizetype lastIndexOf(const QRegularExpression &re, QRegularExpressionMatch *rmatch = nullptr) const;
+#else
+ // prevent an ambiguity when called like this: lastIndexOf(re, 0)
+ template <typename T = QRegularExpressionMatch, std::enable_if_t<std::is_same_v<T, QRegularExpressionMatch>, bool> = false>
+ [[nodiscard]] qsizetype lastIndexOf(const QRegularExpression &re, T *rmatch = nullptr) const
+ {
+ return QtPrivate::lastIndexOf(*this, re, size(), rmatch);
+ }
+#endif
+ [[nodiscard]] qsizetype lastIndexOf(const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch = nullptr) const
+ {
+ return QtPrivate::lastIndexOf(*this, re, from, rmatch);
+ }
+ [[nodiscard]] bool contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch = nullptr) const
+ {
+ return QtPrivate::contains(*this, re, rmatch);
+ }
+ [[nodiscard]] qsizetype count(const QRegularExpression &re) const
+ {
+ return QtPrivate::count(*this, re);
+ }
+#endif
+
+ [[nodiscard]] bool isRightToLeft() const noexcept
{ return QtPrivate::isRightToLeft(*this); }
- Q_REQUIRED_RESULT bool isValidUtf16() const noexcept
+ [[nodiscard]] bool isValidUtf16() const noexcept
{ return QtPrivate::isValidUtf16(*this); }
- Q_REQUIRED_RESULT inline short toShort(bool *ok = nullptr, int base = 10) const;
- Q_REQUIRED_RESULT inline ushort toUShort(bool *ok = nullptr, int base = 10) const;
- Q_REQUIRED_RESULT inline int toInt(bool *ok = nullptr, int base = 10) const;
- Q_REQUIRED_RESULT inline uint toUInt(bool *ok = nullptr, int base = 10) const;
- Q_REQUIRED_RESULT inline long toLong(bool *ok = nullptr, int base = 10) const;
- Q_REQUIRED_RESULT inline ulong toULong(bool *ok = nullptr, int base = 10) const;
- Q_REQUIRED_RESULT inline qlonglong toLongLong(bool *ok = nullptr, int base = 10) const;
- Q_REQUIRED_RESULT inline qulonglong toULongLong(bool *ok = nullptr, int base = 10) const;
- Q_REQUIRED_RESULT Q_CORE_EXPORT float toFloat(bool *ok = nullptr) const;
- Q_REQUIRED_RESULT Q_CORE_EXPORT double toDouble(bool *ok = nullptr) const;
+ [[nodiscard]] bool isUpper() const noexcept
+ { return QtPrivate::isUpper(*this); }
+ [[nodiscard]] bool isLower() const noexcept
+ { return QtPrivate::isLower(*this); }
- Q_REQUIRED_RESULT inline int toWCharArray(wchar_t *array) const; // defined in qstring.h
+ [[nodiscard]] inline short toShort(bool *ok = nullptr, int base = 10) const;
+ [[nodiscard]] inline ushort toUShort(bool *ok = nullptr, int base = 10) const;
+ [[nodiscard]] inline int toInt(bool *ok = nullptr, int base = 10) const;
+ [[nodiscard]] inline uint toUInt(bool *ok = nullptr, int base = 10) const;
+ [[nodiscard]] inline long toLong(bool *ok = nullptr, int base = 10) const;
+ [[nodiscard]] inline ulong toULong(bool *ok = nullptr, int base = 10) const;
+ [[nodiscard]] inline qlonglong toLongLong(bool *ok = nullptr, int base = 10) const;
+ [[nodiscard]] inline qulonglong toULongLong(bool *ok = nullptr, int base = 10) const;
+ [[nodiscard]] Q_CORE_EXPORT float toFloat(bool *ok = nullptr) const;
+ [[nodiscard]] Q_CORE_EXPORT double toDouble(bool *ok = nullptr) const;
+ [[nodiscard]] inline qsizetype toWCharArray(wchar_t *array) const; // defined in qstring.h
- Q_REQUIRED_RESULT Q_CORE_EXPORT
+
+ [[nodiscard]] Q_CORE_EXPORT
QList<QStringView> split(QStringView sep,
Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- Q_REQUIRED_RESULT Q_CORE_EXPORT
+ [[nodiscard]] Q_CORE_EXPORT
QList<QStringView> split(QChar sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
#if QT_CONFIG(regularexpression)
- Q_REQUIRED_RESULT Q_CORE_EXPORT
+ [[nodiscard]] Q_CORE_EXPORT
QList<QStringView> split(const QRegularExpression &sep,
Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const;
#endif
+ // QStringView <> QStringView
+ friend bool comparesEqual(const QStringView &lhs, const QStringView &rhs) noexcept
+ { return lhs.size() == rhs.size() && QtPrivate::equalStrings(lhs, rhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QStringView &lhs, const QStringView &rhs) noexcept
+ {
+ const int res = QtPrivate::compareStrings(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QStringView)
+
+ // QStringView <> QChar
+ friend bool comparesEqual(const QStringView &lhs, QChar rhs) noexcept
+ { return lhs.size() == 1 && lhs[0] == rhs; }
+ friend Qt::strong_ordering compareThreeWay(const QStringView &lhs, QChar rhs) noexcept
+ { return compareThreeWay(lhs, QStringView(&rhs, 1)); }
+ Q_DECLARE_STRONGLY_ORDERED(QStringView, QChar)
+
//
// STL compatibility API:
//
- Q_REQUIRED_RESULT const_iterator begin() const noexcept { return data(); }
- Q_REQUIRED_RESULT const_iterator end() const noexcept { return data() + size(); }
- Q_REQUIRED_RESULT const_iterator cbegin() const noexcept { return begin(); }
- Q_REQUIRED_RESULT const_iterator cend() const noexcept { return end(); }
- Q_REQUIRED_RESULT const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
- Q_REQUIRED_RESULT const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
- Q_REQUIRED_RESULT const_reverse_iterator crbegin() const noexcept { return rbegin(); }
- Q_REQUIRED_RESULT const_reverse_iterator crend() const noexcept { return rend(); }
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR bool empty() const noexcept { return size() == 0; }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar front() const { return Q_ASSERT(!empty()), QChar(m_data[0]); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar back() const { return Q_ASSERT(!empty()), QChar(m_data[m_size - 1]); }
+ [[nodiscard]] const_iterator begin() const noexcept { return data(); }
+ [[nodiscard]] const_iterator end() const noexcept { return data() + size(); }
+ [[nodiscard]] const_iterator cbegin() const noexcept { return begin(); }
+ [[nodiscard]] const_iterator cend() const noexcept { return end(); }
+ [[nodiscard]] const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ [[nodiscard]] const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ [[nodiscard]] const_reverse_iterator crbegin() const noexcept { return rbegin(); }
+ [[nodiscard]] const_reverse_iterator crend() const noexcept { return rend(); }
+
+ [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; }
+ [[nodiscard]] constexpr QChar front() const { return Q_ASSERT(!empty()), QChar(m_data[0]); }
+ [[nodiscard]] constexpr QChar back() const { return Q_ASSERT(!empty()), QChar(m_data[m_size - 1]); }
+
+ [[nodiscard]] Q_IMPLICIT operator std::u16string_view() const noexcept
+ { return std::u16string_view(m_data, size_t(m_size)); }
//
// Qt compatibility API:
//
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR bool isNull() const noexcept { return !m_data; }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR bool isEmpty() const noexcept { return empty(); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR int length() const /* not nothrow! */
- { return Q_ASSERT(int(size()) == size()), int(size()); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar first() const { return front(); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar last() const { return back(); }
+ [[nodiscard]] const_iterator constBegin() const noexcept { return begin(); }
+ [[nodiscard]] const_iterator constEnd() const noexcept { return end(); }
+ [[nodiscard]] constexpr bool isNull() const noexcept { return !m_data; }
+ [[nodiscard]] constexpr bool isEmpty() const noexcept { return empty(); }
+ [[nodiscard]] constexpr qsizetype length() const noexcept
+ { return size(); }
+ [[nodiscard]] constexpr QChar first() const { return front(); }
+ [[nodiscard]] constexpr QChar last() const { return back(); }
private:
- qsizetype m_size;
- const storage_type *m_data;
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+ const storage_type *m_data = nullptr;
+ qsizetype m_size = 0;
+#else
+ qsizetype m_size = 0;
+ const storage_type *m_data = nullptr;
+#endif
+
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= size());
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= size() - pos);
+ }
+
+ constexpr int compare_single_char_helper(int diff) const noexcept
+ { return diff ? diff : size() > 1 ? 1 : 0; }
+
+ Q_CORE_EXPORT static bool equal_helper(QStringView sv, const char *data, qsizetype len);
+ Q_CORE_EXPORT static int compare_helper(QStringView sv, const char *data, qsizetype len);
+
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ friend bool comparesEqual(const QStringView &lhs, const QByteArrayView &rhs) noexcept
+ { return equal_helper(lhs, rhs.data(), rhs.size()); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QStringView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ const int res = compare_helper(lhs, rhs.data(), rhs.size());
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QStringView, QByteArrayView, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QStringView, QByteArray, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QStringView, const char *, QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
};
Q_DECLARE_TYPEINFO(QStringView, Q_PRIMITIVE_TYPE);
template <typename QStringLike, typename std::enable_if<
- std::is_same<QStringLike, QString>::value || std::is_same<QStringLike, QStringRef>::value,
+ std::is_same<QStringLike, QString>::value,
bool>::type = true>
inline QStringView qToStringViewIgnoringNull(const QStringLike &s) noexcept
-{ return QStringView(s.data(), s.size()); }
+{ return QStringView(s.begin(), s.size()); }
// QChar inline functions:
-Q_REQUIRED_RESULT constexpr auto QChar::fromUcs4(char32_t c) noexcept
+[[nodiscard]] constexpr auto QChar::fromUcs4(char32_t c) noexcept
{
struct R {
char16_t chars[2];
- Q_REQUIRED_RESULT constexpr operator QStringView() const noexcept { return {begin(), end()}; }
- Q_REQUIRED_RESULT constexpr qsizetype size() const noexcept { return chars[1] ? 2 : 1; }
- Q_REQUIRED_RESULT constexpr const char16_t *begin() const noexcept { return chars; }
- Q_REQUIRED_RESULT constexpr const char16_t *end() const noexcept { return begin() + size(); }
+ [[nodiscard]] constexpr operator QStringView() const noexcept { return {begin(), end()}; }
+ [[nodiscard]] constexpr qsizetype size() const noexcept { return chars[1] ? 2 : 1; }
+ [[nodiscard]] constexpr const char16_t *begin() const noexcept { return chars; }
+ [[nodiscard]] constexpr const char16_t *end() const noexcept { return begin() + size(); }
};
return requiresSurrogates(c) ? R{{QChar::highSurrogate(c),
QChar::lowSurrogate(c)}} :
R{{char16_t(c), u'\0'}} ;
}
+qsizetype QtPrivate::findString(QStringView str, qsizetype from, QChar ch, Qt::CaseSensitivity cs) noexcept
+{
+ if (from < -str.size()) // from < 0 && abs(from) > str.size(), avoiding overflow
+ return -1;
+ if (from < 0)
+ from = qMax(from + str.size(), qsizetype(0));
+ if (from < str.size()) {
+ const char16_t *s = str.utf16();
+ char16_t c = ch.unicode();
+ const char16_t *n = s + from;
+ const char16_t *e = s + str.size();
+ if (cs == Qt::CaseSensitive)
+ n = qustrchr(QStringView(n, e), c);
+ else
+ n = qustrcasechr(QStringView(n, e), c);
+ if (n != e)
+ return n - s;
+ }
+ return -1;
+}
+
QT_END_NAMESPACE
#endif /* QSTRINGVIEW_H */
diff --git a/src/corelib/text/qt_attribution.json b/src/corelib/text/qt_attribution.json
index c555209f19..6235ec5c16 100644
--- a/src/corelib/text/qt_attribution.json
+++ b/src/corelib/text/qt_attribution.json
@@ -4,37 +4,41 @@
"Name": "Unicode Character Database (UCD)",
"QDocModule": "qtcore",
"QtUsage": "Qt Core uses data obtained from UCD files for working with characters and strings.",
- "Files": "For update, see qtbase/util/unicode/README",
- "Files": "qunicodetables_p.h qunicodetables.cpp",
+ "Comment": { "Files": "For update, see qtbase/util/unicode/README" },
+ "Files": [ "qunicodetables_p.h", "qunicodetables.cpp" ],
"Description": "The Unicode Character Database (UCD) is a set of files that
define the Unicode character properties and internal mappings.",
"Homepage": "https://www.unicode.org/ucd/",
- "Version": "Don't use the Unicode standard version;
- UCD has its own 'Revision' numbers, see the 'UAX #44, UCD' page",
- "Version": "26",
+ "Comment": {
+ "Version": [ "Don't use the Unicode standard version;",
+ "UCD has its own 'Revision' numbers",
+ "see the 'UAX #44, UCD' page (https://www.unicode.org/reports/tr44/)" ],
+ "License": [ "Will change to Unicode-3.0 on next update",
+ "util/unicode/main.cpp is updated to do that already",
+ "Please update the following and delete this note when that happens" ] },
+ "Version": "30",
"License": "Unicode License Agreement - Data Files and Software (2016)",
"LicenseId": "Unicode-DFS-2016",
- "LicenseFile": "UNICODE_LICENSE.txt",
- "Copyright": "Copyright (C) 1991-2018 Unicode, Inc."
+ "Copyright": "Copyright (C) 1991-2022 Unicode, Inc."
},
{
"Id": "unicode-cldr",
"Name": "Unicode Common Locale Data Repository (CLDR)",
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core (QTimeZone, QLocale).",
- "Files": "For update, see qtbase/util/locale_database/cldr2qlocalexml.py",
- "Files": "qlocale_data_p.h qtimezoneprivate_data_p.h",
+ "Comment": { "Files": "For update, see qtbase/util/locale_database/cldr2qlocalexml.py" },
+ "Files": [ "qlocale_data_p.h",
+ "../time/qtimezoneprivate_data_p.h", "../time/qhijricalendar_data_p.h",
+ "../time/qjalalicalendar_data_p.h", "../time/qromancalendar_data_p.h" ],
"Description": "The Unicode CLDR provides key building blocks for software to support the
world's languages, with the largest and most extensive standard repository of locale data
available.",
- "Homepage": "http://cldr.unicode.org/",
- "Version": "v36",
- "License": "// as specified in https://spdx.org/licenses/Unicode-DFS-2016.html",
- "License": "Unicode License Agreement - Data Files and Software (2016)",
- "LicenseId": "Unicode-DFS-2016",
- "LicenseFile": "UNICODE_LICENSE.txt",
- "Copyright": "Copyright (C) 1991-2019 Unicode, Inc."
+ "Homepage": "https://cldr.unicode.org/",
+ "Version": "v44.1",
+ "License": "Unicode License v3",
+ "LicenseId": "Unicode-3.0",
+ "Copyright": "Copyright (C) 2004-2023 Unicode, Inc."
}
]
diff --git a/src/corelib/text/qtextboundaryfinder.cpp b/src/corelib/text/qtextboundaryfinder.cpp
index fdbb7f0176..21d4c5153e 100644
--- a/src/corelib/text/qtextboundaryfinder.cpp
+++ b/src/corelib/text/qtextboundaryfinder.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qtextboundaryfinder.h>
#include <QtCore/qvarlengtharray.h>
@@ -43,18 +7,10 @@
QT_BEGIN_NAMESPACE
-class QTextBoundaryFinderPrivate
+static void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
{
-public:
- QCharAttributes attributes[1];
-};
-
-static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int length, QCharAttributes *attributes)
-{
- const ushort *string = reinterpret_cast<const ushort *>(chars);
-
QUnicodeTools::ScriptItemArray scriptItems;
- QUnicodeTools::initScripts(string, length, &scriptItems);
+ QUnicodeTools::initScripts(str, &scriptItems);
QUnicodeTools::CharAttributeOptions options;
switch (type) {
@@ -64,7 +20,7 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
case QTextBoundaryFinder::Line: options |= QUnicodeTools::LineBreaks; break;
default: break;
}
- QUnicodeTools::initCharAttributes(string, length, scriptItems.data(), scriptItems.count(), attributes, options);
+ QUnicodeTools::initCharAttributes(str, scriptItems.data(), scriptItems.size(), attributes, options);
}
/*!
@@ -81,8 +37,8 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
QTextBoundaryFinder allows to find Unicode text boundaries in a
string, accordingly to the Unicode text boundary specification (see
- \l{http://www.unicode.org/reports/tr14/}{Unicode Standard Annex #14} and
- \l{http://www.unicode.org/reports/tr29/}{Unicode Standard Annex #29}).
+ \l{https://www.unicode.org/reports/tr14/}{Unicode Standard Annex #14} and
+ \l{https://www.unicode.org/reports/tr29/}{Unicode Standard Annex #29}).
QTextBoundaryFinder can operate on a QString in four possible
modes depending on the value of \a BoundaryType.
@@ -93,17 +49,17 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
for example form one grapheme cluster as the user thinks of them
as one character, yet it is in this case represented by two
unicode code points
- (see \l{http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries}).
+ (see \l{https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries}).
Word boundaries are there to locate the start and end of what a
language considers to be a word
- (see \l{http://www.unicode.org/reports/tr29/#Word_Boundaries}).
+ (see \l{https://www.unicode.org/reports/tr29/#Word_Boundaries}).
Line break boundaries give possible places where a line break
might happen and sentence boundaries will show the beginning and
end of whole sentences
- (see \l{http://www.unicode.org/reports/tr29/#Sentence_Boundaries} and
- \l{http://www.unicode.org/reports/tr14/}).
+ (see \l{https://www.unicode.org/reports/tr29/#Sentence_Boundaries} and
+ \l{https://www.unicode.org/reports/tr14/}).
The first position in a string is always a valid boundary and
refers to the position before the first character. The last
@@ -131,11 +87,11 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
Such a break opportunity might also be an item boundary
(either StartOfItem, EndOfItem, or combination of both),
a mandatory line break, or a soft hyphen.
- \value StartOfItem Since 5.0. The boundary finder is at the start of
+ \value [since 5.0] StartOfItem The boundary finder is at the start of
a grapheme, a word, a sentence, or a line.
- \value EndOfItem Since 5.0. The boundary finder is at the end of
+ \value [since 5.0] EndOfItem The boundary finder is at the end of
a grapheme, a word, a sentence, or a line.
- \value MandatoryBreak Since 5.0. The boundary finder is at the end of line
+ \value [since 5.0] MandatoryBreak The boundary finder is at the end of line
(can occur for a Line boundary type only).
\value SoftHyphen The boundary finder is at the soft hyphen
(can occur for a Line boundary type only).
@@ -145,11 +101,7 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
Constructs an invalid QTextBoundaryFinder object.
*/
QTextBoundaryFinder::QTextBoundaryFinder()
- : t(Grapheme)
- , chars(nullptr)
- , length(0)
- , freePrivate(true)
- , d(nullptr)
+ : freeBuffer(true)
{
}
@@ -159,17 +111,15 @@ QTextBoundaryFinder::QTextBoundaryFinder()
QTextBoundaryFinder::QTextBoundaryFinder(const QTextBoundaryFinder &other)
: t(other.t)
, s(other.s)
- , chars(other.chars)
- , length(other.length)
+ , sv(other.sv)
, pos(other.pos)
- , freePrivate(true)
- , d(nullptr)
+ , freeBuffer(true)
{
- if (other.d) {
- Q_ASSERT(length > 0);
- d = (QTextBoundaryFinderPrivate *) malloc((length + 1) * sizeof(QCharAttributes));
- Q_CHECK_PTR(d);
- memcpy(d, other.d, (length + 1) * sizeof(QCharAttributes));
+ if (other.attributes) {
+ Q_ASSERT(sv.size() > 0);
+ attributes = (QCharAttributes *) malloc((sv.size() + 1) * sizeof(QCharAttributes));
+ Q_CHECK_PTR(attributes);
+ memcpy(attributes, other.attributes, (sv.size() + 1) * sizeof(QCharAttributes));
}
}
@@ -181,27 +131,26 @@ QTextBoundaryFinder &QTextBoundaryFinder::operator=(const QTextBoundaryFinder &o
if (&other == this)
return *this;
- if (other.d) {
- Q_ASSERT(other.length > 0);
- uint newCapacity = (other.length + 1) * sizeof(QCharAttributes);
- QTextBoundaryFinderPrivate *newD = (QTextBoundaryFinderPrivate *) realloc(freePrivate ? d : nullptr, newCapacity);
+ if (other.attributes) {
+ Q_ASSERT(other.sv.size() > 0);
+ size_t newCapacity = (size_t(other.sv.size()) + 1) * sizeof(QCharAttributes);
+ QCharAttributes *newD = (QCharAttributes *) realloc(freeBuffer ? attributes : nullptr, newCapacity);
Q_CHECK_PTR(newD);
- freePrivate = true;
- d = newD;
+ freeBuffer = true;
+ attributes = newD;
}
t = other.t;
s = other.s;
- chars = other.chars;
- length = other.length;
+ sv = other.sv;
pos = other.pos;
- if (other.d) {
- memcpy(d, other.d, (length + 1) * sizeof(QCharAttributes));
+ if (other.attributes) {
+ memcpy(attributes, other.attributes, (sv.size() + 1) * sizeof(QCharAttributes));
} else {
- if (freePrivate)
- free(d);
- d = nullptr;
+ if (freeBuffer)
+ free(attributes);
+ attributes = nullptr;
}
return *this;
@@ -213,8 +162,8 @@ QTextBoundaryFinder &QTextBoundaryFinder::operator=(const QTextBoundaryFinder &o
QTextBoundaryFinder::~QTextBoundaryFinder()
{
Q_UNUSED(unused);
- if (freePrivate)
- free(d);
+ if (freeBuffer)
+ free(attributes);
}
/*!
@@ -223,52 +172,51 @@ QTextBoundaryFinder::~QTextBoundaryFinder()
QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QString &string)
: t(type)
, s(string)
- , chars(string.unicode())
- , length(string.length())
- , pos(0)
- , freePrivate(true)
- , d(nullptr)
+ , sv(s)
+ , freeBuffer(true)
{
- if (length > 0) {
- d = (QTextBoundaryFinderPrivate *) malloc((length + 1) * sizeof(QCharAttributes));
- Q_CHECK_PTR(d);
- init(t, chars, length, d->attributes);
+ if (sv.size() > 0) {
+ attributes = (QCharAttributes *) malloc((sv.size() + 1) * sizeof(QCharAttributes));
+ Q_CHECK_PTR(attributes);
+ init(t, sv, attributes);
}
}
/*!
- Creates a QTextBoundaryFinder object of \a type operating on \a chars
- with \a length.
+ \fn QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QChar *chars, qsizetype length, unsigned char *buffer, qsizetype bufferSize)
+ \overload
+
+ The same as QTextBoundaryFinder(type, QStringView(chars, length), buffer, bufferSize).
+*/
+
+/*!
+ Creates a QTextBoundaryFinder object of \a type operating on \a string.
+ \since 6.0
\a buffer is an optional working buffer of size \a bufferSize you can pass to
the QTextBoundaryFinder. If the buffer is large enough to hold the working
data required (bufferSize >= length + 1), it will use this
instead of allocating its own buffer.
- \warning QTextBoundaryFinder does not create a copy of \a chars. It is the
+ \warning QTextBoundaryFinder does not create a copy of \a string. It is the
application programmer's responsibility to ensure the array is allocated for
as long as the QTextBoundaryFinder object stays alive. The same applies to
\a buffer.
*/
-QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QChar *chars, int length, unsigned char *buffer, int bufferSize)
+QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, QStringView string, unsigned char *buffer, qsizetype bufferSize)
: t(type)
- , chars(chars)
- , length(length)
- , pos(0)
- , freePrivate(true)
- , d(nullptr)
+ , sv(string)
+ , freeBuffer(true)
{
- if (!chars) {
- length = 0;
- } else if (length > 0) {
- if (buffer && (uint)bufferSize >= (length + 1) * sizeof(QCharAttributes)) {
- d = (QTextBoundaryFinderPrivate *)buffer;
- freePrivate = false;
+ if (!sv.isEmpty()) {
+ if (buffer && bufferSize / int(sizeof(QCharAttributes)) >= sv.size() + 1) {
+ attributes = reinterpret_cast<QCharAttributes *>(buffer);
+ freeBuffer = false;
} else {
- d = (QTextBoundaryFinderPrivate *) malloc((length + 1) * sizeof(QCharAttributes));
- Q_CHECK_PTR(d);
+ attributes = (QCharAttributes *) malloc((sv.size() + 1) * sizeof(QCharAttributes));
+ Q_CHECK_PTR(attributes);
}
- init(t, chars, length, d->attributes);
+ init(t, sv, attributes);
}
}
@@ -289,7 +237,7 @@ void QTextBoundaryFinder::toStart()
*/
void QTextBoundaryFinder::toEnd()
{
- pos = length;
+ pos = sv.size();
}
/*!
@@ -300,7 +248,7 @@ void QTextBoundaryFinder::toEnd()
\sa setPosition()
*/
-int QTextBoundaryFinder::position() const
+qsizetype QTextBoundaryFinder::position() const
{
return pos;
}
@@ -314,9 +262,9 @@ int QTextBoundaryFinder::position() const
\sa position()
*/
-void QTextBoundaryFinder::setPosition(int position)
+void QTextBoundaryFinder::setPosition(qsizetype position)
{
- pos = qBound(0, position, length);
+ pos = qBound(0, position, sv.size());
}
/*! \fn QTextBoundaryFinder::BoundaryType QTextBoundaryFinder::type() const
@@ -335,9 +283,9 @@ void QTextBoundaryFinder::setPosition(int position)
*/
QString QTextBoundaryFinder::string() const
{
- if (chars == s.unicode() && length == s.length())
+ if (sv.data() == s.unicode() && sv.size() == s.size())
return s;
- return QString(chars, length);
+ return sv.toString();
}
@@ -346,9 +294,9 @@ QString QTextBoundaryFinder::string() const
Returns -1 if there is no next boundary.
*/
-int QTextBoundaryFinder::toNextBoundary()
+qsizetype QTextBoundaryFinder::toNextBoundary()
{
- if (!d || pos < 0 || pos >= length) {
+ if (!attributes || pos < 0 || pos >= sv.size()) {
pos = -1;
return pos;
}
@@ -356,19 +304,19 @@ int QTextBoundaryFinder::toNextBoundary()
++pos;
switch(t) {
case Grapheme:
- while (pos < length && !d->attributes[pos].graphemeBoundary)
+ while (pos < sv.size() && !attributes[pos].graphemeBoundary)
++pos;
break;
case Word:
- while (pos < length && !d->attributes[pos].wordBreak)
+ while (pos < sv.size() && !attributes[pos].wordBreak)
++pos;
break;
case Sentence:
- while (pos < length && !d->attributes[pos].sentenceBoundary)
+ while (pos < sv.size() && !attributes[pos].sentenceBoundary)
++pos;
break;
case Line:
- while (pos < length && !d->attributes[pos].lineBreak)
+ while (pos < sv.size() && !attributes[pos].lineBreak)
++pos;
break;
}
@@ -381,9 +329,9 @@ int QTextBoundaryFinder::toNextBoundary()
Returns -1 if there is no previous boundary.
*/
-int QTextBoundaryFinder::toPreviousBoundary()
+qsizetype QTextBoundaryFinder::toPreviousBoundary()
{
- if (!d || pos <= 0 || pos > length) {
+ if (!attributes || pos <= 0 || pos > sv.size()) {
pos = -1;
return pos;
}
@@ -391,19 +339,19 @@ int QTextBoundaryFinder::toPreviousBoundary()
--pos;
switch(t) {
case Grapheme:
- while (pos > 0 && !d->attributes[pos].graphemeBoundary)
+ while (pos > 0 && !attributes[pos].graphemeBoundary)
--pos;
break;
case Word:
- while (pos > 0 && !d->attributes[pos].wordBreak)
+ while (pos > 0 && !attributes[pos].wordBreak)
--pos;
break;
case Sentence:
- while (pos > 0 && !d->attributes[pos].sentenceBoundary)
+ while (pos > 0 && !attributes[pos].sentenceBoundary)
--pos;
break;
case Line:
- while (pos > 0 && !d->attributes[pos].lineBreak)
+ while (pos > 0 && !attributes[pos].lineBreak)
--pos;
break;
}
@@ -416,19 +364,19 @@ int QTextBoundaryFinder::toPreviousBoundary()
*/
bool QTextBoundaryFinder::isAtBoundary() const
{
- if (!d || pos < 0 || pos > length)
+ if (!attributes || pos < 0 || pos > sv.size())
return false;
switch(t) {
case Grapheme:
- return d->attributes[pos].graphemeBoundary;
+ return attributes[pos].graphemeBoundary;
case Word:
- return d->attributes[pos].wordBreak;
+ return attributes[pos].wordBreak;
case Sentence:
- return d->attributes[pos].sentenceBoundary;
+ return attributes[pos].sentenceBoundary;
case Line:
// ### TR#14 LB2 prohibits break at sot
- return d->attributes[pos].lineBreak || pos == 0;
+ return attributes[pos].lineBreak || pos == 0;
}
return false;
}
@@ -439,17 +387,17 @@ bool QTextBoundaryFinder::isAtBoundary() const
QTextBoundaryFinder::BoundaryReasons QTextBoundaryFinder::boundaryReasons() const
{
BoundaryReasons reasons = NotAtBoundary;
- if (!d || pos < 0 || pos > length)
+ if (!attributes || pos < 0 || pos > sv.size())
return reasons;
- const QCharAttributes attr = d->attributes[pos];
+ const QCharAttributes attr = attributes[pos];
switch (t) {
case Grapheme:
if (attr.graphemeBoundary) {
reasons |= BreakOpportunity | StartOfItem | EndOfItem;
if (pos == 0)
reasons &= (~EndOfItem);
- else if (pos == length)
+ else if (pos == sv.size())
reasons &= (~StartOfItem);
}
break;
@@ -467,7 +415,7 @@ QTextBoundaryFinder::BoundaryReasons QTextBoundaryFinder::boundaryReasons() cons
reasons |= BreakOpportunity | StartOfItem | EndOfItem;
if (pos == 0)
reasons &= (~EndOfItem);
- else if (pos == length)
+ else if (pos == sv.size())
reasons &= (~StartOfItem);
}
break;
@@ -479,9 +427,9 @@ QTextBoundaryFinder::BoundaryReasons QTextBoundaryFinder::boundaryReasons() cons
reasons |= MandatoryBreak | StartOfItem | EndOfItem;
if (pos == 0)
reasons &= (~EndOfItem);
- else if (pos == length)
+ else if (pos == sv.size())
reasons &= (~StartOfItem);
- } else if (pos > 0 && chars[pos - 1].unicode() == QChar::SoftHyphen) {
+ } else if (pos > 0 && sv[pos - 1].unicode() == QChar::SoftHyphen) {
reasons |= SoftHyphen;
}
}
diff --git a/src/corelib/text/qtextboundaryfinder.h b/src/corelib/text/qtextboundaryfinder.h
index b1e5008f54..04e64fd69b 100644
--- a/src/corelib/text/qtextboundaryfinder.h
+++ b/src/corelib/text/qtextboundaryfinder.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTEXTBOUNDARYFINDER_H
#define QTEXTBOUNDARYFINDER_H
@@ -46,7 +10,7 @@
QT_BEGIN_NAMESPACE
-class QTextBoundaryFinderPrivate;
+struct QCharAttributes;
class Q_CORE_EXPORT QTextBoundaryFinder
{
@@ -74,33 +38,35 @@ public:
Q_DECLARE_FLAGS( BoundaryReasons, BoundaryReason )
QTextBoundaryFinder(BoundaryType type, const QString &string);
- QTextBoundaryFinder(BoundaryType type, const QChar *chars, int length, unsigned char *buffer = nullptr, int bufferSize = 0);
+ QTextBoundaryFinder(BoundaryType type, const QChar *chars, qsizetype length, unsigned char *buffer = nullptr, qsizetype bufferSize = 0)
+ : QTextBoundaryFinder(type, QStringView(chars, length), buffer, bufferSize)
+ {}
+ QTextBoundaryFinder(BoundaryType type, QStringView str, unsigned char *buffer = nullptr, qsizetype bufferSize = 0);
- inline bool isValid() const { return d; }
+ inline bool isValid() const { return attributes; }
inline BoundaryType type() const { return t; }
QString string() const;
void toStart();
void toEnd();
- int position() const;
- void setPosition(int position);
+ qsizetype position() const;
+ void setPosition(qsizetype position);
- int toNextBoundary();
- int toPreviousBoundary();
+ qsizetype toNextBoundary();
+ qsizetype toPreviousBoundary();
bool isAtBoundary() const;
BoundaryReasons boundaryReasons() const;
private:
- BoundaryType t;
+ BoundaryType t = Grapheme;
QString s;
- const QChar *chars;
- int length;
- int pos;
- uint freePrivate : 1;
+ QStringView sv;
+ qsizetype pos = 0;
+ uint freeBuffer : 1;
uint unused : 31;
- QTextBoundaryFinderPrivate *d;
+ QCharAttributes *attributes = nullptr;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QTextBoundaryFinder::BoundaryReasons)
diff --git a/src/corelib/text/qtliterals.qdoc b/src/corelib/text/qtliterals.qdoc
new file mode 100644
index 0000000000..d108aeb615
--- /dev/null
+++ b/src/corelib/text/qtliterals.qdoc
@@ -0,0 +1,44 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \namespace QtLiterals
+ \inmodule QtCore
+
+ \brief The QtLiterals namespace declares literal operators for Qt types.
+*/
+
+/*!
+ \namespace Qt::Literals
+ \inmodule QtCore
+ \inheaderfile QString
+
+ \brief The Literals inline namespace declares literal operators for Qt types.
+*/
+
+/*!
+ \namespace Qt::Literals::StringLiterals
+ \inmodule QtCore
+ \inheaderfile QString
+
+ \brief The StringLiterals namespace declares string literal operators
+ for Qt types.
+
+ The inline Qt::Literals::StringLiterals namespace declares string literal
+ operators for Qt types. Because both \c Literals and \c StringLiterals
+ namespaces are declared as inline, the symbols from this namespace can be
+ accessed by adding one of the following to your code:
+
+ \code
+ // Makes visible only the literal operators declared in StringLiterals
+ using namespace Qt::Literals::StringLiterals;
+
+ // Makes visible literal operators declared in all inline namespaces
+ // inside Literals
+ using namespace Qt::Literals;
+
+ // Makes visible all symbols (including all literal operators) declared
+ // in the Qt namespace
+ using namespace Qt;
+ \endcode
+*/
diff --git a/src/corelib/text/qunicodetables.cpp b/src/corelib/text/qunicodetables.cpp
index 865f93ba52..dc93b99668 100644
--- a/src/corelib/text/qunicodetables.cpp
+++ b/src/corelib/text/qunicodetables.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/* This file is autogenerated from the Unicode 13.0 database. Do not edit */
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: Unicode-DFS-2016
+
+/* This file is autogenerated from the Unicode 15.1 database. Do not edit */
#include "qunicodetables_p.h"
@@ -45,7 +9,7 @@ QT_BEGIN_NAMESPACE
namespace QUnicodeTables {
-static const unsigned short uc_property_trie[] = {
+static constexpr unsigned short uc_property_trie[] = {
// [0x0..0x11000)
6256, 6288, 6320, 6352, 6384, 6416, 6448, 6480,
@@ -87,784 +51,784 @@ static const unsigned short uc_property_trie[] = {
14032, 14064, 14096, 14128, 14160, 14192, 14224, 14256,
14288, 14320, 14352, 14384, 14416, 14448, 14480, 14512,
14544, 14576, 14608, 14640, 14672, 14704, 14736, 14768,
- 14544, 14544, 14544, 14544, 14800, 14832, 14864, 14896,
- 14928, 14960, 14544, 14992, 15024, 15056, 15088, 15120,
- 15152, 15184, 15216, 15248, 15280, 15312, 15344, 15376,
- 15408, 15408, 15408, 15408, 15408, 15408, 15408, 15408,
- 15440, 15440, 15440, 15440, 15472, 15504, 15536, 15568,
- 15600, 15632, 15440, 15664, 15696, 15728, 15760, 15792,
- 15824, 15856, 15888, 15920, 15952, 15984, 16016, 16048,
- 16080, 16112, 16144, 16176, 16208, 16208, 16208, 16240,
- 16272, 16304, 16336, 16368, 16400, 16432, 16432, 16464,
- 16496, 16528, 16560, 9936, 16592, 16624, 16624, 16656,
- 16688, 16688, 16688, 16688, 16688, 16688, 16720, 16752,
-
- 16784, 16816, 16848, 16880, 16912, 16944, 16976, 17008,
- 17040, 17072, 17104, 17104, 17136, 17168, 17200, 17232,
- 17264, 17296, 17328, 17360, 17296, 17392, 17424, 17456,
- 17488, 17488, 17520, 17552, 17584, 17584, 17616, 17648,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
-
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680,
- 17680, 17680, 17680, 17680, 17680, 17712, 17744, 17744,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
-
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
-
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
-
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
-
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
-
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776,
- 17776, 17776, 17776, 17776, 17776, 17808, 17840, 17872,
-
- 17904, 17936, 17936, 17936, 17936, 17936, 17936, 17936,
- 17936, 17936, 17936, 17936, 17936, 17936, 17936, 17936,
- 17936, 17936, 17936, 17936, 17936, 17936, 17936, 17936,
- 17936, 17936, 17936, 17936, 17936, 17936, 17936, 17936,
- 17936, 17936, 17936, 17936, 17968, 18000, 18032, 18064,
- 18096, 18096, 18096, 18096, 18096, 18096, 18096, 18096,
- 18128, 18160, 18192, 18224, 18256, 18288, 18288, 18320,
- 18352, 18384, 18416, 18448, 18480, 18512, 18544, 18576,
- 18608, 18640, 18672, 18704, 18736, 18768, 18800, 18832,
- 18864, 18896, 18928, 18960, 18992, 19024, 19056, 19088,
- 19120, 19152, 19184, 19216, 19248, 19280, 19312, 19344,
- 19376, 19408, 19440, 19472, 19504, 19536, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632,
- 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664,
- 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696,
- 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728,
-
- 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760,
- 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792,
- 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824,
- 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632,
- 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664,
- 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696,
- 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728,
- 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760,
- 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792,
- 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824,
- 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632,
- 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664,
- 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696,
- 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728,
- 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760,
- 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792,
-
- 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824,
- 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632,
- 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664,
- 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696,
- 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728,
- 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760,
- 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792,
- 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824,
- 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632,
- 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664,
- 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696,
- 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728,
- 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760,
- 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792,
- 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824,
- 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632,
-
- 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664,
- 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696,
- 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728,
- 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760,
- 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792,
- 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824,
- 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632,
- 19664, 19696, 19728, 19760, 19792, 19856, 19888, 19920,
- 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
- 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
- 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
- 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
- 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
- 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
- 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
- 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
-
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
-
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
- 20016, 20016, 20016, 20016, 20016, 20016, 20016, 20016,
- 20048, 20080, 20112, 20144, 20176, 20176, 20208, 20240,
- 20272, 20304, 20336, 20368, 20368, 20400, 20432, 20368,
- 20368, 20368, 20368, 20368, 20368, 20368, 20368, 20368,
- 20368, 20464, 20496, 20368, 20528, 20368, 20560, 20592,
- 20624, 20656, 20688, 20720, 20368, 20368, 20368, 20752,
- 20784, 20816, 20848, 20880, 20912, 20944, 20976, 21008,
-
- 21040, 21072, 21104, 9936, 21136, 21136, 21136, 21168,
- 21200, 21232, 21264, 21296, 21328, 21360, 21392, 21424,
- 9936, 9936, 9936, 9936, 21456, 21488, 21520, 21552,
- 21584, 21616, 21648, 21680, 21712, 21744, 21776, 9936,
- 21808, 21840, 21872, 21904, 21936, 21968, 22000, 22032,
- 22064, 22096, 22128, 22160, 9936, 9936, 9936, 9936,
- 22192, 22192, 22192, 22192, 22192, 22192, 22192, 22192,
- 22192, 22224, 22256, 22288, 9936, 9936, 9936, 9936,
- 22320, 22352, 22384, 22416, 22448, 22480, 8432, 22512,
- 22544, 22576, 8432, 8432, 22608, 22640, 22672, 22704,
- 22736, 22768, 22800, 22832, 22864, 8432, 22896, 22928,
- 22960, 22992, 23024, 23056, 23088, 23120, 8432, 8432,
- 23152, 23152, 23184, 8432, 23216, 23248, 23280, 23312,
- 23344, 23376, 8432, 8432, 8432, 8432, 8432, 8432,
- 8432, 8432, 8432, 23408, 23440, 23472, 8432, 8432,
- 23504, 23536, 23568, 8432, 8432, 23600, 23632, 23664,
+ 14800, 14800, 14832, 14864, 14896, 14928, 14960, 14992,
+ 15024, 15056, 15088, 15120, 15152, 15184, 15216, 15248,
+ 15280, 15312, 15344, 15376, 15408, 15440, 15472, 15504,
+ 15536, 15536, 15536, 15536, 15536, 15536, 15536, 15536,
+ 15568, 15600, 15568, 15568, 15632, 15664, 15696, 15728,
+ 15760, 15792, 15568, 15824, 15856, 15888, 15920, 15952,
+ 15984, 16016, 16048, 16080, 16112, 16144, 16176, 16208,
+ 16240, 16272, 16304, 16336, 16368, 16368, 16368, 16400,
+ 16432, 16464, 16496, 16528, 16560, 16592, 16592, 16624,
+ 16656, 16688, 16720, 9936, 16752, 16784, 16784, 16816,
+ 16848, 16848, 16848, 16848, 16848, 16848, 16880, 16912,
+
+ 16944, 16976, 17008, 17040, 17072, 17104, 17136, 17168,
+ 17200, 17232, 17264, 17296, 17328, 17360, 17392, 17424,
+ 17456, 17488, 17520, 17552, 17584, 17616, 17648, 17680,
+ 17712, 17712, 17744, 17776, 17808, 17808, 17840, 17872,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 17904, 17904, 17904, 17904, 17904, 17936, 17968, 17968,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18032, 18064, 18096,
+
+ 18128, 18160, 18160, 18160, 18160, 18160, 18160, 18160,
+ 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160,
+ 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160,
+ 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160,
+ 18160, 18160, 18160, 18160, 18192, 18224, 18256, 18288,
+ 18320, 18320, 18320, 18320, 18320, 18320, 18320, 18320,
+ 18352, 18384, 18416, 18448, 18480, 18512, 18512, 18544,
+ 18576, 18608, 18640, 18672, 18704, 18736, 18768, 18800,
+ 18832, 18864, 18896, 18928, 18960, 18992, 19024, 19056,
+ 19088, 19120, 19152, 19184, 19216, 19248, 19280, 19312,
+ 19344, 19376, 19408, 19440, 19472, 19504, 19536, 19568,
+ 19600, 19632, 19664, 19696, 19728, 19760, 19792, 19824,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20080, 20112, 20144,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20240, 20240, 20240, 20240, 20240, 20240, 20240, 20240,
+ 20272, 20304, 20336, 20368, 20400, 20400, 20432, 20464,
+ 20496, 20528, 20560, 20592, 20592, 20624, 20656, 20592,
+ 20592, 20592, 20688, 20720, 20592, 20592, 20592, 20592,
+ 20592, 20752, 20784, 20592, 20816, 20592, 20848, 20880,
+ 20912, 20944, 20976, 21008, 20592, 20592, 20592, 21040,
+ 21072, 21104, 21136, 21168, 21200, 21232, 21264, 21296,
+
+ 21328, 21360, 21392, 9936, 21424, 21424, 21424, 21456,
+ 21488, 21520, 21552, 21584, 21616, 21648, 21680, 21712,
+ 9936, 9936, 9936, 9936, 21744, 21776, 21808, 21840,
+ 21872, 21904, 21936, 21968, 22000, 22032, 22064, 9936,
+ 22096, 22128, 22160, 22192, 22224, 22256, 22288, 22320,
+ 22352, 22384, 22416, 22448, 22480, 22512, 9936, 9936,
+ 22544, 22544, 22544, 22544, 22544, 22544, 22544, 22544,
+ 22544, 22576, 22608, 22640, 22672, 22704, 9936, 9936,
+ 22736, 22768, 22800, 22832, 22864, 22896, 22928, 22960,
+ 22992, 23024, 22928, 22928, 23056, 23088, 23120, 23152,
+ 23184, 23216, 23248, 23280, 23312, 22928, 23344, 23376,
+ 23408, 23440, 23472, 23504, 23536, 23568, 22928, 22928,
+ 23600, 23600, 23632, 22928, 23664, 23696, 23728, 23760,
+ 23792, 23824, 22928, 22928, 22928, 22928, 22928, 22928,
+ 22928, 22928, 22928, 23856, 23888, 23920, 22928, 23952,
+ 23984, 24016, 24048, 24080, 24112, 24144, 24176, 24208,
// [0x11000..0x110000)
- 23696, 23952, 24208, 24464, 24720, 24976, 25232, 25488,
- 25744, 26000, 26256, 26512, 26768, 27024, 27280, 27536,
- 27792, 27792, 27792, 28048, 28304, 28560, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 28816, 28816, 29072, 29328, 29584, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 29840, 30096, 30352, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 30608, 30608, 30864, 31120, 26512, 26512, 31376, 31632,
- 31888, 31888, 31888, 31888, 31888, 31888, 31888, 31888,
- 31888, 31888, 31888, 31888, 31888, 31888, 31888, 31888,
- 31888, 31888, 31888, 31888, 31888, 31888, 31888, 32144,
- 31888, 31888, 32400, 32656, 32912, 33168, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 33424, 33680, 33936, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 34192, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 34448, 34704, 34960, 35216, 35472, 35728, 35984, 36240,
- 36496, 36496, 36752, 26512, 26512, 26512, 26512, 26512,
- 37008, 37264, 37520, 26512, 26512, 26512, 26512, 26512,
- 37776, 38032, 38288, 38288, 38544, 38800, 39056, 38288,
- 39312, 39568, 39824, 40080, 40336, 40592, 40848, 41104,
- 41360, 41616, 41872, 42128, 42384, 42384, 42384, 42640,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
-
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896,
- 42896, 42896, 42896, 42896, 42896, 42896, 43152, 43408,
- 43408, 43408, 43408, 43408, 43408, 43408, 43408, 43408,
- 43408, 43408, 43408, 43408, 43408, 43408, 43408, 43664,
- 43920, 44176, 44176, 44176, 44176, 44176, 44176, 44176,
- 44176, 44176, 44176, 44176, 44176, 44176, 44176, 44176,
- 44176, 44176, 44176, 44176, 44176, 44176, 44432, 44688,
- 44688, 44688, 44688, 44688, 44688, 44688, 44688, 44688,
- 44688, 44688, 44688, 44688, 44688, 44688, 44688, 44688,
- 44688, 44688, 44688, 44688, 44688, 44688, 44688, 44688,
- 44688, 44688, 44688, 44944, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 45200, 45200, 45456, 42384, 42384, 42384, 42384, 42640,
- 45712, 45712, 45712, 45712, 45712, 45712, 45712, 45712,
- 45712, 45712, 45712, 45712, 45712, 45712, 45712, 45712,
- 45712, 45712, 45712, 45968, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
-
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384,
- 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42640,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 46480, 46736, 46992, 46992, 46992, 46992, 46992, 46992,
- 46992, 46992, 46992, 46992, 46992, 46992, 46992, 46992,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
-
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512,
- 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
-
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47504,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
-
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248,
- 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47504,
+ 24240, 24496, 24752, 25008, 25264, 25520, 25776, 26032,
+ 26288, 26544, 26800, 27056, 27312, 27568, 27824, 28080,
+ 28336, 28336, 28336, 28592, 28848, 29104, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29616,
+ 29872, 29872, 30128, 30384, 30640, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 30896, 31152, 31408, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 31664, 31664, 31920, 32176, 29360, 29360, 32432, 32688,
+ 32944, 32944, 32944, 32944, 32944, 32944, 32944, 32944,
+ 32944, 32944, 32944, 32944, 32944, 32944, 32944, 32944,
+ 32944, 32944, 32944, 32944, 32944, 32944, 32944, 33200,
+ 32944, 32944, 33456, 33712, 33968, 34224, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 34480,
+ 34736, 34992, 35248, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 35504, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 35760,
+ 36016, 36272, 36528, 36784, 37040, 37296, 37552, 37808,
+ 38064, 38064, 38320, 29360, 29360, 29360, 29360, 38576,
+ 38832, 39088, 39344, 29360, 39600, 29360, 29360, 39856,
+ 40112, 40368, 40624, 40624, 40880, 41136, 41392, 40624,
+ 41648, 41904, 42160, 42416, 42672, 42928, 43184, 43440,
+ 43696, 43952, 44208, 44464, 44720, 44720, 44720, 44976,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45488, 45744,
+ 45744, 45744, 45744, 45744, 45744, 45744, 45744, 45744,
+ 45744, 45744, 45744, 45744, 45744, 45744, 45744, 46000,
+ 46256, 46512, 46512, 46512, 46512, 46512, 46512, 46512,
+ 46512, 46512, 46512, 46512, 46512, 46512, 46512, 46512,
+ 46512, 46512, 46512, 46512, 46512, 46512, 46768, 47024,
+ 47024, 47024, 47024, 47024, 47024, 47024, 47024, 47024,
+ 47024, 47024, 47024, 47024, 47024, 47024, 47024, 47024,
+ 47024, 47024, 47024, 47024, 47024, 47024, 47024, 47024,
+ 47024, 47024, 47024, 47280, 47536, 47536, 47792, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48304, 48560, 48816, 48048, 48048, 48048, 48048, 49072,
+ 49328, 49328, 49328, 49328, 49328, 49328, 49328, 49328,
+ 49328, 49328, 49328, 49328, 49328, 49328, 49328, 49328,
+ 49328, 49328, 49328, 49584, 49840, 49840, 49840, 49840,
+ 49840, 49840, 49840, 49840, 49840, 49840, 49840, 49840,
+ 49840, 49840, 49840, 50096, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 49072,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 50608, 50864, 51120, 51120, 51120, 51120, 51120, 51120,
+ 51120, 51120, 51120, 51120, 51120, 51120, 51120, 51120,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51632,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51632,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -892,2590 +856,2190 @@ static const unsigned short uc_property_trie[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 48, 49, 50, 12, 12, 12, 51, 14,
- 52, 51, 53, 54, 36, 55, 51, 52,
- 56, 57, 58, 59, 60, 61, 14, 62,
- 52, 63, 53, 64, 65, 65, 65, 49,
-
- 66, 66, 66, 66, 66, 66, 38, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 38, 66, 66, 66, 66, 66, 66, 36,
- 38, 66, 66, 66, 66, 66, 38, 67,
-
- 68, 68, 68, 68, 68, 68, 44, 68,
- 68, 68, 68, 68, 68, 68, 68, 68,
- 44, 68, 68, 68, 68, 68, 68, 36,
- 44, 68, 68, 68, 68, 68, 44, 69,
-
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 72, 73, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
-
- 70, 71, 70, 71, 70, 71, 72, 73,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 74, 75, 76, 77, 70, 71, 70, 71,
- 78, 70, 71, 70, 71, 70, 71, 76,
-
- 77, 72, 73, 70, 71, 70, 71, 70,
- 71, 79, 72, 73, 70, 71, 70, 71,
- 70, 71, 72, 73, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
-
- 70, 71, 70, 71, 70, 71, 72, 73,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 80, 70, 71, 70, 71, 70, 71, 81,
-
- 82, 83, 72, 73, 72, 73, 84, 72,
- 73, 85, 85, 72, 73, 78, 86, 87,
- 88, 72, 73, 85, 89, 90, 91, 92,
- 72, 73, 93, 78, 91, 94, 95, 96,
-
- 70, 71, 72, 73, 72, 73, 97, 72,
- 73, 97, 78, 78, 72, 73, 97, 70,
- 71, 98, 98, 72, 73, 72, 73, 99,
- 72, 73, 78, 100, 72, 73, 78, 101,
-
- 100, 100, 100, 100, 102, 103, 104, 102,
- 103, 104, 102, 103, 104, 70, 71, 70,
- 71, 70, 71, 70, 71, 70, 71, 70,
- 71, 70, 71, 70, 71, 105, 70, 71,
-
- 70, 71, 70, 71, 72, 73, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 106, 102, 103, 104, 70, 71, 107, 108,
- 109, 110, 70, 71, 70, 71, 70, 71,
-
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 109, 110, 109, 110, 111, 112, 109, 110,
-
- 113, 114, 111, 112, 111, 112, 109, 110,
- 109, 110, 109, 110, 109, 110, 109, 110,
- 109, 110, 109, 110, 114, 114, 114, 115,
- 115, 115, 116, 117, 118, 119, 120, 121,
-
- 122, 117, 123, 124, 125, 126, 127, 123,
- 127, 123, 127, 123, 127, 123, 127, 123,
- 128, 129, 130, 131, 132, 78, 133, 133,
- 78, 134, 78, 135, 136, 78, 78, 78,
-
- 133, 137, 78, 138, 78, 139, 140, 78,
- 141, 142, 143, 144, 145, 78, 78, 142,
- 78, 146, 147, 78, 78, 148, 78, 78,
- 78, 78, 78, 78, 78, 149, 78, 78,
-
- 150, 78, 151, 150, 78, 78, 78, 152,
- 150, 153, 154, 154, 155, 78, 78, 78,
- 78, 78, 156, 78, 100, 78, 78, 78,
- 78, 78, 78, 78, 78, 157, 158, 78,
-
- 78, 78, 78, 78, 78, 78, 78, 78,
- 78, 159, 159, 159, 159, 159, 114, 114,
- 160, 160, 160, 160, 160, 160, 160, 160,
- 160, 161, 161, 162, 162, 162, 162, 162,
-
- 163, 163, 164, 164, 164, 164, 161, 161,
- 165, 161, 161, 161, 165, 161, 161, 161,
- 162, 162, 164, 164, 164, 164, 164, 164,
- 52, 52, 52, 52, 52, 52, 164, 166,
-
- 160, 160, 160, 160, 160, 164, 164, 164,
- 164, 164, 167, 167, 168, 169, 170, 171,
- 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171,
-
- 172, 172, 172, 172, 172, 173, 172, 172,
- 172, 172, 172, 172, 172, 173, 173, 172,
- 173, 172, 173, 172, 172, 174, 175, 175,
- 175, 175, 174, 176, 175, 175, 175, 175,
-
- 175, 177, 177, 178, 178, 178, 178, 179,
- 179, 175, 175, 175, 175, 178, 178, 175,
- 178, 178, 175, 175, 180, 180, 180, 180,
- 181, 175, 175, 175, 175, 173, 173, 173,
-
- 182, 182, 172, 182, 182, 183, 184, 185,
- 185, 185, 184, 184, 184, 185, 185, 186,
- 187, 187, 187, 188, 188, 188, 188, 187,
- 189, 190, 190, 191, 192, 193, 193, 194,
-
- 195, 195, 196, 197, 197, 197, 197, 197,
- 197, 197, 197, 197, 197, 197, 197, 197,
- 198, 199, 198, 199, 200, 201, 198, 199,
- 202, 202, 203, 204, 204, 204, 205, 206,
-
- 202, 202, 202, 202, 207, 208, 209, 210,
- 211, 211, 211, 202, 212, 202, 213, 213,
- 214, 215, 215, 215, 215, 215, 215, 215,
- 215, 215, 215, 215, 215, 215, 215, 215,
-
- 215, 215, 202, 215, 215, 215, 215, 215,
- 215, 215, 216, 216, 217, 218, 218, 218,
- 219, 220, 220, 220, 220, 220, 220, 220,
- 220, 220, 220, 220, 220, 220, 220, 220,
-
- 220, 220, 221, 220, 220, 220, 220, 220,
- 220, 220, 222, 222, 223, 224, 224, 225,
- 226, 227, 228, 229, 229, 230, 231, 232,
- 233, 234, 235, 236, 235, 236, 235, 236,
-
- 235, 236, 237, 238, 237, 238, 237, 238,
- 237, 238, 237, 238, 237, 238, 237, 238,
- 239, 240, 241, 242, 243, 244, 245, 246,
- 247, 248, 246, 247, 249, 250, 250, 250,
-
- 251, 252, 253, 252, 253, 253, 253, 252,
- 253, 253, 253, 253, 252, 251, 252, 253,
- 254, 254, 254, 254, 254, 254, 254, 254,
- 254, 255, 254, 254, 254, 254, 254, 254,
-
- 254, 254, 254, 254, 254, 254, 254, 254,
- 254, 254, 254, 254, 254, 254, 254, 254,
- 256, 256, 256, 256, 256, 256, 256, 256,
- 256, 257, 256, 256, 256, 256, 256, 256,
-
- 256, 256, 256, 256, 256, 256, 256, 256,
- 256, 256, 256, 256, 256, 256, 256, 256,
- 258, 259, 260, 259, 260, 260, 260, 259,
- 260, 260, 260, 260, 259, 258, 259, 260,
-
- 261, 262, 261, 262, 261, 262, 261, 262,
- 261, 262, 261, 262, 261, 262, 261, 262,
- 261, 262, 261, 262, 261, 262, 263, 264,
- 261, 262, 261, 262, 261, 262, 261, 262,
-
- 261, 262, 265, 266, 266, 173, 173, 267,
- 268, 268, 269, 270, 271, 272, 271, 272,
- 261, 262, 261, 262, 261, 262, 261, 262,
- 261, 262, 261, 262, 261, 262, 261, 262,
-
- 261, 262, 261, 262, 261, 262, 261, 262,
- 261, 262, 261, 262, 261, 262, 261, 262,
- 261, 262, 261, 262, 261, 262, 261, 262,
- 261, 262, 261, 262, 261, 262, 261, 262,
-
- 273, 263, 264, 261, 262, 269, 270, 261,
- 262, 269, 270, 261, 262, 269, 270, 274,
- 263, 264, 263, 264, 261, 262, 263, 264,
- 261, 262, 263, 264, 263, 264, 263, 264,
-
- 261, 262, 263, 264, 263, 264, 263, 264,
- 261, 262, 263, 264, 275, 276, 263, 264,
- 263, 264, 263, 264, 263, 264, 277, 278,
- 263, 264, 279, 280, 279, 280, 279, 280,
-
- 269, 270, 269, 270, 269, 270, 269, 270,
- 269, 270, 269, 270, 269, 270, 269, 270,
- 279, 280, 279, 280, 281, 282, 281, 282,
- 281, 282, 281, 282, 281, 282, 281, 282,
-
- 281, 282, 281, 282, 283, 284, 285, 286,
- 287, 288, 287, 288, 287, 288, 287, 288,
- 202, 289, 289, 289, 289, 289, 289, 289,
- 289, 289, 289, 289, 289, 289, 289, 289,
-
- 289, 289, 289, 289, 289, 289, 289, 289,
- 289, 289, 289, 289, 289, 289, 289, 289,
- 289, 289, 289, 289, 289, 289, 289, 202,
- 202, 290, 291, 291, 291, 292, 291, 293,
-
- 294, 295, 295, 295, 295, 295, 295, 295,
- 295, 295, 295, 295, 295, 295, 295, 295,
- 295, 295, 295, 295, 295, 295, 295, 295,
- 295, 295, 295, 295, 295, 295, 295, 295,
-
- 295, 295, 295, 295, 295, 295, 295, 296,
- 294, 297, 298, 202, 202, 299, 299, 300,
- 301, 302, 303, 303, 303, 303, 302, 303,
- 303, 303, 304, 302, 303, 303, 303, 303,
-
- 303, 303, 305, 302, 302, 302, 302, 302,
- 303, 303, 302, 303, 303, 304, 306, 303,
- 307, 308, 309, 310, 311, 312, 313, 314,
- 315, 316, 317, 318, 319, 320, 321, 322,
-
- 323, 324, 325, 323, 303, 305, 326, 327,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 328, 328, 328, 328, 328, 328, 328, 328,
- 328, 328, 328, 328, 328, 328, 328, 328,
-
- 328, 328, 328, 328, 328, 328, 328, 328,
- 328, 328, 328, 301, 301, 301, 301, 329,
- 328, 328, 328, 330, 331, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 332, 332, 332, 332, 333, 334, 335, 335,
- 336, 337, 337, 338, 19, 339, 340, 340,
- 341, 341, 341, 341, 341, 341, 342, 342,
- 343, 344, 345, 346, 347, 348, 349, 350,
-
- 351, 352, 353, 353, 353, 353, 354, 355,
- 356, 355, 356, 356, 356, 356, 356, 355,
- 355, 355, 355, 356, 356, 356, 356, 356,
- 356, 356, 356, 357, 357, 357, 357, 357,
-
- 358, 356, 356, 356, 356, 356, 356, 356,
- 355, 356, 356, 359, 360, 361, 362, 363,
- 364, 365, 366, 367, 367, 368, 369, 341,
- 341, 370, 370, 370, 371, 370, 370, 372,
-
- 373, 374, 375, 376, 377, 378, 379, 380,
- 381, 382, 383, 384, 385, 386, 387, 387,
- 388, 355, 355, 355, 352, 389, 389, 389,
- 390, 356, 356, 356, 356, 356, 356, 356,
-
- 356, 356, 356, 356, 356, 356, 356, 356,
- 355, 355, 355, 355, 355, 355, 355, 355,
- 355, 355, 355, 355, 355, 355, 355, 355,
- 355, 355, 356, 356, 356, 356, 356, 356,
-
- 356, 356, 356, 356, 356, 356, 356, 356,
- 356, 356, 356, 356, 356, 356, 356, 356,
- 356, 356, 356, 356, 356, 356, 356, 356,
- 391, 391, 356, 356, 356, 356, 356, 391,
-
- 353, 356, 354, 355, 355, 355, 355, 355,
- 355, 355, 355, 355, 356, 355, 356, 392,
- 356, 356, 355, 353, 393, 355, 394, 394,
- 394, 394, 394, 394, 394, 395, 396, 394,
-
- 394, 394, 394, 397, 394, 398, 398, 394,
- 394, 396, 397, 394, 394, 397, 399, 399,
- 400, 401, 402, 403, 404, 405, 406, 407,
- 408, 409, 391, 391, 391, 410, 410, 411,
-
- 412, 412, 412, 413, 413, 413, 413, 413,
- 413, 413, 413, 413, 413, 413, 348, 414,
- 415, 416, 417, 417, 417, 415, 415, 415,
- 415, 415, 417, 417, 417, 417, 415, 417,
-
- 417, 417, 417, 417, 417, 417, 417, 417,
- 415, 417, 415, 417, 415, 418, 418, 419,
- 420, 421, 420, 420, 421, 420, 420, 421,
- 421, 421, 420, 421, 421, 420, 421, 420,
-
- 420, 420, 421, 420, 421, 420, 421, 420,
- 421, 420, 420, 348, 348, 419, 418, 418,
- 422, 422, 422, 422, 422, 422, 422, 422,
- 422, 423, 423, 423, 422, 422, 422, 422,
-
- 422, 422, 422, 422, 422, 422, 422, 422,
- 422, 422, 422, 423, 423, 422, 357, 357,
- 357, 424, 357, 424, 424, 357, 357, 357,
- 424, 424, 357, 357, 357, 357, 357, 357,
-
- 425, 425, 425, 425, 425, 425, 425, 425,
- 425, 425, 425, 425, 425, 425, 425, 425,
- 425, 425, 425, 425, 425, 425, 425, 425,
- 425, 425, 425, 425, 425, 425, 425, 425,
-
- 425, 425, 425, 425, 425, 425, 426, 426,
- 426, 426, 426, 426, 426, 426, 426, 426,
- 426, 427, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 348, 348,
-
- 428, 429, 430, 431, 432, 433, 434, 435,
- 436, 437, 438, 438, 438, 438, 438, 438,
- 438, 438, 438, 438, 438, 438, 438, 438,
- 438, 438, 438, 438, 438, 438, 438, 438,
-
- 438, 438, 438, 438, 438, 438, 438, 438,
- 438, 438, 438, 439, 439, 439, 439, 439,
- 439, 439, 440, 439, 441, 441, 442, 443,
- 444, 445, 446, 301, 301, 447, 448, 448,
+ 48, 49, 50, 51, 52, 51, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, 65, 66, 67, 68, 54, 69,
+ 55, 70, 57, 71, 72, 72, 72, 49,
+
+ 73, 73, 73, 73, 73, 73, 74, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73,
+ 74, 73, 73, 73, 73, 73, 73, 75,
+ 74, 73, 73, 73, 73, 73, 74, 76,
+
+ 77, 77, 78, 78, 78, 78, 79, 78,
+ 77, 77, 77, 78, 77, 77, 78, 78,
+ 79, 78, 77, 77, 78, 78, 78, 75,
+ 79, 77, 77, 78, 77, 78, 79, 80,
+
+ 81, 82, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 84, 85, 81, 82, 81, 83, 81, 83,
+ 81, 83, 81, 82, 81, 83, 81, 83,
+
+ 81, 83, 81, 83, 81, 83, 86, 85,
+ 81, 83, 81, 82, 81, 83, 81, 83,
+ 87, 88, 89, 90, 81, 83, 81, 83,
+ 91, 81, 83, 81, 83, 81, 83, 89,
+
+ 90, 86, 85, 81, 82, 81, 83, 81,
+ 82, 92, 86, 85, 81, 82, 81, 83,
+ 81, 83, 86, 85, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+
+ 81, 83, 81, 83, 81, 83, 86, 85,
+ 81, 83, 81, 82, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 93, 81, 83, 81, 83, 81, 83, 94,
+
+ 95, 96, 84, 97, 84, 97, 98, 84,
+ 97, 99, 99, 84, 97, 100, 101, 102,
+ 103, 84, 97, 99, 104, 105, 106, 107,
+ 84, 97, 108, 100, 106, 109, 110, 111,
+
+ 81, 83, 84, 97, 84, 97, 112, 84,
+ 97, 112, 100, 100, 84, 97, 112, 81,
+ 83, 113, 113, 84, 97, 84, 97, 114,
+ 84, 97, 100, 115, 84, 97, 100, 116,
+
+ 115, 115, 115, 115, 117, 118, 119, 117,
+ 118, 119, 117, 118, 119, 81, 82, 81,
+ 82, 81, 82, 81, 82, 81, 82, 81,
+ 82, 81, 82, 81, 82, 120, 81, 83,
+
+ 81, 83, 81, 83, 84, 97, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 121, 117, 118, 119, 81, 83, 122, 123,
+ 124, 125, 81, 83, 81, 83, 81, 83,
+
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 124, 125, 124, 125, 126, 127, 124, 125,
+
+ 128, 129, 126, 127, 126, 127, 124, 125,
+ 124, 125, 124, 125, 124, 125, 124, 125,
+ 124, 125, 124, 125, 129, 129, 129, 130,
+ 130, 130, 131, 132, 133, 134, 135, 136,
+
+ 137, 132, 138, 139, 140, 141, 142, 138,
+ 142, 138, 142, 138, 142, 138, 142, 138,
+ 143, 144, 145, 146, 147, 100, 148, 148,
+ 100, 149, 100, 150, 151, 100, 100, 100,
+
+ 148, 152, 100, 153, 100, 154, 155, 100,
+ 156, 157, 158, 159, 160, 100, 100, 157,
+ 100, 161, 162, 100, 100, 163, 100, 100,
+ 100, 100, 100, 100, 100, 164, 100, 100,
+
+ 165, 100, 166, 165, 100, 100, 100, 167,
+ 165, 168, 169, 169, 170, 100, 100, 100,
+ 100, 100, 171, 100, 115, 100, 100, 100,
+ 100, 100, 100, 100, 100, 172, 173, 100,
+
+ 100, 100, 100, 100, 100, 100, 100, 100,
+ 100, 174, 174, 174, 174, 174, 129, 129,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 176, 176, 177, 177, 177, 177, 177,
+
+ 178, 178, 179, 179, 180, 179, 176, 181,
+ 182, 181, 181, 181, 182, 181, 176, 176,
+ 183, 177, 179, 179, 179, 179, 179, 179,
+ 55, 55, 55, 55, 184, 55, 179, 185,
+
+ 175, 175, 175, 175, 175, 179, 179, 179,
+ 179, 179, 186, 186, 187, 188, 189, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190,
+
+ 191, 191, 191, 191, 191, 192, 191, 191,
+ 191, 191, 191, 191, 191, 192, 192, 191,
+ 192, 191, 192, 191, 191, 193, 194, 194,
+ 194, 194, 193, 195, 194, 194, 194, 194,
+
+ 194, 196, 196, 197, 197, 197, 197, 198,
+ 198, 194, 194, 194, 194, 197, 197, 194,
+ 197, 197, 194, 194, 199, 199, 199, 199,
+ 200, 194, 194, 194, 194, 192, 192, 192,
+
+ 201, 201, 191, 201, 201, 202, 203, 204,
+ 204, 204, 203, 203, 203, 204, 204, 205,
+ 206, 206, 206, 207, 207, 207, 207, 206,
+ 208, 209, 209, 210, 211, 212, 212, 213,
+
+ 214, 214, 215, 216, 216, 216, 216, 216,
+ 216, 216, 216, 216, 216, 216, 216, 216,
+ 217, 218, 217, 218, 219, 220, 217, 218,
+ 221, 221, 222, 223, 223, 223, 224, 225,
+
+ 221, 221, 221, 221, 226, 227, 228, 229,
+ 230, 230, 230, 221, 231, 221, 232, 232,
+ 233, 234, 234, 234, 234, 234, 234, 234,
+ 234, 234, 234, 234, 234, 234, 234, 234,
+
+ 234, 234, 221, 234, 234, 234, 234, 234,
+ 234, 234, 235, 235, 236, 237, 237, 237,
+ 238, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+
+ 239, 239, 240, 239, 239, 239, 239, 239,
+ 239, 239, 241, 241, 242, 243, 243, 244,
+ 245, 246, 247, 248, 248, 249, 250, 251,
+ 252, 253, 254, 255, 254, 255, 254, 255,
+
+ 254, 255, 256, 257, 256, 257, 256, 257,
+ 256, 257, 256, 257, 256, 257, 256, 257,
+ 258, 259, 260, 261, 262, 263, 264, 265,
+ 266, 267, 265, 266, 268, 269, 269, 269,
+
+ 270, 271, 272, 273, 272, 272, 272, 273,
+ 272, 272, 272, 272, 273, 270, 273, 272,
+ 274, 274, 274, 274, 274, 274, 274, 274,
+ 274, 275, 274, 274, 274, 274, 274, 274,
+
+ 274, 274, 274, 274, 274, 274, 274, 274,
+ 274, 274, 274, 274, 274, 274, 274, 274,
+ 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 277, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276,
+ 278, 279, 280, 281, 280, 280, 280, 281,
+ 280, 280, 280, 280, 281, 278, 281, 280,
+
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 284, 285,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+
+ 282, 283, 286, 287, 287, 288, 288, 289,
+ 290, 290, 291, 292, 293, 294, 293, 294,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+
+ 295, 284, 285, 282, 283, 291, 292, 282,
+ 283, 291, 292, 282, 283, 291, 292, 296,
+ 284, 285, 284, 285, 282, 283, 284, 285,
+ 282, 283, 284, 285, 284, 285, 284, 285,
+
+ 282, 283, 284, 285, 284, 285, 284, 285,
+ 282, 283, 284, 285, 297, 298, 284, 285,
+ 284, 285, 284, 285, 284, 285, 299, 300,
+ 284, 285, 301, 302, 301, 302, 301, 302,
+
+ 291, 292, 291, 292, 291, 292, 291, 292,
+ 291, 292, 291, 292, 291, 292, 291, 292,
+ 301, 302, 301, 302, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+
+ 303, 304, 303, 304, 305, 306, 307, 308,
+ 309, 310, 309, 310, 309, 310, 309, 310,
+ 221, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 221,
+ 221, 312, 313, 313, 313, 314, 313, 315,
+
+ 316, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 317, 317, 317, 317, 317,
+
+ 317, 317, 317, 317, 317, 317, 317, 318,
+ 316, 319, 320, 221, 221, 321, 321, 322,
+ 323, 324, 325, 325, 325, 325, 324, 325,
+ 325, 325, 326, 324, 325, 325, 325, 325,
+
+ 325, 325, 327, 324, 324, 324, 324, 324,
+ 325, 325, 324, 325, 325, 326, 328, 325,
+ 329, 330, 331, 332, 333, 334, 335, 336,
+ 337, 338, 339, 340, 341, 342, 343, 344,
+
+ 345, 346, 347, 345, 325, 327, 348, 349,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350,
+
+ 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 323, 323, 323, 323, 351,
+ 350, 350, 350, 352, 353, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 354, 354, 354, 354, 355, 356, 357, 357,
+ 358, 359, 359, 360, 361, 362, 363, 363,
+ 364, 364, 364, 364, 364, 364, 365, 365,
+ 366, 367, 368, 369, 370, 371, 372, 373,
+
+ 374, 375, 376, 376, 376, 376, 377, 378,
+ 379, 378, 379, 379, 379, 379, 379, 378,
+ 378, 378, 378, 379, 379, 379, 379, 379,
+ 379, 379, 379, 380, 380, 380, 380, 380,
+
+ 381, 379, 379, 379, 379, 379, 379, 379,
+ 378, 379, 379, 382, 383, 384, 385, 386,
+ 387, 388, 389, 390, 390, 391, 392, 364,
+ 364, 393, 393, 393, 394, 393, 393, 395,
+
+ 396, 397, 398, 399, 400, 401, 402, 403,
+ 404, 405, 406, 407, 408, 409, 410, 410,
+ 411, 378, 378, 378, 375, 412, 412, 412,
+ 413, 379, 379, 379, 379, 379, 379, 379,
+
+ 379, 379, 379, 379, 379, 379, 379, 379,
+ 378, 378, 378, 378, 378, 378, 378, 378,
+ 378, 378, 378, 378, 378, 378, 378, 378,
+ 378, 378, 379, 379, 379, 379, 379, 379,
+
+ 379, 379, 379, 379, 379, 379, 379, 379,
+ 379, 379, 379, 379, 379, 379, 379, 379,
+ 379, 379, 379, 379, 379, 379, 379, 379,
+ 414, 414, 379, 379, 379, 379, 379, 414,
+
+ 376, 379, 377, 378, 378, 378, 378, 378,
+ 378, 378, 378, 378, 379, 378, 379, 415,
+ 379, 379, 378, 376, 416, 378, 417, 417,
+ 417, 417, 417, 417, 417, 418, 419, 417,
+
+ 417, 417, 417, 420, 417, 421, 421, 417,
+ 417, 419, 420, 417, 417, 420, 422, 422,
+ 423, 424, 425, 426, 427, 428, 429, 430,
+ 431, 432, 414, 414, 414, 433, 433, 434,
+
+ 435, 435, 435, 436, 436, 436, 436, 436,
+ 436, 436, 436, 436, 436, 436, 437, 438,
+ 439, 440, 441, 441, 441, 439, 439, 439,
+ 439, 439, 441, 441, 441, 441, 439, 441,
+
+ 441, 441, 441, 441, 441, 441, 441, 441,
+ 439, 441, 439, 441, 439, 442, 442, 443,
+ 444, 445, 444, 444, 445, 444, 444, 445,
+ 445, 445, 444, 445, 445, 444, 445, 444,
+
+ 444, 444, 445, 444, 445, 444, 445, 444,
+ 445, 444, 444, 437, 437, 443, 442, 442,
+ 446, 446, 446, 446, 446, 446, 446, 446,
+ 446, 447, 447, 447, 446, 446, 446, 446,
+
+ 446, 446, 446, 446, 446, 446, 446, 446,
+ 446, 446, 446, 447, 447, 446, 380, 380,
+ 380, 448, 380, 448, 448, 380, 380, 380,
+ 448, 448, 380, 380, 380, 380, 380, 380,
449, 449, 449, 449, 449, 449, 449, 449,
449, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 449, 449, 449, 449, 449, 449,
+
449, 449, 449, 449, 449, 449, 450, 450,
- 450, 450, 451, 450, 450, 450, 450, 450,
-
- 450, 450, 450, 450, 451, 450, 450, 450,
- 451, 450, 450, 450, 450, 450, 301, 301,
- 452, 452, 452, 452, 452, 452, 452, 453,
- 452, 453, 452, 452, 452, 453, 453, 301,
-
- 454, 455, 455, 455, 455, 455, 454, 454,
- 455, 454, 455, 455, 455, 455, 455, 455,
- 455, 455, 455, 455, 454, 455, 454, 454,
- 454, 456, 456, 456, 301, 301, 457, 301,
-
- 458, 459, 458, 458, 458, 458, 459, 460,
- 458, 460, 460, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 461, 462, 461, 461, 461, 461, 461, 461,
- 461, 461, 463, 463, 463, 464, 465, 462,
- 462, 465, 465, 466, 466, 348, 467, 467,
- 467, 468, 467, 467, 467, 467, 469, 469,
-
- 469, 469, 469, 469, 469, 469, 469, 469,
- 348, 348, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 470, 471, 471, 471, 471,
- 471, 471, 471, 471, 471, 471, 471, 471,
-
- 471, 471, 472, 473, 474, 474, 475, 474,
- 474, 475, 474, 474, 474, 475, 475, 475,
- 476, 477, 478, 474, 474, 474, 475, 474,
- 474, 475, 475, 474, 474, 474, 474, 479,
-
- 480, 481, 481, 482, 483, 484, 484, 484,
- 484, 484, 484, 484, 484, 484, 484, 484,
- 484, 484, 484, 484, 484, 484, 484, 484,
- 484, 484, 484, 484, 484, 484, 484, 484,
-
- 484, 484, 484, 484, 484, 484, 484, 484,
- 484, 485, 484, 484, 484, 484, 484, 484,
- 484, 485, 484, 484, 485, 484, 484, 484,
- 484, 484, 486, 487, 488, 484, 482, 482,
-
- 482, 481, 481, 481, 481, 481, 481, 481,
- 481, 482, 482, 482, 482, 489, 490, 487,
- 484, 173, 175, 173, 173, 480, 486, 486,
- 491, 491, 491, 491, 491, 491, 491, 491,
-
- 484, 484, 481, 481, 492, 492, 493, 494,
- 495, 496, 497, 498, 499, 500, 501, 502,
- 503, 504, 505, 506, 506, 506, 506, 506,
- 507, 508, 508, 509, 509, 510, 509, 509,
-
- 511, 512, 513, 513, 202, 514, 514, 514,
- 514, 514, 514, 514, 514, 202, 202, 514,
- 514, 202, 202, 514, 514, 514, 514, 514,
- 514, 514, 514, 514, 514, 514, 514, 514,
-
- 514, 514, 514, 514, 514, 514, 514, 514,
- 514, 202, 514, 514, 514, 514, 514, 514,
- 514, 202, 514, 202, 202, 202, 514, 514,
- 514, 514, 202, 202, 515, 516, 517, 513,
-
- 513, 512, 512, 512, 512, 202, 202, 513,
- 513, 202, 202, 518, 518, 519, 520, 202,
- 202, 202, 202, 202, 202, 202, 202, 517,
- 202, 202, 202, 202, 521, 521, 202, 521,
-
- 514, 514, 512, 512, 202, 202, 522, 523,
- 524, 525, 526, 527, 528, 529, 530, 531,
- 514, 514, 532, 532, 533, 533, 533, 533,
- 533, 534, 535, 536, 537, 538, 539, 202,
-
- 202, 540, 541, 542, 202, 543, 543, 543,
- 543, 543, 543, 202, 202, 202, 202, 543,
- 543, 202, 202, 543, 543, 543, 543, 543,
- 543, 543, 543, 543, 543, 543, 543, 543,
-
- 543, 543, 543, 543, 543, 543, 543, 543,
- 543, 202, 543, 543, 543, 543, 543, 543,
- 543, 202, 543, 544, 202, 543, 544, 202,
- 543, 543, 202, 202, 545, 202, 546, 546,
-
- 546, 541, 541, 202, 202, 202, 202, 541,
- 541, 202, 202, 541, 541, 547, 202, 202,
- 202, 548, 202, 202, 202, 202, 202, 202,
- 202, 544, 544, 544, 543, 202, 544, 202,
-
- 202, 202, 202, 202, 202, 202, 549, 550,
- 551, 552, 553, 554, 555, 556, 557, 558,
- 541, 541, 543, 543, 543, 548, 559, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 560, 560, 561, 202, 562, 562, 562,
- 562, 562, 562, 562, 563, 562, 202, 562,
- 562, 562, 202, 562, 562, 562, 562, 562,
- 562, 562, 562, 562, 562, 562, 562, 562,
-
- 562, 562, 562, 562, 562, 562, 562, 562,
- 562, 202, 562, 562, 562, 562, 562, 562,
- 562, 202, 562, 562, 202, 562, 562, 562,
- 562, 562, 202, 202, 564, 562, 561, 561,
-
- 561, 560, 560, 560, 560, 560, 202, 560,
- 560, 561, 202, 561, 561, 565, 202, 202,
- 562, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 562, 563, 566, 566, 202, 202, 567, 568,
- 569, 570, 571, 572, 573, 574, 575, 576,
- 577, 578, 202, 202, 202, 202, 202, 202,
- 202, 579, 580, 580, 580, 580, 580, 580,
-
- 202, 581, 582, 582, 202, 583, 583, 583,
- 583, 583, 583, 583, 583, 202, 202, 583,
- 583, 202, 202, 583, 583, 583, 583, 583,
- 583, 583, 583, 583, 583, 583, 583, 583,
-
- 583, 583, 583, 583, 583, 583, 583, 583,
- 583, 202, 583, 583, 583, 583, 583, 583,
- 583, 202, 583, 583, 202, 584, 583, 583,
- 583, 583, 202, 202, 585, 583, 586, 581,
-
- 582, 581, 581, 581, 587, 202, 202, 582,
- 588, 202, 202, 588, 588, 589, 202, 202,
- 202, 202, 202, 202, 202, 590, 591, 586,
- 202, 202, 202, 202, 592, 592, 202, 583,
-
- 583, 583, 587, 587, 202, 202, 593, 594,
- 595, 596, 597, 598, 599, 600, 601, 602,
- 603, 584, 604, 604, 604, 604, 604, 604,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 605, 606, 202, 606, 606, 606,
- 606, 606, 606, 202, 202, 202, 606, 606,
- 606, 202, 606, 606, 607, 606, 202, 202,
- 202, 606, 606, 202, 606, 202, 606, 606,
-
- 202, 202, 202, 606, 606, 202, 202, 202,
- 606, 606, 606, 202, 202, 202, 606, 606,
- 606, 606, 606, 606, 606, 606, 608, 606,
- 606, 606, 202, 202, 202, 202, 609, 610,
-
- 605, 610, 610, 202, 202, 202, 610, 610,
- 610, 202, 611, 611, 611, 612, 202, 202,
- 613, 202, 202, 202, 202, 202, 202, 609,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 614, 615,
- 616, 617, 618, 619, 620, 621, 622, 623,
- 624, 624, 624, 625, 625, 625, 625, 625,
- 625, 626, 625, 202, 202, 202, 202, 202,
-
- 627, 628, 628, 628, 629, 630, 630, 630,
- 630, 630, 630, 630, 630, 202, 630, 630,
- 630, 202, 630, 630, 630, 630, 630, 630,
- 630, 630, 630, 630, 630, 630, 630, 630,
-
- 630, 630, 630, 630, 630, 630, 630, 630,
- 630, 202, 630, 630, 630, 630, 630, 630,
- 630, 630, 630, 630, 631, 630, 630, 630,
- 630, 630, 202, 202, 202, 632, 633, 633,
-
- 633, 628, 628, 628, 628, 202, 633, 633,
- 634, 202, 633, 633, 633, 635, 202, 202,
- 202, 202, 202, 202, 202, 636, 637, 202,
- 632, 632, 638, 202, 202, 202, 202, 202,
-
- 630, 630, 639, 639, 202, 202, 640, 641,
- 642, 643, 644, 645, 646, 647, 648, 649,
- 202, 202, 202, 202, 202, 202, 202, 650,
- 651, 651, 651, 651, 651, 651, 651, 652,
-
- 653, 654, 655, 655, 656, 657, 657, 657,
- 657, 657, 657, 657, 657, 202, 657, 657,
- 657, 202, 657, 657, 657, 657, 657, 657,
- 657, 657, 657, 657, 657, 657, 657, 657,
-
- 657, 657, 657, 657, 657, 657, 657, 657,
- 657, 202, 657, 657, 657, 657, 657, 657,
- 657, 657, 657, 657, 202, 657, 657, 657,
- 657, 657, 202, 202, 658, 659, 655, 660,
-
- 661, 655, 662, 655, 655, 202, 660, 661,
- 661, 202, 661, 661, 663, 664, 202, 202,
- 202, 202, 202, 202, 202, 662, 662, 202,
- 202, 202, 202, 202, 202, 202, 657, 202,
-
- 657, 657, 665, 665, 202, 202, 666, 667,
- 668, 669, 670, 671, 672, 673, 674, 675,
- 202, 676, 676, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 677, 678, 679, 679, 680, 681, 681, 681,
- 681, 681, 681, 681, 681, 202, 681, 681,
- 681, 202, 681, 681, 681, 681, 681, 681,
- 681, 681, 681, 681, 681, 681, 681, 681,
-
- 681, 681, 681, 681, 681, 681, 681, 681,
- 681, 682, 681, 681, 681, 681, 681, 681,
- 681, 681, 681, 681, 681, 681, 681, 681,
- 681, 681, 682, 683, 683, 684, 685, 679,
-
- 679, 686, 686, 686, 687, 202, 679, 679,
- 679, 202, 688, 688, 688, 689, 690, 691,
- 202, 202, 202, 202, 692, 692, 692, 685,
- 693, 693, 693, 693, 693, 693, 693, 694,
-
- 681, 681, 687, 687, 202, 202, 695, 696,
- 697, 698, 699, 700, 701, 702, 703, 704,
- 705, 705, 705, 705, 705, 705, 693, 693,
- 693, 706, 684, 684, 684, 684, 684, 684,
-
- 202, 707, 708, 708, 202, 709, 709, 709,
- 709, 709, 709, 709, 709, 709, 709, 709,
- 709, 709, 709, 709, 709, 709, 709, 202,
- 202, 202, 709, 709, 709, 709, 709, 709,
-
- 709, 709, 709, 709, 709, 709, 709, 709,
- 709, 709, 709, 709, 709, 709, 709, 709,
- 709, 709, 202, 709, 709, 709, 709, 709,
- 709, 709, 709, 709, 202, 709, 202, 202,
-
- 709, 709, 709, 709, 709, 709, 709, 202,
- 202, 202, 710, 202, 202, 202, 202, 711,
- 708, 708, 712, 712, 712, 202, 712, 202,
- 708, 708, 713, 708, 713, 713, 713, 711,
-
- 202, 202, 202, 202, 202, 202, 714, 715,
- 716, 717, 718, 719, 720, 721, 722, 723,
- 202, 202, 708, 708, 724, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 725, 725, 725, 725, 725, 725, 725,
- 725, 725, 725, 725, 725, 725, 725, 725,
- 725, 725, 725, 725, 725, 725, 725, 725,
- 725, 725, 725, 725, 725, 725, 725, 725,
-
- 725, 725, 725, 725, 725, 725, 725, 725,
- 725, 725, 725, 725, 725, 725, 725, 725,
- 725, 726, 725, 727, 726, 726, 726, 726,
- 728, 728, 729, 202, 202, 202, 202, 12,
-
- 725, 725, 725, 725, 725, 725, 730, 726,
- 731, 731, 731, 731, 726, 726, 726, 732,
- 733, 734, 735, 736, 737, 738, 739, 740,
- 741, 742, 743, 743, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 744, 744, 202, 744, 202, 745, 744,
- 744, 745, 744, 202, 745, 744, 745, 745,
- 745, 745, 745, 745, 744, 744, 744, 744,
- 745, 744, 744, 744, 744, 744, 744, 744,
-
- 745, 744, 744, 744, 202, 744, 202, 744,
- 745, 745, 744, 744, 745, 744, 744, 744,
- 744, 746, 744, 747, 746, 746, 746, 746,
- 748, 748, 749, 746, 746, 744, 202, 202,
-
- 744, 744, 744, 744, 744, 202, 750, 202,
- 751, 751, 751, 751, 746, 746, 202, 202,
- 752, 753, 754, 755, 756, 757, 758, 759,
- 760, 761, 202, 202, 762, 762, 763, 763,
-
- 764, 765, 765, 765, 766, 767, 766, 766,
- 768, 766, 766, 769, 770, 771, 771, 771,
- 771, 771, 768, 772, 771, 772, 772, 772,
- 773, 773, 772, 772, 772, 772, 772, 772,
-
- 774, 775, 776, 777, 778, 779, 780, 781,
- 782, 783, 784, 784, 784, 784, 784, 784,
- 784, 784, 784, 784, 785, 773, 772, 773,
- 772, 786, 787, 788, 787, 788, 789, 789,
-
- 764, 764, 764, 790, 764, 764, 764, 764,
- 202, 764, 764, 764, 764, 790, 764, 764,
- 764, 764, 790, 764, 764, 764, 764, 790,
- 764, 764, 764, 764, 790, 764, 764, 764,
-
- 764, 764, 764, 764, 764, 764, 764, 764,
- 764, 790, 791, 792, 792, 202, 202, 202,
- 202, 793, 794, 795, 796, 795, 795, 797,
- 795, 797, 794, 794, 794, 794, 798, 799,
-
- 794, 795, 800, 800, 801, 769, 800, 800,
- 764, 764, 764, 764, 802, 803, 803, 803,
- 798, 798, 798, 795, 798, 798, 804, 798,
- 202, 798, 798, 798, 798, 795, 798, 798,
-
- 798, 798, 795, 798, 798, 798, 798, 795,
- 798, 798, 798, 798, 795, 798, 804, 804,
- 804, 798, 798, 798, 798, 798, 798, 798,
- 804, 795, 804, 804, 804, 202, 805, 805,
-
- 806, 806, 806, 806, 806, 806, 807, 806,
- 806, 806, 806, 806, 806, 202, 808, 806,
- 809, 809, 810, 811, 812, 813, 813, 813,
- 813, 814, 814, 202, 202, 202, 202, 202,
-
- 815, 815, 815, 815, 815, 815, 815, 815,
- 815, 815, 815, 815, 815, 815, 815, 815,
- 815, 815, 815, 815, 815, 815, 815, 815,
- 815, 815, 815, 815, 815, 815, 815, 815,
-
- 815, 815, 816, 815, 815, 815, 817, 815,
- 816, 815, 815, 818, 819, 820, 821, 820,
- 820, 822, 820, 823, 823, 823, 820, 824,
- 819, 825, 826, 827, 827, 823, 823, 816,
-
- 828, 829, 830, 831, 832, 833, 834, 835,
- 836, 837, 838, 838, 839, 839, 839, 839,
- 815, 815, 815, 815, 815, 815, 822, 822,
- 820, 820, 816, 816, 816, 816, 823, 823,
-
- 823, 816, 818, 818, 818, 816, 816, 818,
- 818, 818, 818, 818, 818, 818, 816, 816,
- 816, 823, 823, 823, 823, 816, 816, 816,
- 816, 816, 816, 816, 816, 816, 816, 816,
-
- 816, 816, 823, 818, 827, 823, 823, 818,
- 818, 818, 818, 818, 818, 840, 816, 818,
- 841, 842, 843, 844, 845, 846, 847, 848,
- 849, 850, 851, 851, 851, 852, 853, 853,
-
- 854, 854, 854, 854, 854, 854, 854, 854,
- 854, 854, 854, 854, 854, 854, 854, 854,
- 854, 854, 854, 854, 854, 854, 854, 854,
- 854, 854, 854, 854, 854, 854, 854, 854,
-
- 854, 854, 854, 854, 854, 854, 202, 855,
- 202, 202, 202, 202, 202, 855, 202, 202,
- 856, 856, 856, 856, 856, 856, 856, 856,
+ 450, 450, 450, 450, 450, 450, 450, 450,
+ 450, 451, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+
+ 452, 453, 454, 455, 456, 457, 458, 459,
+ 460, 461, 462, 462, 462, 462, 462, 462,
+ 462, 462, 462, 462, 462, 462, 462, 462,
+ 462, 462, 462, 462, 462, 462, 462, 462,
+
+ 462, 462, 462, 462, 462, 462, 462, 462,
+ 462, 462, 462, 463, 463, 463, 463, 463,
+ 463, 463, 464, 463, 465, 465, 466, 467,
+ 468, 469, 470, 323, 323, 471, 472, 472,
+
+ 473, 473, 473, 473, 473, 473, 473, 473,
+ 473, 473, 473, 473, 473, 473, 473, 473,
+ 473, 473, 473, 473, 473, 473, 474, 474,
+ 474, 474, 475, 474, 474, 474, 474, 474,
+
+ 474, 474, 474, 474, 475, 474, 474, 474,
+ 475, 474, 474, 474, 474, 474, 323, 323,
+ 476, 476, 476, 476, 476, 476, 476, 477,
+ 476, 477, 476, 476, 476, 477, 477, 323,
+
+ 478, 479, 479, 479, 479, 479, 478, 478,
+ 479, 478, 479, 479, 479, 479, 479, 479,
+ 479, 479, 479, 479, 478, 479, 478, 478,
+ 478, 480, 480, 480, 323, 323, 481, 323,
+
+ 482, 483, 482, 482, 482, 482, 483, 484,
+ 482, 484, 484, 323, 323, 323, 323, 323,
+ 485, 485, 485, 485, 485, 485, 485, 485,
+ 485, 485, 485, 485, 485, 485, 485, 485,
+
+ 485, 485, 485, 486, 486, 486, 487, 488,
+ 489, 487, 487, 487, 487, 487, 485, 323,
+ 490, 490, 323, 323, 323, 323, 323, 323,
+ 491, 492, 492, 492, 491, 491, 491, 491,
+
+ 493, 494, 493, 493, 493, 493, 493, 493,
+ 493, 493, 495, 495, 495, 496, 497, 494,
+ 494, 497, 497, 498, 498, 487, 499, 499,
+ 499, 500, 499, 499, 499, 499, 501, 501,
+
+ 501, 501, 501, 501, 501, 501, 501, 501,
+ 487, 502, 491, 491, 491, 491, 491, 492,
+ 492, 492, 492, 503, 504, 504, 504, 504,
+ 504, 504, 504, 504, 504, 504, 504, 504,
+
+ 504, 504, 505, 506, 507, 507, 508, 507,
+ 507, 508, 507, 507, 507, 508, 508, 508,
+ 509, 510, 511, 507, 507, 507, 508, 507,
+ 507, 508, 508, 507, 507, 507, 507, 512,
+
+ 513, 514, 514, 515, 516, 517, 517, 517,
+ 517, 517, 517, 517, 517, 517, 517, 517,
+ 517, 517, 517, 517, 517, 517, 517, 517,
+ 517, 517, 517, 517, 517, 517, 517, 517,
+
+ 517, 517, 517, 517, 517, 517, 517, 517,
+ 517, 518, 517, 517, 517, 517, 517, 517,
+ 517, 518, 517, 517, 518, 517, 517, 517,
+ 517, 517, 519, 520, 521, 517, 515, 515,
+
+ 515, 514, 514, 514, 514, 514, 514, 514,
+ 514, 515, 515, 515, 515, 522, 523, 520,
+ 517, 288, 524, 288, 288, 513, 519, 519,
+ 525, 525, 525, 525, 525, 525, 525, 525,
+
+ 517, 517, 514, 514, 526, 526, 527, 528,
+ 529, 530, 531, 532, 533, 534, 535, 536,
+ 537, 538, 539, 540, 540, 540, 540, 540,
+ 541, 542, 542, 543, 543, 544, 543, 543,
+
+ 545, 546, 547, 547, 221, 548, 548, 548,
+ 548, 548, 548, 548, 548, 221, 221, 548,
+ 548, 221, 221, 548, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 548, 548,
+
+ 548, 548, 548, 548, 548, 548, 548, 548,
+ 548, 221, 548, 548, 548, 548, 548, 548,
+ 548, 221, 548, 221, 221, 221, 548, 548,
+ 548, 548, 221, 221, 549, 550, 551, 547,
+
+ 547, 546, 546, 546, 546, 221, 221, 547,
+ 547, 221, 221, 552, 552, 553, 554, 221,
+ 221, 221, 221, 221, 221, 221, 221, 551,
+ 221, 221, 221, 221, 555, 555, 221, 555,
+
+ 548, 548, 546, 546, 221, 221, 556, 557,
+ 558, 559, 560, 561, 562, 563, 564, 565,
+ 548, 548, 566, 566, 567, 567, 567, 567,
+ 567, 568, 569, 570, 571, 572, 573, 221,
+
+ 221, 574, 575, 576, 221, 577, 577, 577,
+ 577, 577, 577, 221, 221, 221, 221, 577,
+ 577, 221, 221, 577, 577, 577, 577, 577,
+ 577, 577, 577, 577, 577, 577, 577, 577,
+
+ 577, 577, 577, 577, 577, 577, 577, 577,
+ 577, 221, 577, 577, 577, 577, 577, 577,
+ 577, 221, 577, 578, 221, 577, 578, 221,
+ 577, 577, 221, 221, 579, 221, 580, 580,
+
+ 580, 575, 575, 221, 221, 221, 221, 575,
+ 575, 221, 221, 575, 575, 581, 221, 221,
+ 221, 582, 221, 221, 221, 221, 221, 221,
+ 221, 578, 578, 578, 577, 221, 578, 221,
+
+ 221, 221, 221, 221, 221, 221, 583, 584,
+ 585, 586, 587, 588, 589, 590, 591, 592,
+ 575, 575, 577, 577, 577, 582, 593, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 594, 594, 595, 221, 596, 596, 596,
+ 596, 596, 596, 596, 597, 596, 221, 596,
+ 596, 596, 221, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 221, 596, 596, 596, 596, 596, 596,
+ 596, 221, 596, 596, 221, 596, 596, 596,
+ 596, 596, 221, 221, 598, 596, 595, 595,
+
+ 595, 594, 594, 594, 594, 594, 221, 594,
+ 594, 595, 221, 595, 595, 599, 221, 221,
+ 596, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 596, 597, 600, 600, 221, 221, 601, 602,
+ 603, 604, 605, 606, 607, 608, 609, 610,
+ 611, 612, 221, 221, 221, 221, 221, 221,
+ 221, 613, 614, 614, 614, 614, 614, 614,
+
+ 221, 615, 616, 616, 221, 617, 617, 617,
+ 617, 617, 617, 617, 617, 221, 221, 617,
+ 617, 221, 221, 617, 617, 617, 617, 617,
+ 617, 617, 617, 617, 617, 617, 617, 617,
+
+ 617, 617, 617, 617, 617, 617, 617, 617,
+ 617, 221, 617, 617, 617, 617, 617, 617,
+ 617, 221, 617, 617, 221, 618, 617, 617,
+ 617, 617, 221, 221, 619, 617, 620, 615,
+
+ 616, 615, 615, 615, 621, 221, 221, 616,
+ 622, 221, 221, 622, 622, 623, 221, 221,
+ 221, 221, 221, 221, 221, 624, 625, 620,
+ 221, 221, 221, 221, 626, 626, 221, 617,
+
+ 617, 617, 621, 621, 221, 221, 627, 628,
+ 629, 630, 631, 632, 633, 634, 635, 636,
+ 637, 618, 638, 638, 638, 638, 638, 638,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 639, 640, 221, 640, 640, 640,
+ 640, 640, 640, 221, 221, 221, 640, 640,
+ 640, 221, 640, 640, 641, 640, 221, 221,
+ 221, 640, 640, 221, 640, 221, 640, 640,
+
+ 221, 221, 221, 640, 640, 221, 221, 221,
+ 640, 640, 640, 221, 221, 221, 640, 640,
+ 640, 640, 640, 640, 640, 640, 642, 640,
+ 640, 640, 221, 221, 221, 221, 643, 644,
+
+ 639, 644, 644, 221, 221, 221, 644, 644,
+ 644, 221, 645, 645, 645, 646, 221, 221,
+ 647, 221, 221, 221, 221, 221, 221, 643,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 648, 649,
+ 650, 651, 652, 653, 654, 655, 656, 657,
+ 658, 658, 658, 659, 659, 659, 659, 659,
+ 659, 660, 659, 221, 221, 221, 221, 221,
+
+ 661, 662, 662, 662, 663, 664, 664, 664,
+ 664, 664, 664, 664, 664, 221, 664, 664,
+ 664, 221, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 221, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 665, 664, 664, 664,
+ 664, 664, 221, 221, 666, 667, 668, 668,
+
+ 668, 662, 662, 662, 662, 221, 668, 668,
+ 669, 221, 668, 668, 668, 670, 221, 221,
+ 221, 221, 221, 221, 221, 671, 672, 221,
+ 667, 667, 673, 221, 221, 674, 221, 221,
+
+ 664, 664, 675, 675, 221, 221, 676, 677,
+ 678, 679, 680, 681, 682, 683, 684, 685,
+ 221, 221, 221, 221, 221, 221, 221, 686,
+ 687, 687, 687, 687, 687, 687, 687, 688,
+
+ 689, 690, 691, 691, 692, 693, 693, 693,
+ 693, 693, 693, 693, 693, 221, 693, 693,
+ 693, 221, 693, 693, 693, 693, 693, 693,
+ 693, 693, 693, 693, 693, 693, 693, 693,
+
+ 693, 693, 693, 693, 693, 693, 693, 693,
+ 693, 221, 693, 693, 693, 693, 693, 693,
+ 693, 693, 693, 693, 221, 693, 693, 693,
+ 693, 693, 221, 221, 694, 695, 691, 696,
+
+ 697, 691, 698, 691, 691, 221, 696, 697,
+ 697, 221, 697, 697, 699, 700, 221, 221,
+ 221, 221, 221, 221, 221, 698, 698, 221,
+ 221, 221, 221, 221, 221, 701, 693, 221,
+
+ 693, 693, 702, 702, 221, 221, 703, 704,
+ 705, 706, 707, 708, 709, 710, 711, 712,
+ 221, 713, 713, 714, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 715, 716, 717, 717, 718, 719, 719, 719,
+ 719, 719, 719, 719, 719, 221, 719, 719,
+ 719, 221, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719,
+
+ 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 720, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 719, 720, 721, 721, 722, 723, 717,
+
+ 717, 724, 724, 724, 725, 221, 717, 717,
+ 717, 221, 726, 726, 726, 727, 728, 729,
+ 221, 221, 221, 221, 730, 730, 730, 723,
+ 731, 731, 731, 731, 731, 731, 731, 732,
+
+ 719, 719, 725, 725, 221, 221, 733, 734,
+ 735, 736, 737, 738, 739, 740, 741, 742,
+ 743, 743, 743, 743, 743, 743, 731, 731,
+ 731, 744, 722, 722, 722, 722, 722, 722,
+
+ 221, 745, 746, 746, 221, 747, 747, 747,
+ 747, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 747, 747, 747, 221,
+ 221, 221, 747, 747, 747, 747, 747, 747,
+
+ 747, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 221, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 221, 747, 221, 221,
+
+ 747, 747, 747, 747, 747, 747, 747, 221,
+ 221, 221, 748, 221, 221, 221, 221, 749,
+ 746, 746, 750, 750, 750, 221, 750, 221,
+ 746, 746, 751, 746, 751, 751, 751, 749,
+
+ 221, 221, 221, 221, 221, 221, 752, 753,
+ 754, 755, 756, 757, 758, 759, 760, 761,
+ 221, 221, 746, 746, 762, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 763, 763, 763, 763, 763, 763, 763,
+ 763, 763, 763, 763, 763, 763, 763, 763,
+ 763, 763, 763, 763, 763, 763, 763, 763,
+ 763, 763, 763, 763, 763, 763, 763, 763,
+
+ 763, 763, 763, 763, 763, 763, 763, 763,
+ 763, 763, 763, 763, 763, 763, 763, 763,
+ 763, 764, 763, 765, 764, 764, 764, 764,
+ 766, 766, 767, 221, 221, 221, 221, 768,
+
+ 763, 763, 763, 763, 763, 763, 769, 764,
+ 770, 770, 770, 770, 764, 764, 764, 771,
+ 772, 773, 774, 775, 776, 777, 778, 779,
+ 780, 781, 782, 782, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 783, 783, 221, 783, 221, 784, 783,
+ 783, 784, 783, 221, 784, 783, 784, 784,
+ 784, 784, 784, 784, 783, 783, 783, 783,
+ 784, 783, 783, 783, 783, 783, 783, 783,
+
+ 784, 783, 783, 783, 221, 783, 221, 783,
+ 784, 784, 783, 783, 784, 783, 783, 783,
+ 783, 785, 783, 786, 785, 785, 785, 785,
+ 787, 787, 788, 785, 785, 783, 221, 221,
+
+ 783, 783, 783, 783, 783, 221, 789, 221,
+ 790, 790, 790, 790, 785, 785, 791, 221,
+ 792, 793, 794, 795, 796, 797, 798, 799,
+ 800, 801, 221, 221, 802, 802, 803, 803,
+
+ 804, 805, 805, 805, 806, 807, 806, 806,
+ 808, 806, 806, 809, 810, 811, 811, 811,
+ 811, 811, 808, 812, 811, 812, 812, 812,
+ 813, 813, 812, 812, 812, 812, 812, 812,
+
+ 814, 815, 816, 817, 818, 819, 820, 821,
+ 822, 823, 824, 824, 824, 824, 824, 824,
+ 824, 824, 824, 824, 825, 813, 812, 813,
+ 812, 826, 827, 828, 827, 828, 829, 829,
+
+ 804, 804, 804, 830, 804, 804, 804, 804,
+ 221, 804, 804, 804, 804, 830, 804, 804,
+ 804, 804, 830, 804, 804, 804, 804, 830,
+ 804, 804, 804, 804, 830, 804, 804, 804,
+
+ 804, 804, 804, 804, 804, 804, 804, 804,
+ 804, 830, 831, 832, 832, 221, 221, 221,
+ 221, 833, 834, 835, 836, 835, 835, 837,
+ 835, 837, 834, 834, 834, 834, 838, 839,
+
+ 834, 835, 840, 840, 841, 809, 840, 840,
+ 804, 804, 804, 804, 842, 843, 843, 843,
+ 838, 838, 838, 835, 838, 838, 844, 838,
+ 221, 838, 838, 838, 838, 835, 838, 838,
+
+ 838, 838, 835, 838, 838, 838, 838, 835,
+ 838, 838, 838, 838, 835, 838, 844, 844,
+ 844, 838, 838, 838, 838, 838, 838, 838,
+ 844, 835, 844, 844, 844, 221, 845, 845,
+
+ 846, 846, 846, 846, 846, 846, 847, 846,
+ 846, 846, 846, 846, 846, 221, 848, 846,
+ 849, 849, 850, 851, 852, 853, 853, 853,
+ 853, 854, 854, 221, 221, 221, 221, 221,
+
+ 855, 855, 855, 855, 855, 855, 855, 855,
+ 855, 855, 855, 855, 855, 855, 855, 855,
+ 855, 855, 855, 855, 855, 855, 855, 855,
+ 855, 855, 855, 855, 855, 855, 855, 855,
+
+ 855, 855, 856, 855, 855, 855, 857, 855,
+ 856, 855, 855, 858, 859, 860, 861, 860,
+ 860, 862, 860, 863, 863, 863, 860, 864,
+ 859, 865, 866, 867, 867, 863, 863, 856,
+
+ 868, 869, 870, 871, 872, 873, 874, 875,
+ 876, 877, 878, 878, 879, 879, 879, 879,
+ 855, 855, 855, 855, 855, 855, 862, 862,
+ 860, 860, 856, 856, 856, 856, 863, 863,
+
+ 863, 856, 858, 858, 858, 856, 856, 858,
+ 858, 858, 858, 858, 858, 858, 856, 856,
+ 856, 863, 863, 863, 863, 856, 856, 856,
856, 856, 856, 856, 856, 856, 856, 856,
- 856, 856, 856, 856, 856, 856, 856, 856,
- 856, 856, 856, 856, 856, 856, 856, 856,
- 856, 856, 856, 856, 856, 856, 856, 857,
- 857, 858, 858, 859, 860, 861, 861, 861,
-
- 862, 862, 862, 862, 862, 862, 862, 862,
- 862, 862, 862, 862, 862, 862, 862, 862,
- 862, 862, 862, 862, 862, 862, 862, 862,
- 862, 862, 862, 862, 862, 862, 862, 862,
-
- 862, 862, 862, 862, 862, 862, 862, 862,
- 862, 862, 862, 862, 862, 862, 862, 862,
- 862, 862, 862, 862, 862, 862, 862, 862,
- 862, 862, 863, 863, 863, 863, 863, 862,
-
- 864, 865, 865, 865, 865, 865, 865, 865,
- 865, 865, 865, 865, 865, 865, 865, 865,
- 865, 865, 865, 865, 865, 865, 864, 864,
- 864, 864, 864, 864, 864, 864, 864, 864,
-
- 864, 864, 864, 864, 864, 864, 864, 864,
- 864, 864, 864, 864, 864, 864, 864, 864,
- 864, 864, 864, 864, 864, 864, 864, 864,
- 864, 864, 864, 864, 864, 864, 864, 864,
-
- 864, 864, 864, 866, 866, 866, 866, 866,
- 867, 867, 867, 867, 867, 867, 867, 867,
- 867, 867, 867, 867, 867, 867, 867, 867,
- 867, 867, 867, 867, 867, 867, 867, 867,
-
- 867, 867, 867, 868, 868, 868, 868, 868,
- 868, 868, 868, 868, 868, 868, 868, 868,
- 868, 868, 868, 868, 868, 868, 868, 868,
- 868, 868, 868, 868, 868, 868, 868, 868,
-
- 868, 868, 868, 868, 868, 868, 868, 868,
- 868, 868, 868, 868, 868, 868, 868, 868,
- 868, 868, 868, 868, 868, 868, 868, 868,
- 868, 868, 869, 869, 869, 869, 869, 869,
-
- 870, 870, 870, 870, 870, 870, 870, 871,
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 870,
-
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 870,
-
- 870, 870, 870, 870, 870, 870, 870, 871,
- 870, 202, 870, 870, 870, 870, 202, 202,
- 870, 870, 870, 870, 870, 870, 870, 202,
- 870, 202, 870, 870, 870, 870, 202, 202,
-
- 870, 870, 870, 870, 870, 870, 870, 871,
- 870, 202, 870, 870, 870, 870, 202, 202,
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 870,
-
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 871,
- 870, 202, 870, 870, 870, 870, 202, 202,
- 870, 870, 870, 870, 870, 870, 870, 202,
-
- 870, 202, 870, 870, 870, 870, 202, 202,
- 870, 870, 870, 870, 870, 870, 870, 871,
- 870, 870, 870, 870, 870, 870, 870, 202,
- 870, 870, 870, 870, 870, 870, 870, 870,
-
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 871,
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 870,
-
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 871,
- 870, 202, 870, 870, 870, 870, 202, 202,
- 870, 870, 870, 870, 870, 870, 870, 871,
-
- 870, 870, 870, 870, 870, 870, 870, 871,
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 202, 202, 872, 872, 873,
-
- 874, 875, 876, 877, 877, 877, 877, 876,
- 876, 878, 879, 880, 881, 882, 883, 884,
- 885, 886, 887, 887, 887, 887, 887, 887,
- 887, 887, 887, 887, 887, 202, 202, 202,
-
- 871, 871, 871, 871, 871, 871, 871, 871,
- 871, 871, 871, 871, 871, 871, 871, 871,
- 888, 888, 888, 888, 888, 888, 888, 888,
- 888, 888, 202, 202, 202, 202, 202, 202,
-
- 889, 890, 891, 892, 893, 894, 895, 896,
- 897, 898, 899, 900, 901, 902, 903, 904,
- 905, 906, 907, 908, 909, 910, 911, 912,
- 913, 914, 915, 916, 917, 918, 919, 920,
-
- 921, 922, 923, 924, 925, 926, 927, 928,
- 929, 930, 931, 932, 933, 934, 935, 936,
- 937, 938, 939, 940, 941, 942, 943, 944,
- 945, 946, 947, 948, 949, 950, 951, 952,
-
- 953, 954, 955, 956, 957, 958, 959, 960,
- 961, 962, 963, 964, 965, 966, 967, 968,
- 969, 969, 969, 969, 969, 970, 202, 202,
- 971, 971, 971, 971, 971, 971, 202, 202,
-
- 972, 973, 973, 973, 973, 973, 973, 973,
- 973, 973, 973, 973, 973, 973, 973, 973,
- 973, 973, 973, 973, 973, 973, 973, 973,
- 973, 973, 973, 973, 973, 973, 973, 973,
-
- 973, 973, 973, 973, 973, 973, 973, 973,
- 973, 973, 973, 973, 973, 973, 973, 973,
- 973, 973, 973, 973, 973, 973, 973, 973,
- 973, 973, 973, 973, 973, 973, 973, 973,
-
- 973, 973, 973, 973, 973, 973, 973, 973,
- 973, 973, 973, 973, 973, 974, 975, 973,
- 973, 973, 973, 973, 973, 973, 973, 976,
- 976, 976, 976, 976, 976, 976, 976, 976,
-
- 977, 978, 978, 978, 978, 978, 978, 978,
- 978, 978, 978, 978, 978, 978, 978, 978,
- 978, 978, 978, 978, 978, 978, 978, 978,
- 978, 978, 978, 979, 980, 202, 202, 202,
-
- 981, 981, 981, 981, 981, 981, 981, 981,
- 981, 981, 981, 981, 981, 981, 981, 981,
- 981, 981, 981, 981, 981, 981, 981, 981,
- 981, 981, 981, 981, 981, 981, 981, 981,
-
- 981, 981, 981, 981, 981, 981, 981, 981,
- 981, 981, 981, 982, 982, 982, 983, 983,
- 983, 984, 984, 984, 984, 984, 984, 984,
- 984, 202, 202, 202, 202, 202, 202, 202,
-
- 985, 985, 985, 985, 985, 985, 985, 985,
- 985, 985, 985, 985, 985, 202, 985, 985,
- 985, 985, 986, 986, 987, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 988, 988, 988, 988, 988, 988, 988, 988,
- 988, 988, 988, 988, 988, 988, 988, 988,
- 988, 988, 989, 989, 990, 991, 991, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 992, 992, 992, 992, 992, 992, 992, 992,
- 992, 992, 992, 992, 992, 992, 992, 992,
- 992, 992, 993, 993, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 994, 994, 994, 994, 994, 994, 994, 994,
- 994, 994, 994, 994, 994, 202, 994, 994,
- 994, 202, 995, 995, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 996, 996, 996, 996,
-
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 997, 997, 998, 997,
- 997, 997, 997, 997, 997, 997, 998, 998,
-
- 998, 998, 998, 998, 998, 998, 997, 998,
- 998, 997, 997, 997, 997, 997, 997, 997,
- 997, 997, 999, 997, 1000, 1000, 1001, 1002,
- 1000, 1003, 1000, 1004, 996, 1005, 202, 202,
-
- 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013,
- 1014, 1015, 202, 202, 202, 202, 202, 202,
- 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016,
- 1016, 1016, 202, 202, 202, 202, 202, 202,
-
- 1017, 1017, 1018, 1019, 1020, 1021, 1022, 1023,
- 1024, 1025, 1026, 1027, 1027, 1027, 1028, 202,
- 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036,
- 1037, 1038, 202, 202, 202, 202, 202, 202,
-
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-
- 1039, 1039, 1039, 1040, 1039, 1039, 1039, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1041, 202, 202, 202, 202, 202, 202, 202,
-
- 1042, 1042, 1042, 1042, 1042, 1027, 1027, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1043, 1044, 202, 202, 202, 202, 202,
- 976, 976, 976, 976, 976, 976, 976, 976,
- 976, 976, 976, 976, 976, 976, 976, 976,
-
- 976, 976, 976, 976, 976, 976, 976, 976,
- 976, 976, 976, 976, 976, 976, 976, 976,
- 976, 976, 976, 976, 976, 976, 976, 976,
- 976, 976, 976, 976, 976, 976, 976, 976,
-
- 976, 976, 976, 976, 976, 976, 976, 976,
- 976, 976, 976, 976, 976, 976, 976, 976,
- 976, 976, 976, 976, 976, 976, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045,
- 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045,
- 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045,
- 1045, 1045, 1045, 1045, 1045, 1046, 1046, 202,
-
- 1047, 1047, 1047, 1048, 1048, 1048, 1048, 1047,
- 1047, 1048, 1048, 1048, 202, 202, 202, 202,
- 1048, 1048, 1047, 1048, 1048, 1048, 1048, 1048,
- 1048, 1049, 1050, 1051, 202, 202, 202, 202,
-
- 1052, 202, 202, 202, 1053, 1053, 1054, 1055,
- 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063,
- 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064,
- 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064,
-
- 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064,
- 1064, 1064, 1064, 1064, 1064, 1064, 202, 202,
- 1064, 1064, 1064, 1064, 1064, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
- 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
- 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
- 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
-
- 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
- 1065, 1065, 1066, 1066, 202, 202, 202, 202,
- 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
- 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
-
- 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
- 1065, 1065, 202, 202, 202, 202, 202, 202,
- 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074,
- 1075, 1076, 1077, 202, 202, 202, 1078, 1078,
-
- 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079,
- 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079,
- 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079,
- 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079,
-
- 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080,
- 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080,
- 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1081,
- 1082, 1083, 1083, 1084, 202, 202, 1085, 1085,
+ 856, 856, 863, 858, 867, 863, 863, 858,
+ 858, 858, 858, 858, 858, 880, 856, 858,
+ 881, 882, 883, 884, 885, 886, 887, 888,
+ 889, 890, 891, 891, 891, 892, 893, 893,
+
+ 894, 894, 894, 894, 894, 894, 894, 894,
+ 894, 894, 894, 894, 894, 894, 894, 894,
+ 894, 894, 894, 894, 894, 894, 894, 894,
+ 894, 894, 894, 894, 894, 894, 894, 894,
+
+ 894, 894, 894, 894, 894, 894, 221, 895,
+ 221, 221, 221, 221, 221, 895, 221, 221,
+ 896, 896, 896, 896, 896, 896, 896, 896,
+ 896, 896, 896, 896, 896, 896, 896, 896,
+
+ 896, 896, 896, 896, 896, 896, 896, 896,
+ 896, 896, 896, 896, 896, 896, 896, 896,
+ 896, 896, 896, 896, 896, 896, 896, 897,
+ 897, 898, 898, 899, 900, 901, 901, 901,
+
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 902, 902,
+
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 903, 903, 903, 903, 903, 904,
+
+ 905, 906, 906, 906, 906, 906, 906, 906,
+ 906, 906, 906, 906, 906, 906, 906, 906,
+ 906, 906, 906, 906, 906, 906, 907, 907,
+ 907, 907, 907, 907, 907, 907, 907, 907,
+
+ 907, 907, 907, 907, 907, 907, 907, 907,
+ 907, 907, 907, 907, 907, 907, 907, 907,
+ 907, 907, 907, 907, 907, 907, 907, 907,
+ 907, 907, 907, 907, 907, 907, 907, 907,
+
+ 907, 907, 907, 908, 908, 908, 908, 908,
+ 909, 909, 909, 909, 909, 909, 909, 909,
+ 909, 909, 909, 909, 909, 909, 909, 909,
+ 909, 909, 909, 909, 909, 909, 909, 909,
+
+ 909, 909, 909, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
+
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 911, 911, 911, 911, 911, 911,
+
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 221, 912, 912, 912, 912, 221, 221,
+ 912, 912, 912, 912, 912, 912, 912, 221,
+ 912, 221, 912, 912, 912, 912, 221, 221,
+
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 221, 912, 912, 912, 912, 221, 221,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 221, 912, 912, 912, 912, 221, 221,
+ 912, 912, 912, 912, 912, 912, 912, 221,
+
+ 912, 221, 912, 912, 912, 912, 221, 221,
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 912, 912, 912, 912, 912, 912, 221,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 221, 912, 912, 912, 912, 221, 221,
+ 912, 912, 912, 912, 912, 912, 912, 913,
+
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 221, 221, 914, 914, 915,
+
+ 916, 917, 918, 919, 919, 919, 919, 918,
+ 918, 920, 921, 922, 923, 924, 925, 926,
+ 927, 928, 929, 929, 929, 929, 929, 929,
+ 929, 929, 929, 929, 929, 221, 221, 221,
+
+ 913, 913, 913, 913, 913, 913, 913, 913,
+ 913, 913, 913, 913, 913, 913, 913, 913,
+ 930, 930, 930, 930, 930, 930, 930, 930,
+ 930, 930, 221, 221, 221, 221, 221, 221,
+
+ 931, 932, 933, 934, 935, 936, 937, 938,
+ 939, 940, 941, 942, 943, 944, 945, 946,
+ 947, 948, 949, 950, 951, 952, 953, 954,
+ 955, 956, 957, 958, 959, 960, 961, 962,
+
+ 963, 964, 965, 966, 967, 968, 969, 970,
+ 971, 972, 973, 974, 975, 976, 977, 978,
+ 979, 980, 981, 982, 983, 984, 985, 986,
+ 987, 988, 989, 990, 991, 992, 993, 994,
+
+ 995, 996, 997, 998, 999, 1000, 1001, 1002,
+ 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010,
+ 1011, 1011, 1011, 1011, 1011, 1012, 221, 221,
+ 1013, 1013, 1013, 1013, 1013, 1013, 221, 221,
+
+ 1014, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1016, 1017, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1018,
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+
+ 1019, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1021, 1022, 221, 221, 221,
+
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+ 1023, 1023, 1023, 1024, 1024, 1024, 1025, 1025,
+ 1025, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+ 1026, 221, 221, 221, 221, 221, 221, 221,
+
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1028, 1027, 1027,
+ 1027, 1027, 1029, 1029, 1030, 1031, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 1028,
+
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1033, 1033, 1034, 1035, 1035, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1037, 1037, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+ 1038, 1038, 1038, 1038, 1038, 221, 1038, 1038,
+ 1038, 221, 1039, 1039, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+ 1040, 1040, 1040, 1040, 1041, 1041, 1042, 1043,
+ 1043, 1043, 1043, 1043, 1043, 1043, 1042, 1042,
+
+ 1042, 1042, 1042, 1042, 1042, 1042, 1043, 1042,
+ 1042, 1043, 1043, 1043, 1043, 1043, 1043, 1043,
+ 1043, 1043, 1044, 1043, 1045, 1045, 1046, 1047,
+ 1048, 1049, 1048, 1050, 1040, 1051, 221, 221,
+
+ 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059,
+ 1060, 1061, 221, 221, 221, 221, 221, 221,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 221, 221, 221, 221, 221, 221,
+
+ 1063, 1063, 1064, 1065, 1066, 1067, 1068, 1069,
+ 1070, 1071, 1072, 1073, 1073, 1073, 1074, 1075,
+ 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083,
+ 1084, 1085, 221, 221, 221, 221, 221, 221,
1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1087, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
- 1086, 1086, 1086, 1086, 1086, 1087, 1088, 1087,
- 1088, 1088, 1088, 1088, 1088, 1088, 1088, 202,
-
- 1089, 1090, 1088, 1090, 1090, 1088, 1088, 1088,
- 1088, 1088, 1088, 1088, 1088, 1087, 1087, 1087,
- 1087, 1087, 1087, 1088, 1088, 1091, 1091, 1091,
- 1091, 1091, 1091, 1091, 1091, 202, 202, 1092,
-
- 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100,
- 1101, 1102, 202, 202, 202, 202, 202, 202,
- 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100,
- 1101, 1102, 202, 202, 202, 202, 202, 202,
-
- 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1104,
- 1105, 1105, 1105, 1105, 1103, 1103, 202, 202,
- 1106, 1106, 1106, 1106, 1106, 1107, 1107, 1107,
- 1107, 1107, 1107, 1106, 1106, 1107, 1108, 1109,
-
- 1109, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1110, 1110, 1110, 1110, 1111, 1112, 1113, 1112,
- 1113, 1112, 1113, 1112, 1113, 1112, 1113, 1112,
- 1112, 1112, 1113, 1112, 1112, 1112, 1112, 1112,
- 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1088, 221, 221, 221, 221, 221, 221, 221,
+
+ 1089, 1089, 1089, 1089, 1089, 1090, 1090, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1091, 1092, 221, 221, 221, 221, 221,
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+ 1018, 1018, 1018, 1018, 1018, 1018, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1094, 1094, 221,
+
+ 1095, 1095, 1095, 1096, 1096, 1096, 1096, 1095,
+ 1095, 1096, 1096, 1096, 221, 221, 221, 221,
+ 1096, 1096, 1095, 1096, 1096, 1096, 1096, 1096,
+ 1096, 1097, 1098, 1099, 221, 221, 221, 221,
+
+ 1100, 221, 221, 221, 1101, 1101, 1102, 1103,
+ 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111,
1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
- 1112, 1112, 1112, 1112, 1114, 1115, 1110, 1110,
- 1110, 1110, 1110, 1116, 1110, 1116, 1111, 1111,
-
- 1116, 1116, 1110, 1116, 1117, 1112, 1112, 1112,
- 1112, 1112, 1112, 1112, 202, 202, 202, 202,
- 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125,
- 1126, 1127, 1128, 1128, 1129, 1130, 1128, 1128,
-
- 1130, 1131, 1131, 1131, 1131, 1131, 1131, 1131,
- 1131, 1131, 1131, 1132, 1133, 1132, 1132, 1132,
- 1132, 1132, 1132, 1132, 1131, 1131, 1131, 1131,
- 1131, 1131, 1131, 1131, 1131, 202, 202, 202,
-
- 1134, 1134, 1135, 1136, 1136, 1136, 1136, 1136,
- 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136,
- 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136,
- 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136,
-
- 1136, 1135, 1134, 1134, 1134, 1134, 1135, 1135,
- 1134, 1134, 1137, 1138, 1139, 1139, 1136, 1136,
- 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147,
- 1148, 1149, 1150, 1150, 1150, 1150, 1150, 1150,
-
- 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
- 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
- 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
- 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
-
- 1151, 1151, 1151, 1151, 1151, 1151, 1152, 1153,
- 1154, 1154, 1153, 1153, 1153, 1154, 1153, 1154,
- 1154, 1154, 1155, 1155, 202, 202, 202, 202,
- 202, 202, 202, 202, 1156, 1156, 1156, 1156,
-
- 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157,
- 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157,
- 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157,
- 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157,
-
- 1157, 1157, 1157, 1157, 1158, 1158, 1158, 1158,
- 1158, 1158, 1158, 1158, 1159, 1159, 1159, 1159,
- 1159, 1159, 1159, 1159, 1158, 1158, 1159, 1160,
- 202, 202, 202, 1161, 1161, 1162, 1162, 1162,
-
- 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170,
- 1171, 1172, 202, 202, 202, 1157, 1157, 1157,
- 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180,
- 1181, 1182, 1183, 1183, 1183, 1183, 1183, 1183,
-
- 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183,
- 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183,
- 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183,
- 1184, 1184, 1184, 1184, 1184, 1184, 1185, 1185,
-
- 1186, 1187, 1188, 1189, 1189, 1190, 1191, 1192,
- 1193, 202, 202, 202, 202, 202, 202, 202,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
-
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1194, 1194, 1194, 202, 202, 1194, 1194, 1194,
-
- 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 1196, 1196, 1196, 1197, 1198, 1199, 1199, 1199,
- 1199, 1199, 1196, 1196, 1199, 1199, 1199, 1199,
-
- 1196, 1200, 1198, 1198, 1198, 1198, 1198, 1198,
- 1198, 1201, 1201, 1201, 1201, 1199, 1201, 1201,
- 1201, 1201, 1201, 1202, 1203, 1202, 1202, 1204,
- 1106, 1106, 1205, 202, 202, 202, 202, 202,
-
- 114, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 114, 114, 114, 114, 114,
-
- 114, 114, 114, 114, 114, 114, 1206, 1206,
- 1206, 1206, 1206, 1207, 1208, 1208, 1208, 1209,
- 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208,
- 1208, 1208, 1208, 1209, 1208, 1208, 1208, 1208,
-
- 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208,
- 1208, 1208, 1208, 1208, 1208, 1208, 1209, 1208,
- 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208,
- 1208, 1208, 1208, 1208, 1208, 1210, 1210, 1210,
-
- 1210, 1210, 1208, 1208, 1208, 1208, 1210, 1210,
- 1210, 1210, 1210, 114, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115,
- 1211, 1212, 115, 115, 115, 1213, 115, 115,
-
- 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 1214, 115,
- 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 1215, 1215, 1215, 1215, 1215,
-
- 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215,
- 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215,
- 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215,
- 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1216,
-
- 191, 191, 190, 191, 1217, 1217, 1217, 1217,
- 1217, 1217, 1218, 1219, 1219, 1220, 1221, 1222,
- 1223, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
- 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
-
- 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1106,
- 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
- 1106, 1106, 1106, 1106, 1106, 1106, 1224, 1225,
- 1225, 1226, 202, 1227, 1228, 1199, 1217, 1218,
-
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
-
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 1229, 1230,
- 1231, 1232, 1233, 1234, 1235, 1235, 1236, 1235,
-
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 1237, 1238, 1237, 1238, 1237, 1238,
-
- 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239,
- 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
- 1239, 1239, 1239, 1239, 1239, 1239, 202, 202,
- 1240, 1240, 1240, 1240, 1240, 1240, 202, 202,
-
- 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239,
- 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
- 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239,
- 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
-
- 1239, 1239, 1239, 1239, 1239, 1239, 202, 202,
- 1240, 1240, 1240, 1240, 1240, 1240, 202, 202,
- 1241, 1239, 1242, 1239, 1243, 1239, 1244, 1239,
- 202, 1240, 202, 1240, 202, 1240, 202, 1240,
-
- 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239,
- 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
- 1245, 1246, 1247, 1248, 1247, 1248, 1249, 1250,
- 1251, 1252, 1253, 1254, 1255, 1256, 202, 202,
-
- 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264,
- 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272,
- 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280,
- 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288,
-
- 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296,
- 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304,
- 1239, 1239, 1305, 1306, 1307, 202, 1308, 1309,
- 1240, 1240, 1310, 1311, 1312, 207, 1313, 207,
-
- 207, 1314, 1315, 1316, 1317, 202, 1318, 1319,
- 1320, 1321, 1320, 1321, 1322, 1314, 1314, 1314,
- 1239, 1239, 1323, 1324, 202, 202, 1325, 1326,
- 1240, 1240, 1327, 1328, 202, 1314, 1314, 1314,
-
- 1239, 1239, 1329, 1330, 1331, 1332, 1333, 1334,
- 1240, 1240, 1335, 1336, 1337, 1314, 1338, 1338,
- 202, 202, 1339, 1340, 1341, 202, 1342, 1343,
- 1344, 1345, 1346, 1347, 1348, 1349, 207, 202,
-
- 1350, 1350, 1351, 1351, 1351, 1351, 1351, 1352,
- 1351, 1351, 1351, 1353, 1354, 1355, 1356, 1357,
- 1358, 1359, 1358, 1360, 1361, 1362, 14, 1363,
- 1364, 1365, 1366, 1367, 1367, 1368, 1366, 1367,
-
- 14, 14, 14, 14, 1369, 1370, 1370, 1371,
- 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379,
- 13, 13, 13, 1380, 1380, 1381, 1382, 1382,
- 14, 1383, 1384, 14, 1385, 1386, 1363, 43,
-
- 43, 14, 14, 14, 1387, 16, 1388, 1389,
- 1390, 1390, 1391, 1391, 1391, 1391, 1392, 1392,
- 1392, 1392, 1393, 1394, 1395, 1396, 1397, 1398,
- 1397, 1397, 1397, 1397, 1396, 1397, 1397, 1399,
-
- 1400, 1401, 1401, 1401, 1402, 1403, 1404, 1405,
- 1406, 1407, 1408, 1408, 1408, 1408, 1408, 1408,
- 1409, 1410, 202, 202, 1411, 1412, 1413, 1414,
- 1415, 1416, 1417, 1417, 1418, 1419, 1420, 160,
-
- 1409, 63, 58, 59, 1411, 1412, 1413, 1414,
- 1415, 1416, 1417, 1417, 1418, 1419, 1420, 202,
- 1215, 1215, 1215, 1215, 1215, 1421, 1421, 1421,
- 1421, 1421, 1421, 1421, 1421, 202, 202, 202,
-
- 12, 12, 12, 12, 12, 12, 12, 50,
- 1422, 12, 12, 1423, 1424, 1425, 1425, 1425,
- 1426, 1426, 1427, 1427, 1427, 1427, 1428, 1429,
- 1429, 1430, 1431, 1432, 1433, 1433, 1434, 1435,
-
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 173, 173, 180, 180, 173, 173, 173, 173,
- 180, 180, 180, 173, 173, 1437, 1437, 1437,
-
- 1437, 173, 1438, 1438, 1439, 1440, 1440, 197,
- 1441, 197, 1440, 1442, 1218, 1218, 1218, 1218,
- 1219, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1443, 1443, 1444, 1445, 51, 1443, 1443, 1444,
- 51, 1445, 1446, 1444, 1444, 1444, 1446, 1446,
- 1444, 1444, 1444, 1446, 51, 1444, 1447, 51,
- 36, 1444, 1444, 1444, 1444, 1444, 51, 51,
-
- 1443, 1443, 1443, 51, 1444, 51, 1448, 51,
- 1444, 51, 1449, 1450, 1444, 1444, 1451, 1446,
- 1444, 1444, 1452, 1444, 1446, 1453, 1453, 1453,
- 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1459,
-
- 1460, 1393, 1393, 1393, 1393, 1459, 1458, 1458,
- 1458, 1458, 1461, 1393, 1462, 1463, 1464, 1465,
- 1466, 1466, 1466, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 65, 65, 65, 65,
-
- 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
- 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
- 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
- 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
- 1469, 1469, 1469, 111, 123, 1470, 1470, 1470,
- 1470, 1466, 1471, 1471, 202, 202, 202, 202,
- 36, 36, 36, 36, 36, 51, 51, 51,
- 51, 51, 1472, 1472, 51, 51, 51, 51,
-
- 36, 51, 51, 36, 51, 51, 36, 51,
- 51, 51, 51, 51, 51, 51, 1472, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 1473, 1472, 1472,
- 51, 51, 36, 51, 36, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 1455, 1455, 1455, 1455, 1455,
- 1455, 1455, 1455, 1455, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
-
- 36, 36, 36, 36, 1472, 36, 36, 36,
- 1474, 1475, 1474, 1476, 1477, 1476, 36, 36,
- 36, 36, 18, 57, 36, 1478, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 1479,
-
- 1480, 1481, 1482, 36, 1483, 36, 1472, 36,
- 36, 36, 36, 36, 1418, 1418, 36, 1418,
- 1418, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 1484, 1485, 36, 36,
-
- 36, 1472, 36, 1486, 1472, 1487, 36, 1472,
- 36, 1472, 36, 36, 1488, 36, 36, 36,
- 36, 36, 1484, 1485, 1484, 1485, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36,
-
- 1472, 36, 1472, 36, 1484, 1485, 1484, 1485,
- 1484, 1485, 1484, 1485, 36, 1472, 1489, 1490,
- 1489, 1490, 1484, 1485, 1489, 1490, 1484, 1485,
- 1489, 1490, 1484, 1485, 1484, 1485, 1484, 1485,
-
- 1489, 1490, 1484, 1485, 1489, 1490, 1484, 1485,
- 1489, 1490, 1484, 1485, 36, 36, 36, 1484,
- 1485, 1484, 1485, 36, 36, 36, 36, 36,
- 1491, 36, 36, 36, 36, 36, 36, 36,
-
- 36, 36, 1484, 1485, 36, 36, 1492, 36,
- 1493, 1494, 36, 1494, 1472, 1472, 1472, 1472,
- 1484, 1485, 1484, 1485, 1484, 1485, 1484, 1485,
- 1495, 36, 36, 36, 36, 36, 36, 36,
-
- 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 1484, 1485, 1484, 1485, 1496, 36, 36,
- 1484, 1485, 36, 36, 36, 36, 1484, 1485,
- 1484, 1485, 1484, 1485, 1484, 1485, 1484, 1485,
-
- 1489, 1490, 1489, 1490, 1484, 1485, 1484, 1485,
- 1484, 1485, 1489, 1490, 1489, 1490, 36, 1497,
- 1484, 1485, 1498, 1498, 1498, 1393, 1499, 1499,
- 1393, 1393, 1500, 1500, 1500, 1501, 1501, 1393,
-
- 51, 1455, 51, 51, 51, 51, 51, 51,
- 16, 1388, 16, 1388, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 1502, 1502, 51, 51, 51, 51,
-
- 36, 36, 51, 51, 51, 51, 51, 51,
- 51, 1503, 1504, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 1505, 1505,
- 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505,
-
- 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505,
- 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505,
- 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505,
- 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505,
-
- 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505,
- 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505,
- 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505,
- 1505, 1505, 1505, 1455, 1393, 1455, 1455, 1455,
-
- 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455,
- 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455,
- 1455, 1455, 1455, 1455, 1455, 1506, 1455, 1455,
- 1455, 1455, 1455, 1393, 1393, 1393, 1393, 1393,
-
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1461, 1461, 1461, 1461,
- 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
-
- 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
- 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1507,
- 1507, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
- 1462, 1462, 1462, 1462, 1508, 1508, 1508, 1508,
-
- 1508, 1508, 1463, 1463, 1463, 1463, 1463, 1463,
- 1509, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1511, 1511, 1511, 1511, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1513, 1513, 1513, 1513, 1514,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 1455, 1455, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522,
- 1523, 65, 65, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 1515, 1516, 1517, 1518,
- 1519, 1520, 1521, 1522, 1523, 65, 65, 65,
-
- 65, 65, 65, 65, 65, 65, 65, 65,
- 63, 58, 59, 1411, 1412, 1413, 1414, 1415,
- 1416, 1524, 1524, 1524, 1524, 1524, 1524, 1524,
- 1524, 1524, 1524, 1524, 1525, 1525, 1525, 1525,
-
- 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525,
- 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525,
- 1525, 1525, 1525, 1525, 1525, 1525, 1526, 1526,
- 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
-
- 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
- 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
- 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527,
- 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527,
-
- 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527,
- 1527, 1527, 1528, 1529, 1529, 1529, 1529, 1529,
- 1529, 1529, 1529, 1529, 1529, 1530, 1531, 1532,
- 1533, 1534, 1535, 1536, 1537, 1538, 1529, 1539,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 1461, 1461,
- 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 36,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 36, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
-
- 1502, 1502, 1502, 1502, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 1540, 1540, 1461, 1461,
- 1541, 1455, 1502, 1502, 1502, 1542, 1502, 1502,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 1502, 1502, 1502, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 1502, 51, 51, 51, 51, 51, 51, 36,
- 1455, 1455, 1461, 1461, 1461, 1461, 1461, 1461,
- 1461, 1461, 1461, 1461, 1461, 1461, 1462, 1541,
-
- 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
- 1461, 1461, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1462, 1462, 1462, 1462, 1462, 1462,
- 1462, 1462, 1462, 1462, 1462, 1543, 1509, 1509,
-
- 1507, 1507, 1462, 1462, 1462, 1462, 1462, 1462,
- 1462, 1462, 1462, 1462, 1544, 1462, 1462, 1462,
- 1462, 1462, 1463, 1543, 1543, 1543, 1543, 1543,
- 1543, 1543, 1543, 1543, 1543, 1545, 1545, 1545,
-
- 1546, 1546, 1546, 1546, 1545, 1545, 1545, 1545,
- 1545, 1509, 1509, 1509, 1509, 1545, 1510, 1545,
- 1545, 1545, 1509, 1545, 1545, 1509, 1509, 1509,
- 1545, 1545, 1509, 1509, 1545, 1509, 1509, 1545,
-
- 1545, 1545, 1510, 1509, 1510, 1510, 1510, 1510,
- 1509, 1509, 1545, 1509, 1509, 1509, 1509, 1509,
- 1509, 1545, 1545, 1545, 1545, 1545, 1509, 1545,
- 1545, 1547, 1545, 1509, 1509, 1545, 1545, 1545,
-
- 1548, 1502, 1502, 1502, 1502, 1510, 51, 51,
- 1502, 1502, 1549, 1549, 1542, 1542, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 1510, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 1510, 51, 1510, 51,
- 51, 51, 51, 1510, 1510, 1510, 51, 1509,
- 51, 51, 51, 1550, 1550, 1550, 1550, 1551,
-
- 1551, 51, 1552, 1552, 1502, 51, 51, 51,
- 1553, 1554, 1553, 1554, 1553, 1554, 1553, 1554,
- 1553, 1554, 1553, 1554, 1553, 1554, 1555, 1556,
- 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564,
-
- 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562,
- 1563, 1564, 1555, 1556, 1557, 1558, 1559, 1560,
- 1561, 1562, 1563, 1564, 51, 1510, 1510, 1510,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 1510, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 1510,
-
- 1565, 1565, 1565, 1566, 1567, 1568, 1569, 1508,
- 1570, 1571, 1508, 1572, 1573, 1574, 1575, 1575,
- 1393, 1393, 1393, 1393, 1393, 1576, 1577, 1393,
- 1393, 1393, 1393, 1393, 1578, 1576, 1577, 1393,
-
- 1393, 1393, 1576, 1577, 1576, 1577, 1553, 1554,
- 1553, 1554, 1553, 1554, 1579, 1580, 1579, 1580,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
-
- 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
- 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
- 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
- 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
-
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
-
- 1393, 1393, 1393, 1553, 1554, 1553, 1554, 1553,
- 1554, 1553, 1554, 1553, 1554, 1582, 1583, 1584,
- 1585, 1553, 1554, 1553, 1554, 1553, 1554, 1553,
- 1554, 1393, 1393, 1586, 1393, 1393, 1393, 1393,
-
- 1587, 1393, 1393, 1588, 1576, 1577, 1393, 1393,
- 1576, 1577, 1576, 1577, 1576, 1577, 1576, 1577,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1589, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
-
- 1576, 1577, 1393, 1393, 1576, 1577, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1576,
- 1577, 1576, 1577, 1393, 1576, 1577, 1393, 1393,
- 1553, 1554, 1553, 1554, 1393, 1393, 1393, 1393,
-
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1576, 1577, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1590, 1393, 1393,
- 1576, 1577, 1393, 1393, 1553, 1554, 1393, 1393,
-
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1460, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
-
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1576, 1577, 1576, 1577, 1393,
- 1393, 1393, 1393, 1393, 1576, 1577, 1393, 1393,
- 1393, 1393, 1393, 1393, 1576, 1577, 1393, 1393,
-
- 1393, 1393, 1393, 1393, 1576, 1577, 1393, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393,
- 1393, 1393, 1393, 1393, 1460, 1460, 1460, 1393,
- 1393, 1576, 1577, 1576, 1577, 1576, 1577, 1576,
-
- 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576,
- 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576,
- 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576,
- 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576,
-
- 1577, 1576, 1577, 1393, 1393, 1393, 1576, 1577,
- 1576, 1577, 1576, 1577, 1576, 1577, 1393, 1576,
- 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576,
- 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576,
-
- 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576,
- 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576,
- 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1393,
- 1393, 1393, 1393, 1393, 1591, 1393, 1592, 1393,
-
- 1393, 1393, 1393, 1593, 1594, 1593, 1393, 1393,
- 1393, 1393, 1393, 1393, 1576, 1577, 1595, 1393,
- 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1576,
- 1577, 1576, 1577, 1393, 1393, 1393, 1393, 1393,
-
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1462, 1462,
- 1462, 1462, 1462, 1462, 1463, 1463, 1463, 1463,
- 1463, 1463, 1463, 1543, 1543, 1543, 1543, 1543,
-
- 1463, 1463, 1463, 1463, 1543, 1543, 1543, 1543,
- 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543,
- 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573,
- 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573,
-
- 1573, 1573, 1573, 1573, 1573, 1543, 1543, 1573,
- 1573, 1573, 1573, 1573, 1573, 1512, 1512, 1512,
- 1543, 1543, 1543, 1543, 1543, 1509, 1509, 1509,
- 1509, 1509, 1512, 1512, 1512, 1512, 1512, 1512,
-
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 202, 202, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
-
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 202, 1596,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
-
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1597, 1597, 1597, 1512, 1512, 1512,
-
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1598, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1514, 1597, 1597, 1597, 1597, 1597,
- 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597,
-
- 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597,
- 1597, 1597, 1597, 1597, 1471, 1471, 1471, 1471,
- 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597,
- 1597, 1597, 1597, 1597, 1597, 1597, 1599, 1598,
-
- 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600,
- 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600,
- 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600,
- 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600,
-
- 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600,
- 1600, 1600, 1600, 1600, 1600, 1600, 1600, 202,
- 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
- 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
-
- 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
- 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
- 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
- 1601, 1601, 1601, 1601, 1601, 1601, 1601, 202,
-
- 127, 123, 1602, 1603, 1604, 1605, 1606, 127,
- 123, 127, 123, 127, 123, 1607, 1608, 1609,
- 1610, 1235, 1237, 1238, 1611, 127, 123, 1611,
- 1235, 1235, 1235, 1235, 1612, 1612, 1613, 1614,
-
- 1615, 1616, 1615, 1616, 1615, 1616, 1615, 1616,
- 1615, 1616, 1615, 1616, 1615, 1616, 1615, 1616,
- 1615, 1616, 1615, 1616, 1615, 1616, 1615, 1616,
- 1615, 1616, 1615, 1616, 1615, 1616, 1615, 1616,
-
- 1615, 1616, 1615, 1616, 1617, 1618, 1618, 1618,
- 1618, 1618, 1618, 1619, 1620, 1619, 1620, 1621,
- 1621, 1621, 1622, 1623, 202, 202, 202, 202,
- 202, 1624, 1625, 1625, 1625, 1626, 1624, 1625,
-
- 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627,
- 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627,
- 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627,
- 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627,
-
- 1627, 1627, 1627, 1627, 1627, 1627, 202, 1628,
- 202, 202, 202, 202, 202, 1628, 202, 202,
- 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629,
- 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629,
-
- 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629,
- 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629,
- 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629,
- 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629,
-
- 1629, 1629, 1629, 1629, 1629, 1629, 1630, 1630,
- 202, 202, 202, 202, 202, 202, 202, 1631,
- 1632, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 1633,
-
- 871, 871, 871, 871, 871, 871, 871, 871,
- 871, 871, 871, 871, 871, 871, 871, 871,
- 871, 871, 871, 871, 871, 871, 871, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 871, 871, 871, 871, 871, 871, 871, 202,
- 871, 871, 871, 871, 871, 871, 871, 202,
- 871, 871, 871, 871, 871, 871, 871, 202,
- 871, 871, 871, 871, 871, 871, 871, 202,
-
- 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267,
-
- 1634, 1634, 1635, 1636, 1635, 1636, 1634, 1634,
- 1634, 1635, 1636, 1634, 1635, 1636, 1397, 1397,
- 1397, 1397, 1397, 1397, 1397, 1397, 1396, 1637,
- 1638, 1639, 1640, 1641, 1635, 1636, 1641, 1641,
-
- 1642, 1643, 1579, 1580, 1579, 1580, 1579, 1580,
- 1579, 1580, 1639, 1639, 1639, 1639, 1644, 1645,
- 1639, 1646, 1647, 1648, 1648, 1647, 1647, 1647,
- 1647, 1647, 1649, 1649, 1650, 1651, 1651, 1652,
-
- 1653, 1651, 1654, 1655, 1655, 1656, 1656, 1656,
- 1656, 1656, 1657, 1658, 1657, 1658, 1657, 1659,
- 1596, 1596, 1660, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
- 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
- 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
- 1661, 1661, 202, 1661, 1661, 1661, 1661, 1662,
-
- 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
- 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
- 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
- 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
-
- 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
- 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
- 1661, 1661, 1661, 1662, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
- 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
- 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
- 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
-
- 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
- 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
- 1662, 1662, 1662, 1662, 1662, 1662, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
- 1663, 1663, 1663, 1663, 202, 202, 202, 202,
-
- 1351, 1664, 1665, 1666, 1502, 1667, 1668, 1669,
- 16, 1388, 16, 1388, 16, 1388, 16, 1388,
- 16, 1388, 1502, 1502, 16, 1388, 16, 1388,
- 16, 1388, 16, 1388, 1670, 1366, 1671, 1671,
-
- 1502, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1672, 1673, 174, 1674, 1675, 1675,
- 1676, 1677, 1677, 1677, 1677, 1678, 1679, 1502,
- 1680, 1680, 1680, 1681, 1682, 1683, 1663, 1502,
-
- 202, 1684, 1685, 1684, 1685, 1684, 1685, 1684,
- 1685, 1684, 1685, 1685, 1686, 1685, 1686, 1685,
- 1686, 1685, 1686, 1685, 1686, 1685, 1686, 1685,
- 1686, 1685, 1686, 1685, 1686, 1685, 1686, 1685,
-
- 1686, 1685, 1686, 1684, 1685, 1686, 1685, 1686,
- 1685, 1686, 1685, 1685, 1685, 1685, 1685, 1685,
- 1686, 1686, 1685, 1686, 1686, 1685, 1686, 1686,
- 1685, 1686, 1686, 1685, 1686, 1686, 1685, 1685,
-
- 1685, 1685, 1685, 1684, 1685, 1684, 1685, 1684,
- 1685, 1685, 1685, 1685, 1685, 1685, 1684, 1685,
- 1685, 1685, 1685, 1685, 1686, 1687, 1687, 202,
- 202, 1688, 1688, 1689, 1689, 1690, 1691, 1692,
-
- 1693, 1694, 1695, 1694, 1695, 1694, 1695, 1694,
- 1695, 1694, 1695, 1695, 1696, 1695, 1696, 1695,
- 1696, 1695, 1696, 1695, 1696, 1695, 1696, 1695,
- 1696, 1695, 1696, 1695, 1696, 1695, 1696, 1695,
-
- 1696, 1695, 1696, 1694, 1695, 1696, 1695, 1696,
- 1695, 1696, 1695, 1695, 1695, 1695, 1695, 1695,
- 1696, 1696, 1695, 1696, 1696, 1695, 1696, 1696,
- 1695, 1696, 1696, 1695, 1696, 1696, 1695, 1695,
-
- 1695, 1695, 1695, 1694, 1695, 1694, 1695, 1694,
- 1695, 1695, 1695, 1695, 1695, 1695, 1694, 1695,
- 1695, 1695, 1695, 1695, 1696, 1694, 1694, 1696,
- 1696, 1696, 1696, 1697, 1698, 1699, 1700, 1701,
-
- 202, 202, 202, 202, 202, 1702, 1702, 1702,
- 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702,
- 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702,
- 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702,
-
- 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702,
- 1702, 1702, 1702, 1702, 1702, 1703, 1704, 1705,
- 202, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
-
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
-
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 202,
- 1707, 1707, 1708, 1708, 1708, 1708, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
-
- 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710,
- 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710,
- 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710,
- 1711, 1711, 1711, 1712, 1712, 1712, 1712, 1712,
-
- 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541,
- 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
-
- 1546, 1546, 1546, 1546, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713,
- 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713,
-
- 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
- 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
- 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
- 1714, 1714, 1714, 1714, 1714, 1715, 1715, 202,
-
- 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708,
- 1708, 1708, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
-
- 1709, 1709, 1709, 1709, 1716, 1716, 1716, 1716,
- 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
- 1718, 1719, 1719, 1719, 1719, 1719, 1719, 1719,
- 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719,
-
- 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
- 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
- 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
- 1714, 1714, 1714, 1714, 1715, 1715, 1720, 1707,
-
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1719, 1719, 1719, 1719, 1719, 1719, 1719,
- 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719,
-
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1718, 1718, 1718, 1718,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
-
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1722,
-
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
-
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
-
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1718,
- 1718, 1718, 1718, 1709, 1709, 1709, 1709, 1709,
-
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
-
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1718, 1718,
-
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
- 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1718,
-
- 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
- 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
- 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
- 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
-
- 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
- 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
- 1723, 1723, 1723, 1723, 1723, 1723, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
-
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
-
- 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725,
- 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725,
- 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725,
- 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725,
-
- 1725, 1725, 1725, 1725, 1725, 1725, 1726, 1726,
- 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
- 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
- 1726, 1726, 1726, 1726, 1727, 1727, 1727, 1727,
-
- 1727, 1727, 1727, 1727, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1729, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
-
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1732, 1732, 1732, 1732, 1732,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1733, 1733, 1733,
-
- 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
- 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
- 1734, 1734, 1734, 1734, 1734, 1735, 1734, 1734,
- 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
-
- 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
- 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
- 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
- 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
-
- 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
- 1734, 1734, 1734, 1734, 1734, 202, 202, 202,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
-
- 1736, 1736, 1737, 1737, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1737, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
-
- 1736, 1737, 1736, 1736, 1736, 1737, 1736, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
-
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
- 1739, 1739, 1739, 1739, 1739, 1739, 1740, 1741,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1743, 1744, 1745, 1746,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754,
- 1755, 1756, 1742, 1742, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 281, 282, 281, 282, 281, 282, 281, 282,
- 281, 282, 281, 282, 281, 282, 281, 282,
- 281, 282, 281, 282, 281, 282, 281, 282,
- 281, 282, 281, 282, 281, 282, 281, 282,
-
- 285, 286, 281, 282, 281, 282, 281, 282,
- 281, 282, 281, 282, 281, 282, 1757, 267,
- 1758, 1758, 1758, 1759, 1760, 1760, 1760, 1760,
- 1760, 1760, 1760, 1760, 267, 267, 1759, 1761,
-
- 281, 282, 281, 282, 281, 282, 281, 282,
- 281, 282, 281, 282, 281, 282, 281, 282,
- 281, 282, 281, 282, 281, 282, 281, 282,
- 287, 288, 287, 288, 1762, 1762, 1763, 1760,
-
- 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764,
- 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764,
- 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764,
- 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764,
-
- 1764, 1764, 1764, 1764, 1764, 1764, 1765, 1765,
- 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765,
- 1766, 1766, 1767, 1768, 1769, 1769, 1769, 1768,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
- 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771,
- 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1772,
- 1772, 1772, 1772, 1645, 1645, 1645, 1645, 1645,
-
- 1773, 1773, 1237, 1238, 1237, 1238, 1237, 1238,
- 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238,
- 1235, 1235, 1237, 1238, 1237, 1238, 1237, 1238,
- 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238,
-
- 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238,
- 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238,
- 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238,
- 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238,
-
- 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238,
- 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238,
- 1612, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
- 1235, 1237, 1238, 1237, 1238, 1774, 1237, 1238,
-
- 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238,
- 1645, 1775, 1775, 1237, 1238, 1776, 1777, 1778,
- 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786,
- 1785, 1786, 1785, 1786, 1785, 1786, 1785, 1786,
-
- 1779, 1780, 1779, 1780, 1779, 1780, 1779, 1780,
- 1779, 1780, 1787, 1788, 1789, 1790, 1791, 1792,
- 1793, 1794, 1795, 1796, 1797, 1798, 1797, 1798,
- 1799, 1800, 1801, 1802, 1801, 1802, 1801, 1802,
-
- 202, 202, 1801, 1802, 1803, 1804, 1805, 1806,
- 1807, 1806, 1807, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 1806, 1807, 1808,
- 1809, 1809, 1777, 1810, 1810, 1810, 1810, 1810,
-
- 1811, 1811, 1812, 1811, 1811, 1811, 1813, 1811,
- 1811, 1811, 1811, 1812, 1811, 1811, 1811, 1811,
- 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811,
- 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811,
-
- 1811, 1811, 1811, 1814, 1814, 1812, 1812, 1814,
- 1815, 1815, 1815, 1815, 1816, 202, 202, 202,
- 1717, 1717, 1717, 1717, 1717, 1717, 813, 813,
- 1428, 1817, 202, 202, 202, 202, 202, 202,
-
- 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
- 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
- 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
- 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
-
- 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
- 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
- 1818, 1818, 1819, 1820, 1821, 1821, 1822, 1822,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1823, 1823, 1824, 1824, 1824, 1824, 1824, 1824,
- 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
- 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
- 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+ 1112, 1112, 1112, 1112, 1112, 1112, 221, 221,
+ 1112, 1112, 1112, 1112, 1112, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1114, 1114, 221, 221, 221, 221,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 221, 221, 221, 221, 221, 221,
+ 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122,
+ 1123, 1124, 1125, 221, 221, 221, 1126, 1126,
+
+ 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1129,
+ 1130, 1131, 1131, 1132, 221, 221, 1133, 1133,
+
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1134, 1134, 1134, 1135, 1136, 1135,
+ 1136, 1136, 1136, 1136, 1136, 1136, 1136, 221,
+
+ 1137, 1138, 1136, 1138, 1138, 1136, 1136, 1136,
+ 1136, 1136, 1136, 1136, 1136, 1135, 1135, 1135,
+ 1135, 1135, 1135, 1136, 1136, 1139, 1139, 1139,
+ 1139, 1139, 1139, 1139, 1139, 221, 221, 1140,
+
+ 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148,
+ 1149, 1150, 221, 221, 221, 221, 221, 221,
+ 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148,
+ 1149, 1150, 221, 221, 221, 221, 221, 221,
+
+ 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1152,
+ 1153, 1153, 1153, 1153, 1151, 1151, 221, 221,
+ 1154, 1154, 1154, 1154, 1154, 1155, 1155, 1155,
+ 1155, 1155, 1155, 1154, 1154, 1155, 1156, 1157,
+
+ 1157, 1158, 1158, 1159, 1159, 1158, 1158, 1158,
+ 1158, 1158, 1159, 1158, 1158, 1158, 1158, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1160, 1160, 1160, 1160, 1161, 1162, 1163, 1162,
+ 1163, 1162, 1163, 1162, 1163, 1162, 1163, 1162,
+ 1162, 1162, 1163, 1162, 1162, 1162, 1162, 1162,
+ 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162,
+
+ 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162,
+ 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162,
+ 1162, 1162, 1162, 1162, 1164, 1165, 1160, 1160,
+ 1160, 1160, 1160, 1166, 1160, 1166, 1161, 1161,
+
+ 1166, 1166, 1160, 1166, 1167, 1162, 1162, 1162,
+ 1162, 1162, 1162, 1162, 1168, 221, 221, 221,
+ 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176,
+ 1177, 1178, 1179, 1179, 1180, 1181, 1179, 1179,
+
+ 1181, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1183, 1184, 1183, 1183, 1183,
+ 1183, 1183, 1183, 1183, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1185, 1185, 221,
+
+ 1186, 1186, 1187, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
+
+ 1188, 1187, 1186, 1186, 1186, 1186, 1187, 1187,
+ 1186, 1186, 1189, 1190, 1191, 1191, 1188, 1188,
+ 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199,
+ 1200, 1201, 1202, 1202, 1202, 1202, 1202, 1202,
+
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+
+ 1203, 1203, 1203, 1203, 1203, 1203, 1204, 1205,
+ 1206, 1206, 1205, 1205, 1205, 1206, 1205, 1206,
+ 1206, 1206, 1207, 1207, 221, 221, 221, 221,
+ 221, 221, 221, 221, 1208, 1208, 1208, 1208,
+
+ 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209,
+ 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209,
+ 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209,
+ 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209,
+
+ 1209, 1209, 1209, 1209, 1210, 1210, 1210, 1210,
+ 1210, 1210, 1210, 1210, 1211, 1211, 1211, 1211,
+ 1211, 1211, 1211, 1211, 1210, 1210, 1211, 1212,
+ 221, 221, 221, 1213, 1213, 1214, 1214, 1214,
+
+ 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222,
+ 1223, 1224, 221, 221, 221, 1209, 1209, 1209,
+ 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232,
+ 1233, 1234, 1235, 1235, 1235, 1235, 1235, 1235,
+
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1237, 1237,
+
+ 1238, 1239, 1240, 1241, 1241, 1242, 1243, 1244,
+ 1245, 221, 221, 221, 221, 221, 221, 221,
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+ 1246, 1246, 1246, 221, 221, 1246, 1246, 1246,
+
+ 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 1248, 1248, 1248, 1249, 1250, 1251, 1251, 1251,
+ 1251, 1251, 1248, 1248, 1251, 1251, 1251, 1251,
+
+ 1248, 1252, 1250, 1250, 1250, 1250, 1250, 1250,
+ 1250, 1253, 1253, 1253, 1253, 1251, 1253, 1253,
+ 1253, 1253, 1253, 1254, 1255, 1254, 1254, 1256,
+ 1154, 1154, 1257, 221, 221, 221, 221, 221,
+
+ 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129,
+
+ 129, 129, 129, 129, 129, 129, 1258, 1258,
+ 1258, 1258, 1258, 1259, 1260, 1260, 1260, 1261,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1261, 1260, 1260, 1260, 1260,
+
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1261, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1262,
+
+ 1262, 1262, 1260, 1260, 1260, 1260, 1262, 1262,
+ 1262, 1262, 1262, 129, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 1263, 1264, 130, 130, 130, 1265, 130, 130,
+
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 1266, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 1267, 1267, 1267, 1267, 1267,
+
+ 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267,
+ 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267,
+ 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267,
+ 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1268,
+
+ 1269, 1269, 1270, 1269, 1271, 1271, 1271, 1271,
+ 1271, 1271, 1272, 1273, 1273, 1274, 1275, 1276,
+ 1277, 1273, 1273, 1273, 1273, 1273, 1273, 1273,
+ 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273,
+
+ 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1154,
+ 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154,
+ 1154, 1154, 1154, 1154, 1154, 1154, 1278, 1279,
+ 1279, 1280, 1281, 1282, 1283, 1251, 1271, 1272,
+
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 1284, 1285,
+ 1286, 1287, 1288, 1289, 1290, 1290, 1291, 1290,
+
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 1292, 1293, 1292, 1293, 1292, 1293,
+
+ 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+ 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295,
+ 1294, 1294, 1294, 1294, 1294, 1294, 221, 221,
+ 1295, 1295, 1295, 1295, 1295, 1295, 221, 221,
+
+ 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+ 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295,
+ 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+ 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295,
+
+ 1294, 1294, 1294, 1294, 1294, 1294, 221, 221,
+ 1295, 1295, 1295, 1295, 1295, 1295, 221, 221,
+ 1296, 1294, 1297, 1294, 1298, 1294, 1299, 1294,
+ 221, 1295, 221, 1295, 221, 1295, 221, 1295,
+
+ 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+ 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295,
+ 1300, 1301, 1302, 1303, 1302, 1303, 1304, 1305,
+ 1306, 1307, 1308, 1309, 1310, 1311, 221, 221,
+
+ 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319,
+ 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327,
+ 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335,
+ 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343,
+
+ 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351,
+ 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359,
+ 1294, 1294, 1360, 1361, 1362, 221, 1363, 1364,
+ 1295, 1295, 1365, 1366, 1367, 226, 1368, 226,
+
+ 226, 1369, 1370, 1371, 1372, 221, 1373, 1374,
+ 1375, 1376, 1375, 1376, 1377, 1369, 1369, 1369,
+ 1294, 1294, 1378, 1379, 221, 221, 1380, 1381,
+ 1295, 1295, 1382, 1383, 221, 1369, 1369, 1369,
+
+ 1294, 1294, 1384, 1385, 1386, 1387, 1388, 1389,
+ 1295, 1295, 1390, 1391, 1392, 1369, 1393, 1393,
+ 221, 221, 1394, 1395, 1396, 221, 1397, 1398,
+ 1399, 1400, 1401, 1402, 1403, 1404, 226, 221,
+
+ 1405, 1405, 1406, 1406, 1406, 1406, 1406, 1407,
+ 1406, 1406, 1406, 1408, 1409, 1410, 1411, 1412,
+ 1413, 1414, 1415, 1416, 1417, 1418, 54, 1419,
+ 1420, 1421, 1422, 1423, 1424, 1425, 1422, 1423,
+
+ 54, 54, 54, 1426, 1427, 1428, 1428, 1429,
+ 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437,
+ 1438, 1439, 1438, 1440, 1441, 1442, 1443, 1443,
+ 1426, 1444, 1445, 54, 1446, 1447, 1448, 1449,
+
+ 1449, 1426, 1426, 1426, 1450, 1451, 1452, 1453,
+ 1454, 1455, 1456, 1456, 1456, 1456, 1457, 1457,
+ 1457, 1457, 1458, 1459, 1460, 1461, 1462, 1463,
+ 1462, 1462, 1462, 1462, 1461, 1462, 1462, 1464,
+
+ 1465, 1466, 1466, 1466, 1467, 1468, 1469, 1470,
+ 1471, 1472, 1473, 1473, 1473, 1473, 1473, 1473,
+ 1474, 1475, 221, 221, 1476, 1477, 1478, 1479,
+ 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487,
+
+ 1474, 70, 65, 66, 1476, 1477, 1478, 1479,
+ 1480, 1481, 1482, 1483, 1484, 1485, 1486, 221,
+ 1267, 1267, 1267, 1267, 1267, 1488, 1488, 1488,
+ 1488, 1488, 1488, 1488, 1488, 221, 221, 221,
+
+ 768, 768, 768, 768, 768, 768, 768, 1489,
+ 1490, 1491, 768, 1492, 1493, 1494, 1494, 1494,
+ 1495, 1495, 1496, 1496, 1496, 1496, 1497, 1498,
+ 1498, 1499, 1500, 1501, 1502, 1502, 1503, 1504,
+
+ 1505, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 288, 288, 1507, 1507, 288, 288, 288, 288,
+ 1507, 1507, 1507, 288, 288, 1508, 1508, 1508,
+
+ 1508, 288, 1509, 1509, 1510, 1511, 1511, 1512,
+ 1513, 1512, 1511, 1514, 1272, 1272, 1272, 1272,
+ 1273, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1515, 1515, 1516, 1517, 1518, 1519, 1515, 1516,
+ 1518, 1517, 1520, 1516, 1516, 1516, 1520, 1520,
+ 1516, 1516, 1516, 1521, 1518, 1516, 1522, 1518,
+ 1523, 1516, 1516, 1516, 1516, 1516, 1518, 1518,
+
+ 1524, 1525, 1526, 1518, 1516, 1518, 1527, 1518,
+ 1516, 1518, 1528, 1529, 1516, 1516, 1530, 1520,
+ 1516, 1516, 1531, 1516, 1520, 1532, 1532, 1532,
+ 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1538,
+
+ 1539, 1458, 1458, 1458, 1458, 1538, 1537, 1537,
+ 1537, 1537, 1540, 1458, 1541, 1542, 1543, 1544,
+ 1545, 1545, 1545, 72, 72, 1546, 1546, 1546,
+ 1546, 1546, 1546, 72, 72, 72, 72, 1546,
+
+ 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547,
+ 1547, 1547, 1547, 1547, 1548, 1548, 1548, 1548,
+ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
+ 1549, 1549, 1550, 1550, 1550, 1550, 1550, 1550,
+
+ 1551, 1551, 1551, 1552, 138, 1553, 1553, 1553,
+ 1553, 1554, 1555, 1555, 221, 221, 221, 221,
+ 75, 75, 75, 75, 1556, 61, 61, 61,
+ 61, 61, 1557, 1557, 1518, 1518, 1518, 1518,
+
+ 1523, 1518, 1518, 1523, 1518, 1518, 1523, 1518,
+ 1518, 56, 56, 1518, 1518, 1518, 1557, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1558, 1558, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1559, 1557, 1557,
+ 1518, 1518, 75, 1518, 75, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1558,
+ 1518, 1518, 1518, 1534, 1534, 1534, 1534, 1534,
+ 1534, 1534, 1534, 1534, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 75, 1523, 75, 75, 1557, 1523, 1523, 75,
+ 1560, 1561, 1562, 1563, 1564, 1565, 1523, 75,
+ 1523, 75, 1566, 1567, 1523, 1568, 1523, 1523,
+ 1523, 1523, 75, 1523, 1523, 75, 75, 1569,
+
+ 1570, 1571, 1572, 75, 1573, 75, 1557, 75,
+ 75, 75, 75, 75, 1574, 1575, 75, 1575,
+ 1575, 1523, 1523, 1523, 75, 75, 75, 75,
+ 1523, 1523, 1523, 1523, 1576, 1577, 1523, 1523,
+
+ 1523, 1557, 1523, 1578, 1557, 1579, 1523, 1557,
+ 75, 1557, 1523, 1523, 1580, 1523, 1523, 1523,
+ 1523, 1523, 1576, 1581, 1582, 1581, 1523, 1523,
+ 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
+
+ 1583, 75, 1557, 1523, 1576, 1577, 1576, 1577,
+ 1582, 1581, 1576, 1577, 1523, 1557, 1584, 1585,
+ 1586, 1587, 1582, 1581, 1586, 1587, 1582, 1581,
+ 1586, 1587, 1582, 1581, 1582, 1581, 1582, 1581,
+
+ 1586, 1587, 1576, 1577, 1586, 1587, 1576, 1577,
+ 1586, 1587, 1582, 1581, 1523, 1523, 1523, 1582,
+ 1581, 1582, 1581, 1523, 1523, 75, 1523, 1523,
+ 1588, 75, 1523, 1523, 1523, 1523, 1523, 1523,
+
+ 1523, 1523, 1582, 1581, 1523, 75, 1589, 1523,
+ 1590, 1591, 1523, 1591, 1557, 1557, 1557, 1557,
+ 1582, 1581, 1582, 1581, 1582, 1581, 1582, 1581,
+ 1592, 1523, 1523, 1523, 1523, 1523, 1523, 75,
+
+ 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
+ 1523, 1582, 1581, 1582, 1581, 1593, 1523, 1523,
+ 1582, 1581, 1523, 1523, 1523, 1523, 1582, 1581,
+ 1582, 1581, 1582, 1581, 1582, 1581, 1582, 1581,
+
+ 1586, 1587, 1586, 1587, 1582, 1581, 1582, 1581,
+ 1582, 1581, 1586, 1587, 1586, 1587, 1523, 1594,
+ 1582, 1581, 1595, 1595, 1595, 1458, 1596, 1596,
+ 1458, 1458, 1597, 1597, 1597, 1598, 1598, 1458,
+
+ 1518, 1534, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1451, 1452, 1451, 1452, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1558, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1599, 1599, 1518, 1518, 1518, 1518,
+
+ 1523, 1523, 1518, 1518, 1518, 1518, 1518, 1518,
+ 56, 1600, 1601, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1534, 1458, 1534, 1534, 1534,
+
+ 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534,
+ 1603, 1534, 1534, 1534, 1534, 1534, 1534, 1534,
+ 1534, 1534, 1534, 1534, 1534, 1604, 1534, 1534,
+ 1534, 1534, 1534, 1458, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1540, 1540, 1540, 1540,
+ 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540,
+
+ 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540,
+ 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1605,
+ 1606, 1541, 1541, 1541, 1541, 1541, 1541, 1541,
+ 1541, 1541, 1541, 1541, 1607, 1607, 1607, 1607,
+
+ 1607, 1607, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1608, 1609, 1609, 1609, 1609, 1610, 1610, 1610,
+ 1611, 1612, 1612, 1611, 1613, 1613, 1613, 1613,
+ 1614, 1614, 1614, 1615, 1615, 1615, 1615, 1616,
+
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1518, 1518, 1518, 1518, 1518, 1534, 1534, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624,
+ 1625, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 1626, 1627, 1628, 1629,
+ 1630, 1631, 1632, 1633, 1634, 1635, 1635, 1635,
+
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643,
+ 1644, 1645, 1645, 1645, 1645, 1645, 1645, 1645,
+ 1645, 1645, 1645, 1645, 1646, 1646, 1646, 1646,
+
+ 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646,
+ 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646,
+ 1646, 1646, 1646, 1646, 1646, 1646, 1647, 1647,
+ 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647,
+
+ 1647, 1647, 1648, 1647, 1647, 1647, 1647, 1647,
+ 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647,
+ 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649,
+ 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649,
+
+ 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649,
+ 1649, 1649, 1650, 1651, 1651, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 1651, 1652, 1653, 1654,
+ 1655, 1656, 1657, 1658, 1659, 1660, 1651, 1661,
+
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1518, 1518, 1518, 1518,
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1518, 1518, 1558, 1558, 1558, 1558, 1540, 1540,
+ 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540,
+
+ 1558, 1558, 1518, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 56, 56, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1558, 1558, 1518, 1518, 61, 75,
+ 1518, 1518, 1518, 1518, 1558, 1558, 1518, 1518,
+
+ 61, 75, 1518, 1518, 1518, 1518, 1558, 1558,
+ 1558, 1518, 1518, 1558, 1518, 1518, 1558, 1558,
+ 1558, 1558, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1518, 1518, 1558, 1558, 1558, 1558, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1558,
+ 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534,
+ 1458, 1458, 1458, 1662, 1662, 1663, 1663, 1458,
+
+ 1664, 1664, 1664, 1664, 56, 61, 1558, 56,
+ 56, 61, 56, 56, 56, 56, 61, 61,
+ 56, 56, 56, 1518, 1665, 1665, 1666, 1666,
+ 1667, 1603, 1664, 1664, 1668, 1669, 1668, 1664,
+
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 1664, 1664, 1664, 56, 56, 56, 56,
+
+ 61, 56, 61, 56, 56, 56, 56, 56,
+ 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670,
+ 1670, 1670, 1670, 1670, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+
+ 61, 61, 56, 61, 61, 61, 56, 61,
+ 1668, 61, 61, 56, 61, 61, 56, 1556,
+ 1603, 1603, 1666, 1666, 1666, 1666, 1666, 1666,
+ 1666, 1666, 1666, 1666, 1666, 1666, 1671, 1672,
+
+ 1666, 1666, 1666, 1666, 1666, 1666, 1540, 1540,
+ 1540, 1540, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1605, 1605, 1671, 1673, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1674, 1675, 1675,
+
+ 1605, 1676, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1673, 1673, 1677, 1671, 1671, 1671,
+ 1671, 1671, 1678, 1674, 1674, 1674, 1674, 1674,
+ 1674, 1674, 1674, 1674, 1674, 1679, 1679, 1680,
+
+ 1681, 1681, 1681, 1681, 1679, 1679, 1680, 1680,
+ 1680, 1675, 1675, 1675, 1675, 1680, 1609, 1680,
+ 1680, 1680, 1675, 1680, 1679, 1675, 1675, 1675,
+ 1680, 1680, 1675, 1675, 1680, 1675, 1675, 1680,
+
+ 1680, 1680, 1610, 1675, 1610, 1610, 1610, 1610,
+ 1675, 1675, 1679, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1680, 1679, 1679, 1680, 1679, 1675, 1680,
+ 1680, 1682, 1679, 1675, 1675, 1679, 1680, 1680,
+
+ 1683, 1664, 1664, 1664, 1664, 1609, 1518, 1518,
+ 1664, 1664, 1684, 1684, 1669, 1669, 56, 56,
+ 56, 56, 56, 1518, 56, 1518, 56, 1518,
+ 1518, 1518, 1518, 1518, 1518, 56, 1518, 1518,
+
+ 1518, 56, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1609, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 56, 56, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1558, 1518, 1518,
+
+ 1518, 1518, 1518, 1518, 56, 1518, 1518, 56,
+ 1518, 1518, 1518, 1518, 1609, 1518, 1609, 1518,
+ 1518, 1518, 1518, 1609, 1609, 1609, 1518, 1685,
+ 1518, 1518, 1518, 1686, 1686, 1686, 1686, 1687,
+
+ 1687, 1518, 1688, 1689, 1664, 56, 56, 56,
+ 1690, 1691, 1690, 1691, 1690, 1691, 1690, 1691,
+ 1690, 1691, 1690, 1691, 1690, 1691, 1692, 1693,
+ 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701,
+
+ 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709,
+ 1710, 1711, 1702, 1703, 1704, 1705, 1706, 1707,
+ 1708, 1709, 1710, 1711, 1518, 1609, 1609, 1609,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1518, 56, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1609, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1609,
+
+ 1712, 1712, 1712, 1713, 1714, 1715, 1716, 1607,
+ 1717, 1718, 1607, 1719, 1720, 1721, 1722, 1722,
+ 1458, 1458, 1458, 1458, 1458, 1723, 1724, 1458,
+ 1458, 1458, 1458, 1458, 1725, 1723, 1724, 1458,
+
+ 1458, 1458, 1723, 1724, 1723, 1724, 1726, 1727,
+ 1726, 1727, 1726, 1727, 1728, 1729, 1730, 1731,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732,
+ 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732,
+ 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732,
+ 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1662, 1662, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1690, 1691, 1726, 1727, 1690,
+ 1691, 1690, 1691, 1690, 1691, 1733, 1734, 1735,
+ 1736, 1690, 1691, 1690, 1691, 1690, 1691, 1690,
+ 1691, 1458, 1458, 1737, 1458, 1458, 1458, 1458,
+
+ 1738, 1458, 1458, 1739, 1723, 1724, 1458, 1458,
+ 1723, 1724, 1723, 1724, 1723, 1724, 1723, 1724,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1740, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1723, 1724, 1458, 1458, 1723, 1724, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1723,
+ 1724, 1723, 1724, 1458, 1723, 1724, 1458, 1458,
+ 1690, 1691, 1690, 1691, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1723, 1724, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1741, 1458, 1458,
+ 1723, 1724, 1458, 1458, 1690, 1691, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1539, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1723, 1724, 1723, 1724, 1458,
+ 1458, 1458, 1458, 1458, 1723, 1724, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1723, 1724, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1723, 1724, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1742, 1742, 1742, 1458,
+ 1458, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+
+ 1724, 1723, 1724, 1458, 1458, 1458, 1723, 1724,
+ 1723, 1724, 1723, 1724, 1723, 1724, 1458, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1458,
+ 1458, 1458, 1458, 1458, 1743, 1458, 1744, 1458,
+
+ 1458, 1458, 1458, 1745, 1746, 1745, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1723, 1724, 1747, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1723,
+ 1724, 1723, 1724, 1458, 1458, 1458, 1458, 1458,
+
+ 1606, 1606, 1606, 1606, 1606, 1605, 1605, 1605,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1541, 1541,
+ 1541, 1541, 1541, 1541, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1748, 1748, 1749, 1749, 1749,
+
+ 1542, 1542, 1542, 1542, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
+ 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
+
+ 1720, 1720, 1720, 1720, 1720, 1749, 1749, 1720,
+ 1720, 1720, 1720, 1720, 1720, 1613, 1613, 1613,
+ 1748, 1749, 1749, 1749, 1749, 1685, 1750, 1750,
+ 1750, 1750, 1613, 1613, 1613, 1613, 1613, 1613,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 221, 221, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 221, 1751,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1752, 1752, 1752, 1613, 1613, 1613,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1753, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1616, 1752, 1752, 1752, 1752, 1752,
+ 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752,
+
+ 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752,
+ 1752, 1752, 1752, 1752, 1555, 1555, 1555, 1555,
+ 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752,
+ 1752, 1752, 1752, 1752, 1752, 1752, 1754, 1753,
+
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
+
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1756,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1758,
+
+ 142, 138, 1759, 1760, 1761, 1762, 1763, 142,
+ 138, 142, 138, 142, 138, 1764, 1765, 1766,
+ 1767, 1290, 1292, 1293, 1768, 142, 138, 1768,
+ 1290, 1290, 1290, 1290, 1769, 1769, 1770, 1771,
+
+ 1772, 1773, 1772, 1773, 1772, 1773, 1772, 1773,
+ 1772, 1773, 1772, 1773, 1772, 1773, 1772, 1773,
+ 1772, 1773, 1772, 1773, 1772, 1773, 1772, 1773,
+ 1772, 1773, 1772, 1773, 1772, 1773, 1772, 1773,
+
+ 1772, 1773, 1772, 1773, 1774, 1775, 1775, 1775,
+ 1775, 1775, 1775, 1776, 1777, 1776, 1777, 1778,
+ 1778, 1778, 1779, 1780, 221, 221, 221, 221,
+ 221, 1781, 1782, 1782, 1782, 1783, 1781, 1782,
- 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
- 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
- 1824, 1824, 1824, 1824, 1823, 1823, 1823, 1823,
- 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
+ 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
+ 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
+ 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
- 1823, 1823, 1823, 1823, 1825, 1826, 202, 202,
- 202, 202, 202, 202, 202, 202, 1827, 1827,
- 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835,
- 1836, 1837, 202, 202, 202, 202, 202, 202,
-
- 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838,
- 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838,
- 1838, 1838, 508, 508, 508, 508, 508, 508,
- 1839, 1839, 1839, 508, 1840, 1841, 1842, 1843,
-
- 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851,
- 1852, 1853, 1854, 1854, 1854, 1854, 1854, 1854,
- 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854,
- 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854,
-
- 1854, 1854, 1854, 1854, 1854, 1854, 1855, 1855,
- 1855, 1855, 1855, 1856, 1856, 1856, 1857, 1858,
- 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859,
- 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859,
-
- 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1860,
- 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
- 1860, 1860, 1861, 1862, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 1863,
-
- 863, 863, 863, 863, 863, 863, 863, 863,
- 863, 863, 863, 863, 863, 863, 863, 863,
- 863, 863, 863, 863, 863, 863, 863, 863,
- 863, 863, 863, 863, 863, 202, 202, 202,
-
- 1864, 1864, 1864, 1865, 1866, 1866, 1866, 1866,
- 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866,
- 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866,
- 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866,
-
- 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866,
- 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866,
- 1866, 1866, 1866, 1867, 1865, 1865, 1864, 1864,
- 1864, 1864, 1865, 1865, 1864, 1864, 1865, 1865,
-
- 1868, 1869, 1869, 1869, 1869, 1869, 1869, 1870,
- 1871, 1871, 1869, 1869, 1869, 1869, 202, 1872,
- 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880,
- 1881, 1882, 202, 202, 202, 202, 1869, 1869,
-
- 1883, 1883, 1883, 1883, 1883, 1884, 1885, 1883,
- 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
- 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893,
- 1894, 1895, 1883, 1883, 1883, 1883, 1883, 202,
-
- 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896,
- 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896,
- 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896,
- 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896,
-
- 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896,
- 1896, 1897, 1897, 1897, 1897, 1897, 1897, 1898,
- 1898, 1897, 1897, 1898, 1898, 1897, 1897, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1896, 1896, 1896, 1897, 1896, 1896, 1896, 1896,
- 1896, 1896, 1896, 1896, 1897, 1898, 202, 202,
- 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906,
- 1907, 1908, 202, 202, 1909, 1910, 1910, 1910,
-
- 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911,
- 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911,
- 1912, 1911, 1911, 1911, 1911, 1911, 1911, 1913,
- 1913, 1913, 1911, 851, 1884, 1914, 1883, 1883,
-
- 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915,
- 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915,
- 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915,
- 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915,
-
- 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915,
- 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915,
- 1916, 1915, 1916, 1916, 1917, 1915, 1915, 1916,
- 1916, 1915, 1915, 1915, 1915, 1915, 1916, 1916,
-
- 1915, 1916, 1915, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 1915, 1915, 1918, 1919, 1919,
+ 1784, 1784, 1784, 1784, 1784, 1784, 221, 1785,
+ 221, 221, 221, 221, 221, 1785, 221, 221,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
- 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
- 1920, 1920, 1920, 1921, 1922, 1922, 1921, 1921,
- 1923, 1923, 1920, 1924, 1924, 1921, 1925, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
- 202, 1926, 1926, 1926, 1926, 1926, 1926, 202,
- 202, 1926, 1926, 1926, 1926, 1926, 1926, 202,
- 202, 1926, 1926, 1926, 1926, 1926, 1926, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1787, 1787,
+ 221, 221, 221, 221, 221, 221, 221, 1788,
+ 1789, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 1790,
- 1926, 1926, 1926, 1926, 1926, 1926, 1926, 202,
- 1926, 1926, 1926, 1926, 1926, 1926, 1926, 202,
- 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
- 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
+ 913, 913, 913, 913, 913, 913, 913, 913,
+ 913, 913, 913, 913, 913, 913, 913, 913,
+ 913, 913, 913, 913, 913, 913, 913, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
- 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
- 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
- 1784, 1784, 1784, 1927, 1784, 1784, 1784, 1784,
- 1784, 1784, 1784, 1928, 1929, 1929, 1929, 1929,
-
- 1930, 1930, 1930, 1930, 1784, 1931, 1932, 1932,
- 1933, 1934, 1935, 1935, 202, 202, 202, 202,
- 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943,
- 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951,
-
- 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959,
- 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967,
- 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975,
- 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983,
-
- 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991,
- 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
- 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015,
-
- 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
- 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
- 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
- 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
-
- 2016, 2016, 2016, 2017, 2017, 2018, 2017, 2017,
- 2018, 2017, 2017, 2019, 2017, 2020, 202, 202,
- 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028,
- 2029, 2030, 202, 202, 202, 202, 202, 202,
-
- 2031, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2031, 2032, 2032, 2032,
-
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2031, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
-
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2031, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
-
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2031, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
-
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2031, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
-
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2031, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
-
- 2032, 2032, 2032, 2032, 2031, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
- 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
-
- 2032, 2032, 2032, 2032, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 866, 866, 866, 866, 866, 866, 866, 866,
- 866, 866, 866, 866, 866, 866, 866, 866,
-
- 866, 866, 866, 866, 866, 866, 866, 202,
- 202, 202, 202, 869, 869, 869, 869, 869,
- 869, 869, 869, 869, 869, 869, 869, 869,
- 869, 869, 869, 869, 869, 869, 869, 869,
-
- 869, 869, 869, 869, 869, 869, 869, 869,
- 869, 869, 869, 869, 869, 869, 869, 869,
- 869, 869, 869, 869, 869, 869, 869, 869,
- 869, 869, 869, 869, 202, 202, 202, 202,
-
- 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033,
- 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033,
- 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033,
- 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033,
-
- 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034,
- 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034,
- 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034,
- 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034,
-
- 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035,
- 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035,
- 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035,
- 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035,
-
- 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035,
- 2035, 2035, 2035, 2035, 2035, 2035, 1725, 1725,
- 2035, 1725, 2035, 1725, 1725, 2035, 2035, 2035,
- 2035, 2035, 2035, 2035, 2035, 2035, 2035, 1725,
-
- 2035, 1725, 2035, 1725, 1725, 2035, 2035, 1725,
- 1725, 1725, 2035, 2035, 2035, 2035, 2036, 2036,
- 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
- 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
+ 913, 913, 913, 913, 913, 913, 913, 221,
+ 913, 913, 913, 913, 913, 913, 913, 221,
+ 913, 913, 913, 913, 913, 913, 913, 221,
+ 913, 913, 913, 913, 913, 913, 913, 221,
- 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
- 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+
+ 1791, 1791, 1792, 1793, 1792, 1793, 1791, 1791,
+ 1791, 1792, 1793, 1791, 1792, 1793, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1461, 1794,
+ 1795, 1796, 1797, 1798, 1792, 1793, 1798, 1798,
+
+ 1799, 1800, 1730, 1731, 1730, 1731, 1730, 1731,
+ 1730, 1731, 1796, 1796, 1796, 1796, 1801, 1802,
+ 1796, 1803, 1804, 1805, 1805, 1804, 1804, 1804,
+ 1804, 1804, 1806, 1806, 1807, 1808, 1808, 1809,
+
+ 1810, 1808, 1811, 1812, 1812, 1813, 1813, 1813,
+ 1813, 1813, 1814, 1815, 1814, 1815, 1814, 1816,
+ 1751, 1751, 1817, 1818, 1818, 1819, 1820, 1819,
+ 1820, 1819, 1820, 1819, 1820, 1821, 221, 221,
+
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 221, 1822, 1822, 1822, 1822, 1823,
+
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1823, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1823, 1823, 1823, 1823, 1823, 1823, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
+ 1824, 1824, 1824, 1824, 1825, 1825, 1825, 1825,
+
+ 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833,
+ 1834, 1835, 1834, 1835, 1834, 1835, 1834, 1835,
+ 1834, 1835, 1830, 1830, 1834, 1835, 1834, 1835,
+ 1834, 1835, 1834, 1835, 1836, 1837, 1838, 1838,
+
+ 1830, 1833, 1833, 1833, 1833, 1833, 1833, 1833,
+ 1833, 1833, 1839, 1840, 1841, 1842, 1843, 1843,
+ 1844, 1845, 1845, 1845, 1845, 1846, 1847, 1830,
+ 1848, 1848, 1848, 1849, 1850, 1851, 1852, 1853,
+
+ 221, 1854, 1855, 1854, 1855, 1854, 1855, 1854,
+ 1855, 1854, 1855, 1855, 1856, 1855, 1856, 1855,
+ 1856, 1855, 1856, 1855, 1856, 1855, 1856, 1855,
+ 1856, 1855, 1856, 1855, 1856, 1855, 1856, 1855,
+
+ 1856, 1855, 1856, 1854, 1855, 1856, 1855, 1856,
+ 1855, 1856, 1855, 1855, 1855, 1855, 1855, 1855,
+ 1856, 1856, 1855, 1856, 1856, 1855, 1856, 1856,
+ 1855, 1856, 1856, 1855, 1856, 1856, 1855, 1855,
+
+ 1855, 1855, 1855, 1854, 1855, 1854, 1855, 1854,
+ 1855, 1855, 1855, 1855, 1855, 1855, 1854, 1855,
+ 1855, 1855, 1855, 1855, 1856, 1857, 1857, 221,
+ 221, 1858, 1858, 1859, 1859, 1860, 1861, 1862,
+
+ 1863, 1864, 1865, 1864, 1865, 1864, 1865, 1864,
+ 1865, 1864, 1865, 1865, 1866, 1865, 1866, 1865,
+ 1866, 1865, 1866, 1865, 1866, 1865, 1866, 1865,
+ 1866, 1865, 1866, 1865, 1866, 1865, 1866, 1865,
+
+ 1866, 1865, 1866, 1864, 1865, 1866, 1865, 1866,
+ 1865, 1866, 1865, 1865, 1865, 1865, 1865, 1865,
+ 1866, 1866, 1865, 1866, 1866, 1865, 1866, 1866,
+ 1865, 1866, 1866, 1865, 1866, 1866, 1865, 1865,
+
+ 1865, 1865, 1865, 1864, 1865, 1864, 1865, 1864,
+ 1865, 1865, 1865, 1865, 1865, 1865, 1864, 1865,
+ 1865, 1865, 1865, 1865, 1866, 1864, 1864, 1866,
+ 1866, 1866, 1866, 1867, 1868, 1869, 1870, 1871,
+
+ 221, 221, 221, 221, 221, 1872, 1872, 1872,
+ 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872,
+ 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872,
+ 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872,
+
+ 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872,
+ 1872, 1872, 1872, 1872, 1872, 1873, 1874, 1875,
+ 221, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+
+ 1876, 1876, 1876, 1876, 1877, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 221,
+ 1878, 1878, 1879, 1879, 1879, 1879, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+
+ 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881,
+ 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881,
+ 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881,
+ 1882, 1882, 1882, 1883, 1883, 1883, 1883, 1883,
+
+ 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884,
+ 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884,
+ 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
+ 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
+
+ 1885, 1885, 1885, 1885, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 1825,
+ 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886,
+ 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886,
+
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1888, 1888, 221,
+
+ 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889,
+ 1889, 1889, 1890, 1890, 1890, 1890, 1890, 1890,
+ 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
+ 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
+
+ 1890, 1890, 1890, 1890, 1891, 1891, 1891, 1891,
+ 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892,
+ 1893, 1894, 1894, 1894, 1894, 1894, 1894, 1894,
+ 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894,
+
+ 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895,
+ 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895,
+ 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895,
+ 1895, 1895, 1895, 1895, 1896, 1896, 1897, 1878,
+
+ 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
+ 1879, 1879, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1898,
+ 1880, 1898, 1880, 1880, 1880, 1880, 1880, 1880,
+
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1894, 1894, 1894, 1894, 1894, 1894, 1894,
+ 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894,
+
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1893, 1893, 1893, 1893,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1900,
+
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1893,
+ 1893, 1893, 1893, 1880, 1880, 1880, 1880, 1880,
+
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+
+ 1880, 1880, 1890, 1880, 1880, 1880, 1880, 1890,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1890, 1880, 1880, 1880, 1880, 1880, 1893, 1893,
+
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1893,
+
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+
+ 1903, 1903, 1903, 1903, 1903, 1903, 1904, 1904,
+ 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904,
+ 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904,
+ 1904, 1904, 1904, 1904, 1905, 1905, 1905, 1905,
+
+ 1905, 1905, 1905, 1905, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1907, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1910, 1910, 1910, 1910, 1910,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1911, 1911, 1911,
+
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1913, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 221, 221, 221,
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914,
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914,
+
+ 1914, 1914, 1915, 1915, 1914, 1914, 1914, 1914,
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914,
+ 1914, 1914, 1914, 1914, 1915, 1914, 1914, 1914,
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914,
+
+ 1914, 1915, 1914, 1914, 1914, 1915, 1914, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+ 1917, 1917, 1917, 1917, 1917, 1917, 1918, 1919,
+
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1921, 1922, 1923, 1924,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+
+ 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932,
+ 1933, 1934, 1920, 1920, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+
+ 307, 308, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 1935, 289,
+ 1936, 1936, 1936, 1937, 1938, 1938, 1938, 1938,
+ 1938, 1938, 1938, 1938, 289, 289, 1937, 1939,
+
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 309, 310, 309, 310, 1940, 1940, 1941, 1938,
+
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+
+ 1942, 1942, 1942, 1942, 1942, 1942, 1943, 1943,
+ 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943,
+ 1944, 1944, 1945, 1946, 1947, 1947, 1947, 1946,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1950,
+ 1950, 1950, 1950, 1802, 1802, 1802, 1802, 1802,
+
+ 1951, 1951, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1290, 1290, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1769, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1292, 1293, 1292, 1293, 1952, 1292, 1293,
+
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1802, 1953, 1953, 1292, 1293, 1954, 1955, 1956,
+ 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964,
+ 1963, 1964, 1963, 1964, 1963, 1964, 1963, 1964,
+
+ 1957, 1958, 1957, 1958, 1957, 1958, 1957, 1958,
+ 1957, 1958, 1965, 1966, 1967, 1968, 1969, 1970,
+ 1971, 1972, 1973, 1974, 1975, 1976, 1975, 1976,
+ 1977, 1978, 1979, 1980, 1979, 1980, 1979, 1980,
+
+ 1981, 1982, 1979, 1980, 1983, 1984, 1985, 1986,
+ 1987, 1986, 1987, 221, 221, 221, 221, 221,
+ 1981, 1982, 221, 1988, 221, 1988, 1981, 1982,
+ 1981, 1982, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 1989, 1989, 1989, 1986, 1987, 1990,
+ 1991, 1991, 1955, 1992, 1992, 1992, 1992, 1992,
+
+ 1993, 1993, 1994, 1993, 1993, 1993, 1995, 1993,
+ 1993, 1993, 1993, 1994, 1993, 1993, 1993, 1993,
+ 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
+ 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
+
+ 1993, 1993, 1993, 1996, 1996, 1994, 1994, 1996,
+ 1997, 1997, 1997, 1997, 1998, 221, 221, 221,
+ 1999, 1999, 1999, 1999, 1999, 1999, 853, 853,
+ 1497, 2000, 221, 221, 221, 221, 221, 221,
+
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2002, 2003, 2004, 2004, 2005, 2005,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2006, 2006, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2006, 2006, 2006, 2006,
+ 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006,
+
+ 2006, 2006, 2006, 2006, 2008, 2009, 221, 221,
+ 221, 221, 221, 221, 221, 221, 2010, 2010,
+ 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018,
+ 2019, 2020, 221, 221, 221, 221, 221, 221,
+
+ 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021,
+ 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021,
+ 2021, 2021, 542, 542, 542, 542, 542, 542,
+ 2022, 2022, 2022, 542, 2023, 2024, 2025, 2026,
+
+ 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034,
+ 2035, 2036, 2037, 2037, 2037, 2037, 2037, 2037,
2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
- 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
- 2037, 2037, 2037, 2038, 2038, 2038, 1733, 1733,
- 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
- 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
-
- 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
- 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
- 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
- 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
-
- 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
- 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
- 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
- 2039, 2039, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 2040, 2041, 2042, 2043, 2044, 2045, 2045, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 2046, 2047, 2048, 2049, 2050,
- 202, 202, 202, 202, 202, 2051, 2052, 2053,
-
- 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054,
- 2054, 2055, 2053, 2053, 2053, 2053, 2053, 2053,
- 2053, 2053, 2053, 2053, 2053, 2053, 2053, 301,
- 2053, 2053, 2053, 2053, 2053, 301, 2053, 301,
-
- 2053, 2053, 301, 2053, 2053, 301, 2053, 2053,
- 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2054,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
-
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
-
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2057, 2057, 2057, 2057, 2057, 2057,
- 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057,
-
- 2057, 2057, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
-
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 1671, 1366,
-
- 348, 348, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 348, 348,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
-
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 348, 348, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
-
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 348, 348, 348, 348, 348, 348, 348, 348,
- 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
- 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
-
- 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
- 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2059, 340, 348, 348,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2061, 2062, 2063, 2064, 2065, 2066, 2066, 2067,
- 2068, 2069, 202, 202, 202, 202, 202, 202,
-
- 173, 173, 173, 173, 1219, 1219, 1219, 1107,
- 1107, 1107, 1107, 1107, 1107, 1107, 1763, 1763,
- 2070, 2071, 2071, 2072, 2072, 2073, 2074, 2073,
- 2074, 2073, 2074, 2073, 2074, 2073, 2074, 2073,
-
- 2074, 2073, 2074, 2073, 2074, 1683, 1683, 2075,
- 2076, 2070, 2070, 2070, 2070, 2072, 2072, 2072,
- 2077, 2078, 2079, 202, 2080, 2081, 2082, 2082,
- 2071, 1419, 1420, 1419, 1420, 1419, 1420, 2083,
-
- 2070, 2070, 2084, 2085, 2086, 2087, 2088, 202,
- 2070, 1422, 1380, 2070, 202, 202, 202, 202,
- 2056, 2056, 2056, 2089, 2056, 348, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
-
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
- 2056, 2056, 2056, 2056, 2056, 348, 348, 2090,
-
- 202, 2082, 2070, 2083, 1422, 1380, 2070, 2091,
- 1419, 1420, 2070, 2084, 2077, 2085, 2079, 2092,
- 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100,
- 2101, 2102, 2081, 2080, 2103, 2088, 2104, 2082,
-
- 2070, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 2105, 2105, 2105, 2106, 2070, 2107, 2108, 2072,
-
- 2108, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2106, 2088, 2107, 2088, 2110,
-
- 2111, 2112, 1419, 1420, 2113, 2114, 2115, 2116,
- 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116,
- 2117, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
- 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
-
- 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
- 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
- 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
- 2115, 2115, 2115, 2115, 2115, 2115, 2118, 2118,
-
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 202,
-
- 202, 202, 1706, 1706, 1706, 1706, 1706, 1706,
- 202, 202, 1706, 1706, 1706, 1706, 1706, 1706,
- 202, 202, 1706, 1706, 1706, 1706, 1706, 1706,
- 202, 202, 1706, 1706, 1706, 202, 202, 202,
-
- 2119, 1422, 2088, 2108, 1679, 1422, 1422, 202,
- 1443, 1418, 1418, 1418, 1418, 1443, 1443, 202,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 2120, 2120, 2120, 2121, 51, 2122, 2122,
-
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 202, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
-
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 202,
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 202, 2123, 2123, 202, 2123,
-
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 2123, 2123, 202, 202,
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 2123, 2123, 202, 202,
-
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
-
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123,
- 2123, 2123, 2123, 202, 202, 202, 202, 202,
-
- 2124, 2125, 2124, 202, 202, 202, 202, 2126,
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
-
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126, 202, 202, 202, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
-
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
-
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2129, 2129, 2129,
- 2129, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
-
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2129, 2131, 2132, 2133, 2133, 202,
- 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543,
- 1543, 1543, 1543, 1543, 1596, 202, 202, 202,
-
- 2132, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
- 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
-
- 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
- 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
- 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
- 1465, 1465, 1465, 1465, 1465, 1222, 202, 202,
-
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 202, 202, 202,
-
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
-
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1107, 2136, 2136, 2136, 2136, 2136, 2136, 2136,
- 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136,
- 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136,
- 2136, 2136, 2136, 2136, 202, 202, 202, 202,
-
- 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137,
- 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137,
- 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137,
- 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2138,
-
- 2139, 2139, 2139, 2139, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 2140, 2140, 2140,
- 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141,
- 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141,
-
- 2141, 2142, 2141, 2141, 2141, 2141, 2141, 2141,
- 2141, 2141, 2142, 202, 202, 202, 202, 202,
- 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
- 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
-
- 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
- 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
- 2143, 2143, 2143, 2143, 2143, 2143, 2144, 2144,
- 2144, 2144, 2144, 202, 202, 202, 202, 202,
-
- 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145,
- 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145,
- 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145,
- 2145, 2145, 2145, 2145, 2145, 2145, 202, 2146,
-
- 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147,
- 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147,
- 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147,
- 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147,
-
- 2147, 2147, 2147, 2147, 202, 202, 202, 202,
- 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147,
- 2148, 2149, 2149, 2149, 2149, 2149, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
- 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
- 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
- 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
-
- 2150, 2150, 2150, 2150, 2150, 2150, 2151, 2151,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
-
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2153, 2153,
- 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
- 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
-
- 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
- 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
- 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
- 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
-
- 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155,
- 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155,
- 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155,
- 2155, 2155, 2155, 2155, 2155, 2155, 202, 202,
-
- 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163,
- 2164, 2165, 202, 202, 202, 202, 202, 202,
- 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166,
- 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166,
-
- 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166,
- 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166,
- 2166, 2166, 2166, 2166, 202, 202, 202, 202,
- 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167,
-
- 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167,
- 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167,
- 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167,
- 2167, 2167, 2167, 2167, 202, 202, 202, 202,
-
- 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168,
- 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168,
- 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168,
- 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168,
-
- 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169,
- 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169,
-
- 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169,
- 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169,
- 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169,
- 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169,
-
- 2169, 2169, 2169, 2169, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 2170,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
-
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2172, 2172, 2172, 2172, 2172, 2172, 301, 301,
- 2172, 301, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
-
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 2172, 2172, 2172, 301, 2172,
- 2172, 301, 301, 301, 2172, 301, 301, 2172,
-
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 2173, 2173, 2173, 301, 2174,
- 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175,
-
- 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
- 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
- 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2177,
- 2177, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
-
- 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179,
- 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179,
- 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179,
- 2179, 2179, 2179, 2179, 2179, 2179, 2179, 301,
-
- 301, 301, 301, 301, 301, 301, 301, 2180,
- 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181,
- 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181,
- 2181, 2181, 2181, 301, 2181, 2181, 301, 301,
- 301, 301, 301, 2182, 2182, 2182, 2182, 2182,
-
- 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
- 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
- 2183, 2183, 2183, 2183, 2183, 2183, 2184, 2184,
- 2184, 2184, 2185, 2185, 301, 301, 301, 2186,
-
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 301, 301, 301, 301, 301, 2188,
-
- 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189,
- 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189,
- 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189,
- 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189,
-
- 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190,
- 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190,
- 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190,
- 301, 301, 301, 301, 2191, 2191, 2190, 2190,
-
- 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191,
- 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191,
- 301, 301, 2191, 2191, 2191, 2191, 2191, 2191,
- 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191,
-
- 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191,
- 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191,
- 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191,
- 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191,
-
- 2192, 2193, 2193, 2193, 301, 2193, 2193, 301,
- 301, 301, 301, 301, 2193, 2194, 2193, 2195,
- 2192, 2192, 2192, 2192, 301, 2192, 2192, 2192,
- 301, 2192, 2192, 2192, 2192, 2192, 2192, 2192,
-
- 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192,
- 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192,
- 2192, 2192, 2192, 2192, 2196, 2196, 301, 301,
- 2195, 2197, 2194, 301, 301, 301, 301, 2198,
-
- 2199, 2200, 2201, 2202, 2203, 2203, 2203, 2203,
- 2204, 301, 301, 301, 301, 301, 301, 301,
- 2205, 2205, 2205, 2205, 2205, 2205, 2206, 2206,
- 2207, 301, 301, 301, 301, 301, 301, 301,
-
- 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208,
- 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208,
- 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208,
- 2208, 2208, 2208, 2208, 2208, 2209, 2209, 2210,
-
- 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
- 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
- 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
- 2211, 2211, 2211, 2211, 2211, 2212, 2212, 2212,
-
- 2213, 2213, 2213, 2213, 2213, 2214, 2215, 2214,
- 2216, 2214, 2214, 2215, 2215, 2217, 2214, 2214,
- 2214, 2214, 2214, 2213, 2213, 2213, 2213, 2217,
- 2213, 2213, 2213, 2213, 2213, 2214, 2213, 2213,
-
- 2213, 2214, 2215, 2215, 2214, 2218, 2219, 301,
- 301, 301, 301, 2220, 2220, 2220, 2220, 2221,
- 2222, 2222, 2222, 2222, 2222, 2222, 2223, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
+ 2037, 2037, 2037, 2037, 2037, 2037, 2038, 2038,
+ 2038, 2038, 2038, 2039, 2039, 2039, 2040, 2041,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2044, 2045, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 2046,
+
+ 903, 903, 903, 903, 903, 903, 903, 903,
+ 903, 903, 903, 903, 903, 903, 903, 903,
+ 903, 903, 903, 903, 903, 903, 903, 903,
+ 903, 903, 903, 903, 903, 221, 221, 221,
+
+ 2047, 2047, 2047, 2048, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2050, 2048, 2048, 2047, 2047,
+ 2047, 2047, 2048, 2048, 2047, 2047, 2048, 2048,
+
+ 2051, 2052, 2052, 2052, 2052, 2052, 2052, 2053,
+ 2054, 2054, 2052, 2052, 2052, 2052, 221, 2055,
+ 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063,
+ 2064, 2065, 221, 221, 221, 221, 2052, 2052,
+
+ 2066, 2066, 2066, 2066, 2066, 2067, 2068, 2066,
+ 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066,
+ 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076,
+ 2077, 2078, 2066, 2066, 2066, 2066, 2066, 221,
+
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+ 2079, 2080, 2080, 2080, 2080, 2080, 2080, 2081,
+ 2081, 2080, 2080, 2081, 2081, 2080, 2080, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2082, 2082, 2082, 2080, 2082, 2082, 2082, 2082,
+ 2082, 2082, 2082, 2082, 2080, 2081, 221, 221,
+ 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090,
+ 2091, 2092, 221, 221, 2093, 2094, 2094, 2094,
+
+ 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095,
+ 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095,
+ 2096, 2095, 2095, 2095, 2095, 2095, 2095, 2097,
+ 2097, 2097, 2095, 891, 2067, 2098, 2066, 2066,
+
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+ 2100, 2099, 2100, 2100, 2101, 2099, 2099, 2100,
+ 2100, 2099, 2099, 2099, 2099, 2099, 2100, 2100,
+
+ 2099, 2100, 2099, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 2099, 2099, 2102, 2103, 2103,
+
+ 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
+ 2104, 2104, 2104, 2105, 2106, 2106, 2105, 2105,
+ 2107, 2107, 2104, 2108, 2108, 2105, 2109, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 2110, 2110, 2110, 2110, 2110, 2110, 221,
+ 221, 2110, 2110, 2110, 2110, 2110, 2110, 221,
+ 221, 2110, 2110, 2110, 2110, 2110, 2110, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2110, 2110, 2110, 2110, 2110, 2110, 2110, 221,
+ 2110, 2110, 2110, 2110, 2110, 2110, 2110, 221,
+ 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962,
+ 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962,
+
+ 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962,
+ 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962,
+ 1962, 1962, 1962, 2111, 1962, 1962, 1962, 1962,
+ 1962, 1962, 1962, 2112, 2113, 2113, 2113, 2113,
+
+ 2114, 2114, 2114, 2114, 1962, 2115, 2116, 2116,
+ 2117, 2118, 2119, 2119, 221, 221, 221, 221,
+ 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127,
+ 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135,
+
+ 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143,
+ 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151,
+ 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159,
+ 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167,
+
+ 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175,
+ 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183,
+ 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191,
+ 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199,
+
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+
+ 2200, 2200, 2200, 2201, 2201, 2202, 2201, 2201,
+ 2202, 2201, 2201, 2203, 2201, 2204, 221, 221,
+ 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212,
+ 2213, 2214, 221, 221, 221, 221, 221, 221,
+
+ 2215, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2215, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2215, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2215, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2215, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2215, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2215, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2215, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 908, 908, 908, 908, 908, 908, 908, 908,
+ 908, 908, 908, 908, 908, 908, 908, 908,
+
+ 908, 908, 908, 908, 908, 908, 908, 221,
+ 221, 221, 221, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 911, 911, 911, 911,
+
+ 911, 911, 911, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 221, 221, 221, 221,
+
+ 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217,
+ 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217,
+ 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217,
+ 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217,
+
+ 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218,
+ 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218,
+ 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218,
+ 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218,
+
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219,
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219,
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219,
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219,
+
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219,
+ 2219, 2219, 2219, 2219, 2219, 2219, 1903, 1903,
+ 2219, 1903, 2219, 1903, 1903, 2219, 2219, 2219,
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 1903,
+
+ 2219, 1903, 2219, 1903, 1903, 2219, 2219, 1903,
+ 1903, 1903, 2219, 2219, 2219, 2219, 2220, 2220,
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+ 2221, 2221, 2221, 2222, 2222, 2222, 2223, 2223,
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
@@ -3484,806 +3048,730 @@ static const unsigned short uc_property_trie[] = {
2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
- 2224, 2224, 2224, 2224, 2224, 2224, 301, 301,
- 301, 2225, 2225, 2225, 2225, 2225, 2225, 2225,
-
- 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226,
- 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226,
- 2226, 2226, 2226, 2226, 2226, 2226, 301, 301,
- 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227,
-
- 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
- 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
- 2228, 2228, 2228, 301, 301, 301, 301, 301,
- 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229,
-
- 2230, 2231, 2230, 2231, 2231, 2231, 2230, 2230,
- 2230, 2231, 2230, 2230, 2231, 2230, 2231, 2231,
- 2230, 2231, 301, 301, 301, 301, 301, 301,
- 301, 2232, 2232, 2232, 2232, 301, 301, 301,
-
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 2233, 2233, 2233, 2233, 2234, 2234, 2235,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
-
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
- 2236, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237,
- 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237,
- 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237,
- 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237,
-
- 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237,
- 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237,
- 2237, 2237, 2237, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
-
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 301, 301, 301, 301, 301,
- 301, 301, 2239, 2239, 2239, 2239, 2239, 2239,
-
- 2240, 2241, 2241, 2241, 2241, 2241, 2241, 2241,
- 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241,
- 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241,
- 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241,
-
- 2241, 2241, 2242, 2241, 2243, 2243, 2243, 2243,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251,
- 2252, 2253, 301, 301, 301, 301, 301, 301,
-
- 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261,
- 2262, 2263, 2263, 2263, 2263, 2263, 2263, 2263,
- 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263,
- 2263, 2263, 2263, 2263, 2263, 2263, 2263, 301,
-
- 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264,
- 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264,
- 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264,
- 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264,
-
- 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264,
- 2264, 2264, 301, 2265, 2265, 2266, 301, 301,
- 2264, 2264, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
- 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
- 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
- 2267, 2267, 2267, 2267, 2267, 2268, 2268, 2268,
-
- 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2267,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 2269, 2269, 2269, 2270, 2269, 2269, 2269, 2269,
- 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269,
-
- 2269, 2269, 2269, 2269, 2269, 2271, 2272, 2272,
- 2273, 2273, 2273, 2272, 2273, 2272, 2272, 2272,
- 2272, 2274, 2274, 2274, 2275, 2276, 2276, 2276,
- 2276, 2276, 301, 301, 301, 301, 301, 301,
-
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 2277, 2278, 2277, 2277, 2279, 2279, 2279, 2278,
- 2277, 2279, 2279, 2277, 2277, 2279, 2277, 2277,
-
- 2278, 2277, 2279, 2279, 2277, 2280, 2280, 2280,
- 2280, 2281, 2282, 2283, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284,
- 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284,
- 2284, 2284, 2284, 2284, 2284, 2284, 2284, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 2285, 2286, 2285, 2287, 2287, 2287, 2287, 2287,
- 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
- 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
- 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
- 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
- 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
- 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
- 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286,
- 2286, 2286, 2286, 2286, 2286, 2286, 2288, 2289,
- 2289, 2290, 2290, 2290, 2290, 2290, 202, 202,
- 202, 202, 2291, 2292, 2293, 2294, 2295, 2296,
- 2297, 2298, 2299, 2300, 2300, 2300, 2300, 2300,
- 2300, 2300, 2300, 2300, 2300, 2300, 2301, 2302,
- 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 2311,
- 2312, 2312, 2313, 2314, 2314, 2314, 2314, 2314,
- 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
- 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
- 2314, 2314, 2315, 2314, 2315, 2314, 2314, 2314,
- 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
- 2314, 2314, 2314, 2315, 2314, 2314, 2314, 2314,
- 2313, 2313, 2313, 2312, 2312, 2312, 2312, 2313,
- 2313, 2316, 2317, 2318, 2318, 2319, 2320, 2320,
- 2320, 2320, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 2321, 202, 202,
- 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322,
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+ 2224, 2224, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 2225, 2226, 2227, 2228, 2229, 2230, 2231, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 2232, 2233, 2234, 2235, 2236,
+ 221, 221, 221, 221, 221, 2237, 2238, 2239,
+
+ 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240,
+ 2240, 2241, 2239, 2239, 2239, 2239, 2239, 2239,
+ 2239, 2239, 2239, 2239, 2239, 2239, 2239, 323,
+ 2239, 2239, 2239, 2239, 2239, 323, 2239, 323,
+
+ 2239, 2239, 323, 2239, 2239, 323, 2239, 2239,
+ 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2240,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+
+ 2243, 2243, 489, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2244, 2244,
+
+ 2244, 2244, 2244, 2244, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2245, 1422,
+
+ 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246,
+ 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 437, 437, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 437, 437, 437, 437, 437, 437, 437, 2246,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2244, 2244, 2248, 363, 2246, 2246,
+
+ 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2250, 2251, 2252, 2253, 2254, 2255, 2255, 2256,
+ 2257, 2258, 221, 221, 221, 221, 221, 221,
+
+ 288, 288, 288, 288, 1273, 1273, 1273, 1155,
+ 1155, 1155, 1155, 1155, 1155, 1155, 1941, 1941,
+ 2259, 2260, 2260, 2261, 2261, 2262, 2263, 2262,
+ 2263, 2264, 2265, 2264, 2265, 2264, 2265, 2264,
+
+ 2265, 2264, 2265, 2264, 2265, 2266, 2266, 2267,
+ 2268, 2259, 2259, 2259, 2259, 2261, 2261, 2261,
+ 2269, 2270, 2271, 221, 2272, 2273, 2274, 2274,
+ 2260, 2275, 2276, 2275, 2276, 2277, 2278, 2279,
+
+ 2259, 2259, 2280, 2281, 2282, 2283, 2284, 221,
+ 2259, 2285, 2286, 2259, 221, 221, 221, 221,
+ 2244, 2242, 2244, 2287, 2244, 437, 2244, 2242,
+ 2244, 2242, 2244, 2242, 2244, 2242, 2244, 2242,
+
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 437, 437, 2288,
+
+ 221, 2289, 2290, 2291, 2292, 2293, 2290, 2294,
+ 2295, 2296, 2290, 2297, 2298, 2299, 2300, 2301,
+ 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309,
+ 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2289,
+
+ 2290, 2317, 2317, 2317, 2317, 2317, 2317, 2317,
+ 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317,
+ 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317,
+ 2317, 2317, 2317, 2318, 2290, 2319, 2320, 2321,
+
+ 2320, 2322, 2322, 2322, 2322, 2322, 2322, 2322,
2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322,
2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322,
- 2322, 202, 202, 202, 202, 202, 202, 202,
- 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330,
- 2331, 2332, 202, 202, 202, 202, 202, 202,
-
- 2333, 2333, 2333, 2334, 2334, 2334, 2334, 2334,
- 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334,
- 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334,
- 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334,
- 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2335,
- 2336, 2336, 2336, 2336, 2337, 2336, 2338, 2338,
- 2336, 2336, 2336, 2339, 2339, 202, 2340, 2341,
- 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349,
- 2350, 2351, 2351, 2351, 2352, 2353, 2353, 2354,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2356, 2357, 2358, 2355, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2359, 2359, 2360, 2361, 2361, 2361, 2361, 2361,
- 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361,
- 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361,
- 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361,
- 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361,
- 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361,
- 2361, 2361, 2361, 2360, 2360, 2360, 2359, 2359,
- 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2360,
- 2362, 2361, 2363, 2363, 2361, 2364, 2364, 2365,
- 2366, 2367, 2368, 2367, 2367, 2369, 2370, 2371,
- 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379,
- 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2386,
- 202, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
- 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
- 2387, 2387, 2387, 2387, 2387, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388,
- 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388,
- 2388, 2388, 202, 2388, 2388, 2388, 2388, 2388,
- 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388,
- 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388,
- 2388, 2388, 2388, 2388, 2389, 2389, 2389, 2390,
- 2390, 2390, 2389, 2389, 2390, 2391, 2392, 2390,
- 2393, 2393, 2394, 2393, 2393, 2394, 2395, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2396, 2396, 2396, 2396, 2396, 2396, 2396, 202,
- 2396, 202, 2396, 2396, 2396, 2396, 202, 2396,
+ 2322, 2322, 2322, 2318, 2315, 2319, 2315, 2323,
+
+ 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331,
+ 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331,
+ 2332, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2330, 2330, 2330, 2333, 2333,
+
+ 2334, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 221,
+
+ 221, 221, 2335, 2335, 2335, 2335, 2335, 2335,
+ 221, 221, 2335, 2335, 2335, 2335, 2335, 2335,
+ 221, 221, 2335, 2335, 2335, 2335, 2335, 2335,
+ 221, 221, 2335, 2335, 2335, 221, 221, 221,
+
+ 2336, 2337, 2338, 2320, 2339, 2337, 2337, 221,
+ 2340, 2341, 2341, 2341, 2341, 2340, 2340, 221,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 2342, 2342, 2342, 2343, 2344, 2345, 2345,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 221, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 221,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 221, 2346, 2346, 221, 2346,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 221, 221,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 221, 221,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 221, 221, 221, 221, 221,
+
+ 2347, 2348, 2347, 221, 221, 221, 221, 2349,
+ 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
+ 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
+ 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
+
+ 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
+ 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
+ 2349, 2349, 2349, 2349, 221, 221, 221, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2352, 2352, 2352,
+ 2352, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2352, 2354, 2355, 2356, 2356, 221,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1751, 221, 221, 221,
+
+ 2355, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1276, 221, 221,
+
+ 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357,
+ 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357,
+ 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357,
+ 2357, 2357, 2357, 2357, 2357, 221, 221, 221,
+
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+ 2358, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1155, 2359, 2359, 2359, 2359, 2359, 2359, 2359,
+ 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359,
+ 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359,
+ 2359, 2359, 2359, 2359, 221, 221, 221, 221,
+
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2361,
+
+ 2362, 2362, 2362, 2362, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 2363, 2363, 2363,
+ 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364,
+ 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364,
+
+ 2364, 2365, 2364, 2364, 2364, 2364, 2364, 2364,
+ 2364, 2364, 2365, 221, 221, 221, 221, 221,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2367, 2367,
+ 2367, 2367, 2367, 221, 221, 221, 221, 221,
+
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 221, 2369,
+
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+
+ 2370, 2370, 2370, 2370, 221, 221, 221, 221,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2371, 2372, 2372, 2372, 2372, 2372, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373,
+ 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373,
+ 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373,
+ 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373,
+
+ 2373, 2373, 2373, 2373, 2373, 2373, 2374, 2374,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
+
+ 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2376, 2376,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+
+ 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378,
+ 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378,
+ 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378,
+ 2378, 2378, 2378, 2378, 2378, 2378, 221, 221,
+
+ 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386,
+ 2387, 2388, 221, 221, 221, 221, 221, 221,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 221, 221, 221, 221,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 221, 221, 221, 221,
+
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+
+ 2392, 2392, 2392, 2392, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 2393,
+ 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394,
+ 2394, 2394, 2394, 221, 2394, 2394, 2394, 2394,
+
+ 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394,
+ 2394, 2394, 2394, 221, 2394, 2394, 2394, 2394,
+ 2394, 2394, 2394, 221, 2394, 2394, 221, 2395,
+ 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395,
+
+ 2395, 2395, 221, 2395, 2395, 2395, 2395, 2395,
+ 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395,
+ 2395, 2395, 221, 2395, 2395, 2395, 2395, 2395,
+ 2395, 2395, 221, 2395, 2395, 221, 221, 221,
+
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
- 2396, 2396, 2396, 2396, 2396, 2396, 202, 2396,
+
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
- 2396, 2397, 202, 202, 202, 202, 202, 202,
- 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398,
- 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398,
- 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398,
- 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398,
- 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398,
- 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2399,
- 2400, 2400, 2400, 2399, 2399, 2399, 2399, 2399,
- 2399, 2401, 2402, 202, 202, 202, 202, 202,
- 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410,
- 2411, 2412, 202, 202, 202, 202, 202, 202,
-
- 2413, 2414, 2415, 2415, 202, 2416, 2416, 2416,
- 2416, 2416, 2416, 2416, 2416, 202, 202, 2416,
- 2416, 202, 202, 2416, 2416, 2416, 2416, 2416,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2397, 2398, 2398, 1989, 1989, 1989, 221, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 221, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 221, 221, 221, 221, 221,
+
+ 2399, 2399, 2399, 2399, 2399, 2399, 323, 323,
+ 2399, 323, 2399, 2399, 2399, 2399, 2399, 2399,
+ 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399,
+ 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399,
+
+ 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399,
+ 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399,
+ 2399, 2399, 2399, 2399, 2399, 2399, 323, 2399,
+ 2399, 323, 323, 323, 2399, 323, 323, 2399,
+
+ 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400,
+ 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400,
+ 2400, 2400, 2400, 2400, 2400, 2400, 323, 2401,
+ 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402,
+
+ 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403,
+ 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403,
+ 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2404,
+ 2404, 2405, 2405, 2405, 2405, 2405, 2405, 2405,
+
+ 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406,
+ 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406,
+ 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406,
+ 2406, 2406, 2406, 2406, 2406, 2406, 2406, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 2407,
+ 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408,
+ 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408,
+ 2408, 2408, 2408, 323, 2408, 2408, 323, 323,
+ 323, 323, 323, 2409, 2409, 2409, 2409, 2409,
+
+ 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+ 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+ 2410, 2410, 2410, 2410, 2410, 2410, 2411, 2411,
+ 2411, 2411, 2412, 2412, 323, 323, 323, 2413,
+
+ 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414,
+ 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414,
+ 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414,
+ 2414, 2414, 323, 323, 323, 323, 323, 2415,
+
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
- 2416, 202, 2416, 2416, 2416, 2416, 2416, 2416,
- 2416, 202, 2416, 2416, 202, 2416, 2416, 2416,
- 2416, 2416, 202, 2417, 2418, 2416, 2419, 2415,
- 2414, 2415, 2415, 2415, 2415, 202, 202, 2415,
- 2415, 202, 202, 2420, 2420, 2421, 202, 202,
- 2422, 202, 202, 202, 202, 202, 202, 2419,
- 202, 202, 202, 202, 202, 2416, 2416, 2416,
- 2416, 2416, 2415, 2415, 202, 202, 2423, 2423,
- 2423, 2423, 2423, 2423, 2423, 202, 202, 202,
- 2423, 2423, 2423, 2423, 2423, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424,
- 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424,
- 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424,
- 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424,
- 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424,
- 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424,
- 2424, 2424, 2424, 2424, 2424, 2425, 2425, 2425,
- 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426,
- 2425, 2425, 2427, 2426, 2426, 2425, 2428, 2424,
- 2424, 2424, 2424, 2429, 2429, 2430, 2430, 2431,
- 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439,
- 2440, 2441, 2442, 2430, 202, 2431, 2443, 2444,
- 2445, 2445, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446,
- 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446,
- 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446,
- 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446,
- 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446,
- 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446,
- 2447, 2448, 2448, 2449, 2449, 2449, 2449, 2449,
- 2449, 2448, 2450, 2451, 2451, 2447, 2451, 2449,
- 2449, 2448, 2452, 2453, 2446, 2446, 2454, 2446,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462,
- 2463, 2464, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+
+ 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417,
+ 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417,
+ 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417,
+ 323, 323, 323, 323, 2418, 2418, 2417, 2417,
+
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 323, 323, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+
+ 2419, 2420, 2420, 2420, 323, 2420, 2420, 323,
+ 323, 323, 323, 323, 2420, 2421, 2420, 2422,
+ 2419, 2419, 2419, 2419, 323, 2419, 2419, 2419,
+ 323, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
+
+ 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
+ 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
+ 2419, 2419, 2419, 2419, 2423, 2423, 323, 323,
+ 2422, 2424, 2421, 323, 323, 323, 323, 2425,
+
+ 2426, 2427, 2428, 2429, 2430, 2430, 2430, 2430,
+ 2431, 323, 323, 323, 323, 323, 323, 323,
+ 2432, 2432, 2432, 2432, 2432, 2432, 2433, 2433,
+ 2434, 323, 323, 323, 323, 323, 323, 323,
+
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2436, 2436, 2437,
+
+ 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438,
+ 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438,
+ 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438,
+ 2438, 2438, 2438, 2438, 2438, 2439, 2439, 2439,
+
+ 2440, 2440, 2440, 2440, 2440, 2441, 2442, 2441,
+ 2443, 2441, 2441, 2442, 2442, 2444, 2441, 2441,
+ 2441, 2441, 2441, 2440, 2440, 2440, 2440, 2444,
+ 2440, 2440, 2440, 2440, 2440, 2441, 2440, 2440,
+
+ 2440, 2441, 2442, 2442, 2441, 2445, 2446, 323,
+ 323, 323, 323, 2447, 2447, 2447, 2447, 2448,
+ 2449, 2449, 2449, 2449, 2449, 2449, 2450, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2451, 2451, 2451, 323, 323,
+ 323, 2452, 2452, 2452, 2452, 2452, 2452, 2452,
+
+ 2453, 2453, 2453, 2453, 2453, 2453, 2453, 2453,
+ 2453, 2453, 2453, 2453, 2453, 2453, 2453, 2453,
+ 2453, 2453, 2453, 2453, 2453, 2453, 323, 323,
+ 2454, 2454, 2454, 2454, 2454, 2454, 2454, 2454,
+
+ 2455, 2455, 2455, 2455, 2455, 2455, 2455, 2455,
+ 2455, 2455, 2455, 2455, 2455, 2455, 2455, 2455,
+ 2455, 2455, 2455, 323, 323, 323, 323, 323,
+ 2456, 2456, 2456, 2456, 2456, 2456, 2456, 2456,
+
+ 2457, 2458, 2457, 2458, 2458, 2458, 2457, 2457,
+ 2457, 2458, 2457, 2457, 2458, 2457, 2458, 2458,
+ 2457, 2458, 323, 323, 323, 323, 323, 323,
+ 323, 2459, 2459, 2459, 2459, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 2460, 2460, 2460, 2460, 2461, 2461, 2462,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+ 2463, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
+
2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
- 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2466,
- 2467, 2467, 2468, 2468, 2468, 2468, 202, 202,
- 2467, 2467, 2469, 2469, 2468, 2468, 2467, 2470,
- 2471, 2472, 2473, 2473, 2474, 2474, 2475, 2475,
- 2475, 2473, 2476, 2476, 2476, 2476, 2476, 2476,
- 2476, 2476, 2476, 2476, 2476, 2476, 2476, 2476,
- 2477, 2477, 2477, 2477, 2478, 2478, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479,
- 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479,
- 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479,
- 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479,
- 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479,
- 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479,
- 2480, 2480, 2480, 2481, 2481, 2481, 2481, 2481,
- 2481, 2481, 2481, 2480, 2480, 2481, 2480, 2482,
- 2481, 2483, 2483, 2484, 2479, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492,
- 2493, 2494, 202, 202, 202, 202, 202, 202,
+ 2465, 2465, 2465, 323, 323, 323, 323, 323,
+ 323, 323, 2466, 2466, 2466, 2466, 2466, 2466,
+
+ 2467, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+ 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+ 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+ 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+
+ 2468, 2468, 2469, 2468, 2470, 2470, 2470, 2470,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478,
+ 2479, 2480, 323, 323, 323, 323, 323, 323,
+
+ 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488,
+ 2489, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
+ 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
+ 2490, 2490, 2490, 2490, 2490, 2490, 2490, 323,
+
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+ 2491, 2491, 323, 2492, 2492, 2493, 323, 323,
+ 2491, 2491, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 2494, 2494, 2494,
+
2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495,
- 2495, 2495, 2495, 2495, 2495, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496,
- 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496,
- 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496,
- 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496,
- 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496,
- 2496, 2496, 2496, 2497, 2498, 2497, 2498, 2498,
- 2497, 2497, 2497, 2497, 2497, 2497, 2499, 2500,
- 2501, 202, 202, 202, 202, 202, 202, 202,
- 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509,
- 2510, 2511, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
- 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
- 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
- 2512, 2512, 2513, 202, 202, 2514, 2514, 2514,
- 2515, 2515, 2514, 2514, 2514, 2514, 2515, 2514,
- 2514, 2514, 2514, 2516, 202, 202, 202, 202,
- 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524,
- 2525, 2526, 2527, 2527, 2528, 2528, 2528, 2529,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530,
- 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530,
- 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530,
- 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530,
- 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530,
- 2530, 2530, 2530, 2530, 2531, 2531, 2531, 2532,
- 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532,
- 2531, 2533, 2534, 2535, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536,
- 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536,
- 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536,
- 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536,
- 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537,
- 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537,
- 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537,
- 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537,
- 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545,
- 2546, 2547, 2548, 2548, 2548, 2548, 2548, 2548,
- 2548, 2548, 2548, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 2549,
-
- 2550, 2550, 2550, 2550, 2550, 2550, 2550, 202,
- 202, 2550, 202, 202, 2550, 2550, 2550, 2550,
- 2550, 2550, 2550, 2550, 202, 2550, 2550, 202,
+ 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495,
+ 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495,
+ 2495, 2495, 2495, 2495, 2495, 2496, 2496, 2496,
+
+ 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2495,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 2497, 2497, 2497, 2498, 2497, 2497, 2497, 2497,
+ 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
+
+ 2497, 2497, 2497, 2497, 2497, 2499, 2500, 2500,
+ 2501, 2501, 2501, 2500, 2501, 2500, 2500, 2500,
+ 2500, 2502, 2502, 2502, 2503, 2504, 2504, 2504,
+ 2504, 2504, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 2505, 2505, 2505, 2505, 2506, 2506, 2505, 2505,
+ 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505,
+
+ 2505, 2505, 2507, 2508, 2507, 2508, 2509, 2509,
+ 2509, 2509, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 2510, 2511, 2510, 2510, 2512, 2512, 2512, 2511,
+ 2510, 2512, 2512, 2510, 2510, 2512, 2510, 2510,
+
+ 2511, 2510, 2512, 2512, 2510, 2513, 2513, 2513,
+ 2513, 2514, 2515, 2516, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2517, 2517, 2517, 2517, 2517, 2517, 2517, 2517,
+ 2517, 2517, 2517, 2517, 2517, 2517, 2517, 2517,
+ 2517, 2517, 2517, 2517, 2517, 2517, 2517, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2518, 2519, 2518, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519,
+ 2519, 2519, 2519, 2519, 2519, 2519, 2521, 2522,
+ 2522, 2523, 2523, 2523, 2523, 2523, 221, 221,
+ 221, 221, 2524, 2525, 2526, 2527, 2528, 2529,
+ 2530, 2531, 2532, 2533, 2533, 2533, 2533, 2533,
+ 2533, 2533, 2533, 2533, 2533, 2533, 2534, 2535,
+ 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543,
+ 2544, 2545, 2545, 2546, 2546, 2545, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 2547,
+ 2548, 2548, 2549, 2550, 2550, 2550, 2550, 2550,
2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550,
2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550,
+ 2550, 2550, 2551, 2550, 2551, 2550, 2550, 2550,
2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550,
- 2551, 2552, 2552, 2552, 2552, 2552, 202, 2552,
- 2553, 202, 202, 2554, 2554, 2555, 2556, 2557,
- 2552, 2557, 2552, 2558, 2559, 2560, 2559, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568,
- 2569, 2570, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571,
- 202, 202, 2571, 2571, 2571, 2571, 2571, 2571,
- 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571,
+ 2550, 2550, 2550, 2551, 2550, 2550, 2550, 2550,
+ 2549, 2549, 2549, 2548, 2548, 2548, 2548, 2549,
+ 2549, 2552, 2553, 2554, 2554, 2555, 2556, 2556,
+ 2556, 2556, 2557, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 2558, 221, 221,
+ 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559,
+ 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559,
+ 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559,
+ 2559, 221, 221, 221, 221, 221, 221, 221,
+ 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567,
+ 2568, 2569, 221, 221, 221, 221, 221, 221,
+
+ 2570, 2570, 2570, 2571, 2571, 2571, 2571, 2571,
2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571,
2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571,
2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571,
- 2571, 2572, 2572, 2572, 2573, 2573, 2573, 2573,
- 202, 202, 2573, 2573, 2572, 2572, 2572, 2572,
- 2574, 2571, 2575, 2571, 2572, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2576, 2577, 2577, 2577, 2577, 2577, 2577, 2578,
- 2578, 2577, 2577, 2576, 2576, 2576, 2576, 2576,
- 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576,
- 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576,
- 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576,
- 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576,
- 2576, 2576, 2576, 2577, 2579, 2577, 2577, 2577,
- 2577, 2580, 2581, 2577, 2577, 2577, 2577, 2582,
- 2583, 2584, 2585, 2585, 2584, 2582, 2583, 2579,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2586, 2587, 2587, 2587, 2587, 2587, 2587, 2588,
- 2588, 2587, 2587, 2587, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2589, 2589, 2590, 2590,
- 2590, 2590, 2587, 2587, 2587, 2587, 2587, 2587,
- 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2588,
- 2587, 2591, 2592, 2593, 2593, 2594, 2595, 2595,
- 2595, 2592, 2592, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596,
- 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596,
- 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596,
- 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596,
- 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596,
- 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596,
- 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596,
- 2596, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
- 2597, 202, 2597, 2597, 2597, 2597, 2597, 2597,
- 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
- 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
- 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
- 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2598,
- 2599, 2599, 2599, 2599, 2599, 2599, 2599, 202,
- 2599, 2599, 2599, 2599, 2599, 2599, 2598, 2600,
- 2597, 2601, 2601, 2602, 2602, 2602, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610,
- 2611, 2612, 2613, 2613, 2613, 2613, 2613, 2613,
- 2613, 2613, 2613, 2613, 2613, 2613, 2613, 2613,
- 2613, 2613, 2613, 2613, 2613, 202, 202, 202,
- 2614, 2615, 2616, 2616, 2616, 2616, 2616, 2616,
- 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616,
- 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616,
- 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616,
- 202, 202, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 202, 2618, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2618, 2617, 2617, 2618, 2617, 2617, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2619, 2619, 2619, 2619, 2619, 2619, 2619, 202,
- 2619, 2619, 202, 2619, 2619, 2619, 2619, 2619,
- 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619,
- 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619,
- 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619,
- 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619,
- 2619, 2620, 2620, 2620, 2620, 2620, 2620, 202,
- 202, 202, 2620, 202, 2620, 2620, 202, 2620,
- 2620, 2620, 2621, 2620, 2622, 2622, 2623, 2620,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631,
- 2632, 2633, 202, 202, 202, 202, 202, 202,
- 2634, 2634, 2634, 2634, 2634, 2634, 202, 2634,
- 2634, 202, 2634, 2634, 2634, 2634, 2634, 2634,
- 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
- 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
- 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
- 2634, 2634, 2635, 2635, 2635, 2635, 2635, 202,
- 2636, 2636, 202, 2635, 2635, 2636, 2635, 2637,
- 2634, 202, 202, 202, 202, 202, 202, 202,
- 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645,
- 2646, 2647, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2649, 2649, 2650, 2650, 2651,
- 2651, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2652, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653,
- 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653,
- 2653, 2653, 2653, 2653, 2653, 2654, 2654, 2654,
- 2654, 2654, 2654, 2654, 2654, 2655, 2655, 2655,
- 2655, 2654, 2654, 2654, 2654, 2654, 2654, 2654,
- 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654,
- 2654, 2654, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 2656,
-
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
-
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
- 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2658,
- 2658, 2658, 2658, 2658, 2658, 2658, 2658, 2658,
- 2658, 2658, 2658, 2658, 2658, 2658, 2658, 2658,
- 2658, 2658, 2658, 2658, 2658, 2658, 2658, 2658,
- 2658, 2658, 2658, 2658, 2658, 2658, 2658, 2658,
- 2658, 2658, 2658, 2658, 2658, 2658, 2658, 2658,
- 2658, 2659, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2661, 2661, 2661, 2661, 2661,
- 2661, 2661, 2661, 2661, 2661, 2661, 2661, 202,
- 2662, 2662, 2662, 2662, 2663, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
-
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659,
- 2659, 2659, 2659, 2659, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2572,
+ 2573, 2573, 2573, 2573, 2574, 2573, 2575, 2575,
+ 2573, 2573, 2573, 2576, 2576, 221, 2577, 2578,
+ 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586,
+ 2587, 2588, 2588, 2588, 2589, 2590, 2590, 2591,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592,
+ 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592,
+ 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592,
+ 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592,
+ 2592, 2592, 2592, 2593, 2594, 2595, 2592, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2596, 2596, 2597, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2597, 2597, 2597, 2596, 2596,
+ 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2597,
+ 2599, 2598, 2600, 2600, 2598, 2601, 2601, 2602,
+ 2603, 2604, 2605, 2604, 2604, 2606, 2607, 2608,
+ 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616,
+ 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2623,
+ 221, 2624, 2624, 2624, 2624, 2624, 2624, 2624,
+ 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624,
+ 2624, 2624, 2624, 2624, 2624, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 221, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2626, 2626, 2626, 2627,
+ 2627, 2627, 2626, 2626, 2627, 2628, 2629, 2627,
+ 2630, 2630, 2631, 2630, 2630, 2631, 2632, 2633,
+ 2633, 2634, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2635, 2635, 2635, 2635, 2635, 2635, 2635, 221,
+ 2635, 221, 2635, 2635, 2635, 2635, 221, 2635,
+ 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635,
+ 2635, 2635, 2635, 2635, 2635, 2635, 221, 2635,
+ 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635,
+ 2635, 2636, 221, 221, 221, 221, 221, 221,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2638,
+ 2639, 2639, 2639, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2640, 2641, 221, 221, 221, 221, 221,
+ 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649,
+ 2650, 2651, 221, 221, 221, 221, 221, 221,
+
+ 2652, 2653, 2654, 2654, 221, 2655, 2655, 2655,
+ 2655, 2655, 2655, 2655, 2655, 221, 221, 2655,
+ 2655, 221, 221, 2655, 2655, 2655, 2655, 2655,
+ 2655, 2655, 2655, 2655, 2655, 2655, 2655, 2655,
+ 2655, 2655, 2655, 2655, 2655, 2655, 2655, 2655,
+ 2655, 221, 2655, 2655, 2655, 2655, 2655, 2655,
+ 2655, 221, 2655, 2655, 221, 2655, 2655, 2655,
+ 2655, 2655, 221, 2656, 2657, 2658, 2659, 2654,
+ 2653, 2654, 2654, 2654, 2654, 221, 221, 2654,
+ 2654, 221, 221, 2660, 2660, 2661, 221, 221,
+ 2662, 221, 221, 221, 221, 221, 221, 2659,
+ 221, 221, 221, 221, 221, 2658, 2655, 2655,
+ 2655, 2655, 2654, 2654, 221, 221, 2663, 2663,
+ 2663, 2663, 2663, 2663, 2663, 221, 221, 221,
+ 2663, 2663, 2663, 2663, 2663, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
@@ -4291,5321 +3779,6682 @@ static const unsigned short uc_property_trie[] = {
2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2665, 2665, 2665, 2666, 2666, 2666, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2666, 2664, 2664, 2664, 2665, 2666,
- 2665, 2666, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
-
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2665, 2666, 2666, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
-
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
- 2664, 2664, 2664, 2664, 2664, 2664, 2664, 202,
- 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2668,
- 2669, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
-
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2671, 2672,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
-
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
- 2670, 2670, 2670, 2670, 2670, 2670, 2670, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
-
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
- 2673, 202, 202, 202, 202, 202, 202, 202,
- 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674,
- 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674,
- 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674,
- 2674, 2674, 2674, 2674, 2674, 2674, 2674, 202,
- 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682,
- 2683, 2684, 202, 202, 202, 202, 2685, 2685,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
+ 2664, 2664, 2664, 2664, 2664, 2665, 2665, 2665,
+ 2666, 2666, 2666, 2666, 2666, 2666, 2666, 2666,
+ 2665, 2665, 2667, 2666, 2666, 2665, 2668, 2664,
+ 2664, 2664, 2664, 2669, 2669, 2670, 2670, 2671,
+ 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679,
+ 2680, 2681, 2682, 2670, 221, 2671, 2683, 2684,
+ 2685, 2685, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
- 2686, 2686, 2686, 2686, 2686, 2686, 202, 202,
- 2687, 2687, 2687, 2687, 2687, 2688, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689,
- 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689,
- 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689,
- 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689,
- 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689,
- 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689,
- 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2691,
- 2691, 2692, 2693, 2693, 2694, 2694, 2694, 2694,
- 2695, 2695, 2695, 2695, 2691, 2694, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703,
- 2704, 2705, 202, 2706, 2706, 2706, 2706, 2706,
- 2706, 2706, 202, 2689, 2689, 2689, 2689, 2689,
- 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689,
- 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689,
- 202, 202, 202, 202, 202, 2689, 2689, 2689,
- 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689,
- 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2707, 2707, 2707, 2707, 2707, 2707, 2707, 2707,
- 2707, 2707, 2707, 2707, 2707, 2707, 2707, 2707,
- 2707, 2707, 2707, 2707, 2707, 2707, 2707, 2707,
- 2707, 2707, 2707, 2707, 2707, 2707, 2707, 2707,
- 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
- 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
- 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
- 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
- 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709,
- 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709,
- 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2710,
- 2711, 2712, 2712, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713,
- 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713,
- 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713,
- 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713,
- 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713,
- 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713,
- 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713,
- 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713,
- 2713, 2713, 2713, 2713, 2713, 2714, 2714, 2714,
- 2714, 2714, 2714, 202, 202, 202, 202, 2715,
- 2713, 2716, 2716, 2716, 2716, 2716, 2716, 2716,
- 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716,
- 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716,
- 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716,
+ 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
+ 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
+ 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
+ 2687, 2688, 2688, 2689, 2689, 2689, 2689, 2689,
+ 2689, 2688, 2690, 2691, 2691, 2687, 2691, 2689,
+ 2689, 2688, 2692, 2693, 2686, 2686, 2694, 2686,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702,
+ 2703, 2704, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2705,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2705,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2705,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2705,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2705,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2706,
+ 2707, 2707, 2708, 2708, 2708, 2708, 221, 221,
+ 2707, 2707, 2709, 2709, 2708, 2708, 2707, 2710,
+ 2711, 2712, 2713, 2713, 2714, 2714, 2715, 2715,
+ 2715, 2713, 2716, 2716, 2716, 2716, 2716, 2716,
2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716,
- 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2717,
- 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
- 202, 202, 202, 202, 202, 202, 202, 2718,
- 2718, 2718, 2718, 2719, 2719, 2719, 2719, 2719,
- 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2720, 2721, 2722, 2723, 2724, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2725, 2725, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
-
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2727, 2727, 2727,
- 2727, 2727, 2728, 2728, 2728, 2728, 2728, 2728,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
- 2726, 2726, 2726, 2729, 2729, 2729, 2729, 2729,
- 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729,
-
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
-
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
- 2730, 2730, 2730, 2730, 2730, 2730, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729,
- 2729, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2731, 2732, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
-
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733,
- 2733, 2733, 2733, 2733, 2733, 2733, 2733, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2734, 2734, 2734, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 2735, 2735, 2735, 2735,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
+ 2717, 2717, 2717, 2717, 2718, 2718, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2720, 2720, 2720, 2721, 2721, 2721, 2721, 2721,
+ 2721, 2721, 2721, 2720, 2720, 2721, 2720, 2722,
+ 2721, 2723, 2723, 2724, 2719, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732,
+ 2733, 2734, 221, 221, 221, 221, 221, 221,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
- 2736, 2736, 2736, 2736, 202, 202, 202, 202,
-
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 202, 202, 202, 202, 202,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 2737, 2737, 2737, 202, 202, 202,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 202, 202, 202, 202, 202, 202, 202,
- 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
- 2737, 2737, 202, 202, 2738, 2739, 2740, 2741,
- 2742, 2742, 2742, 2742, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 202,
- 202, 1465, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2744, 2744,
- 2744, 2744, 2744, 2744, 2744, 2745, 2746, 2747,
- 2747, 2747, 2743, 2743, 2743, 2748, 2745, 2745,
- 2745, 2745, 2745, 2749, 2749, 2749, 2749, 2749,
- 2749, 2749, 2749, 2750, 2750, 2750, 2750, 2750,
- 2750, 2750, 2750, 2743, 2743, 2751, 2751, 2751,
- 2751, 2751, 2750, 2750, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2751, 2751, 2751, 2751, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2744, 2744, 2744, 2744, 2744,
- 2744, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743,
- 2743, 2743, 2743, 2743, 2743, 2743, 2752, 2752,
- 2752, 2752, 2752, 2752, 2752, 2752, 2752, 2752,
- 2752, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2753, 2753, 2753, 2130, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2754, 2754, 2754, 2754, 2754, 2754, 2754, 2754,
- 2754, 2754, 2754, 2754, 2754, 2754, 2754, 2754,
- 2754, 2754, 2754, 2754, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
- 1507, 1507, 1507, 1507, 1507, 1507, 1507, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
- 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
- 2755, 2755, 2754, 2754, 2754, 2754, 2754, 2754,
- 2754, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 202, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2756, 202, 2756, 2756,
- 202, 202, 2756, 202, 202, 2756, 2756, 202,
- 202, 2756, 2756, 2756, 2756, 202, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2757, 2757,
- 2757, 2757, 202, 2757, 202, 2757, 2757, 2757,
- 2757, 2758, 2757, 2757, 202, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
-
- 2757, 2757, 2757, 2757, 2756, 2756, 202, 2756,
- 2756, 2756, 2756, 202, 202, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 202, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 202, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2756, 2756, 202, 2756, 2756, 2756, 2756, 202,
- 2756, 2756, 2756, 2756, 2756, 202, 2756, 202,
- 202, 202, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 202, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
-
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 1457, 1457, 202, 202,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2759, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2760, 2757, 2757, 2757, 2757,
- 2757, 2757, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2759, 2757, 2757, 2757, 2757,
-
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2760, 2757, 2757,
- 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2759, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2760,
- 2757, 2757, 2757, 2757, 2757, 2757, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2759,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2760, 2757, 2757, 2757, 2757, 2757, 2757,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756,
- 2756, 2759, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
- 2757, 2757, 2757, 2760, 2757, 2757, 2757, 2757,
- 2757, 2757, 2761, 2762, 202, 202, 2763, 2764,
- 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772,
- 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770,
- 2771, 2772, 2763, 2764, 2765, 2766, 2767, 2768,
- 2769, 2770, 2771, 2772, 2763, 2764, 2765, 2766,
- 2767, 2768, 2769, 2770, 2771, 2772, 2763, 2764,
- 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772,
+ 2736, 2736, 2736, 2737, 2738, 2737, 2738, 2738,
+ 2737, 2737, 2737, 2737, 2737, 2737, 2739, 2740,
+ 2741, 2742, 221, 221, 221, 221, 221, 221,
+ 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750,
+ 2751, 2752, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2754, 221, 221, 2755, 2755, 2755,
+ 2756, 2756, 2755, 2755, 2755, 2755, 2757, 2755,
+ 2755, 2755, 2755, 2758, 221, 221, 221, 221,
+ 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766,
+ 2767, 2768, 2769, 2769, 2770, 2770, 2770, 2771,
+ 2772, 2772, 2772, 2772, 2772, 2772, 2772, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
-
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2773,
- 2773, 2773, 2773, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2774, 2773, 2773,
- 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2773, 2774, 2773, 2773, 2775,
- 2776, 2775, 2775, 2777, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 2774, 2774, 2774, 2774, 2774,
- 202, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 2778, 2778, 2778, 2778, 2778, 2778, 2778, 202,
- 2778, 2778, 2778, 2778, 2778, 2778, 2778, 2778,
- 2778, 2778, 2778, 2778, 2778, 2778, 2778, 2778,
- 2778, 202, 202, 2778, 2778, 2778, 2778, 2778,
- 2778, 2778, 202, 2778, 2778, 202, 2778, 2778,
- 2778, 2778, 2778, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
+ 2773, 2773, 2773, 2773, 2774, 2774, 2774, 2775,
+ 2775, 2775, 2775, 2775, 2775, 2775, 2775, 2775,
+ 2774, 2776, 2777, 2778, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
- 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
- 2779, 2779, 2779, 2779, 2779, 202, 202, 202,
- 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2781,
- 2781, 2781, 2781, 2781, 2781, 2781, 202, 202,
- 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789,
- 2790, 2791, 202, 202, 202, 202, 2779, 2792,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793,
+ 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780,
+ 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780,
+ 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780,
+ 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780,
+ 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788,
+ 2789, 2790, 2791, 2791, 2791, 2791, 2791, 2791,
+ 2791, 2791, 2791, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 2792,
+
+ 2793, 2793, 2793, 2793, 2793, 2793, 2793, 221,
+ 221, 2793, 221, 221, 2793, 2793, 2793, 2793,
+ 2793, 2793, 2793, 2793, 221, 2793, 2793, 221,
2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793,
2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793,
2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793,
- 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793,
- 2793, 2793, 2793, 2793, 2794, 2794, 2794, 2794,
- 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802,
- 2803, 2804, 202, 202, 202, 202, 202, 2805,
-
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
- 2806, 2806, 2806, 2806, 2806, 301, 301, 2807,
- 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807,
- 2808, 2808, 2808, 2808, 2808, 2808, 2808, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809,
- 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809,
- 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809,
- 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809,
- 2809, 2809, 2810, 2810, 2810, 2810, 2810, 2810,
- 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810,
- 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810,
- 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810,
- 2810, 2810, 2810, 2810, 2811, 2811, 2811, 2811,
- 2811, 2811, 2812, 2813, 301, 301, 301, 301,
- 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821,
- 2822, 2823, 301, 301, 301, 301, 2824, 2824,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 2825, 2825, 2825, 2825, 2825, 2825, 2825,
- 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825,
- 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825,
- 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825,
- 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825,
- 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825,
- 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825,
- 2825, 2825, 2825, 2825, 2826, 2825, 2825, 2825,
- 2827, 2825, 2825, 2825, 2825, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 301, 2828, 2828, 2828, 2828, 2828, 2828, 2828,
- 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828,
- 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828,
- 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828,
- 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828,
- 2828, 2828, 2828, 2828, 2828, 2828, 2829, 2828,
- 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828,
- 2828, 2828, 2828, 2828, 2828, 2828, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301,
-
- 2830, 2830, 2830, 2830, 348, 2830, 2830, 2830,
- 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
- 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
- 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
- 348, 2830, 2830, 348, 2830, 348, 348, 2830,
- 348, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
- 2830, 2830, 2830, 348, 2830, 2830, 2830, 2830,
- 348, 2830, 348, 2830, 348, 348, 348, 348,
- 348, 348, 2830, 348, 348, 348, 348, 2830,
- 348, 2830, 348, 2830, 348, 2830, 2830, 2830,
- 348, 2830, 2830, 348, 2830, 348, 348, 2830,
- 348, 2830, 348, 2830, 348, 2830, 348, 2830,
- 348, 2830, 2830, 348, 2830, 348, 348, 2830,
- 2830, 2830, 2830, 348, 2830, 2830, 2830, 2830,
- 2830, 2830, 2830, 348, 2830, 2830, 2830, 2830,
- 348, 2830, 2830, 2830, 2830, 348, 2830, 348,
- 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
- 2830, 2830, 348, 2830, 2830, 2830, 2830, 2830,
- 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
- 2830, 2830, 2830, 2830, 348, 348, 348, 348,
- 348, 2830, 2830, 2830, 348, 2830, 2830, 2830,
- 2830, 2830, 348, 2830, 2830, 2830, 2830, 2830,
- 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
- 2830, 2830, 2830, 2830, 348, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 348, 348,
- 2831, 2831, 348, 348, 348, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 348, 348,
-
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1733, 1733, 1733, 1733,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
- 1546, 1546, 1546, 1546, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1733,
- 1733, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1548,
- 1733, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1733, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 2832, 2832, 2833, 2834, 2835, 2836, 2837, 2838,
- 2839, 2840, 2841, 2842, 2842, 2843, 2843, 2843,
- 2844, 2844, 2844, 2844, 2844, 2844, 2844, 2844,
- 2844, 2844, 2844, 2844, 2844, 2844, 2844, 2844,
- 2844, 2844, 2844, 2844, 2844, 2844, 2844, 2844,
- 2844, 2844, 2844, 2844, 2844, 2844, 2844, 1597,
- 2845, 2846, 2845, 2845, 2845, 2845, 2845, 2845,
- 2845, 2845, 2845, 2845, 2845, 2846, 2845, 2846,
- 2845, 2845, 2846, 2845, 2845, 2845, 2846, 2845,
- 2845, 2845, 2844, 2844, 2844, 2844, 2844, 2847,
- 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2849,
- 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2849,
- 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848,
- 2848, 2848, 2850, 2850, 2851, 2843, 2843, 2843,
- 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848,
- 2848, 2849, 2848, 2849, 2849, 2848, 2848, 2849,
- 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848,
- 2848, 2848, 813, 813, 813, 813, 2852, 2852,
- 2844, 2852, 2852, 2852, 2852, 2852, 2852, 2852,
- 2852, 2852, 2852, 2853, 2853, 2853, 2853, 2853,
- 2853, 2853, 2853, 2853, 2853, 2853, 2853, 2853,
- 2853, 2853, 2853, 2853, 2853, 2843, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 2854, 2854,
- 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
- 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
- 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
-
- 2855, 2856, 2856, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
- 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
- 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
- 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
- 1716, 1716, 2856, 2856, 2856, 2856, 2856, 2856,
- 2856, 2856, 2856, 2857, 1733, 1733, 1733, 1733,
- 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
- 1716, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 2856, 2856, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 2858, 2858, 2858, 2858, 2858, 2858, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 2859, 2859, 2859,
- 1511, 1511, 1511, 1511, 1511, 1511, 1548, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1548, 2859, 2859,
- 1511, 1511, 1511, 1511, 1511, 1549, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1512, 1512, 1548, 1548,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1510, 1510, 1511,
- 1511, 1511, 1511, 1511, 1510, 1511, 1511, 1511,
- 1511, 1511, 1549, 1549, 1549, 1548, 1511, 1549,
- 1511, 1511, 1549, 2860, 2860, 1548, 1548, 2859,
- 2859, 2859, 2859, 2859, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 2859, 2859, 2859, 2861, 2861, 2861, 2861, 2861,
-
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1548,
- 1511, 1548, 1549, 1549, 1511, 1511, 1549, 1549,
- 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
- 1549, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1549, 1549,
- 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
- 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
- 1549, 1511, 1511, 1511, 1549, 1511, 1511, 1511,
- 1511, 1549, 1549, 1549, 1511, 1549, 1549, 1549,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1549,
- 1511, 1549, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1510, 1511, 1510, 1511, 1510, 1511, 1511, 1511,
- 1511, 1511, 1549, 1511, 1511, 1511, 1511, 1510,
- 1511, 1510, 1510, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1548, 1511, 1511, 1511, 1511, 1548, 1548, 2859,
-
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1512, 1512,
- 2862, 2862, 2862, 2862, 1512, 1512, 1512, 1512,
- 1512, 1512, 1548, 2859, 2859, 2859, 2859, 2859,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 2860, 2860, 1548, 1548,
- 1548, 1548, 2863, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 2860, 1548, 1548, 1548, 1548, 2860, 2860, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 2864, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1512, 1512, 1512, 1512,
- 1512, 1512, 1548, 1511, 1511, 1511, 1511, 1511,
-
- 2865, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 2865, 1511, 1511, 1511, 2865, 1511, 2865,
- 1511, 2865, 1511, 2865, 1511, 1511, 1511, 2865,
- 1511, 1511, 1511, 1511, 1511, 1511, 2865, 2865,
- 1511, 1511, 1511, 1511, 2865, 1511, 2865, 2865,
- 1511, 1511, 1511, 1511, 2865, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1548, 1548, 2859, 2859, 1549, 1549, 1549,
- 1511, 1511, 1511, 1549, 1549, 1549, 1549, 1549,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 2866, 2866,
- 2866, 2867, 2867, 2867, 1512, 1512, 1512, 1512,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1549, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1511, 1511, 1511, 1511, 1549, 1549, 1549, 1511,
- 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
- 1549, 1511, 1511, 1511, 1511, 1511, 1548, 1548,
- 1548, 1548, 1548, 1548, 2860, 1548, 1548, 1548,
- 2859, 2864, 2864, 2858, 2858, 2868, 2843, 2843,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1733, 1733, 1733,
- 1548, 1548, 1548, 1548, 2864, 2864, 2864, 2858,
- 2858, 2869, 2868, 2843, 2843, 1733, 1733, 1733,
-
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
- 1510, 1510, 1510, 1510, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 2869, 2869, 2869,
- 2869, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1733, 1733, 1733, 1733,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1733, 1733, 1733, 1733, 1733, 1733,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1733, 1733,
- 2843, 2843, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514,
- 1514, 1514, 1514, 1514, 2870, 2868, 2868, 2871,
- 2859, 2859, 2859, 2859, 2859, 2859, 2859, 2859,
- 2872, 2863, 2863, 2863, 2863, 2863, 2863, 2873,
- 2864, 2864, 2864, 2864, 2864, 2864, 2863, 2864,
+ 2794, 2795, 2795, 2795, 2795, 2795, 221, 2795,
+ 2796, 221, 221, 2797, 2797, 2798, 2799, 2800,
+ 2795, 2800, 2795, 2801, 2802, 2803, 2802, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811,
+ 2812, 2813, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 221, 221, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2815, 2815, 2815, 2816, 2816, 2816, 2816,
+ 221, 221, 2816, 2816, 2815, 2815, 2815, 2815,
+ 2817, 2814, 2818, 2814, 2815, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2819, 2820, 2820, 2820, 2820, 2820, 2820, 2821,
+ 2821, 2820, 2820, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2820, 2822, 2820, 2820, 2820,
+ 2820, 2823, 2824, 2820, 2820, 2820, 2820, 2825,
+ 2826, 2827, 2828, 2828, 2827, 2825, 2826, 2822,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2829, 2830, 2830, 2830, 2830, 2830, 2830, 2831,
+ 2831, 2830, 2830, 2830, 2829, 2829, 2829, 2829,
+ 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,
+ 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,
+ 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,
+ 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,
+ 2829, 2829, 2829, 2829, 2832, 2832, 2833, 2833,
+ 2833, 2833, 2830, 2830, 2830, 2830, 2830, 2830,
+ 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2831,
+ 2830, 2834, 2835, 2836, 2836, 2837, 2838, 2838,
+ 2838, 2835, 2835, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2839, 2839, 2839, 2839, 2839, 2839, 2839, 2839,
+ 2839, 2839, 2839, 2839, 2839, 2839, 2839, 2839,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 221, 221, 221, 221, 221, 221, 221,
+
+ 2841, 2841, 2841, 2841, 2841, 2841, 2841, 2841,
+ 2841, 2841, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2842, 2842, 2842, 2842, 2842, 2842, 2842, 2842,
+ 2842, 221, 2842, 2842, 2842, 2842, 2842, 2842,
+ 2842, 2842, 2842, 2842, 2842, 2842, 2842, 2842,
+ 2842, 2842, 2842, 2842, 2842, 2842, 2842, 2842,
+ 2842, 2842, 2842, 2842, 2842, 2842, 2842, 2842,
+ 2842, 2842, 2842, 2842, 2842, 2842, 2842, 2843,
+ 2844, 2844, 2844, 2844, 2844, 2844, 2844, 221,
+ 2844, 2844, 2844, 2844, 2844, 2844, 2843, 2845,
+ 2842, 2846, 2846, 2847, 2847, 2847, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855,
+ 2856, 2857, 2858, 2858, 2858, 2858, 2858, 2858,
2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858,
- 2863, 2873, 2873, 2863, 2863, 2863, 2863, 2863,
- 2863, 2863, 2864, 2864, 2863, 2863, 2863, 2868,
+ 2858, 2858, 2858, 2858, 2858, 221, 221, 221,
+ 2859, 2860, 2861, 2861, 2861, 2861, 2861, 2861,
+ 2861, 2861, 2861, 2861, 2861, 2861, 2861, 2861,
+ 2861, 2861, 2861, 2861, 2861, 2861, 2861, 2861,
+ 2861, 2861, 2861, 2861, 2861, 2861, 2861, 2861,
+ 221, 221, 2862, 2862, 2862, 2862, 2862, 2862,
+ 2862, 2862, 2862, 2862, 2862, 2862, 2862, 2862,
+ 2862, 2862, 2862, 2862, 2862, 2862, 2862, 2862,
+ 221, 2863, 2862, 2862, 2862, 2862, 2862, 2862,
+ 2862, 2863, 2862, 2862, 2863, 2862, 2862, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2864, 2864, 2864, 2864, 2864, 2864, 2864, 221,
+ 2864, 2864, 221, 2864, 2864, 2864, 2864, 2864,
2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2858, 2869, 2869, 2869,
2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2858,
- 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858,
- 2858, 2858, 2858, 2858, 2869, 2869, 2869, 2869,
- 2869, 2868, 2843, 2869, 2869, 2869, 2869, 2870,
- 2843, 1733, 2869, 2868, 2869, 2869, 2869, 2869,
- 2859, 2859, 2859, 2859, 2859, 2864, 2864, 2864,
2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2858, 2858, 2858, 2858, 2858, 2858,
- 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869,
- 2869, 2869, 2869, 2843, 2843, 2868, 2868, 2868,
- 2868, 2868, 2868, 2843, 2843, 2843, 2868, 2868,
- 2869, 2869, 2869, 2869, 2869, 2874, 2874, 2869,
- 2874, 2874, 2868, 2871, 2868, 2868, 2868, 2868,
- 2859, 2869, 2869, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2843, 1733, 2871, 2871, 2871,
- 2858, 2873, 2873, 2873, 2873, 2873, 2873, 2873,
- 2873, 2873, 2873, 2873, 2873, 2873, 2858, 2858,
- 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2869,
- 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869,
- 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869,
- 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869,
-
- 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
- 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
- 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
- 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
- 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
- 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
- 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
- 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
- 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
- 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
- 1598, 1598, 1598, 1598, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869,
- 2869, 2869, 2869, 2869, 2869, 2869, 1733, 1733,
- 2868, 2868, 2868, 2868, 2843, 1733, 1733, 1733,
- 2868, 2868, 2868, 1733, 1733, 1733, 1733, 1733,
- 2868, 2868, 2868, 2843, 2843, 2843, 2843, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 2868, 2868, 2868, 2868, 2868, 2868, 2843, 2843,
- 2843, 2843, 2843, 2843, 2843, 2843, 2843, 2843,
- 2843, 2843, 2843, 2843, 2843, 2843, 2843, 2843,
- 2843, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 2843, 2843, 2843, 2843, 2843, 2843, 2843, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 2843, 2843, 2843, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 2843, 2843, 2843, 2843, 2843, 2843, 2843, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 202, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882,
- 2883, 2884, 202, 202, 202, 202, 202, 202,
-
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 2885, 2885,
-
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
-
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
-
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
- 1728, 1728, 1728, 1728, 1728, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
-
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2887, 1733, 1733,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
-
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
-
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
-
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
-
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731,
- 1731, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
-
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
- 2888, 2888, 2888, 2888, 2888, 2888, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
-
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
- 1724, 1724, 1724, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
-
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 202, 202,
- 202, 202, 202, 202, 202, 202, 2885, 2885,
-
- 1403, 2749, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
-
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
-
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
- 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
-
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
-
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
- 2891, 2891, 2891, 2891, 2891, 2891, 2885, 2885
+ 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
+ 2864, 2865, 2865, 2865, 2865, 2865, 2865, 221,
+ 221, 221, 2865, 221, 2865, 2865, 221, 2865,
+ 2865, 2865, 2866, 2865, 2867, 2867, 2868, 2865,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876,
+ 2877, 2878, 221, 221, 221, 221, 221, 221,
+ 2879, 2879, 2879, 2879, 2879, 2879, 221, 2879,
+ 2879, 221, 2879, 2879, 2879, 2879, 2879, 2879,
+ 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879,
+ 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879,
+ 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879,
+ 2879, 2879, 2880, 2880, 2880, 2880, 2880, 221,
+ 2881, 2881, 221, 2880, 2880, 2881, 2880, 2882,
+ 2879, 221, 221, 221, 221, 221, 221, 221,
+ 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890,
+ 2891, 2892, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893,
+ 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893,
+ 2893, 2893, 2894, 2895, 2895, 2896, 2896, 2897,
+ 2897, 221, 221, 221, 221, 221, 221, 221,
+
+ 2898, 2898, 2899, 2900, 2901, 2901, 2901, 2901,
+ 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
+ 2901, 221, 2901, 2901, 2901, 2901, 2901, 2901,
+ 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
+ 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
+ 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
+ 2901, 2901, 2901, 2901, 2900, 2900, 2898, 2898,
+ 2898, 2898, 2898, 221, 221, 221, 2900, 2900,
+ 2898, 2902, 2903, 2904, 2904, 2905, 2905, 2905,
+ 2905, 2905, 2905, 2905, 2905, 2905, 2905, 2905,
+ 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913,
+ 2914, 2915, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2916, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
+ 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
+ 2917, 2917, 2917, 2917, 2917, 2918, 2918, 2918,
+ 2918, 2918, 2918, 2918, 2918, 2919, 2919, 2919,
+ 2919, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
+ 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
+ 2918, 2918, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 2920,
+
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2923, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2925, 2925, 2925, 2925, 2925,
+ 2925, 2925, 2925, 2925, 2925, 2925, 2925, 221,
+ 2926, 2926, 2926, 2926, 2927, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2929, 2929, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2931, 2931, 2931, 2932, 2932, 2932, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2932, 2930, 2930, 2930, 2931, 2932,
+ 2931, 2932, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2931, 2932, 2932, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2933,
+ 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2935,
+ 2936, 2937, 2937, 2937, 2938, 2939, 2938, 2939,
+ 2940, 2941, 2941, 2941, 2941, 2941, 2941, 2940,
+ 2940, 2940, 2940, 2940, 2940, 2940, 2940, 2940,
+ 2940, 2940, 2940, 2940, 2940, 2940, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2943, 2944,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 221, 221, 221, 221, 221, 221, 221,
+ 2946, 2946, 2946, 2946, 2946, 2946, 2946, 2946,
+ 2946, 2946, 2946, 2946, 2946, 2946, 2946, 2946,
+ 2946, 2946, 2946, 2946, 2946, 2946, 2946, 2946,
+ 2946, 2946, 2946, 2946, 2946, 2946, 2946, 221,
+ 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954,
+ 2955, 2956, 221, 221, 221, 221, 2957, 2957,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 221,
+ 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966,
+ 2967, 2968, 221, 221, 221, 221, 221, 221,
+ 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969,
+ 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969,
+ 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969,
+ 2969, 2969, 2969, 2969, 2969, 2969, 221, 221,
+ 2970, 2970, 2970, 2970, 2970, 2971, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2974,
+ 2974, 2975, 2976, 2976, 2977, 2977, 2977, 2977,
+ 2978, 2978, 2978, 2978, 2974, 2977, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986,
+ 2987, 2988, 221, 2989, 2989, 2989, 2989, 2989,
+ 2989, 2989, 221, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 221, 221, 221, 221, 221, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2990, 2990, 2990, 2990, 2990, 2990, 2990, 2990,
+ 2990, 2990, 2990, 2990, 2990, 2990, 2990, 2990,
+ 2990, 2990, 2990, 2990, 2990, 2990, 2990, 2990,
+ 2990, 2990, 2990, 2990, 2990, 2990, 2990, 2990,
+ 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+ 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+ 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+ 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+ 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992,
+ 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992,
+ 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2993,
+ 2994, 2995, 2995, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2997, 2997, 2997,
+ 2997, 2997, 2997, 221, 221, 221, 221, 2998,
+ 2996, 2999, 2999, 2999, 2999, 2999, 2999, 2999,
+ 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999,
+ 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999,
+ 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999,
+ 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999,
+ 2999, 2999, 2999, 2999, 2999, 2999, 2999, 3000,
+ 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,
+ 221, 221, 221, 221, 221, 221, 221, 3001,
+ 3001, 3001, 3001, 3002, 3002, 3002, 3002, 3002,
+ 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3003, 3004, 3005, 3006, 3007, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3008, 3008, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3010, 3010, 3010,
+ 3010, 3010, 3011, 3011, 3011, 3011, 3011, 3011,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3012, 3012, 3012, 3012, 3012,
+ 3012, 3012, 3012, 3012, 3012, 3012, 3012, 3012,
+
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3012, 3012, 3012, 3012, 3012, 3012, 3012, 3012,
+ 3012, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3014, 3014, 3014, 3014, 221, 3014, 3014, 3014,
+ 3014, 3014, 3014, 3014, 221, 3014, 3014, 221,
+
+ 3015, 3016, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3018,
+ 3019, 3019, 3019, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 3020, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3021, 3021, 3021, 221, 221, 3022, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 3023, 3023, 3023, 3023,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 221, 221, 221, 221,
+
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 221, 221, 221, 221, 221,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 221, 221, 221,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 221, 221, 221, 221, 221, 221, 221,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 221, 221, 3026, 3027, 3028, 3029,
+ 3030, 3030, 3030, 3030, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 221, 221,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 221,
+ 221, 1544, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3034, 3034,
+ 3034, 3034, 3034, 3034, 3034, 3035, 3036, 3037,
+ 3037, 3037, 3033, 3033, 3033, 3038, 3035, 3035,
+ 3035, 3035, 3035, 3039, 3039, 3039, 3039, 3039,
+ 3039, 3039, 3039, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3033, 3033, 3041, 3041, 3041,
+ 3041, 3041, 3040, 3040, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3041, 3041, 3041, 3041, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3034, 3034, 3034, 3034, 3034,
+ 3034, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3043, 3043, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 3044, 3044, 3044, 2353, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
+ 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
+ 3046, 3046, 3046, 3046, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
+ 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
+ 3047, 3047, 3046, 3046, 3046, 3046, 3046, 3046,
+ 3046, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 221, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 221, 3048, 3048,
+ 221, 221, 3048, 221, 221, 3048, 3048, 221,
+ 221, 3048, 3048, 3048, 3048, 221, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3049, 3049,
+ 3049, 3049, 221, 3049, 221, 3049, 3049, 3049,
+ 3049, 3050, 3049, 3049, 221, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+
+ 3049, 3049, 3049, 3049, 3048, 3048, 221, 3048,
+ 3048, 3048, 3048, 221, 221, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 221, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 221, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3048, 3048, 221, 3048, 3048, 3048, 3048, 221,
+ 3048, 3048, 3048, 3048, 3048, 221, 3048, 221,
+ 221, 221, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 221, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 1536, 1536, 221, 221,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3051, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3052, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3051, 3049, 3049, 3049, 3049,
+
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3052, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3051, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3052,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3051,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3052, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3051, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3052, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3053, 3054, 221, 221, 3055, 3056,
+ 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064,
+ 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062,
+ 3063, 3064, 3055, 3056, 3057, 3058, 3059, 3060,
+ 3061, 3062, 3063, 3064, 3055, 3056, 3057, 3058,
+ 3059, 3060, 3061, 3062, 3063, 3064, 3055, 3056,
+ 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064,
+
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3065,
+ 3065, 3065, 3065, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3066, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3066, 3065, 3065, 3067,
+ 3068, 3067, 3067, 3069, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 3066, 3066, 3066, 3066, 3066,
+ 221, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988,
+ 1988, 1988, 3070, 1988, 1988, 1988, 1988, 1988,
+ 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988,
+ 1988, 1988, 1988, 1988, 1988, 1988, 1988, 221,
+ 221, 221, 221, 221, 221, 3071, 3071, 3071,
+ 3071, 3071, 3071, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3072, 3072, 3072, 3072, 3072, 3072, 3072, 221,
+ 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072,
+ 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072,
+ 3072, 221, 221, 3072, 3072, 3072, 3072, 3072,
+ 3072, 3072, 221, 3072, 3072, 221, 3072, 3072,
+ 3072, 3072, 3072, 221, 221, 221, 221, 221,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 3074,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 221, 221, 221,
+ 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3077,
+ 3077, 3077, 3077, 3077, 3077, 3077, 221, 221,
+ 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085,
+ 3086, 3087, 221, 221, 221, 221, 3075, 3088,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3090, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+ 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+ 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+ 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+ 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+ 3091, 3091, 3091, 3091, 3092, 3092, 3092, 3092,
+ 3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100,
+ 3101, 3102, 221, 221, 221, 221, 221, 3103,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3105, 3106, 3106, 3107, 3108,
+ 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116,
+ 3117, 3118, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 221,
+ 3119, 3119, 3119, 3119, 221, 3119, 3119, 221,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 221,
+
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 323, 323, 3121,
+ 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121,
+ 3122, 3122, 3122, 3122, 3122, 3122, 3122, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 3123, 3123, 3123, 3123, 3123, 3123, 3123, 3123,
+ 3123, 3123, 3123, 3123, 3123, 3123, 3123, 3123,
+ 3123, 3123, 3123, 3123, 3123, 3123, 3123, 3123,
+ 3123, 3123, 3123, 3123, 3123, 3123, 3123, 3123,
+ 3123, 3123, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3125, 3125, 3125, 3125,
+ 3125, 3125, 3126, 3127, 323, 323, 323, 323,
+ 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135,
+ 3136, 3137, 323, 323, 323, 323, 3138, 3138,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3140, 3139, 3139, 3139,
+ 3141, 3139, 3139, 3139, 3139, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3143, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 3144, 3144, 3144, 3144, 437, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 437, 3144, 3144, 437, 3144, 437, 437, 3144,
+ 437, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 437, 3144, 3144, 3144, 3144,
+ 437, 3144, 437, 3144, 437, 437, 437, 437,
+ 437, 437, 3144, 437, 437, 437, 437, 3144,
+ 437, 3144, 437, 3144, 437, 3144, 3144, 3144,
+ 437, 3144, 3144, 437, 3144, 437, 437, 3144,
+ 437, 3144, 437, 3144, 437, 3144, 437, 3144,
+ 437, 3144, 3144, 437, 3144, 437, 437, 3144,
+ 3144, 3144, 3144, 437, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 437, 3144, 3144, 3144, 3144,
+ 437, 3144, 3144, 3144, 3144, 437, 3144, 437,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 437, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 437, 437, 437, 437,
+ 437, 3144, 3144, 3144, 437, 3144, 3144, 3144,
+ 3144, 3144, 437, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 3145, 3145, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+
+ 1681, 1681, 1681, 1681, 3146, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 3147, 3147, 3147, 3147,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
+ 1612, 1612, 1612, 1612, 1612, 1612, 1612, 3147,
+ 3147, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
+ 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1683,
+ 3147, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
+ 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1611,
+ 3147, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
+ 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 3148, 3148, 3149, 3150, 3151, 3152, 3153, 3154,
+ 3155, 3156, 3157, 3158, 3158, 3159, 3159, 3159,
+ 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160,
+ 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160,
+ 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160,
+ 3160, 3160, 3161, 3161, 3161, 3161, 3162, 3163,
+ 3164, 3165, 3164, 3164, 3164, 3164, 3164, 3164,
+ 3164, 3164, 3164, 3164, 3164, 3165, 3164, 3165,
+ 3164, 3164, 3165, 3164, 3164, 3164, 3165, 3164,
+ 3164, 3164, 3161, 3161, 3161, 3161, 3161, 3166,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3168,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3168,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167,
+ 3167, 3167, 3169, 3169, 3170, 3159, 3159, 3159,
+ 3171, 3171, 3167, 3167, 3167, 3167, 3167, 3167,
+ 3167, 3168, 3167, 3168, 3168, 3167, 3171, 3172,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167,
+ 3167, 3167, 3173, 3173, 3173, 3173, 3174, 3175,
+ 3161, 3174, 3174, 3174, 3174, 3174, 3174, 3174,
+ 3174, 3174, 3174, 3176, 3176, 3176, 3176, 3176,
+ 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176,
+ 3176, 3176, 3176, 3176, 3176, 3159, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3177, 3177,
+ 3177, 3177, 3177, 3177, 3177, 3177, 3177, 3177,
+ 3177, 3177, 3177, 3177, 3177, 3177, 3177, 3177,
+ 3177, 3177, 3177, 3177, 3177, 3177, 3177, 3177,
+
+ 3178, 3179, 3179, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891,
+ 1891, 1891, 3180, 1891, 1891, 1891, 1891, 1891,
+ 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891,
+ 1891, 1891, 1891, 1891, 1891, 1891, 1891, 3180,
+ 1891, 1891, 3179, 3179, 3179, 3179, 3179, 3179,
+ 3179, 3179, 3179, 3181, 3147, 3147, 3147, 3147,
+ 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891,
+ 1891, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3179, 3179, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3182, 3182, 3182, 3182, 3182, 3182, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 3183, 3183, 3183,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1683, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1683, 3183, 3183,
+ 1611, 1611, 1611, 1611, 1611, 1684, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1614, 1614, 1683, 1683,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1609, 1609, 1611,
+ 1611, 1611, 1611, 1611, 1609, 1611, 1611, 1611,
+ 1611, 1611, 1684, 1684, 1684, 3184, 1611, 1684,
+ 1611, 1611, 1684, 3185, 3185, 1683, 1683, 3183,
+ 3183, 3183, 3183, 3183, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1683, 1683, 1683, 3184, 1683, 1683, 1683,
+ 3183, 3183, 3183, 3186, 3186, 3186, 3186, 3186,
+
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1683,
+ 1611, 1683, 1684, 1684, 1611, 1611, 1684, 1684,
+ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
+ 1684, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1684, 1684,
+ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
+ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
+ 1684, 1611, 1611, 1611, 1684, 1611, 1611, 1611,
+ 1611, 1684, 1684, 1684, 1611, 1684, 1684, 1684,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1684,
+ 1611, 1684, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1609, 1611, 1609, 1611, 1609, 1611, 1611, 1611,
+ 1611, 1611, 1684, 1611, 1611, 1611, 1611, 1609,
+ 1611, 1609, 1609, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 3184, 1611, 1611, 1611, 1611, 1683, 1683, 3183,
+
+ 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1609,
+ 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609,
+ 1609, 1609, 1609, 1609, 1609, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1609, 1609, 1609, 1609, 1609, 1609,
+ 1609, 1609, 1609, 1609, 1609, 1609, 1613, 1613,
+ 3187, 3187, 3187, 3187, 1613, 1613, 1614, 1614,
+ 1614, 1614, 1683, 3183, 3183, 3183, 3183, 3188,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 3185, 3185, 1683, 1683,
+ 1683, 1683, 3189, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 3185, 1683, 1683, 1683, 1683, 3190, 3190, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 3191, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1683, 1611, 1611, 1611, 1611, 1611,
+
+ 3192, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 3192, 1611, 1611, 1611, 3192, 1611, 3192,
+ 1611, 3192, 1611, 3192, 1611, 1611, 1611, 3192,
+ 1611, 1611, 1611, 1611, 1611, 1611, 3192, 3192,
+ 1611, 1611, 1611, 1611, 3192, 1611, 3192, 3192,
+ 1611, 1611, 1611, 1611, 3192, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 3184, 3184, 3183, 3183, 1684, 1684, 1684,
+ 1611, 1611, 1611, 1684, 1684, 1684, 1684, 1684,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 3193, 3193,
+ 3193, 3194, 3194, 3194, 1613, 1613, 1613, 1613,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1684, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1684, 1684, 1684, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1684, 1611, 1611, 1611, 1611, 1611, 1683, 1683,
+ 1683, 1683, 1683, 1683, 3190, 1683, 1683, 1683,
+ 3183, 3191, 3191, 3195, 3195, 3196, 3197, 3197,
+ 3147, 3147, 3147, 3147, 3198, 3199, 3199, 3199,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 3184, 3184, 3147, 3147, 3147,
+ 1683, 1683, 1683, 1683, 3191, 3191, 3191, 3182,
+ 3182, 3200, 3196, 3197, 3197, 3147, 3147, 3147,
+
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3202, 3202, 3202, 3147,
+ 3147, 3147, 3147, 3202, 3202, 3202, 3202, 3202,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 3203, 3203, 3203,
+ 3203, 3202, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3196, 3196, 3196, 3196, 3196, 3196, 3196, 3196,
+ 3196, 3196, 3196, 3196, 3147, 3147, 3147, 3147,
+ 3199, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 3147, 3147, 3147, 3147,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 3147, 3147, 3147, 3147, 3147, 3147,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 3147, 3147,
+ 3159, 3159, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616,
+ 1616, 1616, 1616, 1616, 3204, 3196, 3196, 3205,
+ 3183, 3183, 3183, 3183, 3183, 3183, 3183, 3183,
+ 3206, 3189, 3189, 3189, 3189, 3189, 3189, 3207,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3189, 3191,
+ 3182, 3182, 3182, 3182, 3182, 3182, 3182, 3182,
+ 3189, 3207, 3207, 3189, 3189, 3189, 3189, 3189,
+ 3189, 3189, 3191, 3208, 3189, 3189, 3189, 3196,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3208, 3191,
+ 3191, 3191, 3191, 3191, 3182, 3200, 3200, 3200,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3191, 3191,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3191, 3182,
+ 3182, 3182, 3182, 3182, 3182, 3182, 3182, 3182,
+ 3182, 3182, 3182, 3182, 3200, 3200, 3200, 3200,
+ 3200, 3196, 3197, 3200, 3200, 3200, 3200, 3204,
+ 3197, 3199, 3200, 3196, 3200, 3200, 3200, 3200,
+ 3183, 3183, 3183, 3183, 3183, 3191, 3191, 3191,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3191, 3191,
+ 3191, 3191, 3182, 3182, 3182, 3182, 3182, 3182,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+ 3200, 3200, 3200, 3197, 3197, 3196, 3196, 3196,
+ 3196, 3196, 3196, 3197, 3197, 3197, 3196, 3196,
+ 3200, 3200, 3200, 3200, 3200, 3209, 3209, 3200,
+ 3209, 3209, 3196, 3205, 3196, 3196, 3196, 3196,
+ 3183, 3200, 3200, 3196, 3196, 3196, 3196, 3196,
+ 3196, 3196, 3196, 3197, 3199, 3205, 3205, 3205,
+ 3182, 3207, 3207, 3207, 3207, 3207, 3207, 3207,
+ 3207, 3207, 3207, 3207, 3207, 3207, 3182, 3182,
+ 3182, 3182, 3182, 3182, 3182, 3182, 3182, 3200,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3203,
+ 3203, 3203, 3203, 3203, 3203, 3203, 3147, 3147,
+ 3196, 3196, 3196, 3196, 3197, 3198, 3198, 3198,
+ 3196, 3196, 3196, 3199, 3199, 3147, 3147, 3147,
+ 3196, 3196, 3196, 3197, 3197, 3197, 3197, 3198,
+ 3198, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3196, 3196, 3196, 3196, 3196, 3196, 3197, 3197,
+ 3197, 3197, 3197, 3197, 3197, 3197, 3197, 3197,
+ 3197, 3197, 3197, 3197, 3197, 3197, 3197, 3197,
+ 3197, 3199, 3199, 3199, 3199, 3198, 3198, 3198,
+ 3197, 3197, 3197, 3197, 3197, 3197, 3197, 3199,
+ 3199, 3199, 3199, 3198, 3198, 3198, 3147, 3198,
+ 3197, 3197, 3197, 3211, 3211, 3211, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3198, 3198,
+ 3197, 3197, 3197, 3197, 3197, 3197, 3197, 3199,
+ 3199, 3199, 3198, 3198, 3147, 3147, 3147, 3147,
+ 3199, 3199, 3199, 3199, 3199, 3199, 3199, 3199,
+ 3198, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3212,
+ 3212, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 221, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220,
+ 3221, 3222, 221, 221, 221, 221, 221, 221,
+
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3223, 3223,
+
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1911, 1911,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1911, 1911, 1911,
+ 1911, 3225, 2223, 2223, 2223, 2223, 2223, 2223,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 2223, 2223,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3229, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3229, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3229,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3229,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3229,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 3223, 3223,
+
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 2223, 2223, 2223, 2223, 2223,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 3223, 3223,
+
+ 1468, 3039, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3223, 3223
};
-#define GET_PROP_INDEX(ucs4) \
- (ucs4 < 0x11000 \
- ? (uc_property_trie[uc_property_trie[ucs4>>5] + (ucs4 & 0x1f)]) \
- : (uc_property_trie[uc_property_trie[((ucs4 - 0x11000)>>8) + 0x880] + (ucs4 & 0xff)]))
-
-#define GET_PROP_INDEX_UCS2(ucs2) \
- (uc_property_trie[uc_property_trie[ucs2>>5] + (ucs2 & 0x1f)])
-
-static const Properties uc_properties[] = {
- { 9, 18, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 21, 0, 2 },
- { 9, 8, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 17, 5, 2 },
- { 9, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 2, 2, 37, 2, 2 },
- { 9, 8, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 38, 5, 2 },
- { 9, 9, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 38, 5, 2 },
- { 9, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 1, 1, 36, 1, 2 },
- { 9, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 21, 0, 2 },
- { 9, 8, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 21, 0, 2 },
- { 6, 9, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 35, 5, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 12, 3, 13, 2 },
- { 25, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 25, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 11, 3, 13, 2 },
- { 21, 10, 0, 0, -1, 1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 2, 13, 2 },
- { 26, 3, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 11, 2 },
- { 20, 3, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 11, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 10, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 2 },
- { 3, 2, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 11, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 0, 2 },
- { 26, 10, 0, 0, -1, 2, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -2, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3 },
- { 21, 10, 0, 0, -1, 2, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 22, 10, 0, 0, -1, -2, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 2, 13, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 19, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 12, 0, 2 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 26, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 22, 10, 0, 0, -1, -2, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 9, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 38, 3, 2 },
- { 6, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 5, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 23, 10, 0, 0, -1, 16, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 17, 4, 2 },
- { 29, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 26, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 5, 2, 0, 0, 2, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 3, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 2 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 743}, {0, 743}, {0, 775} }, 0, 10, 12, 6, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 12, 0, 2 },
- { 5, 2, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 24, 10, 0, 0, -1, -16, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 5, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 418}, {1, 415}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 121}, {0, 121}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {1, 421}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -232}, {0, -232}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 80, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 500}, {1, 500}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -121}, {0, 0}, {0, 0}, {0, -121} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -300}, {0, -300}, {0, -268} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 195}, {0, 195}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 210}, {0, 0}, {0, 0}, {0, 210} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 206}, {0, 0}, {0, 0}, {0, 206} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 205}, {0, 0}, {0, 0}, {0, 205} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 79}, {0, 0}, {0, 0}, {0, 79} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 202}, {0, 0}, {0, 0}, {0, 202} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 203}, {0, 0}, {0, 0}, {0, 203} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 207}, {0, 0}, {0, 0}, {0, 207} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 97}, {0, 97}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 211}, {0, 0}, {0, 0}, {0, 211} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 209}, {0, 0}, {0, 0}, {0, 209} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 163}, {0, 163}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 213}, {0, 0}, {0, 0}, {0, 213} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 130}, {0, 130}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 214}, {0, 0}, {0, 0}, {0, 214} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 218}, {0, 0}, {0, 0}, {0, 218} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 217}, {0, 0}, {0, 0}, {0, 217} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 219}, {0, 0}, {0, 0}, {0, 219} }, 0, 10, 12, 7, 3 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 56}, {0, 56}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 80, { {0, 2}, {0, 0}, {0, 1}, {0, 2} }, 0, 10, 12, 7, 3 },
- { 16, 0, 0, 0, -1, 0, 1, 80, { {0, 1}, {0, -1}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -2}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -79}, {0, -79}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 511}, {1, 511}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, -97}, {0, 0}, {0, 0}, {0, -97} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, -56}, {0, 0}, {0, 0}, {0, -56} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 4, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 4, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 6, 0, { {0, -130}, {0, 0}, {0, 0}, {0, -130} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {1, 1}, {0, 0}, {0, 0}, {1, 1} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, -163}, {0, 0}, {0, 0}, {0, -163} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {1, 3}, {0, 0}, {0, 0}, {1, 3} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 5}, {1, 5}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 7}, {1, 7}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, -195}, {0, 0}, {0, 0}, {0, -195} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, 69}, {0, 0}, {0, 0}, {0, 69} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, 71}, {0, 0}, {0, 0}, {0, 71} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 9}, {1, 9}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 11}, {1, 11}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 13}, {1, 13}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -210}, {0, -210}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -206}, {0, -206}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -205}, {0, -205}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -202}, {0, -202}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -203}, {0, -203}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 15}, {1, 15}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 17}, {1, 17}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -207}, {0, -207}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 19}, {1, 19}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 21}, {1, 21}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -209}, {0, -209}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -211}, {0, -211}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 23}, {1, 23}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 25}, {1, 25}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 27}, {1, 27}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 29}, {1, 29}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -213}, {0, -213}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -214}, {0, -214}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 31}, {1, 31}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -218}, {0, -218}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 33}, {1, 33}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 35}, {1, 35}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -69}, {0, -69}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -217}, {0, -217}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -71}, {0, -71}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -219}, {0, -219}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 37}, {1, 37}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 39}, {1, 39}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 17, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 17, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 2 },
- { 17, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 18, 8, 2 },
- { 28, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 18, 0, 2 },
- { 28, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 36 },
- { 17, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 28, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 28, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 2 },
- { 0, 17, 230, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 232, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 216, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 202, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 202, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 1, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 1, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 240, 5, -1, 0, 1, 204, { {0, 0}, {0, 84}, {0, 84}, {0, 116} }, 4, 4, 21, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 232, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 233, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1 },
- { 0, 17, 234, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1 },
- { 0, 17, 233, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1 },
- { 0, 17, 234, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1 },
- { 0, 17, 233, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 17, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 13, 0, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 },
- { 17, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 130}, {0, 130}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 25, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {0, 116}, {0, 0}, {0, 0}, {0, 116} }, 0, 10, 12, 7, 4 },
- { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 28, 10, 0, 0, -1, 0, 1, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 38}, {0, 0}, {0, 0}, {0, 38} }, 0, 10, 12, 7, 4 },
- { 25, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 37}, {0, 0}, {0, 0}, {0, 37} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 64}, {0, 0}, {0, 0}, {0, 64} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 63}, {0, 0}, {0, 0}, {0, 63} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 503}, {1, 503}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -38}, {0, -38}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -37}, {0, -37}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 507}, {1, 507}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -31}, {0, -31}, {0, 1} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -64}, {0, -64}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -63}, {0, -63}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 8} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -62}, {0, -62}, {0, -30} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -57}, {0, -57}, {0, -25} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -47}, {0, -47}, {0, -15} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -54}, {0, -54}, {0, -22} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, -8}, {0, -8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 6, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 46 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 46 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -86}, {0, -86}, {0, -54} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -80}, {0, -80}, {0, -48} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 7}, {0, 7}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -116}, {0, -116}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 5, 80, { {0, -60}, {0, 0}, {0, 0}, {0, -60} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, -96}, {0, -96}, {0, -64} }, 0, 10, 12, 6, 4 },
- { 26, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 14, 0, 0, 0, -1, 0, 7, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 7, 80, { {0, -7}, {0, 0}, {0, 0}, {0, -7} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, -130}, {0, 0}, {0, 0}, {0, -130} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 4, 17, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 12, 7, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 12, 7, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 12, 7, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 4, 17, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 5 },
- { 0, 17, 230, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 5 },
- { 0, 17, 230, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 5 },
- { 2, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 5 },
- { 14, 0, 0, 0, -1, 0, 6, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 15}, {0, 0}, {0, 0}, {0, 15} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, -15}, {0, -15}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 4, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 4, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 12, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 5 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 12, 7, 6 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 6 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 6 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 11, 6 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 12, 0, 6 },
- { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 467}, {1, 464}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 12, 6 },
- { 20, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 17, 0, 6 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 6 },
- { 27, 4, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 6 },
- { 13, 1, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 },
- { 0, 17, 220, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 230, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 222, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 228, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 10, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 11, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 12, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 13, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 14, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 15, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 16, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 17, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 18, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 19, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 19, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 20, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 21, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 22, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 20, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 7 },
- { 0, 17, 23, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 25, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 7 },
- { 0, 17, 24, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 0, 17, 25, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 7 },
- { 0, 17, 18, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 18, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 7 },
- { 18, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 7 },
- { 25, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 7 },
- { 25, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 12, 0, 7 },
- { 10, 5, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 8 },
- { 10, 5, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 8 },
- { 10, 5, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 2 },
- { 26, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 26, 13, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 25, 4, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 8 },
- { 27, 13, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 8 },
- { 25, 13, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 11, 8 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 0, 17, 230, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 230, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 30, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 31, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 32, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 25, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 2 },
- { 10, 13, 0, 5, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 8 },
- { 13, 13, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 },
- { 25, 13, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 8 },
- { 25, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 2 },
- { 18, 13, 0, 2, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 3, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 2, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 3, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 2, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 2, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 17, 13, 0, 1, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 0, 17, 27, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 28, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 29, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 30, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 31, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 32, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 33, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 34, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 4, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 4, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 220, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 3, 5, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 5, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 5, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 5, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 5, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 5, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 5, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 5, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 5, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 5, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 25, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 8 },
- { 25, 5, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 25, 5, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 11, 9, 8 },
- { 25, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 18, 13, 0, 2, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 0, 17, 35, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 18, 13, 0, 3, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 2, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 3, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 25, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 8 },
- { 0, 17, 230, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 10, 5, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 0, 17, 220, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 17, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 3, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 3, 2, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 2, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 2, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 2, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 2, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 2, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 2, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 2, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 2, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 3, 2, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 8 },
- { 29, 13, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 18, 13, 0, 2, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 25, 13, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 9 },
- { 25, 13, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 9 },
- { 10, 13, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 9 },
- { 18, 13, 0, 3, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 9 },
- { 0, 17, 36, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 9 },
- { 18, 13, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 9 },
- { 18, 13, 0, 2, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 9 },
- { 18, 13, 0, 3, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 9 },
- { 0, 17, 230, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 9 },
- { 0, 17, 220, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 9 },
- { 18, 13, 0, 2, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 3, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 3, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 10 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 10 },
- { 18, 13, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 10 },
- { 3, 1, 0, 0, 0, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 66 },
- { 3, 1, 0, 0, 1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 66 },
- { 3, 1, 0, 0, 2, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 66 },
- { 3, 1, 0, 0, 3, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 66 },
- { 3, 1, 0, 0, 4, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 66 },
- { 3, 1, 0, 0, 5, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 66 },
- { 3, 1, 0, 0, 6, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 66 },
- { 3, 1, 0, 0, 7, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 66 },
- { 3, 1, 0, 0, 8, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 66 },
- { 3, 1, 0, 0, 9, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 66 },
- { 18, 1, 0, 2, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 66 },
- { 0, 17, 230, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 66 },
- { 0, 17, 220, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 66 },
- { 17, 1, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 66 },
- { 29, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 66 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 66 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 11, 66 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 66 },
- { 17, 1, 0, 1, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 66 },
- { 0, 17, 220, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 66 },
- { 27, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 66 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 82 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 82 },
- { 17, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 82 },
- { 25, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 82 },
- { 25, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 82 },
- { 18, 1, 0, 3, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 95 },
- { 18, 1, 0, 2, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 95 },
- { 0, 17, 220, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 95 },
- { 25, 1, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 95 },
- { 18, 13, 0, 2, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 9 },
- { 18, 13, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 9 },
- { 18, 13, 0, 3, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 9 },
- { 18, 13, 0, 2, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 2, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 3, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 3, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 2, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 2, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 3, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 18, 13, 0, 2, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 0, 17, 220, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 10, 5, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 2 },
- { 0, 17, 220, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 230, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 220, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 27, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 28, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 29, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 11 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 18, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 0, 17, 0, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
- { 1, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 11 },
- { 0, 17, 7, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 11 },
- { 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 2 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 11 },
- { 17, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 12 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 12 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 12 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 12 },
- { 0, 17, 7, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 12 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 12 },
- { 1, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 12 },
- { 1, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 12 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 12 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 12 },
- { 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 12 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 12 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 12 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 12 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 12 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 12 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 12 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 12 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 12 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 12 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 12 },
- { 27, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 12 },
- { 5, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 12 },
- { 5, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 12 },
- { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 12 },
- { 27, 4, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 12 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 12 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 12 },
- { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 12 },
- { 0, 17, 0, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 13 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 13 },
- { 1, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 13 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 13 },
- { 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 13 },
- { 0, 17, 7, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 13 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 13 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 13 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 13 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 13 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 14 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 14 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 14 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 14 },
- { 0, 17, 7, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 14 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 14 },
- { 0, 17, 0, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 14 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 14 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 14 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 14 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 14 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 14 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 14 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 14 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 14 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 14 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 14 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 14 },
- { 27, 4, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 14 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 14 },
- { 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 14 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 15 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 15 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 15 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 15 },
- { 0, 17, 7, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 15 },
- { 1, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 15 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 15 },
- { 1, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 15 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 15 },
- { 0, 17, 0, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 15 },
- { 0, 17, 0, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 15 },
- { 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 15 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 15 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 15 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 15 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 15 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 15 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 15 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 15 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 15 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 15 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 15 },
- { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 15 },
- { 5, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 15 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 16 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 16 },
- { 18, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 16 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 16 },
- { 1, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 16 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 16 },
- { 1, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 16 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 16 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 16 },
- { 3, 0, 0, 0, 0, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 16 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 16 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 16 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 16 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 16 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 16 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 16 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 16 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 16 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 16 },
- { 5, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 16 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 16 },
- { 27, 4, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 16 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 17 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 17 },
- { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 17 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 17 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 17 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 17 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 17 },
- { 0, 17, 0, 5, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 17 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 17 },
- { 0, 17, 84, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 17 },
- { 0, 17, 91, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 17 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 17 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 17 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
- { 25, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 17 },
- { 5, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 17 },
- { 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 17 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 18 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 18 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 18 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 18 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 18 },
- { 0, 17, 7, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 18 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 18 },
- { 0, 0, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 18 },
- { 1, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 18 },
- { 1, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 18 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 18 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 18 },
- { 0, 17, 0, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 18 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 18 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 18 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 18 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 18 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 18 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 18 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 18 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 18 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 18 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 18 },
- { 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 18 },
- { 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 19 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 19 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 19 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 19 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 19 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 19 },
- { 0, 17, 9, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 19 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 19 },
- { 1, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 19 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 19 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 19 },
- { 1, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 19 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 19 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 19 },
- { 29, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 19 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 19 },
- { 5, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 19 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 19 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 19 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 19 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 19 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 19 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 19 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 19 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 19 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 19 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 19 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 19 },
- { 5, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 19 },
- { 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 19 },
- { 0, 17, 0, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 20 },
- { 1, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 20 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 20 },
- { 0, 17, 9, 5, -1, 0, 4, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 20 },
- { 1, 0, 0, 0, -1, 0, 4, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 20 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 20 },
- { 1, 0, 0, 0, -1, 0, 4, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 20 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 20 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 20 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 20 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 20 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 20 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 20 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 20 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 20 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 20 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 20 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 20 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 21 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 21 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 0, 33, 8, 21 },
- { 0, 17, 103, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 21 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 21 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 21 },
- { 0, 17, 107, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 21 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 21 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 21 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 22 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 22 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 22 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 0, 33, 8, 22 },
- { 0, 17, 118, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 22 },
- { 0, 17, 9, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 22 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 22 },
- { 0, 17, 122, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 22 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 22 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 22 },
- { 18, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 23 },
- { 29, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 0, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 0, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 23 },
- { 29, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 23 },
- { 0, 17, 220, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 3, 0, 0, 0, 0, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 23 },
- { 3, 0, 0, 0, 1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 23 },
- { 3, 0, 0, 0, 2, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 23 },
- { 3, 0, 0, 0, 3, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 23 },
- { 3, 0, 0, 0, 4, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 23 },
- { 3, 0, 0, 0, 5, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 23 },
- { 3, 0, 0, 0, 6, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 23 },
- { 3, 0, 0, 0, 7, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 23 },
- { 3, 0, 0, 0, 8, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 23 },
- { 3, 0, 0, 0, 9, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 23 },
- { 5, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 23 },
- { 29, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 23 },
- { 0, 17, 216, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 21, 10, 0, 0, -1, 1, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 23 },
- { 22, 10, 0, 0, -1, -1, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 23 },
- { 1, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 23 },
- { 18, 0, 0, 0, -1, 0, 2, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 23 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 23 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 23 },
- { 0, 17, 129, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 0, 17, 130, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 0, 17, 0, 5, -1, 0, 2, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 0, 17, 132, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 0, 17, 0, 5, -1, 0, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 0, 17, 0, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 1, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 17, 4, 23 },
- { 0, 17, 230, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 0, 17, 9, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 23 },
- { 0, 17, 0, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 23 },
- { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 23 },
- { 0, 17, 220, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 23 },
- { 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 23 },
- { 25, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 23 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 23 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 23 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 23 },
- { 29, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 25, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 0, 23 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 24 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 24 },
- { 18, 0, 0, 0, -1, 0, 4, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 24 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 24 },
- { 1, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 24 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 24 },
- { 0, 17, 0, 5, -1, 0, 4, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 24 },
- { 1, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 24 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 24 },
- { 0, 17, 7, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 24 },
- { 0, 17, 9, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 24 },
- { 0, 17, 9, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 24 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 24 },
- { 3, 0, 0, 0, 0, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 2, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 3, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 4, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 5, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 6, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 7, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 8, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 9, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 24 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 24 },
- { 0, 17, 220, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 24 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 24 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 24 },
- { 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 24 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 7264}, {0, 0}, {0, 0}, {0, 7264} }, 0, 10, 12, 7, 25 },
- { 14, 0, 0, 0, -1, 0, 13, 0, { {0, 7264}, {0, 0}, {0, 0}, {0, 7264} }, 0, 10, 12, 7, 25 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
- { 15, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
- { 15, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 25, 8, 26 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 25, 8, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 26, 8, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 26, 8, 26 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 26, 8, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 27, 8, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 27, 8, 26 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 27, 8, 26 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 27 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 27 },
- { 0, 17, 230, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 27 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 27 },
- { 25, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 27 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 27 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 5, 0, 0, 0, 1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 5, 0, 0, 0, 2, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 5, 0, 0, 0, 3, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 5, 0, 0, 0, 4, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 5, 0, 0, 0, 5, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 5, 0, 0, 0, 6, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 5, 0, 0, 0, 7, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 5, 0, 0, 0, 8, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 5, 0, 0, 0, 9, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 5, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 41}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 43}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 45}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 47}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 49}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 51}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 53}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 55}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 57}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 59}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 61}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 63}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 65}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 67}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 69}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 71}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 73}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 75}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 77}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 79}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 81}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 83}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 85}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 87}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 89}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 91}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 93}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 95}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 97}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 99}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 101}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 103}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 105}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 107}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 109}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 111}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 113}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 115}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 117}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 119}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 121}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 123}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 125}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 127}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 129}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 131}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 133}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 135}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 137}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 139}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 141}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 143}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 145}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 147}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 149}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 151}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 153}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 155}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 157}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 159}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 161}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 163}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 165}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 167}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 169}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 171}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 173}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 175}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 177}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 179}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 181}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 183}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 185}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 187}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 189}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 191}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 193}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 195}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 197}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 199}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 14, 0, 0, 0, -1, 0, 17, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, -8}, {0, -8}, {0, -8} }, 0, 10, 12, 6, 28 },
- { 20, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 29 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 29 },
- { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 29 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 29 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 29 },
- { 6, 9, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 30 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 30 },
- { 21, 10, 0, 0, -1, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 30 },
- { 22, 10, 0, 0, -1, -1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 30 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 31 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 4, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 31 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 31 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 42 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 42 },
- { 0, 17, 9, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 42 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 43 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 43 },
- { 0, 17, 9, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 43 },
- { 25, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 2 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 44 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 44 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 45 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 45 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 32 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 32 },
- { 1, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 32 },
- { 0, 17, 9, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 32 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 32 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 32 },
- { 17, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 32 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 32 },
- { 27, 4, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 32 },
- { 0, 17, 230, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 32 },
- { 3, 0, 0, 0, 0, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 32 },
- { 3, 0, 0, 0, 1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 32 },
- { 3, 0, 0, 0, 2, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 32 },
- { 3, 0, 0, 0, 3, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 32 },
- { 3, 0, 0, 0, 4, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 32 },
- { 3, 0, 0, 0, 5, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 32 },
- { 3, 0, 0, 0, 6, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 32 },
- { 3, 0, 0, 0, 7, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 32 },
- { 3, 0, 0, 0, 8, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 32 },
- { 3, 0, 0, 0, 9, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 32 },
- { 5, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 32 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 33 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 11, 2 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 33 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 20, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 33 },
- { 25, 10, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 33 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 11, 33 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 33 },
- { 25, 10, 0, 1, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 33 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 33 },
- { 10, 18, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 4, 4, 33 },
- { 3, 0, 0, 0, 0, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
- { 3, 0, 0, 0, 1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
- { 3, 0, 0, 0, 2, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
- { 3, 0, 0, 0, 3, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
- { 3, 0, 0, 0, 4, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
- { 3, 0, 0, 0, 5, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
- { 3, 0, 0, 0, 6, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
- { 3, 0, 0, 0, 7, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
- { 3, 0, 0, 0, 8, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
- { 3, 0, 0, 0, 9, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
- { 18, 0, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 33 },
- { 17, 0, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 33 },
- { 18, 0, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 33 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 33 },
- { 0, 17, 228, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 33 },
- { 18, 0, 0, 2, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 33 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 47 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 47 },
- { 0, 17, 0, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 47 },
- { 1, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 47 },
- { 0, 17, 222, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 47 },
- { 0, 17, 230, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 47 },
- { 0, 17, 220, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 47 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 47 },
- { 25, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 47 },
- { 3, 0, 0, 0, 0, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 47 },
- { 3, 0, 0, 0, 1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 47 },
- { 3, 0, 0, 0, 2, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 47 },
- { 3, 0, 0, 0, 3, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 47 },
- { 3, 0, 0, 0, 4, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 47 },
- { 3, 0, 0, 0, 5, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 47 },
- { 3, 0, 0, 0, 6, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 47 },
- { 3, 0, 0, 0, 7, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 47 },
- { 3, 0, 0, 0, 8, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 47 },
- { 3, 0, 0, 0, 9, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 47 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 48 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 56 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 56 },
- { 3, 0, 0, 0, 0, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 56 },
- { 3, 0, 0, 0, 1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 56 },
- { 3, 0, 0, 0, 2, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 56 },
- { 3, 0, 0, 0, 3, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 56 },
- { 3, 0, 0, 0, 4, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 56 },
- { 3, 0, 0, 0, 5, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 56 },
- { 3, 0, 0, 0, 6, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 56 },
- { 3, 0, 0, 0, 7, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 56 },
- { 3, 0, 0, 0, 8, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 56 },
- { 3, 0, 0, 0, 9, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 56 },
- { 5, 0, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 56 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 56 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 32 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 55 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 55 },
- { 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 55 },
- { 1, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 55 },
- { 0, 17, 0, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 55 },
- { 25, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 55 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 78 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 78 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 78 },
- { 0, 17, 9, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 78 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 78 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 78 },
- { 0, 17, 220, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 78 },
- { 3, 0, 0, 0, 0, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 78 },
- { 3, 0, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 78 },
- { 3, 0, 0, 0, 2, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 78 },
- { 3, 0, 0, 0, 3, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 78 },
- { 3, 0, 0, 0, 4, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 78 },
- { 3, 0, 0, 0, 5, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 78 },
- { 3, 0, 0, 0, 6, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 78 },
- { 3, 0, 0, 0, 7, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 78 },
- { 3, 0, 0, 0, 8, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 78 },
- { 3, 0, 0, 0, 9, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 78 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 78 },
- { 17, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 78 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 12, 78 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 2, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 0, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 62 },
- { 1, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 62 },
- { 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 62 },
- { 18, 0, 0, 0, -1, 0, 9, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 62 },
- { 0, 17, 7, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 62 },
- { 1, 0, 0, 0, -1, 0, 9, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 62 },
- { 1, 0, 0, 0, -1, 0, 9, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 62 },
- { 1, 0, 9, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 62 },
- { 3, 0, 0, 0, 0, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
- { 3, 0, 0, 0, 1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
- { 3, 0, 0, 0, 2, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
- { 3, 0, 0, 0, 3, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
- { 3, 0, 0, 0, 4, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
- { 3, 0, 0, 0, 5, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
- { 3, 0, 0, 0, 6, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
- { 3, 0, 0, 0, 7, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
- { 3, 0, 0, 0, 8, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
- { 3, 0, 0, 0, 9, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
- { 25, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 62 },
- { 25, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 62 },
- { 25, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 62 },
- { 29, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 62 },
- { 0, 17, 230, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 62 },
- { 0, 17, 220, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 62 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 67 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 67 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 67 },
- { 1, 0, 9, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 67 },
- { 0, 17, 9, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 67 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 67 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 67 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 67 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 67 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 67 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 67 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 67 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 67 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 67 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 67 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 67 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 67 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 93 },
- { 0, 17, 7, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 93 },
- { 1, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 93 },
- { 0, 17, 0, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 93 },
- { 1, 0, 9, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 93 },
- { 25, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 93 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 68 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 68 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 68 },
- { 0, 17, 7, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 68 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 68 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 68 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 68 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 68 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 68 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 68 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 68 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 68 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 68 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 68 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 68 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 68 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 69 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 69 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 69 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 69 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 69 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 69 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 69 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 69 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 69 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 69 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 69 },
- { 17, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 69 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 69 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6254}, {0, -6254}, {0, -6222} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6253}, {0, -6253}, {0, -6221} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6244}, {0, -6244}, {0, -6212} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6242}, {0, -6242}, {0, -6210} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6243}, {0, -6243}, {0, -6211} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6236}, {0, -6236}, {0, -6204} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6181}, {0, -6181}, {0, -6180} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {1, 201}, {1, 201}, {1, 719} }, 0, 10, 12, 6, 5 },
- { 14, 0, 0, 0, -1, 0, 20, 0, { {0, -3008}, {0, 0}, {0, 0}, {0, -3008} }, 0, 10, 12, 8, 25 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 67 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 0, 17, 1, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 2 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 0, 17, 230, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 1, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 2 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 17, 0, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 17, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 17, 0, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 203}, {1, 203}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 3814}, {0, 3814}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 205}, {1, 205}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 0, 17, 230, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 234, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 214, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 202, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 232, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 228, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 233, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 514}, {1, 514}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 517}, {1, 517}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 520}, {1, 520}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 523}, {1, 523}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 526}, {1, 526}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 2, 81, { {0, 0}, {0, -59}, {0, -59}, {0, -58} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {0, -7615}, {0, 0}, {0, 0}, {0, -7615} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 8}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {0, 0}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 529}, {1, 529}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 532}, {1, 532}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 536}, {1, 536}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 540}, {1, 540}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 74}, {0, 74}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 74}, {0, 74}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 86}, {0, 86}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 86}, {0, 86}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 100}, {0, 100}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 100}, {0, 100}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 128}, {0, 128}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 128}, {0, 128}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 112}, {0, 112}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 112}, {0, 112}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 126}, {0, 126}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 126}, {0, 126}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 578}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 581}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 584}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 587}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 590}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 593}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 596}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 599}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 578}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 581}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 584}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 587}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 590}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 593}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 596}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 599}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 602}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 605}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 608}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 611}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 614}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 617}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 620}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 623}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 602}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 605}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 608}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 611}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 614}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 617}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 620}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 623}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 626}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 629}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 632}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 635}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 638}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 641}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 644}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 647}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 626}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 629}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 632}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 635}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 638}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 641}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 644}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 647}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 662}, {1, 659}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 650}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 668}, {1, 665}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 544}, {1, 544}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 699}, {1, 695}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -74}, {0, 0}, {0, 0}, {0, -74} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -74}, {0, 0}, {0, 0}, {0, -74} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 650}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, -7205}, {0, -7205}, {0, -7173} }, 0, 10, 12, 6, 4 },
- { 28, 10, 0, 0, -1, 0, 1, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 674}, {1, 671}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 653}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 680}, {1, 677}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 547}, {1, 547}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 707}, {1, 703}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -86}, {0, 0}, {0, 0}, {0, -86} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -86}, {0, 0}, {0, 0}, {0, -86} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 653}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 550}, {1, 550}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {1, 503}, {1, 503}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 554}, {1, 554}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 557}, {1, 557}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -100}, {0, 0}, {0, 0}, {0, -100} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -100}, {0, 0}, {0, 0}, {0, -100} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 561}, {1, 561}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {1, 507}, {1, 507}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 565}, {1, 565}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 7}, {0, 7}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 568}, {1, 568}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 571}, {1, 571}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -112}, {0, 0}, {0, 0}, {0, -112} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -112}, {0, 0}, {0, 0}, {0, -112} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -7}, {0, 0}, {0, 0}, {0, -7} }, 0, 10, 12, 7, 4 },
- { 28, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 686}, {1, 683}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 656}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 692}, {1, 689}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 575}, {1, 575}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 715}, {1, 711}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -128}, {0, 0}, {0, 0}, {0, -128} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -128}, {0, 0}, {0, 0}, {0, -128} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -126}, {0, 0}, {0, 0}, {0, -126} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -126}, {0, 0}, {0, 0}, {0, -126} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 656}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 4 },
- { 28, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 4 },
- { 6, 9, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 2 },
- { 6, 9, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 2 },
- { 6, 9, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 5, 2 },
- { 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 20, 4, 2 },
- { 10, 18, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 10, 18, 0, 1, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 5, 5, 32, 4, 1 },
- { 10, 0, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 10, 1, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 0, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 11, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 11, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 23, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 3, 13, 2 },
- { 24, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 3, 13, 2 },
- { 21, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 23, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 24, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 15, 10, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 15, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 17, 0, 2 },
- { 7, 9, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 38, 3, 2 },
- { 8, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 38, 3, 2 },
- { 10, 11, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 10, 14, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 10, 16, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 10, 12, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 10, 15, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 6, 6, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 4, 5, 2 },
- { 25, 4, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 23, 10, 0, 0, -1, 1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 24, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 2 },
- { 26, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 0, 2 },
- { 22, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 25, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 19, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 6, 9, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 2 },
- { 10, 18, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 22, 4, 2 },
- { 10, 18, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 12, 4, 2 },
- { 10, 18, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 12, 4, 2 },
- { 13, 18, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 12, 0, 0 },
- { 10, 19, 0, 0, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 10, 20, 0, 0, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 10, 21, 0, 0, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 10, 22, 0, 0, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 5, 2, 0, 0, 0, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 5, 2, 0, 0, 4, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 5, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 6, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 7, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 8, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 9, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 3, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 21, 10, 0, 0, -1, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, -1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 17, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 27, 4, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 14, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 13, 4, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 0 },
- { 2, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 2, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 2, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 1, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 220, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 1, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -7517}, {0, 0}, {0, 0}, {0, -7517} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {1, 207}, {0, 0}, {0, 0}, {1, 207} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {1, 209}, {0, 0}, {0, 0}, {1, 209} }, 0, 10, 12, 7, 3 },
- { 29, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 28}, {0, 0}, {0, 0}, {0, 28} }, 0, 10, 12, 7, 3 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 15, 0, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 },
- { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 15, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 },
- { 15, 0, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 },
- { 14, 0, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
- { 26, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, -28}, {0, -28}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 4, 0, 0, 0, -1, 0, 1, 80, { {0, 16}, {0, 0}, {0, 0}, {0, 16} }, 0, 10, 12, 7, 3 },
- { 4, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -16}, {0, -16}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 4, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 },
- { 4, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 },
- { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 3, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 3, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -3, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -3, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 2016, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 2527, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 1923, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 1914, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 1918, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 2250, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 138, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 7, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -7, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 1, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -1, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 1824, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 2104, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 2108, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 2106, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 1316, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -138, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 15, 0, 2 },
- { 26, 10, 0, 0, -1, 8, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 7, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -8, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -7, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 21, 10, 0, 0, -1, 1, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, -1, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 2, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 3, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 4, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 5, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 6, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 7, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 8, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 9, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 26}, {0, 0}, {0, 0}, {0, 26} }, 0, 10, 12, 7, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -26}, {0, -26}, {0, 0} }, 0, 10, 12, 6, 2 },
- { 5, 10, 0, 0, 0, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 2, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 3, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 4, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 5, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 6, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 7, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 8, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 9, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 0, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 2 },
- { 21, 10, 0, 0, -1, 1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, -1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 5, 10, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 21, 10, 0, 0, -1, 1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, -1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 26, 10, 0, 0, -1, 1, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -1, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 2, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -2, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -1316, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 21, 10, 0, 0, -1, 1, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, -1, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 54 },
- { 21, 10, 0, 0, -1, 3, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, 1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 21, 10, 0, 0, -1, -1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, -3, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 26, 10, 0, 0, -1, -1914, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -1918, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -1923, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -1824, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -2016, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 6, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -2104, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -2106, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -2108, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, -2250, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, -2527, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 12, 7, 57 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 12, 6, 57 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {1, 211}, {0, 0}, {0, 0}, {1, 211} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, -3814}, {0, 0}, {0, 0}, {0, -3814} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {1, 213}, {0, 0}, {0, 0}, {1, 213} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {1, 215}, {1, 215}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {1, 217}, {1, 217}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 219}, {0, 0}, {0, 0}, {1, 219} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 221}, {0, 0}, {0, 0}, {1, 221} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 223}, {0, 0}, {0, 0}, {1, 223} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 225}, {0, 0}, {0, 0}, {1, 225} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 17, 0, 0, 0, -1, 0, 10, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 227}, {0, 0}, {0, 0}, {1, 227} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 229}, {0, 0}, {0, 0}, {1, 229} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 46 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 46 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 46 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 46 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 46 },
- { 15, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 46 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 46 },
- { 14, 0, 0, 0, -1, 0, 13, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 46 },
- { 15, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 46 },
- { 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 46 },
- { 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 46 },
- { 5, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 46 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -7264}, {0, -7264}, {0, 0} }, 0, 10, 12, 6, 25 },
- { 15, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, -7264}, {0, -7264}, {0, 0} }, 0, 10, 12, 6, 25 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 58 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 58 },
- { 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 58 },
- { 25, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 58 },
- { 0, 17, 9, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 58 },
- { 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 23, 10, 0, 0, -1, 1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 24, 10, 0, 0, -1, -1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 20, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 20, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 23, 10, 0, 0, -1, 1, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 24, 10, 0, 0, -1, -1, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 2 },
- { 17, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 25, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 20, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 20, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 21, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 25, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 37 },
- { 29, 10, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 37 },
- { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 2 },
- { 4, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 2 },
- { 22, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 0, 17, 218, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 228, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 222, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 1, 0, 224, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 26 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 21, 8, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 4, 0, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 17, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 2 },
- { 25, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 34 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 34 },
- { 18, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 34 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 34 },
- { 0, 17, 8, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 34 },
- { 17, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 34 },
- { 18, 0, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 34 },
- { 20, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 0, 2 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 35 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 35 },
- { 18, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 35 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 35 },
- { 17, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 35 },
- { 18, 0, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 35 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 26 },
- { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 5, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 35 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 26 },
- { 29, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 26 },
- { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 5, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 5, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 26 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 0, 35 },
- { 29, 0, 0, 0, -1, 0, 22, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 13, 0, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 38 },
- { 17, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 38 },
- { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 38 },
- { 29, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 38 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 83 },
- { 17, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 83 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 83 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 83 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 70 },
- { 17, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 70 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 70 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 70 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 70 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 70 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 70 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 70 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 70 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 70 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 70 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 70 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 70 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 70 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 70 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 5 },
- { 2, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 5 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 5 },
- { 0, 17, 230, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 5 },
- { 17, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 5 },
- { 17, 0, 0, 0, -1, 0, 16, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 0, 17, 230, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 5 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 84 },
- { 4, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 84 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 84 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 84 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 84 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 84 },
- { 28, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 28, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 2 },
- { 17, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 28, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 231}, {0, 0}, {0, 0}, {1, 231} }, 0, 10, 12, 7, 3 },
- { 28, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 12, 0, { {1, 233}, {0, 0}, {0, 0}, {1, 233} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 },
- { 14, 0, 0, 0, -1, 0, 12, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 13, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 48}, {0, 48}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 13, 0, { {1, 235}, {0, 0}, {0, 0}, {1, 235} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 237}, {0, 0}, {0, 0}, {1, 237} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 239}, {0, 0}, {0, 0}, {1, 239} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 241}, {0, 0}, {0, 0}, {1, 241} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 18, 0, { {1, 243}, {0, 0}, {0, 0}, {1, 243} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 245}, {0, 0}, {0, 0}, {1, 245} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 247}, {0, 0}, {0, 0}, {1, 247} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 17, 0, { {1, 249}, {0, 0}, {0, 0}, {1, 249} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 17, 0, { {0, 928}, {0, 0}, {0, 0}, {0, 928} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 17, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 20, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 21, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 21, 0, { {0, -48}, {0, 0}, {0, 0}, {0, -48} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 21, 0, { {1, 251}, {0, 0}, {0, 0}, {1, 251} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 21, 0, { {1, 253}, {0, 0}, {0, 0}, {1, 253} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 23, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 },
- { 17, 0, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 59 },
- { 0, 17, 0, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 59 },
- { 0, 17, 9, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 59 },
- { 1, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 59 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 59 },
- { 0, 17, 9, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 59 },
- { 29, 4, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 18, 0, 0, 2, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 65 },
- { 18, 0, 0, 4, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 65 },
- { 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 65 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 65 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 65 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 71 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 71 },
- { 0, 17, 9, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 71 },
- { 0, 17, 0, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 71 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 71 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 71 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 71 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 71 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 71 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 71 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 71 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 71 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 71 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 71 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 71 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 11 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 11 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
- { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 72 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 72 },
- { 0, 17, 220, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 72 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 72 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 73 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 73 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 73 },
- { 1, 0, 9, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 73 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 73 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 85 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 85 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 85 },
- { 0, 17, 7, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 85 },
- { 1, 0, 9, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 85 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 85 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 85 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 85 },
- { 17, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 3, 0, 0, 0, 0, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 85 },
- { 3, 0, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 85 },
- { 3, 0, 0, 0, 2, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 85 },
- { 3, 0, 0, 0, 3, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 85 },
- { 3, 0, 0, 0, 4, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 85 },
- { 3, 0, 0, 0, 5, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 85 },
- { 3, 0, 0, 0, 6, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 85 },
- { 3, 0, 0, 0, 7, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 85 },
- { 3, 0, 0, 0, 8, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 85 },
- { 3, 0, 0, 0, 9, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 85 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 24 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 24 },
- { 17, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 24 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 24 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 77 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 77 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 77 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 77 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 77 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 77 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 77 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 77 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 77 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 77 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 77 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 77 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 77 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 77 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 77 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 24 },
- { 17, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 24 },
- { 29, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 24 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 24 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 79 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 79 },
- { 0, 17, 220, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 79 },
- { 17, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 79 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 79 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 86 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 86 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 86 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 86 },
- { 17, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 86 },
- { 0, 17, 9, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 86 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 27 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, -928}, {0, -928}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 28, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 16, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 17, 0, 0, 0, -1, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 },
- { 28, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 255}, {1, 255}, {1, 255} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 257}, {1, 257}, {1, 257} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 259}, {1, 259}, {1, 259} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 261}, {1, 261}, {1, 261} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 263}, {1, 263}, {1, 263} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 265}, {1, 265}, {1, 265} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 267}, {1, 267}, {1, 267} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 269}, {1, 269}, {1, 269} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 271}, {1, 271}, {1, 271} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 273}, {1, 273}, {1, 273} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 275}, {1, 275}, {1, 275} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 277}, {1, 277}, {1, 277} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 279}, {1, 279}, {1, 279} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 281}, {1, 281}, {1, 281} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 283}, {1, 283}, {1, 283} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 285}, {1, 285}, {1, 285} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 287}, {1, 287}, {1, 287} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 289}, {1, 289}, {1, 289} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 291}, {1, 291}, {1, 291} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 293}, {1, 293}, {1, 293} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 295}, {1, 295}, {1, 295} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 297}, {1, 297}, {1, 297} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 299}, {1, 299}, {1, 299} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 301}, {1, 301}, {1, 301} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 303}, {1, 303}, {1, 303} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 305}, {1, 305}, {1, 305} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 307}, {1, 307}, {1, 307} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 309}, {1, 309}, {1, 309} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 311}, {1, 311}, {1, 311} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 313}, {1, 313}, {1, 313} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 315}, {1, 315}, {1, 315} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 317}, {1, 317}, {1, 317} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 319}, {1, 319}, {1, 319} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 321}, {1, 321}, {1, 321} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 323}, {1, 323}, {1, 323} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 325}, {1, 325}, {1, 325} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 327}, {1, 327}, {1, 327} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 329}, {1, 329}, {1, 329} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 331}, {1, 331}, {1, 331} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 333}, {1, 333}, {1, 333} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 335}, {1, 335}, {1, 335} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 337}, {1, 337}, {1, 337} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 339}, {1, 339}, {1, 339} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 341}, {1, 341}, {1, 341} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 343}, {1, 343}, {1, 343} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 345}, {1, 345}, {1, 345} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 347}, {1, 347}, {1, 347} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 349}, {1, 349}, {1, 349} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 351}, {1, 351}, {1, 351} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 353}, {1, 353}, {1, 353} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 355}, {1, 355}, {1, 355} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 357}, {1, 357}, {1, 357} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 359}, {1, 359}, {1, 359} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 361}, {1, 361}, {1, 361} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 363}, {1, 363}, {1, 363} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 365}, {1, 365}, {1, 365} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 367}, {1, 367}, {1, 367} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 369}, {1, 369}, {1, 369} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 371}, {1, 371}, {1, 371} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 373}, {1, 373}, {1, 373} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 375}, {1, 375}, {1, 375} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 377}, {1, 377}, {1, 377} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 379}, {1, 379}, {1, 379} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 381}, {1, 381}, {1, 381} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 383}, {1, 383}, {1, 383} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 385}, {1, 385}, {1, 385} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 387}, {1, 387}, {1, 387} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 389}, {1, 389}, {1, 389} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 391}, {1, 391}, {1, 391} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 393}, {1, 393}, {1, 393} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 395}, {1, 395}, {1, 395} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 397}, {1, 397}, {1, 397} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 399}, {1, 399}, {1, 399} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 401}, {1, 401}, {1, 401} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 403}, {1, 403}, {1, 403} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 405}, {1, 405}, {1, 405} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 407}, {1, 407}, {1, 407} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 409}, {1, 409}, {1, 409} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 411}, {1, 411}, {1, 411} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 413}, {1, 413}, {1, 413} }, 0, 10, 12, 6, 28 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 86 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 86 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 86 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 86 },
- { 0, 17, 9, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 86 },
- { 3, 0, 0, 0, 0, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
- { 3, 0, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
- { 3, 0, 0, 0, 2, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
- { 3, 0, 0, 0, 3, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
- { 3, 0, 0, 0, 4, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
- { 3, 0, 0, 0, 5, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
- { 3, 0, 0, 0, 6, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
- { 3, 0, 0, 0, 7, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
- { 3, 0, 0, 0, 8, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
- { 3, 0, 0, 0, 9, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
- { 18, 0, 0, 0, -1, 0, 2, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 12, 10, 23, 8, 26 },
- { 18, 0, 0, 0, -1, 0, 2, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 13, 10, 24, 8, 26 },
- { 11, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 34, 0, 0 },
- { 12, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 },
- { 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 13, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 6, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 11, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 8, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 427}, {1, 424}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 433}, {1, 430}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 439}, {1, 436}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 446}, {1, 442}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 454}, {1, 450}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 461}, {1, 458}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 473}, {1, 470}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 479}, {1, 476}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 485}, {1, 482}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 491}, {1, 488}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 497}, {1, 494}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 18, 1, 0, 0, -1, 0, 4, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 7 },
- { 0, 17, 26, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
- { 18, 1, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 7 },
- { 18, 1, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 7 },
- { 26, 3, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 7 },
- { 18, 13, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 28, 13, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 13, 18, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 },
- { 27, 13, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 8 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 11, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 8, 11, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 2 },
- { 21, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 15, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 11, 2 },
- { 19, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 14, 0, 2 },
- { 21, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 21, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 1, 11, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 11, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 1, 10, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 5, 0, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 5, 11, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 2 },
- { 25, 4, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 26, 3, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 20, 3, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 11, 2 },
- { 26, 10, 0, 0, -1, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 26, 10, 0, 0, -1, -1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 18, 13, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 22, 4, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 14, 0, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 0, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
- { 3, 2, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
- { 3, 2, 0, 0, 2, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
- { 3, 2, 0, 0, 3, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
- { 3, 2, 0, 0, 4, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
- { 3, 2, 0, 0, 5, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
- { 3, 2, 0, 0, 6, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
- { 3, 2, 0, 0, 7, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
- { 3, 2, 0, 0, 8, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
- { 3, 2, 0, 0, 9, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
- { 26, 10, 0, 0, -1, 2, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 26, 10, 0, 0, -1, -2, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 80, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3 },
- { 21, 10, 0, 0, -1, 2, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, -2, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 3 },
- { 21, 10, 0, 0, -1, 1, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
- { 22, 10, 0, 0, -1, -1, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 2 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 35 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 35 },
- { 17, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 5, 4, 2 },
- { 27, 4, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 10, 10, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 29, 10, 0, 0, -1, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 29, 0, 2 },
- { 13, 18, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 49 },
- { 25, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
- { 5, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 4, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 4 },
- { 5, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 5, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 29, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 74 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 75 },
- { 5, 2, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 18, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 39 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 39 },
- { 5, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 39 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 39 },
- { 18, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 40 },
- { 4, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 40 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 120 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 120 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 50 },
- { 25, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 50 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 60 },
- { 25, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 60 },
- { 4, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 60 },
- { 14, 0, 0, 0, -1, 0, 5, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 12, 7, 41 },
- { 14, 0, 0, 0, -1, 0, 7, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 12, 7, 41 },
- { 15, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 12, 6, 41 },
- { 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 12, 6, 41 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 51 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 52 },
- { 3, 0, 0, 0, 0, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 52 },
- { 3, 0, 0, 0, 1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 52 },
- { 3, 0, 0, 0, 2, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 52 },
- { 3, 0, 0, 0, 3, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 52 },
- { 3, 0, 0, 0, 4, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 52 },
- { 3, 0, 0, 0, 5, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 52 },
- { 3, 0, 0, 0, 6, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 52 },
- { 3, 0, 0, 0, 7, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 52 },
- { 3, 0, 0, 0, 8, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 52 },
- { 3, 0, 0, 0, 9, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 52 },
- { 14, 0, 0, 0, -1, 0, 18, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 12, 7, 136 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 12, 6, 136 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 106 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 103 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 103 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 110 },
- { 18, 1, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 53 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 87 },
- { 25, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 87 },
- { 5, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 87 },
- { 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 118 },
- { 29, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 118 },
- { 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 118 },
- { 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 117 },
- { 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 117 },
- { 18, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 128 },
- { 5, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 128 },
- { 18, 1, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 64 },
- { 5, 1, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 64 },
- { 5, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 64 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 64 },
- { 18, 1, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 76 },
- { 25, 1, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 76 },
- { 18, 1, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 98 },
- { 18, 1, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 97 },
- { 5, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 97 },
- { 18, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 61 },
- { 0, 17, 0, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 61 },
- { 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 61 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 61 },
- { 18, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 61 },
- { 0, 17, 1, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 61 },
- { 0, 17, 9, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 61 },
- { 5, 1, 0, 0, 1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
- { 5, 1, 0, 0, 2, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
- { 5, 1, 0, 0, 3, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
- { 5, 1, 0, 0, 4, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
- { 5, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
- { 5, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
- { 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 61 },
- { 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 61 },
- { 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 88 },
- { 5, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 88 },
- { 25, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 88 },
- { 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 116 },
- { 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 116 },
- { 18, 1, 0, 2, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 112 },
- { 18, 1, 0, 3, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 112 },
- { 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 112 },
- { 29, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 112 },
- { 18, 1, 0, 4, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 112 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 112 },
- { 0, 17, 220, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 112 },
- { 5, 1, 0, 2, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 112 },
- { 5, 1, 0, 3, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 112 },
- { 25, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 112 },
- { 25, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 15, 0, 112 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 80 },
- { 25, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 80 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 89 },
- { 5, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 89 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 90 },
- { 5, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 90 },
- { 18, 1, 0, 2, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 121 },
- { 18, 1, 0, 3, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 121 },
- { 25, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 121 },
- { 5, 1, 0, 3, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 121 },
- { 5, 1, 0, 2, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 121 },
- { 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 121 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 91 },
- { 14, 1, 0, 0, -1, 0, 17, 0, { {0, 64}, {0, 0}, {0, 0}, {0, 64} }, 0, 10, 12, 7, 130 },
- { 15, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, -64}, {0, -64}, {0, 0} }, 0, 10, 12, 6, 130 },
- { 5, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 130 },
- { 18, 13, 0, 4, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 144 },
- { 18, 13, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 144 },
- { 18, 13, 0, 3, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 144 },
- { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 144 },
- { 3, 5, 0, 0, 0, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
- { 3, 5, 0, 0, 1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
- { 3, 5, 0, 0, 2, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
- { 3, 5, 0, 0, 3, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
- { 3, 5, 0, 0, 4, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
- { 3, 5, 0, 0, 5, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
- { 3, 5, 0, 0, 6, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
- { 3, 5, 0, 0, 7, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
- { 3, 5, 0, 0, 8, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
- { 3, 5, 0, 0, 9, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
- { 5, 5, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 5, 5, 0, 0, 2, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 5, 5, 0, 0, 3, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 5, 5, 0, 0, 4, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 5, 5, 0, 0, 5, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 5, 5, 0, 0, 6, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 5, 5, 0, 0, 7, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 5, 5, 0, 0, 8, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 5, 5, 0, 0, 9, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 5, 5, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 18, 1, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 156 },
- { 0, 17, 230, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 156 },
- { 20, 1, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 156 },
- { 18, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 147 },
- { 5, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 147 },
- { 18, 13, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 148 },
- { 18, 13, 0, 3, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 148 },
- { 18, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 148 },
- { 0, 17, 220, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 148 },
- { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 148 },
- { 5, 13, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 148 },
- { 5, 13, 0, 3, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 148 },
- { 25, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 148 },
- { 18, 1, 0, 2, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 153 },
- { 18, 1, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 153 },
- { 18, 1, 0, 3, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 153 },
- { 5, 1, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 153 },
- { 5, 1, 0, 3, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 153 },
- { 5, 1, 0, 2, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 153 },
- { 5, 1, 0, 4, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 153 },
- { 18, 1, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 149 },
- { 1, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 94 },
- { 0, 17, 0, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 94 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 94 },
- { 0, 17, 9, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 94 },
- { 25, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 94 },
- { 25, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 5, 10, 0, 0, 1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 5, 10, 0, 0, 2, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 5, 10, 0, 0, 3, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 5, 10, 0, 0, 4, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 5, 10, 0, 0, 5, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 5, 10, 0, 0, 6, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 5, 10, 0, 0, 7, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 5, 10, 0, 0, 8, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 5, 10, 0, 0, 9, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 5, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 94 },
- { 3, 0, 0, 0, 0, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 94 },
- { 3, 0, 0, 0, 1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 94 },
- { 3, 0, 0, 0, 2, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 94 },
- { 3, 0, 0, 0, 3, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 94 },
- { 3, 0, 0, 0, 4, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 94 },
- { 3, 0, 0, 0, 5, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 94 },
- { 3, 0, 0, 0, 6, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 94 },
- { 3, 0, 0, 0, 7, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 94 },
- { 3, 0, 0, 0, 8, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 94 },
- { 3, 0, 0, 0, 9, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 94 },
- { 0, 17, 9, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 94 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 92 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 92 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 92 },
- { 18, 0, 0, 0, -1, 0, 11, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 92 },
- { 0, 17, 9, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 92 },
- { 0, 17, 7, 5, -1, 0, 11, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 92 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 92 },
- { 10, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 92 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 92 },
- { 10, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 92 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 101 },
- { 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
- { 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
- { 3, 0, 0, 0, 2, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
- { 3, 0, 0, 0, 3, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
- { 3, 0, 0, 0, 4, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
- { 3, 0, 0, 0, 5, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
- { 3, 0, 0, 0, 6, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
- { 3, 0, 0, 0, 7, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
- { 3, 0, 0, 0, 8, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
- { 3, 0, 0, 0, 9, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
- { 0, 17, 230, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 96 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 96 },
- { 0, 17, 0, 5, -1, 0, 13, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 96 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 96 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 96 },
- { 0, 17, 0, 5, -1, 0, 13, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 96 },
- { 0, 17, 9, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 96 },
- { 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
- { 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
- { 3, 0, 0, 0, 2, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
- { 3, 0, 0, 0, 3, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
- { 3, 0, 0, 0, 4, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
- { 3, 0, 0, 0, 5, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
- { 3, 0, 0, 0, 6, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
- { 3, 0, 0, 0, 7, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
- { 3, 0, 0, 0, 8, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
- { 3, 0, 0, 0, 9, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 96 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 96 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 96 },
- { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 96 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 96 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 111 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 111 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 111 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 111 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 100 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 100 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 100 },
- { 1, 0, 9, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 100 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 100 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 100 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 100 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 100 },
- { 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 100 },
- { 0, 17, 7, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 100 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 100 },
- { 1, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 100 },
- { 0, 17, 0, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 100 },
- { 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
- { 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
- { 3, 0, 0, 0, 2, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
- { 3, 0, 0, 0, 3, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
- { 3, 0, 0, 0, 4, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
- { 3, 0, 0, 0, 5, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
- { 3, 0, 0, 0, 6, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
- { 3, 0, 0, 0, 7, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
- { 3, 0, 0, 0, 8, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
- { 3, 0, 0, 0, 9, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 100 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 100 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 100 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 100 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 100 },
- { 5, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 20 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 109 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 109 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 109 },
- { 1, 0, 9, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 109 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 109 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 109 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 109 },
- { 0, 17, 0, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 109 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 129 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 129 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 123 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 123 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 123 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 123 },
- { 0, 17, 9, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 123 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 123 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 123 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 123 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 123 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 123 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 123 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 123 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 123 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 123 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 123 },
- { 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 107 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 107 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 107 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 107 },
- { 0, 17, 7, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 107 },
- { 1, 0, 0, 0, -1, 0, 16, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 107 },
- { 1, 0, 0, 0, -1, 0, 16, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 107 },
- { 1, 0, 9, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 107 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 107 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 107 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 135 },
- { 1, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 135 },
- { 0, 17, 0, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 135 },
- { 0, 17, 9, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 135 },
- { 0, 17, 7, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 135 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 135 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 135 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 135 },
- { 3, 0, 0, 0, 0, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
- { 3, 0, 0, 0, 1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
- { 3, 0, 0, 0, 2, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
- { 3, 0, 0, 0, 3, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
- { 3, 0, 0, 0, 4, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
- { 3, 0, 0, 0, 5, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
- { 3, 0, 0, 0, 6, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
- { 3, 0, 0, 0, 7, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
- { 3, 0, 0, 0, 8, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
- { 3, 0, 0, 0, 9, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
- { 25, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 135 },
- { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 135 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 135 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 135 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 124 },
- { 1, 0, 0, 0, -1, 0, 16, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 124 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 124 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 124 },
- { 0, 17, 0, 5, -1, 0, 16, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 124 },
- { 1, 0, 0, 0, -1, 0, 16, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 124 },
- { 0, 17, 9, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 124 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 124 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 124 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 124 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 124 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 124 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 124 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 124 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 124 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 124 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 124 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 124 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 124 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 122 },
- { 1, 0, 0, 0, -1, 0, 16, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 122 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 122 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 122 },
- { 1, 0, 0, 0, -1, 0, 16, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 122 },
- { 0, 17, 9, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 122 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 122 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 122 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 122 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 122 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 122 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 122 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 122 },
- { 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 122 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 114 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 114 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 114 },
- { 0, 17, 9, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 114 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 114 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 114 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 114 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 114 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 114 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 114 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 114 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 114 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 114 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 114 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 114 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 114 },
- { 25, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 33 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 102 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 102 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 102 },
- { 1, 0, 9, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 102 },
- { 0, 17, 7, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 102 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 102 },
- { 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
- { 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
- { 3, 0, 0, 0, 2, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
- { 3, 0, 0, 0, 3, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
- { 3, 0, 0, 0, 4, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
- { 3, 0, 0, 0, 5, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
- { 3, 0, 0, 0, 6, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
- { 3, 0, 0, 0, 7, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
- { 3, 0, 0, 0, 8, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
- { 3, 0, 0, 0, 9, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 126 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 126 },
- { 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 126 },
- { 1, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 126 },
- { 0, 17, 9, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 126 },
- { 3, 0, 0, 0, 0, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 126 },
- { 3, 0, 0, 0, 1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 126 },
- { 3, 0, 0, 0, 2, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 126 },
- { 3, 0, 0, 0, 3, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 126 },
- { 3, 0, 0, 0, 4, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 126 },
- { 3, 0, 0, 0, 5, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 126 },
- { 3, 0, 0, 0, 6, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 126 },
- { 3, 0, 0, 0, 7, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 126 },
- { 3, 0, 0, 0, 8, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 126 },
- { 3, 0, 0, 0, 9, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 126 },
- { 5, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 126 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 126 },
- { 29, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 126 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 142 },
- { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 142 },
- { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 142 },
- { 0, 17, 9, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 142 },
- { 0, 17, 7, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 142 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 142 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 125 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 125 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
- { 5, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 125 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 125 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 154 },
- { 1, 0, 0, 0, -1, 0, 23, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 154 },
- { 1, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 154 },
- { 1, 0, 0, 0, -1, 0, 23, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 154 },
- { 0, 17, 0, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 154 },
- { 1, 0, 9, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 154 },
- { 0, 17, 9, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 154 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 154 },
- { 0, 17, 7, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 154 },
- { 25, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 154 },
- { 25, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 154 },
- { 3, 0, 0, 0, 0, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 154 },
- { 3, 0, 0, 0, 1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 154 },
- { 3, 0, 0, 0, 2, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 154 },
- { 3, 0, 0, 0, 3, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 154 },
- { 3, 0, 0, 0, 4, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 154 },
- { 3, 0, 0, 0, 5, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 154 },
- { 3, 0, 0, 0, 6, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 154 },
- { 3, 0, 0, 0, 7, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 154 },
- { 3, 0, 0, 0, 8, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 154 },
- { 3, 0, 0, 0, 9, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 154 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 150 },
- { 1, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 150 },
- { 0, 17, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 150 },
- { 0, 17, 9, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 150 },
- { 25, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 150 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 141 },
- { 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 141 },
- { 0, 0, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 141 },
- { 0, 17, 9, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 141 },
- { 1, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 141 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 141 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 141 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 141 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 141 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 141 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 140 },
- { 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 140 },
- { 1, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 140 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 140 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 140 },
- { 0, 17, 9, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 140 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 140 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 140 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 140 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 140 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 119 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 133 },
- { 1, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 133 },
- { 0, 17, 0, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 133 },
- { 0, 0, 9, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 133 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 133 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 133 },
- { 3, 0, 0, 0, 0, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 133 },
- { 3, 0, 0, 0, 1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 133 },
- { 3, 0, 0, 0, 2, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 133 },
- { 3, 0, 0, 0, 3, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 133 },
- { 3, 0, 0, 0, 4, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 133 },
- { 3, 0, 0, 0, 5, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 133 },
- { 3, 0, 0, 0, 6, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 133 },
- { 3, 0, 0, 0, 7, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 133 },
- { 3, 0, 0, 0, 8, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 133 },
- { 3, 0, 0, 0, 9, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 133 },
- { 5, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 133 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 134 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 134 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 134 },
- { 0, 17, 0, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 134 },
- { 1, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 134 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 138 },
- { 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 138 },
- { 0, 17, 7, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 138 },
- { 0, 17, 9, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 138 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 138 },
- { 3, 0, 0, 0, 0, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
- { 3, 0, 0, 0, 1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
- { 3, 0, 0, 0, 2, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
- { 3, 0, 0, 0, 3, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
- { 3, 0, 0, 0, 4, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
- { 3, 0, 0, 0, 5, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
- { 3, 0, 0, 0, 6, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
- { 3, 0, 0, 0, 7, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
- { 3, 0, 0, 0, 8, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
- { 3, 0, 0, 0, 9, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 143 },
- { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 143 },
- { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 143 },
- { 0, 17, 9, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 143 },
- { 3, 0, 0, 0, 0, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
- { 3, 0, 0, 0, 1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
- { 3, 0, 0, 0, 2, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
- { 3, 0, 0, 0, 3, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
- { 3, 0, 0, 0, 4, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
- { 3, 0, 0, 0, 5, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
- { 3, 0, 0, 0, 6, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
- { 3, 0, 0, 0, 7, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
- { 3, 0, 0, 0, 8, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
- { 3, 0, 0, 0, 9, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 145 },
- { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 145 },
- { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 145 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 145 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 83 },
- { 5, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 16 },
- { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 16 },
- { 27, 4, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 16 },
- { 25, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 16 },
- { 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 63 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 63 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 63 },
- { 4, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 63 },
- { 4, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 63 },
- { 25, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 63 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 63 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 81 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 81 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 1, 8, 81 },
- { 10, 0, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 4, 4, 81 },
- { 10, 0, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 0, 4, 81 },
- { 10, 0, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 1, 4, 81 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 127 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 127 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 1, 8, 127 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 84 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 115 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 115 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 115 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 115 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 115 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 115 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 115 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 115 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 115 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 115 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 115 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 115 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 104 },
- { 0, 17, 1, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 104 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 104 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 108 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 108 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 108 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 108 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 108 },
- { 29, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 108 },
- { 17, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 108 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
- { 5, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 108 },
- { 14, 0, 0, 0, -1, 0, 20, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 146 },
- { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 146 },
- { 5, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 146 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 146 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 146 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 146 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 99 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 99 },
- { 0, 17, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 99 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 99 },
- { 1, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 99 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 99 },
- { 17, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 99 },
- { 17, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 137 },
- { 17, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 139 },
- { 25, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 2 },
- { 0, 17, 0, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 155 },
- { 1, 0, 6, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 37 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 137 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 137 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 137 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 137 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 8, 155 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 35 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 34 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 34 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 34 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 35 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 139 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 105 },
- { 29, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 105 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 105 },
- { 0, 17, 1, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 105 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 105 },
- { 10, 18, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 29, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 1, 0, 216, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 2 },
- { 1, 0, 216, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 2 },
- { 0, 17, 1, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 1, 0, 226, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 2 },
- { 10, 18, 0, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2 },
- { 0, 17, 220, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 29, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 4 },
- { 5, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
- { 15, 0, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 },
- { 15, 0, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 },
- { 26, 0, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 9, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
- { 15, 0, 0, 0, -1, 0, 9, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 },
- { 3, 2, 0, 0, 0, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 2, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 3, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 4, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 5, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 6, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 7, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 8, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 9, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 29, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 131 },
- { 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 131 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 131 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 131 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 131 },
- { 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 57 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 151 },
- { 0, 17, 230, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 151 },
- { 17, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 151 },
- { 3, 0, 0, 0, 0, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
- { 3, 0, 0, 0, 1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
- { 3, 0, 0, 0, 2, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
- { 3, 0, 0, 0, 3, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
- { 3, 0, 0, 0, 4, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
- { 3, 0, 0, 0, 5, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
- { 3, 0, 0, 0, 6, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
- { 3, 0, 0, 0, 7, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
- { 3, 0, 0, 0, 8, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
- { 3, 0, 0, 0, 9, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
- { 29, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 151 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 152 },
- { 0, 17, 230, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 152 },
- { 3, 0, 0, 0, 0, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
- { 3, 0, 0, 0, 1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
- { 3, 0, 0, 0, 2, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
- { 3, 0, 0, 0, 3, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
- { 3, 0, 0, 0, 4, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
- { 3, 0, 0, 0, 5, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
- { 3, 0, 0, 0, 6, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
- { 3, 0, 0, 0, 7, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
- { 3, 0, 0, 0, 8, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
- { 3, 0, 0, 0, 9, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
- { 27, 4, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 152 },
- { 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 113 },
- { 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 113 },
- { 0, 17, 220, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 113 },
- { 14, 1, 0, 2, -1, 0, 18, 0, { {0, 34}, {0, 0}, {0, 0}, {0, 34} }, 0, 10, 12, 7, 132 },
- { 15, 1, 0, 2, -1, 0, 18, 0, { {0, 0}, {0, -34}, {0, -34}, {0, 0} }, 0, 10, 12, 6, 132 },
- { 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 132 },
- { 0, 17, 7, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 132 },
- { 17, 1, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 132 },
- { 3, 1, 0, 0, 0, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
- { 3, 1, 0, 0, 1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
- { 3, 1, 0, 0, 2, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
- { 3, 1, 0, 0, 3, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
- { 3, 1, 0, 0, 4, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
- { 3, 1, 0, 0, 5, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
- { 3, 1, 0, 0, 6, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
- { 3, 1, 0, 0, 7, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
- { 3, 1, 0, 0, 8, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
- { 3, 1, 0, 0, 9, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
- { 25, 1, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 132 },
- { 5, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 27, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
- { 5, 13, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 13, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 18, 13, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
- { 26, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
- { 5, 2, 0, 0, 0, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 2, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 3, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 4, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 5, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 6, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 7, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 8, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 2, 0, 0, 9, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 5, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
- { 29, 10, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 21, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 6, 7, 28, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 34 },
- { 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 18, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
- { 28, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 31, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
- { 3, 2, 0, 0, 0, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 1, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 2, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 3, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 4, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 5, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 6, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 7, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 8, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 3, 2, 0, 0, 9, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 },
- { 13, 18, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 },
- { 18, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 18, 0, 0, 0, -1, 0, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 10, 18, 0, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 2 },
- { 0, 17, 0, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 12, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 }
+static constexpr Properties uc_properties[] = {
+ { 9, 18, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 23, 0, 0, 2 },
+ { 9, 8, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 19, 5, 0, 2 },
+ { 9, 7, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 2, 2, 39, 2, 0, 2 },
+ { 9, 8, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 40, 5, 0, 2 },
+ { 9, 9, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 40, 5, 0, 2 },
+ { 9, 7, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 1, 1, 38, 1, 0, 2 },
+ { 9, 7, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 23, 0, 0, 2 },
+ { 9, 8, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 23, 0, 0, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 37, 5, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 12, 3, 13, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 11, 3, 13, 0, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 2, 13, 0, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 11, 0, 2 },
+ { 20, 3, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 11, 1, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 10, 1, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 0, 2 },
+ { 3, 2, 0, 0, 0, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 2, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 3, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 4, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 5, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 6, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 7, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 8, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 9, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 2, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, -2, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 4, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 3 },
+ { 21, 10, 0, 0, -1, 2, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 2 },
+ { 22, 10, 0, 0, -1, -2, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 2, 13, 0, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 19, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 14, 0, 1, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 26, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 0, 2 },
+ { 22, 10, 0, 0, -1, -2, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 9, 7, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 40, 3, 0, 2 },
+ { 6, 6, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 5, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 23, 10, 0, 0, -1, 16, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 10, 18, 0, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 19, 4, 2, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 29, 4, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 26, 4, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 5, 2, 0, 0, 2, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 3, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 0, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 743}, {0, 743}, {0, 775} }, 0, 10, 14, 6, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 14, 0, 1, 2 },
+ { 5, 2, 0, 0, 1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 24, 10, 0, 0, -1, -16, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 5, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 3 },
+ { 26, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {1, 418}, {1, 415}, {0, 0} }, 0, 10, 14, 6, 4, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 121}, {0, 121}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {1, 421}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, -232}, {0, -232}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {1, 500}, {1, 500}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -121}, {0, 0}, {0, 0}, {0, -121} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -300}, {0, -300}, {0, -268} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 195}, {0, 195}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 210}, {0, 0}, {0, 0}, {0, 210} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 206}, {0, 0}, {0, 0}, {0, 206} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 205}, {0, 0}, {0, 0}, {0, 205} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 79}, {0, 0}, {0, 0}, {0, 79} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 202}, {0, 0}, {0, 0}, {0, 202} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 203}, {0, 0}, {0, 0}, {0, 203} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 207}, {0, 0}, {0, 0}, {0, 207} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 97}, {0, 97}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 211}, {0, 0}, {0, 0}, {0, 211} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 209}, {0, 0}, {0, 0}, {0, 209} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 163}, {0, 163}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 213}, {0, 0}, {0, 0}, {0, 213} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 130}, {0, 130}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 214}, {0, 0}, {0, 0}, {0, 214} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 218}, {0, 0}, {0, 0}, {0, 218} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 217}, {0, 0}, {0, 0}, {0, 217} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 219}, {0, 0}, {0, 0}, {0, 219} }, 0, 10, 14, 7, 3, 3 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 56}, {0, 56}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 2}, {0, 0}, {0, 1}, {0, 2} }, 0, 10, 14, 7, 3, 3 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 1}, {0, -1}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -2}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -79}, {0, -79}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 511}, {1, 511}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, -97}, {0, 0}, {0, 0}, {0, -97} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, -56}, {0, 0}, {0, 0}, {0, -56} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 6, 3, 0, { {0, -130}, {0, 0}, {0, 0}, {0, -130} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {1, 1}, {0, 0}, {0, 0}, {1, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, -163}, {0, 0}, {0, 0}, {0, -163} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {1, 3}, {0, 0}, {0, 0}, {1, 3} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {1, 5}, {1, 5}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {1, 7}, {1, 7}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, -195}, {0, 0}, {0, 0}, {0, -195} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 69}, {0, 0}, {0, 0}, {0, 69} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 71}, {0, 0}, {0, 0}, {0, 71} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 9}, {1, 9}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {1, 11}, {1, 11}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 13}, {1, 13}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -210}, {0, -210}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -206}, {0, -206}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -205}, {0, -205}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -202}, {0, -202}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -203}, {0, -203}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 15}, {1, 15}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {1, 17}, {1, 17}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -207}, {0, -207}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 19}, {1, 19}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 21}, {1, 21}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -209}, {0, -209}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -211}, {0, -211}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 23}, {1, 23}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 25}, {1, 25}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 27}, {1, 27}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 29}, {1, 29}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -213}, {0, -213}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -214}, {0, -214}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 31}, {1, 31}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -218}, {0, -218}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 33}, {1, 33}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 35}, {1, 35}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -69}, {0, -69}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -217}, {0, -217}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -71}, {0, -71}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -219}, {0, -219}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 37}, {1, 37}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 39}, {1, 39}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 17, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 17, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 17, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 20, 8, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 28, 10, 0, 0, -1, 0, 4, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 20, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 36 },
+ { 17, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 0, 17, 230, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 232, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 216, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 202, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 202, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 1, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 1, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 1, 0, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 3, 1 },
+ { 0, 17, 240, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 84}, {0, 84}, {0, 116} }, 4, 4, 23, 4, 3, 1 },
+ { 0, 17, 230, 5, -1, 0, 4, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 4, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 0, 5, -1, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 2, 1 },
+ { 0, 17, 230, 5, -1, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 232, 5, -1, 0, 8, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 8, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 8, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 233, 5, -1, 0, 8, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 234, 5, -1, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 233, 5, -1, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 234, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 233, 5, -1, 0, 4, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 17, 10, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 13, 0, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 0, 4 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 130}, {0, 130}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 0, 0, 2 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 116}, {0, 0}, {0, 0}, {0, 116} }, 0, 10, 14, 7, 3, 4 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 4 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 38}, {0, 0}, {0, 0}, {0, 38} }, 0, 10, 14, 7, 3, 4 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 14, 0, 3, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 37}, {0, 0}, {0, 0}, {0, 37} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 64}, {0, 0}, {0, 0}, {0, 64} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 63}, {0, 0}, {0, 0}, {0, 63} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 503}, {1, 503}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -38}, {0, -38}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -37}, {0, -37}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 507}, {1, 507}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -31}, {0, -31}, {0, 1} }, 0, 10, 14, 6, 4, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -64}, {0, -64}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -63}, {0, -63}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 8} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -62}, {0, -62}, {0, -30} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -57}, {0, -57}, {0, -25} }, 0, 10, 14, 6, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -47}, {0, -47}, {0, -15} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -54}, {0, -54}, {0, -22} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, -8}, {0, -8}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 46 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 46 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -86}, {0, -86}, {0, -54} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -80}, {0, -80}, {0, -48} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 7}, {0, 7}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -116}, {0, -116}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 5, 3, 80, { {0, -60}, {0, 0}, {0, 0}, {0, -60} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 5, 3, 80, { {0, 0}, {0, -96}, {0, -96}, {0, -64} }, 0, 10, 14, 6, 3, 4 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 7, 3, 80, { {0, -7}, {0, 0}, {0, 0}, {0, -7} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, -130}, {0, 0}, {0, 0}, {0, -130} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 14, 7, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 14, 7, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 14, 7, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 14, 7, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 29, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 5 },
+ { 0, 17, 230, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 0, 17, 230, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 2, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 15}, {0, 0}, {0, 0}, {0, 15} }, 0, 10, 14, 7, 0, 5 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, -15}, {0, -15}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 14, 7, 3, 6 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 6 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 6 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 11, 1, 6 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 14, 0, 1, 6 },
+ { 15, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 14, 6, 1, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 467}, {1, 464}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 12, 1, 6 },
+ { 20, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 19, 0, 1, 6 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 6 },
+ { 27, 4, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 6 },
+ { 13, 1, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 0, 17, 220, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 230, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 222, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 220, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 228, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 10, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 11, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 12, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 13, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 14, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 15, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 16, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 17, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 18, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 19, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 19, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 20, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 21, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 22, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 20, 1, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 7 },
+ { 0, 17, 23, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 25, 1, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 7 },
+ { 0, 17, 24, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 25, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 25, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 7 },
+ { 0, 17, 18, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 18, 1, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 15, 8, 1, 7 },
+ { 18, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 15, 8, 1, 7 },
+ { 25, 1, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 7 },
+ { 25, 1, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 14, 0, 1, 7 },
+ { 10, 5, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 8 },
+ { 10, 5, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 8 },
+ { 10, 5, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 2 },
+ { 26, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 26, 13, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 25, 4, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
+ { 27, 13, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
+ { 25, 6, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 11, 1, 2 },
+ { 25, 13, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 11, 1, 8 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 30, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 31, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 32, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 2 },
+ { 10, 13, 0, 5, -1, 0, 15, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 8 },
+ { 25, 13, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 2 },
+ { 18, 13, 0, 2, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 17, 13, 0, 1, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 0, 17, 27, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 28, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 29, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 30, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 31, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 32, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 33, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 34, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 4, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 4, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 3, 5, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 25, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
+ { 25, 5, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 25, 5, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 13, 9, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 0, 17, 35, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 18, 13, 0, 3, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 8 },
+ { 18, 13, 0, 2, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 8 },
+ { 18, 13, 0, 2, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 10, 5, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 17, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 3, 2, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 29, 13, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 9 },
+ { 25, 13, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 9 },
+ { 13, 13, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 10, 13, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 4, 0, 9 },
+ { 18, 13, 0, 3, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 0, 17, 36, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 9 },
+ { 18, 13, 0, 2, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 18, 13, 0, 2, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 18, 13, 0, 3, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 0, 17, 230, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 9 },
+ { 0, 17, 220, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 9 },
+ { 18, 13, 0, 2, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 10 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 10 },
+ { 18, 13, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 10 },
+ { 3, 1, 0, 0, 0, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 2, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 3, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 4, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 5, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 6, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 7, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 8, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 9, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 18, 1, 0, 2, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 66 },
+ { 0, 17, 230, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 66 },
+ { 0, 17, 220, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 66 },
+ { 17, 1, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 66 },
+ { 29, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 66 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 66 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 11, 1, 66 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 66 },
+ { 17, 1, 0, 1, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 66 },
+ { 0, 17, 220, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 66 },
+ { 27, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 66 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 82 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 82 },
+ { 17, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 82 },
+ { 25, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 82 },
+ { 25, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 82 },
+ { 18, 1, 0, 3, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 95 },
+ { 18, 1, 0, 2, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 95 },
+ { 0, 17, 220, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 95 },
+ { 25, 1, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 95 },
+ { 18, 13, 0, 2, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 18, 13, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 18, 13, 0, 3, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 18, 13, 0, 3, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 1, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 28, 13, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 10, 5, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 8 },
+ { 0, 17, 230, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 17, 13, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 10, 5, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 2 },
+ { 0, 17, 220, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 27, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 28, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 29, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 0, 17, 0, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 1, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 11 },
+ { 0, 17, 7, 5, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 11 },
+ { 0, 17, 220, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 11 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 2 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 11 },
+ { 17, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 12 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 12 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 12 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 12 },
+ { 0, 17, 7, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 12 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 12 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 12 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 12 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 12 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 12 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 12 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 27, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 12 },
+ { 5, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 12 },
+ { 5, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 12 },
+ { 29, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 12 },
+ { 27, 4, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 12 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 12 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 12 },
+ { 0, 17, 230, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 12 },
+ { 0, 17, 0, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 13 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 13 },
+ { 1, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 13 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 13 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 13 },
+ { 0, 17, 7, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 13 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 13 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 13 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 13 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 13 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 14 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 14 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 14 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 14 },
+ { 0, 17, 7, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 14 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 14 },
+ { 0, 17, 0, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 14 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 14 },
+ { 27, 4, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 14 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 14 },
+ { 0, 17, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 14 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 15 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 15 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 15 },
+ { 0, 17, 7, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 15 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 0, 17, 0, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 15 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 29, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 15 },
+ { 5, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 15 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 16 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 16 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 16 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 16 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 16 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 16 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 16 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 16 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 16 },
+ { 3, 0, 0, 0, 0, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 5, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 16 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 16 },
+ { 27, 4, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 16 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 17 },
+ { 0, 17, 0, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 17 },
+ { 0, 17, 7, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 17 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 0, 17, 84, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 0, 17, 91, 5, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 17 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 25, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 17 },
+ { 5, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 17 },
+ { 29, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 18 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 18 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 18 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 18 },
+ { 0, 17, 7, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 18 },
+ { 0, 0, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 18 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 18 },
+ { 0, 17, 0, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 18 },
+ { 1, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 18 },
+ { 0, 17, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 0, 17, 9, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 19 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 19 },
+ { 29, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 5, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 5, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 19 },
+ { 29, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 19 },
+ { 0, 17, 0, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 20 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 20 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 20 },
+ { 0, 17, 9, 5, -1, 0, 4, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 20 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 20 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 20 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 20 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 20 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 21 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 21 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 0, 35, 8, 3, 21 },
+ { 0, 17, 103, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 21 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 21 },
+ { 27, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 21 },
+ { 0, 17, 107, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 21 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 21 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 21 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 22 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 22 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 22 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 0, 35, 8, 3, 22 },
+ { 0, 17, 118, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 22 },
+ { 0, 17, 9, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 22 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 22 },
+ { 0, 17, 122, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 22 },
+ { 0, 17, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 22 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 3, 22 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 22 },
+ { 18, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 3, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 0, 17, 220, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 3, 0, 0, 0, 0, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 2, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 3, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 4, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 5, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 6, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 7, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 8, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 9, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 5, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 23 },
+ { 0, 17, 216, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 21, 10, 0, 0, -1, 1, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 23 },
+ { 22, 10, 0, 0, -1, -1, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 23 },
+ { 1, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 23 },
+ { 18, 0, 0, 0, -1, 0, 2, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 23 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 23 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 23 },
+ { 0, 17, 129, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 0, 17, 130, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 0, 17, 0, 5, -1, 0, 2, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 3, 23 },
+ { 0, 17, 132, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 0, 17, 0, 5, -1, 0, 2, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 3, 23 },
+ { 0, 17, 0, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 1, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 19, 4, 1, 23 },
+ { 0, 17, 230, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 0, 17, 9, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 23 },
+ { 0, 17, 0, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 0, 17, 220, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 23 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 24 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 35, 4, 1, 24 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 0, 17, 7, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 0, 17, 9, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 0, 17, 9, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 35, 4, 1, 24 },
+ { 3, 0, 0, 0, 0, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 2, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 3, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 4, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 5, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 6, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 7, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 8, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 9, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 24 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 24 },
+ { 0, 17, 220, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 24 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 29, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 24 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 7264}, {0, 0}, {0, 0}, {0, 7264} }, 0, 10, 14, 7, 0, 25 },
+ { 14, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 7264}, {0, 0}, {0, 0}, {0, 7264} }, 0, 10, 14, 7, 3, 25 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 25 },
+ { 15, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 25 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 25 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 25 },
+ { 15, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 25 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 27, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 11, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 27, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 27, 8, 0, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 28, 8, 0, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 28, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 28, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 28, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 29, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 29, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 29, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 27 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 27 },
+ { 0, 17, 230, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 27 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 27 },
+ { 25, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 27 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 27 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 2, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 3, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 4, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 5, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 6, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 7, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 8, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 9, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 41}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 43}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 45}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 47}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 49}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 51}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 53}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 55}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 57}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 59}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 61}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 63}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 65}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 67}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 69}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 71}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 73}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 75}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 77}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 79}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 81}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 83}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 85}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 87}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 89}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 91}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 93}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 95}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 97}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 99}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 101}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 103}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 105}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 107}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 109}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 111}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 113}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 115}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 117}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 119}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 121}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 123}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 125}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 127}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 129}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 131}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 133}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 135}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 137}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 139}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 141}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 143}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 145}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 147}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 149}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 151}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 153}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 155}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 157}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 159}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 161}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 163}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 165}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 167}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 169}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 171}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 173}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 175}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 177}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 179}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 181}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 183}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 185}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 187}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 189}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 191}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 193}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 195}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 197}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 199}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, -8}, {0, -8}, {0, -8} }, 0, 10, 14, 6, 3, 28 },
+ { 20, 10, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 29 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 29 },
+ { 29, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 29 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 29 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 29 },
+ { 6, 9, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 19, 5, 0, 30 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 30 },
+ { 21, 10, 0, 0, -1, 1, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 30 },
+ { 22, 10, 0, 0, -1, -1, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 30 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 31 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 4, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 31 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 31 },
+ { 18, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 42 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 42 },
+ { 0, 17, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 42 },
+ { 0, 17, 9, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 42 },
+ { 1, 0, 9, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 42 },
+ { 18, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 43 },
+ { 0, 17, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 43 },
+ { 1, 0, 9, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 43 },
+ { 25, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 44 },
+ { 0, 17, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 44 },
+ { 18, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 45 },
+ { 0, 17, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 45 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 32 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 0, 32 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 35, 4, 1, 32 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 32 },
+ { 0, 17, 9, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 32 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 32 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 1, 32 },
+ { 17, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 32 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 32 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 32 },
+ { 27, 4, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 32 },
+ { 0, 17, 230, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 32 },
+ { 3, 0, 0, 0, 0, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 2, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 3, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 4, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 5, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 6, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 7, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 8, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 9, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 5, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 32 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 33 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 11, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 33 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 0, 33 },
+ { 25, 10, 0, 2, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 33 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 11, 1, 33 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 33 },
+ { 25, 10, 0, 1, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 33 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 2, 33 },
+ { 10, 18, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 6, 4, 0, 33 },
+ { 0, 17, 0, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 2, 33 },
+ { 3, 0, 0, 0, 0, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 2, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 3, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 4, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 5, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 6, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 7, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 8, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 9, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 18, 0, 0, 2, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 33 },
+ { 17, 0, 0, 2, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 33 },
+ { 18, 0, 0, 2, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 33 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 33 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 33 },
+ { 0, 17, 228, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 33 },
+ { 18, 0, 0, 2, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 33 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 47 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 47 },
+ { 0, 17, 0, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 47 },
+ { 1, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 47 },
+ { 0, 17, 222, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 47 },
+ { 0, 17, 230, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 47 },
+ { 0, 17, 220, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 47 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 47 },
+ { 25, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 47 },
+ { 3, 0, 0, 0, 0, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 2, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 3, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 4, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 5, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 6, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 7, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 8, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 9, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 48 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 56 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 56 },
+ { 3, 0, 0, 0, 0, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 2, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 3, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 4, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 5, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 6, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 7, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 8, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 9, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 5, 0, 0, 0, 1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 56 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 56 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 32 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 55 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 55 },
+ { 0, 17, 220, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 55 },
+ { 1, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 55 },
+ { 0, 17, 0, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 55 },
+ { 25, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 55 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 78 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 35, 4, 1, 78 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 78 },
+ { 0, 17, 9, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 78 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 78 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 78 },
+ { 0, 17, 220, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 78 },
+ { 3, 0, 0, 0, 0, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 2, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 3, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 4, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 5, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 6, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 7, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 8, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 9, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 78 },
+ { 17, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 78 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 12, 1, 78 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 2, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 0, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 62 },
+ { 1, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 62 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 62 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 62 },
+ { 0, 17, 7, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 62 },
+ { 1, 0, 0, 0, -1, 0, 9, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 62 },
+ { 1, 0, 0, 0, -1, 0, 9, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 62 },
+ { 1, 0, 9, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 62 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 62 },
+ { 3, 0, 0, 0, 0, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 2, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 3, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 4, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 5, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 6, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 7, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 8, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 9, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 25, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 62 },
+ { 25, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 62 },
+ { 25, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 62 },
+ { 29, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 62 },
+ { 0, 17, 230, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 62 },
+ { 0, 17, 220, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 62 },
+ { 25, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 62 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 67 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 67 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 67 },
+ { 1, 0, 9, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 67 },
+ { 0, 17, 9, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 67 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 67 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 67 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 93 },
+ { 0, 17, 7, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 93 },
+ { 1, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 93 },
+ { 0, 17, 0, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 93 },
+ { 1, 0, 9, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 93 },
+ { 25, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 93 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 68 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 68 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 68 },
+ { 0, 17, 7, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 68 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 68 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 68 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 69 },
+ { 17, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 69 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 69 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6254}, {0, -6254}, {0, -6222} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6253}, {0, -6253}, {0, -6221} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6244}, {0, -6244}, {0, -6212} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6242}, {0, -6242}, {0, -6210} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6243}, {0, -6243}, {0, -6211} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6236}, {0, -6236}, {0, -6204} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6181}, {0, -6181}, {0, -6180} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {1, 201}, {1, 201}, {1, 719} }, 0, 10, 14, 6, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 20, 3, 0, { {0, -3008}, {0, 0}, {0, 0}, {0, -3008} }, 0, 10, 14, 8, 3, 25 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 67 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 0, 17, 1, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 0, 17, 230, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 1, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 17, 0, 0, 0, -1, 0, 7, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 17, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 7, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 17, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {1, 203}, {1, 203}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 3814}, {0, 3814}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {1, 205}, {1, 205}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 17, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 234, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 214, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 202, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 232, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 228, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 218, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 233, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 514}, {1, 514}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 517}, {1, 517}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 520}, {1, 520}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 523}, {1, 523}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 526}, {1, 526}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 2, 3, 81, { {0, 0}, {0, -59}, {0, -59}, {0, -58} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {0, -7615}, {0, 0}, {0, 0}, {0, -7615} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 8}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {0, 0}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 529}, {1, 529}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 532}, {1, 532}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 536}, {1, 536}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 540}, {1, 540}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 74}, {0, 74}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 74}, {0, 74}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 86}, {0, 86}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 86}, {0, 86}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 100}, {0, 100}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 100}, {0, 100}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 128}, {0, 128}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 128}, {0, 128}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 112}, {0, 112}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 112}, {0, 112}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 126}, {0, 126}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 126}, {0, 126}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 578}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 581}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 584}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 587}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 590}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 593}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 596}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 599}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 578}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 581}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 584}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 587}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 590}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 593}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 596}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 599}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 602}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 605}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 608}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 611}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 614}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 617}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 620}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 623}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 602}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 605}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 608}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 611}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 614}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 617}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 620}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 623}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 626}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 629}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 632}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 635}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 638}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 641}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 644}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 647}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 626}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 629}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 632}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 635}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 638}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 641}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 644}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 647}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 662}, {1, 659}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 650}, {0, 9}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 668}, {1, 665}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 544}, {1, 544}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 699}, {1, 695}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -74}, {0, 0}, {0, 0}, {0, -74} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -74}, {0, 0}, {0, 0}, {0, -74} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -9}, {1, 650}, {0, 0}, {0, -9} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, -7205}, {0, -7205}, {0, -7173} }, 0, 10, 14, 6, 3, 4 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 674}, {1, 671}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 653}, {0, 9}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 680}, {1, 677}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 547}, {1, 547}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 707}, {1, 703}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -86}, {0, 0}, {0, 0}, {0, -86} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -86}, {0, 0}, {0, 0}, {0, -86} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -9}, {1, 653}, {0, 0}, {0, -9} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 550}, {1, 550}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {1, 503}, {1, 503}, {0, -7235} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 554}, {1, 554}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 557}, {1, 557}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -100}, {0, 0}, {0, 0}, {0, -100} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -100}, {0, 0}, {0, 0}, {0, -100} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 561}, {1, 561}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {1, 507}, {1, 507}, {0, -7219} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 565}, {1, 565}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 7}, {0, 7}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 568}, {1, 568}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 571}, {1, 571}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -112}, {0, 0}, {0, 0}, {0, -112} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -112}, {0, 0}, {0, 0}, {0, -112} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -7}, {0, 0}, {0, 0}, {0, -7} }, 0, 10, 14, 7, 3, 4 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 686}, {1, 683}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 656}, {0, 9}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 692}, {1, 689}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 575}, {1, 575}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 715}, {1, 711}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -128}, {0, 0}, {0, 0}, {0, -128} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -128}, {0, 0}, {0, 0}, {0, -128} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -126}, {0, 0}, {0, 0}, {0, -126} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -126}, {0, 0}, {0, 0}, {0, -126} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -9}, {1, 656}, {0, 0}, {0, -9} }, 0, 10, 14, 7, 3, 4 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 0, 4 },
+ { 6, 9, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 19, 5, 0, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 19, 5, 0, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 5, 0, 2 },
+ { 10, 18, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 22, 4, 2, 2 },
+ { 10, 18, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 4, 1 },
+ { 10, 18, 0, 1, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 5, 5, 34, 4, 4, 1 },
+ { 10, 0, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 1, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 3, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 11, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 21, 11, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 23, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 3, 13, 1, 2 },
+ { 24, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 3, 13, 1, 2 },
+ { 21, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 23, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 23, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 24, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 17, 10, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 19, 0, 1, 2 },
+ { 7, 9, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 40, 3, 0, 2 },
+ { 8, 7, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 40, 3, 0, 2 },
+ { 10, 11, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 14, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 16, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 12, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 15, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 6, 6, 0, 0, -1, 0, 4, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 6, 5, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 23, 10, 0, 0, -1, 1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 24, 10, 0, 0, -1, -1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 7, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 12, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 19, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 14, 0, 1, 2 },
+ { 26, 6, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 7, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 19, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 6, 9, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 19, 5, 0, 2 },
+ { 10, 18, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 24, 4, 2, 2 },
+ { 10, 18, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 14, 4, 0, 2 },
+ { 10, 18, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 14, 4, 2, 2 },
+ { 13, 18, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 14, 0, 0, 0 },
+ { 10, 19, 0, 0, -1, 0, 15, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 20, 0, 0, -1, 0, 15, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 21, 0, 0, -1, 0, 15, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 22, 0, 0, -1, 0, 15, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 18, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 5, 2, 0, 0, 0, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 17, 0, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 5, 2, 0, 0, 4, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 5, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 6, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 7, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 8, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 9, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 17, 0, 0, 0, -1, 0, 12, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 27, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 3, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 3, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 14, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 13, 4, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 0 },
+ { 0, 17, 1, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 2, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 2, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 2, 17, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 1, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 1, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 3, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 85, { {0, -7517}, {0, 0}, {0, 0}, {0, -7517} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {1, 207}, {0, 0}, {0, 0}, {1, 207} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 85, { {1, 209}, {0, 0}, {0, 0}, {1, 209} }, 0, 10, 14, 7, 3, 3 },
+ { 29, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 28}, {0, 0}, {0, 0}, {0, 28} }, 0, 10, 14, 7, 0, 3 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 14, 6, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 14, 0, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, -28}, {0, -28}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 29, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, -1, 0, 11, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 4, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 16}, {0, 0}, {0, 0}, {0, 16} }, 0, 10, 14, 7, 3, 3 },
+ { 4, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 16}, {0, 0}, {0, 0}, {0, 16} }, 0, 10, 14, 7, 3, 3 },
+ { 4, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, -16}, {0, -16}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 4, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -16}, {0, -16}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 4, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 0, 3 },
+ { 4, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 5, 10, 0, 0, -1, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 3, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 3, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 3, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -3, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -3, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -3, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 26, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2016, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2527, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1923, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1914, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1918, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2250, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 1, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 138, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 7, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -7, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 0, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 1, 0, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 1, 0, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1824, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2104, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2108, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2106, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1316, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -138, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 8, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 7, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -8, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -7, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 2, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 3, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 4, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 5, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 6, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 7, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 8, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 9, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 2, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 3, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 4, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 5, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 6, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 7, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 8, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 9, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 2, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 3, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 4, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 5, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 6, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 7, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 8, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 9, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 26}, {0, 0}, {0, 0}, {0, 26} }, 0, 10, 14, 7, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 26}, {0, 0}, {0, 0}, {0, 26} }, 14, 10, 14, 7, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, -26}, {0, -26}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 5, 10, 0, 0, 0, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, -1, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 1, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 2, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 3, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 4, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 5, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 6, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 7, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 8, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 9, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 0, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 8, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 8, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 8, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 5, 10, 0, 0, 1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 2, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 3, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 4, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 5, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 6, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 7, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 8, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 9, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -2, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1316, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 6, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 6, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 10, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 10, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 54 },
+ { 21, 10, 0, 0, -1, 3, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, 1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 21, 10, 0, 0, -1, -1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -3, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 26, 10, 0, 0, -1, -1914, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1918, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1923, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1824, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -2016, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, -2104, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -2106, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -2108, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -2250, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 10, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, -2527, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 14, 7, 3, 57 },
+ { 14, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 14, 7, 3, 57 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 14, 6, 1, 57 },
+ { 15, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 14, 6, 1, 57 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {1, 211}, {0, 0}, {0, 0}, {1, 211} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, -3814}, {0, 0}, {0, 0}, {0, -3814} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {1, 213}, {0, 0}, {0, 0}, {1, 213} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {1, 215}, {1, 215}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {1, 217}, {1, 217}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {1, 219}, {0, 0}, {0, 0}, {1, 219} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {1, 221}, {0, 0}, {0, 0}, {1, 221} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {1, 223}, {0, 0}, {0, 0}, {1, 223} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 11, 3, 0, { {1, 225}, {0, 0}, {0, 0}, {1, 225} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 10, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 11, 3, 0, { {1, 227}, {0, 0}, {0, 0}, {1, 227} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 11, 3, 0, { {1, 229}, {0, 0}, {0, 0}, {1, 229} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 46 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 46 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 46 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 46 },
+ { 14, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 46 },
+ { 15, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 46 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 46 },
+ { 14, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 46 },
+ { 15, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 46 },
+ { 25, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 46 },
+ { 25, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 46 },
+ { 5, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 46 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, -7264}, {0, -7264}, {0, 0} }, 0, 10, 14, 6, 1, 25 },
+ { 15, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, -7264}, {0, -7264}, {0, 0} }, 0, 10, 14, 6, 1, 25 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 58 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 58 },
+ { 17, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 58 },
+ { 25, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 58 },
+ { 0, 17, 9, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 58 },
+ { 25, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 23, 10, 0, 0, -1, 1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 24, 10, 0, 0, -1, -1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 23, 10, 0, 0, -1, 1, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 24, 10, 0, 0, -1, -1, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 2 },
+ { 17, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 21, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 37 },
+ { 29, 10, 0, 0, -1, 0, 4, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 37 },
+ { 29, 10, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 26, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 19, 5, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 12, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 2 },
+ { 4, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 21, 10, 0, 0, -1, 1, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 0, 17, 218, 5, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 228, 5, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 232, 5, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 222, 5, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 1, 0, 224, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 26 },
+ { 20, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 23, 8, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 4, 0, 0, 0, -1, 0, 4, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 17, 0, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 0, 17, 8, 5, -1, 0, 1, 5, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 28, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 0, 0, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 34 },
+ { 20, 10, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 0, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 1, 35 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 3, 35 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 10, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 20, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 3, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 0, 26 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 5, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 18, 0, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 29, 10, 0, 0, -1, 0, 8, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 10, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 26 },
+ { 29, 10, 0, 0, -1, 0, 7, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 26 },
+ { 5, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 5, 0, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 5, 10, 0, 0, -1, 0, 6, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 26 },
+ { 29, 10, 0, 0, -1, 0, 7, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 26 },
+ { 29, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 26 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 0, 3, 35 },
+ { 29, 0, 0, 0, -1, 0, 22, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 18, 0, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 8, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 10, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 11, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 13, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 17, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 20, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 38 },
+ { 17, 0, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 38 },
+ { 29, 10, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 38 },
+ { 29, 10, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 38 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 83 },
+ { 17, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 83 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 83 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 83 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 70 },
+ { 17, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 70 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 70 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 70 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 70 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 5 },
+ { 2, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 5 },
+ { 0, 17, 230, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 17, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 5 },
+ { 17, 0, 0, 0, -1, 0, 16, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 5 },
+ { 0, 17, 230, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 84 },
+ { 4, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 84 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 84 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 84 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 84 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 84 },
+ { 28, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 17, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {1, 231}, {0, 0}, {0, 0}, {1, 231} }, 0, 10, 14, 7, 3, 3 },
+ { 28, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 14, 0, 0, 0, -1, 0, 12, 3, 0, { {1, 233}, {0, 0}, {0, 0}, {1, 233} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 48}, {0, 48}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 13, 3, 0, { {1, 235}, {0, 0}, {0, 0}, {1, 235} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {1, 237}, {0, 0}, {0, 0}, {1, 237} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {1, 239}, {0, 0}, {0, 0}, {1, 239} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {1, 241}, {0, 0}, {0, 0}, {1, 241} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 18, 3, 0, { {1, 243}, {0, 0}, {0, 0}, {1, 243} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {1, 245}, {0, 0}, {0, 0}, {1, 245} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {1, 247}, {0, 0}, {0, 0}, {1, 247} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 17, 3, 0, { {1, 249}, {0, 0}, {0, 0}, {1, 249} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 928}, {0, 0}, {0, 0}, {0, 928} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 3, 0, { {0, -48}, {0, 0}, {0, 0}, {0, -48} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 3, 0, { {1, 251}, {0, 0}, {0, 0}, {1, 251} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 3, 0, { {1, 253}, {0, 0}, {0, 0}, {1, 253} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 24, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 13, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 59 },
+ { 0, 17, 0, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 59 },
+ { 0, 17, 9, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 59 },
+ { 1, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 59 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 59 },
+ { 0, 17, 9, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 59 },
+ { 5, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 4, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 18, 0, 0, 2, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 65 },
+ { 18, 0, 0, 4, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 65 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 65 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 65 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 65 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 71 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 71 },
+ { 0, 17, 9, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 71 },
+ { 0, 17, 0, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 71 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 71 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 11 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 0, 17, 0, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 72 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 72 },
+ { 0, 17, 220, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 72 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 72 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 73 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 73 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 73 },
+ { 1, 0, 9, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 73 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 73 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 85 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 85 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 85 },
+ { 0, 17, 7, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 85 },
+ { 1, 0, 9, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 85 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 85 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 85 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 85 },
+ { 17, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 19, 8, 1, 2 },
+ { 3, 0, 0, 0, 0, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 2, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 3, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 4, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 5, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 6, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 7, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 8, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 9, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 17, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 77 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 77 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 77 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 19, 8, 1, 77 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 77 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 77 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 17, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 29, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 24 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 79 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 79 },
+ { 0, 17, 220, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 79 },
+ { 17, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 79 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 79 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 86 },
+ { 1, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 86 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 86 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 86 },
+ { 17, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 86 },
+ { 0, 17, 9, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 86 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 27 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, -928}, {0, -928}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 28, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 16, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 28, 10, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 255}, {1, 255}, {1, 255} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 257}, {1, 257}, {1, 257} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 259}, {1, 259}, {1, 259} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 261}, {1, 261}, {1, 261} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 263}, {1, 263}, {1, 263} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 265}, {1, 265}, {1, 265} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 267}, {1, 267}, {1, 267} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 269}, {1, 269}, {1, 269} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 271}, {1, 271}, {1, 271} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 273}, {1, 273}, {1, 273} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 275}, {1, 275}, {1, 275} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 277}, {1, 277}, {1, 277} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 279}, {1, 279}, {1, 279} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 281}, {1, 281}, {1, 281} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 283}, {1, 283}, {1, 283} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 285}, {1, 285}, {1, 285} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 287}, {1, 287}, {1, 287} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 289}, {1, 289}, {1, 289} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 291}, {1, 291}, {1, 291} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 293}, {1, 293}, {1, 293} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 295}, {1, 295}, {1, 295} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 297}, {1, 297}, {1, 297} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 299}, {1, 299}, {1, 299} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 301}, {1, 301}, {1, 301} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 303}, {1, 303}, {1, 303} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 305}, {1, 305}, {1, 305} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 307}, {1, 307}, {1, 307} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 309}, {1, 309}, {1, 309} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 311}, {1, 311}, {1, 311} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 313}, {1, 313}, {1, 313} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 315}, {1, 315}, {1, 315} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 317}, {1, 317}, {1, 317} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 319}, {1, 319}, {1, 319} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 321}, {1, 321}, {1, 321} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 323}, {1, 323}, {1, 323} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 325}, {1, 325}, {1, 325} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 327}, {1, 327}, {1, 327} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 329}, {1, 329}, {1, 329} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 331}, {1, 331}, {1, 331} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 333}, {1, 333}, {1, 333} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 335}, {1, 335}, {1, 335} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 337}, {1, 337}, {1, 337} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 339}, {1, 339}, {1, 339} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 341}, {1, 341}, {1, 341} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 343}, {1, 343}, {1, 343} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 345}, {1, 345}, {1, 345} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 347}, {1, 347}, {1, 347} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 349}, {1, 349}, {1, 349} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 351}, {1, 351}, {1, 351} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 353}, {1, 353}, {1, 353} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 355}, {1, 355}, {1, 355} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 357}, {1, 357}, {1, 357} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 359}, {1, 359}, {1, 359} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 361}, {1, 361}, {1, 361} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 363}, {1, 363}, {1, 363} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 365}, {1, 365}, {1, 365} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 367}, {1, 367}, {1, 367} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 369}, {1, 369}, {1, 369} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 371}, {1, 371}, {1, 371} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 373}, {1, 373}, {1, 373} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 375}, {1, 375}, {1, 375} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 377}, {1, 377}, {1, 377} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 379}, {1, 379}, {1, 379} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 381}, {1, 381}, {1, 381} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 383}, {1, 383}, {1, 383} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 385}, {1, 385}, {1, 385} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 387}, {1, 387}, {1, 387} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 389}, {1, 389}, {1, 389} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 391}, {1, 391}, {1, 391} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 393}, {1, 393}, {1, 393} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 395}, {1, 395}, {1, 395} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 397}, {1, 397}, {1, 397} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 399}, {1, 399}, {1, 399} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 401}, {1, 401}, {1, 401} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 403}, {1, 403}, {1, 403} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 405}, {1, 405}, {1, 405} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 407}, {1, 407}, {1, 407} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 409}, {1, 409}, {1, 409} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 411}, {1, 411}, {1, 411} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 413}, {1, 413}, {1, 413} }, 0, 10, 14, 6, 3, 28 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 86 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 86 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 86 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 86 },
+ { 0, 17, 9, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 86 },
+ { 3, 0, 0, 0, 0, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 2, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 3, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 4, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 5, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 6, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 7, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 8, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 9, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 18, 0, 0, 0, -1, 0, 2, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 12, 10, 25, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 2, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 13, 10, 26, 8, 1, 26 },
+ { 11, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 36, 0, 0, 0 },
+ { 12, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 18, 0, 0, 0, -1, 0, 13, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 18, 0, 0, 0, -1, 0, 11, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 13, 0, 0, 0, -1, 0, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 0 },
+ { 18, 0, 0, 0, -1, 0, 8, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 427}, {1, 424}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 433}, {1, 430}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 439}, {1, 436}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 446}, {1, 442}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 454}, {1, 450}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 461}, {1, 458}, {0, 1} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 461}, {1, 458}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 473}, {1, 470}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 479}, {1, 476}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 485}, {1, 482}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 491}, {1, 488}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 497}, {1, 494}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 18, 1, 0, 0, -1, 0, 4, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 15, 8, 3, 7 },
+ { 0, 17, 26, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 18, 1, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 15, 8, 3, 7 },
+ { 18, 1, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 15, 8, 3, 7 },
+ { 26, 3, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 7 },
+ { 18, 13, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 8 },
+ { 28, 13, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 18, 13, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 0, 8 },
+ { 22, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 13, 18, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 27, 13, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 8 },
+ { 0, 17, 0, 5, -1, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 2, 1 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 10, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 0, 2 },
+ { 21, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 11, 3, 2 },
+ { 19, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 16, 0, 3, 2 },
+ { 21, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 21, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 0, 7, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, 0, 7, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 1, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 11, 3, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 1, 10, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 7, 0, 0, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 7, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 0, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 20, 3, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 11, 3, 2 },
+ { 26, 10, 0, 0, -1, 1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, -1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
+ { 18, 13, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 10, 18, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 24, 4, 2, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 16, 0, 0, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 1, 11, 0, 2 },
+ { 20, 3, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 11, 3, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 1, 10, 3, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 3, 2, 0, 0, 0, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 2, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 3, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 4, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 5, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 6, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 7, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 8, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 9, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 7, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 7, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 2, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, -2, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 1, 80, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 16, 7, 3, 3 },
+ { 21, 10, 0, 0, -1, 2, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, -2, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 19, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 16, 0, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 16, 6, 3, 3 },
+ { 21, 10, 0, 0, -1, 1, 6, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, -1, 6, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 12, 3, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 3, 2 },
+ { 18, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 3, 35 },
+ { 18, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 3, 35 },
+ { 17, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 3, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 7, 4, 3, 2 },
+ { 18, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 0, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 3, 26 },
+ { 27, 4, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 10, 10, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 3, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 31, 0, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 13, 18, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 49 },
+ { 25, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 5, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 4, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 4 },
+ { 5, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 5, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 29, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 74 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 75 },
+ { 5, 2, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 39 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 39 },
+ { 5, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 39 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 39 },
+ { 18, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 40 },
+ { 4, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 40 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 120 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 120 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 50 },
+ { 25, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 50 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 60 },
+ { 25, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 60 },
+ { 4, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 60 },
+ { 14, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 14, 7, 3, 41 },
+ { 14, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 14, 7, 3, 41 },
+ { 15, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 14, 6, 1, 41 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 14, 6, 1, 41 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 51 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 52 },
+ { 3, 0, 0, 0, 0, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 2, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 3, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 4, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 5, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 6, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 7, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 8, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 9, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 14, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 14, 7, 3, 136 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 14, 6, 1, 136 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 106 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 103 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 103 },
+ { 14, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 39}, {0, 0}, {0, 0}, {0, 39} }, 0, 10, 14, 7, 3, 161 },
+ { 15, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, -39}, {0, -39}, {0, 0} }, 0, 10, 14, 6, 1, 161 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 110 },
+ { 17, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 24, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 3 },
+ { 18, 1, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 53 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 87 },
+ { 25, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 87 },
+ { 5, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 87 },
+ { 18, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 118 },
+ { 29, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 118 },
+ { 5, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 118 },
+ { 18, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 117 },
+ { 5, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 117 },
+ { 18, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 128 },
+ { 5, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 128 },
+ { 18, 1, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 64 },
+ { 5, 1, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 64 },
+ { 5, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 64 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 64 },
+ { 18, 1, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 76 },
+ { 25, 1, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 76 },
+ { 18, 1, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 98 },
+ { 18, 1, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 97 },
+ { 5, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 97 },
+ { 18, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 61 },
+ { 0, 17, 0, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 61 },
+ { 0, 17, 220, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 61 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 61 },
+ { 18, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 61 },
+ { 0, 17, 1, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 61 },
+ { 0, 17, 9, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 61 },
+ { 5, 1, 0, 0, 1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 5, 1, 0, 0, 2, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 5, 1, 0, 0, 3, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 5, 1, 0, 0, 4, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 5, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 5, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 25, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 61 },
+ { 25, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 61 },
+ { 25, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 88 },
+ { 5, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 88 },
+ { 25, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 88 },
+ { 18, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 116 },
+ { 5, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 116 },
+ { 18, 1, 0, 2, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 112 },
+ { 18, 1, 0, 3, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 112 },
+ { 18, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 112 },
+ { 29, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 112 },
+ { 18, 1, 0, 4, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 112 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 112 },
+ { 0, 17, 220, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 112 },
+ { 5, 1, 0, 2, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 112 },
+ { 5, 1, 0, 3, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 112 },
+ { 25, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 112 },
+ { 25, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 112 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 80 },
+ { 25, 10, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 80 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 89 },
+ { 5, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 89 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 90 },
+ { 5, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 90 },
+ { 18, 1, 0, 2, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 121 },
+ { 18, 1, 0, 3, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 121 },
+ { 25, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 121 },
+ { 5, 1, 0, 3, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 121 },
+ { 5, 1, 0, 2, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 121 },
+ { 5, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 121 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 91 },
+ { 14, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 64}, {0, 0}, {0, 0}, {0, 64} }, 0, 10, 14, 7, 3, 130 },
+ { 15, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, -64}, {0, -64}, {0, 0} }, 0, 10, 14, 6, 1, 130 },
+ { 5, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 130 },
+ { 18, 13, 0, 4, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 144 },
+ { 18, 13, 0, 2, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 144 },
+ { 18, 13, 0, 3, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 144 },
+ { 0, 17, 230, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 144 },
+ { 3, 5, 0, 0, 0, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 2, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 3, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 4, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 5, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 6, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 7, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 8, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 9, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 5, 5, 0, 0, 1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 2, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 3, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 4, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 5, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 6, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 7, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 8, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 9, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 18, 1, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 156 },
+ { 0, 17, 230, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 156 },
+ { 20, 1, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 156 },
+ { 0, 17, 220, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 18, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 147 },
+ { 5, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 147 },
+ { 18, 13, 0, 2, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 148 },
+ { 18, 13, 0, 3, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 148 },
+ { 18, 13, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 148 },
+ { 0, 17, 220, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 148 },
+ { 0, 17, 230, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 148 },
+ { 5, 13, 0, 2, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 148 },
+ { 5, 13, 0, 3, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 148 },
+ { 25, 13, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 148 },
+ { 18, 1, 0, 2, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 158 },
+ { 18, 1, 0, 3, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 158 },
+ { 0, 17, 230, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 158 },
+ { 0, 17, 220, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 158 },
+ { 25, 1, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 158 },
+ { 18, 1, 0, 2, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 153 },
+ { 18, 1, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 153 },
+ { 18, 1, 0, 3, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 153 },
+ { 5, 1, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 153 },
+ { 5, 1, 0, 3, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 153 },
+ { 5, 1, 0, 2, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 153 },
+ { 5, 1, 0, 4, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 153 },
+ { 18, 1, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 149 },
+ { 1, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 94 },
+ { 0, 17, 0, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 94 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 94 },
+ { 0, 17, 9, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 94 },
+ { 25, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 94 },
+ { 25, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 2, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 3, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 4, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 5, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 6, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 7, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 8, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 9, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 3, 0, 0, 0, 0, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 2, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 3, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 4, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 5, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 6, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 7, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 8, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 9, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 0, 17, 9, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 94 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 94 },
+ { 0, 17, 0, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 94 },
+ { 0, 17, 9, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 94 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 92 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 92 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 92 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 92 },
+ { 0, 17, 9, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 92 },
+ { 0, 17, 7, 5, -1, 0, 11, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 92 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 92 },
+ { 10, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 92 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 92 },
+ { 0, 17, 0, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 92 },
+ { 10, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 92 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 101 },
+ { 3, 0, 0, 0, 0, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 2, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 3, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 4, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 5, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 6, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 7, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 8, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 9, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 0, 17, 230, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 96 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 96 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 96 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 96 },
+ { 1, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 96 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 96 },
+ { 0, 17, 9, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 96 },
+ { 3, 0, 0, 0, 0, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 2, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 3, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 4, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 5, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 6, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 7, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 8, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 9, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 96 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 96 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 96 },
+ { 1, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 96 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 96 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 111 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 111 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 111 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 111 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 100 },
+ { 1, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 100 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 100 },
+ { 1, 0, 9, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 100 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 100 },
+ { 0, 17, 0, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 100 },
+ { 0, 17, 7, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 100 },
+ { 1, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 100 },
+ { 0, 17, 0, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 100 },
+ { 3, 0, 0, 0, 0, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 2, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 3, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 4, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 5, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 6, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 7, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 8, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 9, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 100 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 100 },
+ { 5, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 20 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 109 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 109 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 109 },
+ { 1, 0, 9, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 109 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 109 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 109 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 109 },
+ { 0, 17, 0, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 109 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 109 },
+ { 0, 17, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 109 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 129 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 129 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 123 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 123 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 123 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 123 },
+ { 0, 17, 9, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 123 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 0, 17, 0, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 107 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 107 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 107 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 107 },
+ { 0, 17, 7, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 107 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 19, 8, 1, 107 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 107 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 107 },
+ { 1, 0, 9, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 107 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 107 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 107 },
+ { 18, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 135 },
+ { 1, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 135 },
+ { 0, 17, 0, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 135 },
+ { 0, 17, 9, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 135 },
+ { 0, 17, 7, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 135 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 135 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 135 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 135 },
+ { 3, 0, 0, 0, 0, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 2, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 3, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 4, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 5, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 6, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 7, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 8, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 9, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 25, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 135 },
+ { 0, 17, 230, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 135 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 135 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 135 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 124 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 124 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 124 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 124 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 124 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 124 },
+ { 0, 17, 9, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 124 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 124 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 124 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 122 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 122 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 122 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 122 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 122 },
+ { 0, 17, 9, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 122 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 122 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 122 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 122 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 122 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 122 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 122 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 122 },
+ { 0, 17, 0, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 122 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 114 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 114 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 114 },
+ { 0, 17, 9, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 114 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 114 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 114 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 25, 10, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 33 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 102 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 102 },
+ { 1, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 102 },
+ { 1, 0, 9, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 102 },
+ { 0, 17, 7, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 102 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 102 },
+ { 25, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 102 },
+ { 3, 0, 0, 0, 0, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 2, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 3, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 4, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 5, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 6, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 7, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 8, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 9, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 126 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 126 },
+ { 0, 17, 0, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 126 },
+ { 1, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 126 },
+ { 1, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 35, 4, 1, 126 },
+ { 0, 17, 9, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 126 },
+ { 3, 0, 0, 0, 0, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 2, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 3, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 4, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 5, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 6, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 7, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 8, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 9, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 5, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 126 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 126 },
+ { 29, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 126 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 126 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 142 },
+ { 1, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 142 },
+ { 0, 17, 0, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 142 },
+ { 0, 17, 9, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 142 },
+ { 0, 17, 7, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 142 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 142 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 125 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 125 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 5, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 125 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 125 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 154 },
+ { 1, 0, 0, 0, -1, 0, 23, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 154 },
+ { 1, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 154 },
+ { 1, 0, 0, 0, -1, 0, 23, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 154 },
+ { 0, 17, 0, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 154 },
+ { 1, 0, 9, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 154 },
+ { 0, 17, 9, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 154 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 154 },
+ { 0, 17, 7, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 154 },
+ { 25, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 154 },
+ { 25, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 154 },
+ { 3, 0, 0, 0, 0, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 2, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 3, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 4, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 5, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 6, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 7, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 8, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 9, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 150 },
+ { 1, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 150 },
+ { 0, 17, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 150 },
+ { 0, 17, 9, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 150 },
+ { 25, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 150 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 141 },
+ { 0, 17, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 141 },
+ { 0, 0, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 141 },
+ { 0, 17, 9, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 141 },
+ { 1, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 141 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 141 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 141 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 141 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 141 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 141 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 140 },
+ { 0, 17, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 140 },
+ { 1, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 140 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 140 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 140 },
+ { 0, 17, 9, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 140 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 140 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 140 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 140 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 140 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 29 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 119 },
+ { 25, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 133 },
+ { 1, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 133 },
+ { 0, 17, 0, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 133 },
+ { 0, 0, 9, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 133 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 133 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 133 },
+ { 3, 0, 0, 0, 0, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 2, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 3, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 4, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 5, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 6, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 7, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 8, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 9, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 5, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 133 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 134 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 134 },
+ { 18, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 134 },
+ { 0, 17, 0, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 134 },
+ { 1, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 134 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 138 },
+ { 0, 17, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 138 },
+ { 0, 17, 7, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 138 },
+ { 0, 17, 9, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 138 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 138 },
+ { 3, 0, 0, 0, 0, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 2, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 3, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 4, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 5, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 6, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 7, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 8, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 9, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 143 },
+ { 1, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 143 },
+ { 0, 17, 0, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 143 },
+ { 0, 17, 9, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 143 },
+ { 3, 0, 0, 0, 0, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 2, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 3, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 4, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 5, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 6, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 7, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 8, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 9, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 145 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 19, 8, 1, 145 },
+ { 0, 17, 0, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 145 },
+ { 1, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 145 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 145 },
+ { 0, 17, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 162 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 162 },
+ { 1, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 162 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 162 },
+ { 1, 0, 9, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 162 },
+ { 0, 17, 9, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 162 },
+ { 25, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 162 },
+ { 25, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 162 },
+ { 3, 0, 0, 0, 0, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 2, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 3, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 4, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 5, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 6, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 7, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 8, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 9, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 83 },
+ { 5, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 16 },
+ { 29, 10, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 16 },
+ { 27, 4, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 16 },
+ { 25, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 16 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 63 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 63 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 63 },
+ { 4, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 63 },
+ { 4, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 63 },
+ { 25, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 63 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 63 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 157 },
+ { 25, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 157 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 81 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 1, 81 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 1, 8, 1, 81 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 1, 81 },
+ { 10, 0, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 6, 4, 0, 81 },
+ { 10, 0, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 0, 4, 0, 81 },
+ { 10, 0, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 1, 4, 0, 81 },
+ { 10, 0, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 6, 4, 0, 81 },
+ { 10, 0, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 0, 4, 0, 81 },
+ { 10, 0, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 1, 4, 0, 81 },
+ { 0, 17, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 81 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 81 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 127 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 1, 127 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 1, 8, 1, 127 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 84 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 115 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 115 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 159 },
+ { 3, 0, 0, 0, 0, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 2, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 3, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 4, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 5, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 6, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 7, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 8, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 9, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 104 },
+ { 0, 17, 1, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 104 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 104 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 108 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 108 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 108 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 108 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 108 },
+ { 29, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 108 },
+ { 17, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 108 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 5, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 108 },
+ { 14, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 146 },
+ { 15, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 146 },
+ { 5, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 146 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 146 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 146 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 146 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 99 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 99 },
+ { 0, 17, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 99 },
+ { 1, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 99 },
+ { 1, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 99 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 99 },
+ { 17, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 99 },
+ { 17, 0, 0, 0, -1, 0, 18, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 137 },
+ { 17, 0, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 139 },
+ { 25, 10, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 1, 37 },
+ { 17, 0, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 37 },
+ { 0, 17, 0, 5, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 155 },
+ { 1, 0, 6, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 18, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 137 },
+ { 18, 0, 0, 0, -1, 0, 20, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 137 },
+ { 18, 0, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 137 },
+ { 18, 0, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 137 },
+ { 18, 0, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 155 },
+ { 17, 0, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 25, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 25, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 139 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 105 },
+ { 29, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 105 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 105 },
+ { 0, 17, 1, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 105 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 105 },
+ { 10, 18, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 2, 2 },
+ { 0, 17, 0, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 29, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 5, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 1, 0, 216, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 2 },
+ { 1, 0, 216, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 2 },
+ { 0, 17, 1, 5, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 1, 0, 226, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 2 },
+ { 10, 18, 0, 5, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 0, 17, 220, 5, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 29, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 4 },
+ { 5, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 14, 0, 0, 0, -1, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 26, 0, 0, 0, -1, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 3, 2, 0, 0, 0, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 1, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 2, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 3, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 4, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 5, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 6, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 7, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 8, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 9, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 131 },
+ { 0, 17, 0, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 131 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 131 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 131 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 131 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 0, 17, 230, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 57 },
+ { 17, 0, 0, 0, -1, 0, 25, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 5 },
+ { 0, 17, 230, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 151 },
+ { 0, 17, 230, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 151 },
+ { 17, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 151 },
+ { 3, 0, 0, 0, 0, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 2, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 3, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 4, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 5, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 6, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 7, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 8, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 9, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 29, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 151 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 160 },
+ { 0, 17, 230, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 160 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 152 },
+ { 0, 17, 230, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 152 },
+ { 3, 0, 0, 0, 0, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 2, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 3, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 4, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 5, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 6, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 7, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 8, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 9, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 27, 4, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 152 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 163 },
+ { 17, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 163 },
+ { 0, 17, 232, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 163 },
+ { 0, 17, 220, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 163 },
+ { 0, 17, 230, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 163 },
+ { 3, 0, 0, 0, 0, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 2, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 3, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 4, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 5, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 6, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 7, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 8, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 9, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 27 },
+ { 18, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 113 },
+ { 5, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 113 },
+ { 0, 17, 220, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 113 },
+ { 14, 1, 0, 2, -1, 0, 18, 3, 0, { {0, 34}, {0, 0}, {0, 0}, {0, 34} }, 0, 10, 14, 7, 3, 132 },
+ { 15, 1, 0, 2, -1, 0, 18, 3, 0, { {0, 0}, {0, -34}, {0, -34}, {0, 0} }, 0, 10, 14, 6, 1, 132 },
+ { 0, 17, 230, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 132 },
+ { 0, 17, 7, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 132 },
+ { 17, 1, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 132 },
+ { 3, 1, 0, 0, 0, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 2, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 3, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 4, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 5, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 6, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 7, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 8, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 9, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 25, 1, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 1, 132 },
+ { 5, 13, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 13, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 13, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 5, 13, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 13, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 18, 13, 0, 0, -1, 0, 13, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 8 },
+ { 26, 10, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 29, 10, 0, 0, -1, 0, 10, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 13, 0, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 0, 0 },
+ { 5, 2, 0, 0, 0, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 1, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 2, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 3, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 4, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 5, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 6, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 7, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 8, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 9, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 13, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 14, 7, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 14, 7, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 18, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 6, 7, 30, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 34 },
+ { 29, 0, 0, 0, -1, 0, 12, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 18, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 17, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 17, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 18, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 18, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 13, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 25, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 17, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 25, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 3, 2, 0, 0, 0, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 1, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 2, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 3, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 4, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 5, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 6, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 7, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 8, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 9, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 13, 18, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 18, 0, 0, 0, -1, 0, 5, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 25, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 26, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 5, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 18, 0, 0, 0, -1, 0, 5, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 0, 37 },
+ { 10, 18, 0, 5, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 0, 2 },
+ { 0, 17, 0, 5, -1, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 2, 1 },
+ { 12, 0, 0, 0, -1, 0, 2, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 }
};
Q_DECL_CONST_FUNCTION static inline const Properties *qGetProp(char32_t ucs4) noexcept
{
- return uc_properties + GET_PROP_INDEX(ucs4);
+ Q_ASSERT(ucs4 <= QChar::LastValidCodePoint);
+ if (ucs4 < 0x11000)
+ return uc_properties + uc_property_trie[uc_property_trie[ucs4 >> 5] + (ucs4 & 0x1f)];
+
+ return uc_properties
+ + uc_property_trie[uc_property_trie[((ucs4 - 0x11000) >> 8) + 0x880] + (ucs4 & 0xff)];
}
Q_DECL_CONST_FUNCTION static inline const Properties *qGetProp(char16_t ucs2) noexcept
{
- return uc_properties + GET_PROP_INDEX_UCS2(ucs2);
+ return uc_properties + uc_property_trie[uc_property_trie[ucs2 >> 5] + (ucs2 & 0x1f)];
}
Q_DECL_CONST_FUNCTION Q_CORE_EXPORT const Properties * QT_FASTCALL properties(char32_t ucs4) noexcept
@@ -9638,8 +10487,17 @@ Q_CORE_EXPORT LineBreakClass QT_FASTCALL lineBreakClass(char32_t ucs4) noexcept
return static_cast<LineBreakClass>(qGetProp(ucs4)->lineBreakClass);
}
+Q_CORE_EXPORT IdnaStatus QT_FASTCALL idnaStatus(char32_t ucs4) noexcept
+{
+ return static_cast<IdnaStatus>(qGetProp(ucs4)->idnaStatus);
+}
+
+Q_CORE_EXPORT EastAsianWidth QT_FASTCALL eastAsianWidth(char32_t ucs4) noexcept
+{
+ return static_cast<EastAsianWidth>(qGetProp(ucs4)->eastAsianWidth);
+}
-static const unsigned short specialCaseMap[] = {
+static constexpr unsigned short specialCaseMap[] = {
0x0, // placeholder
0x1, 0x2c65,
0x1, 0x2c66,
@@ -9946,10 +10804,9 @@ static const unsigned short specialCaseMap[] = {
0x1, 0xa64b
};
-const unsigned int MaxSpecialCaseLength = 3;
+constexpr unsigned int MaxSpecialCaseLength = 3;
-
-static const unsigned short uc_decomposition_trie[] = {
+static constexpr unsigned short uc_decomposition_trie[] = {
// 0 - 0x3400
1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
@@ -10089,9 +10946,9 @@ static const unsigned short uc_decomposition_trie[] = {
5356, 5356, 5356, 5356, 5356, 6380, 6636, 6892,
7148, 7404, 7660, 7916, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 8172, 8428, 5356, 8684,
- 8940, 9196, 5356, 5356, 5356, 9452, 5356, 5356,
+ 5356, 5356, 5356, 8172, 5356, 5356, 5356, 5356,
+ 5356, 5356, 5356, 5356, 8428, 8684, 5356, 8940,
+ 9196, 9452, 5356, 5356, 5356, 9708, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
@@ -10114,13 +10971,13 @@ static const unsigned short uc_decomposition_trie[] = {
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 9708, 5356, 5356,
- 9964, 10220, 10476, 10732, 5356, 5356, 5356, 5356,
+ 5356, 5356, 5356, 5356, 5356, 9964, 5356, 5356,
+ 10220, 10476, 10732, 10988, 5356, 5356, 5356, 5356,
+ 5356, 5356, 5356, 5356, 11244, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 10988, 5356, 5356, 11244, 11500, 5356,
+ 5356, 5356, 11500, 5356, 5356, 11756, 12012, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 11756,
+ 5356, 5356, 5356, 5356, 5356, 5356, 5356, 12268,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
@@ -10153,7 +11010,7 @@ static const unsigned short uc_decomposition_trie[] = {
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 12012, 12268, 12524, 5356,
+ 5356, 5356, 5356, 5356, 12524, 12780, 13036, 5356,
5356, 5356, 5356, 5356,
@@ -10967,8 +11824,8 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x19fe, 0x1a00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x19fe, 0x1a00, 0x1a02, 0xffff, 0xffff, 0xffff,
+ 0x1a04, 0x1a06, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10981,9 +11838,9 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x1a02, 0x1a04, 0x1a06, 0x1a08,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0x1a08, 0x1a0a, 0x1a0c, 0x1a0e,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x1a0a, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x1a10, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11003,234 +11860,267 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x1a0c, 0x1a0e, 0x1a10, 0x1a12, 0x1a14, 0x1a16, 0x1a18, 0x1a1a,
- 0x1a1c, 0x1a1e, 0x1a20, 0x1a22, 0x1a24, 0x1a26, 0x1a28, 0x1a2a,
- 0x1a2c, 0x1a2e, 0x1a30, 0x1a32, 0x1a34, 0x1a36, 0x1a38, 0x1a3a,
- 0x1a3c, 0x1a3e, 0x1a40, 0x1a42, 0x1a44, 0x1a46, 0x1a48, 0x1a4a,
- 0x1a4c, 0x1a4e, 0x1a50, 0x1a52, 0x1a54, 0x1a56, 0x1a58, 0x1a5a,
- 0x1a5c, 0x1a5e, 0x1a60, 0x1a62, 0x1a64, 0x1a66, 0x1a68, 0x1a6a,
- 0x1a6c, 0x1a6e, 0x1a70, 0x1a72, 0x1a74, 0x1a76, 0x1a78, 0x1a7a,
- 0x1a7c, 0x1a7e, 0x1a80, 0x1a82, 0x1a84, 0x1a86, 0x1a88, 0x1a8a,
- 0x1a8c, 0x1a8e, 0x1a90, 0x1a92, 0x1a94, 0x1a96, 0x1a98, 0x1a9a,
- 0x1a9c, 0x1a9e, 0x1aa0, 0x1aa2, 0x1aa4, 0x1aa6, 0x1aa8, 0x1aaa,
- 0x1aac, 0x1aae, 0x1ab0, 0x1ab2, 0x1ab4, 0x1ab6, 0x1ab8, 0x1aba,
- 0x1abc, 0x1abe, 0x1ac0, 0x1ac2, 0x1ac4, 0x1ac6, 0x1ac8, 0x1aca,
- 0x1acc, 0x1ace, 0x1ad0, 0x1ad2, 0x1ad4, 0x1ad6, 0x1ad8, 0x1ada,
- 0x1adc, 0x1ade, 0x1ae0, 0x1ae2, 0x1ae4, 0x1ae6, 0x1ae8, 0x1aea,
- 0x1aec, 0x1aee, 0x1af0, 0x1af2, 0x1af4, 0x1af6, 0x1af8, 0x1afa,
- 0x1afc, 0x1afe, 0x1b00, 0x1b02, 0x1b04, 0x1b06, 0x1b08, 0x1b0a,
- 0x1b0c, 0x1b0e, 0x1b10, 0x1b12, 0x1b14, 0x1b16, 0x1b18, 0x1b1a,
- 0x1b1c, 0x1b1e, 0x1b20, 0x1b22, 0x1b24, 0x1b26, 0x1b28, 0x1b2a,
- 0x1b2c, 0x1b2e, 0x1b30, 0x1b32, 0x1b34, 0x1b36, 0x1b38, 0x1b3a,
- 0x1b3c, 0x1b3e, 0x1b40, 0x1b42, 0x1b44, 0x1b46, 0x1b48, 0x1b4a,
- 0x1b4c, 0x1b4e, 0x1b50, 0x1b52, 0x1b54, 0x1b56, 0x1b58, 0x1b5a,
- 0x1b5c, 0x1b5e, 0x1b60, 0x1b62, 0x1b64, 0x1b66, 0x1b68, 0x1b6a,
- 0x1b6c, 0x1b6e, 0x1b70, 0x1b72, 0x1b74, 0x1b76, 0x1b78, 0x1b7a,
- 0x1b7c, 0x1b7e, 0x1b80, 0x1b82, 0x1b84, 0x1b86, 0x1b88, 0x1b8a,
- 0x1b8c, 0x1b8e, 0x1b90, 0x1b92, 0x1b94, 0x1b96, 0x1b98, 0x1b9a,
- 0x1b9c, 0x1b9e, 0x1ba0, 0x1ba2, 0x1ba4, 0x1ba6, 0x1ba8, 0x1baa,
- 0x1bac, 0x1bae, 0x1bb0, 0x1bb2, 0x1bb4, 0x1bb6, 0x1bb8, 0x1bba,
- 0x1bbc, 0x1bbe, 0x1bc0, 0x1bc2, 0x1bc4, 0x1bc6, 0x1bc8, 0x1bca,
- 0x1bcc, 0x1bce, 0x1bd0, 0x1bd2, 0x1bd4, 0x1bd6, 0x1bd8, 0x1bda,
- 0x1bdc, 0x1bde, 0x1be0, 0x1be2, 0x1be4, 0x1be6, 0x1be8, 0x1bea,
- 0x1bec, 0x1bee, 0x1bf0, 0x1bf2, 0x1bf4, 0x1bf6, 0x1bf8, 0x1bfa,
- 0x1bfc, 0x1bfe, 0x1c00, 0x1c02, 0x1c04, 0x1c06, 0x1c08, 0x1c0a,
+ 0x1a12, 0x1a14, 0x1a16, 0x1a18, 0x1a1a, 0x1a1c, 0x1a1e, 0x1a20,
+ 0x1a22, 0x1a24, 0x1a26, 0x1a28, 0x1a2a, 0x1a2c, 0x1a2e, 0x1a30,
+ 0x1a32, 0x1a34, 0x1a36, 0x1a38, 0x1a3a, 0x1a3c, 0x1a3e, 0x1a40,
+ 0x1a42, 0x1a44, 0x1a46, 0x1a48, 0x1a4a, 0x1a4c, 0x1a4e, 0x1a50,
+ 0x1a52, 0x1a54, 0x1a56, 0x1a58, 0x1a5a, 0x1a5c, 0x1a5e, 0x1a60,
+ 0x1a62, 0x1a64, 0x1a66, 0x1a68, 0x1a6a, 0x1a6c, 0x1a6e, 0x1a70,
+ 0x1a72, 0x1a74, 0x1a76, 0x1a78, 0x1a7a, 0x1a7c, 0x1a7e, 0x1a80,
+ 0x1a82, 0x1a84, 0x1a86, 0x1a88, 0x1a8a, 0x1a8c, 0x1a8e, 0x1a90,
+ 0x1a92, 0x1a94, 0x1a96, 0x1a98, 0x1a9a, 0x1a9c, 0x1a9e, 0x1aa0,
+ 0x1aa2, 0x1aa4, 0x1aa6, 0x1aa8, 0x1aaa, 0x1aac, 0x1aae, 0x1ab0,
+ 0x1ab2, 0x1ab4, 0x1ab6, 0x1ab8, 0x1aba, 0x1abc, 0x1abe, 0x1ac0,
+ 0x1ac2, 0x1ac4, 0x1ac6, 0x1ac8, 0x1aca, 0x1acc, 0x1ace, 0x1ad0,
+ 0x1ad2, 0x1ad4, 0x1ad6, 0x1ad8, 0x1ada, 0x1adc, 0x1ade, 0x1ae0,
+ 0x1ae2, 0x1ae4, 0x1ae6, 0x1ae8, 0x1aea, 0x1aec, 0x1aee, 0x1af0,
+ 0x1af2, 0x1af4, 0x1af6, 0x1af8, 0x1afa, 0x1afc, 0x1afe, 0x1b00,
+ 0x1b02, 0x1b04, 0x1b06, 0x1b08, 0x1b0a, 0x1b0c, 0x1b0e, 0x1b10,
+ 0x1b12, 0x1b14, 0x1b16, 0x1b18, 0x1b1a, 0x1b1c, 0x1b1e, 0x1b20,
+ 0x1b22, 0x1b24, 0x1b26, 0x1b28, 0x1b2a, 0x1b2c, 0x1b2e, 0x1b30,
+ 0x1b32, 0x1b34, 0x1b36, 0x1b38, 0x1b3a, 0x1b3c, 0x1b3e, 0x1b40,
+ 0x1b42, 0x1b44, 0x1b46, 0x1b48, 0x1b4a, 0x1b4c, 0x1b4e, 0x1b50,
+ 0x1b52, 0x1b54, 0x1b56, 0x1b58, 0x1b5a, 0x1b5c, 0x1b5e, 0x1b60,
+ 0x1b62, 0x1b64, 0x1b66, 0x1b68, 0x1b6a, 0x1b6c, 0x1b6e, 0x1b70,
+ 0x1b72, 0x1b74, 0x1b76, 0x1b78, 0x1b7a, 0x1b7c, 0x1b7e, 0x1b80,
+ 0x1b82, 0x1b84, 0x1b86, 0x1b88, 0x1b8a, 0x1b8c, 0x1b8e, 0x1b90,
+ 0x1b92, 0x1b94, 0x1b96, 0x1b98, 0x1b9a, 0x1b9c, 0x1b9e, 0x1ba0,
+ 0x1ba2, 0x1ba4, 0x1ba6, 0x1ba8, 0x1baa, 0x1bac, 0x1bae, 0x1bb0,
+ 0x1bb2, 0x1bb4, 0x1bb6, 0x1bb8, 0x1bba, 0x1bbc, 0x1bbe, 0x1bc0,
+ 0x1bc2, 0x1bc4, 0x1bc6, 0x1bc8, 0x1bca, 0x1bcc, 0x1bce, 0x1bd0,
+ 0x1bd2, 0x1bd4, 0x1bd6, 0x1bd8, 0x1bda, 0x1bdc, 0x1bde, 0x1be0,
+ 0x1be2, 0x1be4, 0x1be6, 0x1be8, 0x1bea, 0x1bec, 0x1bee, 0x1bf0,
+ 0x1bf2, 0x1bf4, 0x1bf6, 0x1bf8, 0x1bfa, 0x1bfc, 0x1bfe, 0x1c00,
+ 0x1c02, 0x1c04, 0x1c06, 0x1c08, 0x1c0a, 0x1c0c, 0x1c0e, 0x1c10,
- 0x1c0c, 0x1c0e, 0x1c10, 0x1c12, 0x1c14, 0x1c16, 0x1c18, 0x1c1a,
- 0x1c1c, 0x1c1e, 0x1c20, 0x1c22, 0x1c24, 0x1c26, 0xffff, 0xffff,
- 0x1c28, 0xffff, 0x1c2a, 0xffff, 0xffff, 0x1c2c, 0x1c2e, 0x1c30,
- 0x1c32, 0x1c34, 0x1c36, 0x1c38, 0x1c3a, 0x1c3c, 0x1c3e, 0xffff,
- 0x1c40, 0xffff, 0x1c42, 0xffff, 0xffff, 0x1c44, 0x1c46, 0xffff,
- 0xffff, 0xffff, 0x1c48, 0x1c4a, 0x1c4c, 0x1c4e, 0x1c50, 0x1c52,
- 0x1c54, 0x1c56, 0x1c58, 0x1c5a, 0x1c5c, 0x1c5e, 0x1c60, 0x1c62,
- 0x1c64, 0x1c66, 0x1c68, 0x1c6a, 0x1c6c, 0x1c6e, 0x1c70, 0x1c72,
- 0x1c74, 0x1c76, 0x1c78, 0x1c7a, 0x1c7c, 0x1c7e, 0x1c80, 0x1c82,
- 0x1c84, 0x1c86, 0x1c88, 0x1c8a, 0x1c8c, 0x1c8e, 0x1c90, 0x1c92,
- 0x1c94, 0x1c96, 0x1c98, 0x1c9a, 0x1c9c, 0x1c9e, 0x1ca0, 0x1ca2,
- 0x1ca4, 0x1ca6, 0x1ca8, 0x1caa, 0x1cac, 0x1cae, 0x1cb0, 0x1cb2,
- 0x1cb4, 0x1cb6, 0x1cb8, 0x1cba, 0x1cbc, 0x1cbe, 0x1cc0, 0x1cc2,
- 0x1cc4, 0x1cc6, 0x1cc8, 0x1cca, 0x1ccc, 0x1ccf, 0xffff, 0xffff,
- 0x1cd1, 0x1cd3, 0x1cd5, 0x1cd7, 0x1cd9, 0x1cdb, 0x1cdd, 0x1cdf,
- 0x1ce1, 0x1ce3, 0x1ce5, 0x1ce7, 0x1ce9, 0x1ceb, 0x1ced, 0x1cef,
- 0x1cf1, 0x1cf3, 0x1cf5, 0x1cf7, 0x1cf9, 0x1cfb, 0x1cfd, 0x1cff,
- 0x1d01, 0x1d03, 0x1d05, 0x1d07, 0x1d09, 0x1d0b, 0x1d0d, 0x1d0f,
- 0x1d11, 0x1d13, 0x1d15, 0x1d17, 0x1d19, 0x1d1b, 0x1d1d, 0x1d1f,
- 0x1d21, 0x1d23, 0x1d25, 0x1d27, 0x1d29, 0x1d2b, 0x1d2d, 0x1d2f,
- 0x1d31, 0x1d33, 0x1d35, 0x1d37, 0x1d39, 0x1d3b, 0x1d3d, 0x1d3f,
- 0x1d41, 0x1d43, 0x1d45, 0x1d47, 0x1d49, 0x1d4b, 0x1d4d, 0x1d4f,
- 0x1d51, 0x1d53, 0x1d55, 0x1d57, 0x1d59, 0x1d5b, 0x1d5d, 0x1d5f,
- 0x1d61, 0x1d63, 0x1d65, 0x1d67, 0x1d69, 0x1d6b, 0x1d6d, 0x1d6f,
- 0x1d71, 0x1d73, 0x1d75, 0x1d77, 0x1d79, 0x1d7b, 0x1d7d, 0x1d7f,
- 0x1d81, 0x1d83, 0x1d85, 0x1d87, 0x1d89, 0x1d8b, 0x1d8d, 0x1d8f,
- 0x1d92, 0x1d95, 0x1d98, 0x1d9a, 0x1d9c, 0x1d9e, 0x1da1, 0x1da4,
- 0x1da7, 0x1da9, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x1c12, 0x1c14, 0x1c16, 0x1c18, 0x1c1a, 0x1c1c, 0x1c1e, 0x1c20,
+ 0x1c22, 0x1c24, 0x1c26, 0x1c28, 0x1c2a, 0x1c2c, 0xffff, 0xffff,
+ 0x1c2e, 0xffff, 0x1c30, 0xffff, 0xffff, 0x1c32, 0x1c34, 0x1c36,
+ 0x1c38, 0x1c3a, 0x1c3c, 0x1c3e, 0x1c40, 0x1c42, 0x1c44, 0xffff,
+ 0x1c46, 0xffff, 0x1c48, 0xffff, 0xffff, 0x1c4a, 0x1c4c, 0xffff,
+ 0xffff, 0xffff, 0x1c4e, 0x1c50, 0x1c52, 0x1c54, 0x1c56, 0x1c58,
+ 0x1c5a, 0x1c5c, 0x1c5e, 0x1c60, 0x1c62, 0x1c64, 0x1c66, 0x1c68,
+ 0x1c6a, 0x1c6c, 0x1c6e, 0x1c70, 0x1c72, 0x1c74, 0x1c76, 0x1c78,
+ 0x1c7a, 0x1c7c, 0x1c7e, 0x1c80, 0x1c82, 0x1c84, 0x1c86, 0x1c88,
+ 0x1c8a, 0x1c8c, 0x1c8e, 0x1c90, 0x1c92, 0x1c94, 0x1c96, 0x1c98,
+ 0x1c9a, 0x1c9c, 0x1c9e, 0x1ca0, 0x1ca2, 0x1ca4, 0x1ca6, 0x1ca8,
+ 0x1caa, 0x1cac, 0x1cae, 0x1cb0, 0x1cb2, 0x1cb4, 0x1cb6, 0x1cb8,
+ 0x1cba, 0x1cbc, 0x1cbe, 0x1cc0, 0x1cc2, 0x1cc4, 0x1cc6, 0x1cc8,
+ 0x1cca, 0x1ccc, 0x1cce, 0x1cd0, 0x1cd2, 0x1cd5, 0xffff, 0xffff,
+ 0x1cd7, 0x1cd9, 0x1cdb, 0x1cdd, 0x1cdf, 0x1ce1, 0x1ce3, 0x1ce5,
+ 0x1ce7, 0x1ce9, 0x1ceb, 0x1ced, 0x1cef, 0x1cf1, 0x1cf3, 0x1cf5,
+ 0x1cf7, 0x1cf9, 0x1cfb, 0x1cfd, 0x1cff, 0x1d01, 0x1d03, 0x1d05,
+ 0x1d07, 0x1d09, 0x1d0b, 0x1d0d, 0x1d0f, 0x1d11, 0x1d13, 0x1d15,
+ 0x1d17, 0x1d19, 0x1d1b, 0x1d1d, 0x1d1f, 0x1d21, 0x1d23, 0x1d25,
+ 0x1d27, 0x1d29, 0x1d2b, 0x1d2d, 0x1d2f, 0x1d31, 0x1d33, 0x1d35,
+ 0x1d37, 0x1d39, 0x1d3b, 0x1d3d, 0x1d3f, 0x1d41, 0x1d43, 0x1d45,
+ 0x1d47, 0x1d49, 0x1d4b, 0x1d4d, 0x1d4f, 0x1d51, 0x1d53, 0x1d55,
+ 0x1d57, 0x1d59, 0x1d5b, 0x1d5d, 0x1d5f, 0x1d61, 0x1d63, 0x1d65,
+ 0x1d67, 0x1d69, 0x1d6b, 0x1d6d, 0x1d6f, 0x1d71, 0x1d73, 0x1d75,
+ 0x1d77, 0x1d79, 0x1d7b, 0x1d7d, 0x1d7f, 0x1d81, 0x1d83, 0x1d85,
+ 0x1d87, 0x1d89, 0x1d8b, 0x1d8d, 0x1d8f, 0x1d91, 0x1d93, 0x1d95,
+ 0x1d98, 0x1d9b, 0x1d9e, 0x1da0, 0x1da2, 0x1da4, 0x1da7, 0x1daa,
+ 0x1dad, 0x1daf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x1dab, 0x1dae, 0x1db1, 0x1db4, 0x1db8, 0x1dbc, 0x1dbf, 0xffff,
+ 0x1db1, 0x1db4, 0x1db7, 0x1dba, 0x1dbe, 0x1dc2, 0x1dc5, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x1dc8, 0x1dcb, 0x1dce, 0x1dd1, 0x1dd4,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1dd7, 0xffff, 0x1dda,
+ 0x1ddd, 0x1ddf, 0x1de1, 0x1de3, 0x1de5, 0x1de7, 0x1de9, 0x1deb,
+ 0x1ded, 0x1def, 0x1df1, 0x1df4, 0x1df7, 0x1dfa, 0x1dfd, 0x1e00,
+ 0x1e03, 0x1e06, 0x1e09, 0x1e0c, 0x1e0f, 0x1e12, 0x1e15, 0xffff,
+ 0x1e18, 0x1e1b, 0x1e1e, 0x1e21, 0x1e24, 0xffff, 0x1e27, 0xffff,
+ 0x1e2a, 0x1e2d, 0xffff, 0x1e30, 0x1e33, 0xffff, 0x1e36, 0x1e39,
+ 0x1e3c, 0x1e3f, 0x1e42, 0x1e45, 0x1e48, 0x1e4b, 0x1e4e, 0x1e51,
+ 0x1e54, 0x1e56, 0x1e58, 0x1e5a, 0x1e5c, 0x1e5e, 0x1e60, 0x1e62,
+ 0x1e64, 0x1e66, 0x1e68, 0x1e6a, 0x1e6c, 0x1e6e, 0x1e70, 0x1e72,
+ 0x1e74, 0x1e76, 0x1e78, 0x1e7a, 0x1e7c, 0x1e7e, 0x1e80, 0x1e82,
+ 0x1e84, 0x1e86, 0x1e88, 0x1e8a, 0x1e8c, 0x1e8e, 0x1e90, 0x1e92,
+ 0x1e94, 0x1e96, 0x1e98, 0x1e9a, 0x1e9c, 0x1e9e, 0x1ea0, 0x1ea2,
+ 0x1ea4, 0x1ea6, 0x1ea8, 0x1eaa, 0x1eac, 0x1eae, 0x1eb0, 0x1eb2,
+ 0x1eb4, 0x1eb6, 0x1eb8, 0x1eba, 0x1ebc, 0x1ebe, 0x1ec0, 0x1ec2,
+ 0x1ec4, 0x1ec6, 0x1ec8, 0x1eca, 0x1ecc, 0x1ece, 0x1ed0, 0x1ed2,
+ 0x1ed4, 0x1ed6, 0x1ed8, 0x1eda, 0x1edc, 0x1ede, 0x1ee0, 0x1ee2,
+ 0x1ee4, 0x1ee6, 0x1ee8, 0x1eea, 0x1eec, 0x1eee, 0x1ef0, 0x1ef2,
+ 0x1ef4, 0x1ef6, 0x1ef8, 0x1efa, 0x1efc, 0x1efe, 0x1f00, 0x1f02,
+ 0x1f04, 0x1f06, 0x1f08, 0x1f0a, 0x1f0c, 0x1f0e, 0x1f10, 0x1f12,
+ 0x1f14, 0x1f16, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x1f18, 0x1f1a, 0x1f1c, 0x1f1e, 0x1f20,
+ 0x1f22, 0x1f24, 0x1f26, 0x1f28, 0x1f2a, 0x1f2c, 0x1f2e, 0x1f30,
+ 0x1f32, 0x1f34, 0x1f36, 0x1f38, 0x1f3a, 0x1f3c, 0x1f3e, 0x1f40,
+ 0x1f42, 0x1f44, 0x1f46, 0x1f49, 0x1f4c, 0x1f4f, 0x1f52, 0x1f55,
+ 0x1f58, 0x1f5b, 0x1f5e, 0x1f61, 0x1f64, 0x1f67, 0x1f6a, 0x1f6d,
+ 0x1f70, 0x1f73, 0x1f76, 0x1f79, 0x1f7c, 0x1f7e, 0x1f80, 0x1f82,
+
+ 0x1f84, 0x1f87, 0x1f8a, 0x1f8d, 0x1f90, 0x1f93, 0x1f96, 0x1f99,
+ 0x1f9c, 0x1f9f, 0x1fa2, 0x1fa5, 0x1fa8, 0x1fab, 0x1fae, 0x1fb1,
+ 0x1fb4, 0x1fb7, 0x1fba, 0x1fbd, 0x1fc0, 0x1fc3, 0x1fc6, 0x1fc9,
+ 0x1fcc, 0x1fcf, 0x1fd2, 0x1fd5, 0x1fd8, 0x1fdb, 0x1fde, 0x1fe1,
+ 0x1fe4, 0x1fe7, 0x1fea, 0x1fed, 0x1ff0, 0x1ff3, 0x1ff6, 0x1ff9,
+ 0x1ffc, 0x1fff, 0x2002, 0x2005, 0x2008, 0x200b, 0x200e, 0x2011,
+ 0x2014, 0x2017, 0x201a, 0x201d, 0x2020, 0x2023, 0x2026, 0x2029,
+ 0x202c, 0x202f, 0x2032, 0x2035, 0x2038, 0x203b, 0x203e, 0x2041,
+ 0x2044, 0x2047, 0x204a, 0x204d, 0x2050, 0x2053, 0x2056, 0x2059,
+ 0x205c, 0x205f, 0x2062, 0x2065, 0x2068, 0x206b, 0x206e, 0x2071,
+ 0x2074, 0x2077, 0x207a, 0x207d, 0x2080, 0x2083, 0x2086, 0x2089,
+ 0x208c, 0x208f, 0x2092, 0x2095, 0x2098, 0x209b, 0x209e, 0x20a2,
+ 0x20a6, 0x20aa, 0x20ae, 0x20b2, 0x20b6, 0x20b9, 0x20bc, 0x20bf,
+ 0x20c2, 0x20c5, 0x20c8, 0x20cb, 0x20ce, 0x20d1, 0x20d4, 0x20d7,
+ 0x20da, 0x20dd, 0x20e0, 0x20e3, 0x20e6, 0x20e9, 0x20ec, 0x20ef,
+ 0x20f2, 0x20f5, 0x20f8, 0x20fb, 0x20fe, 0x2101, 0x2104, 0x2107,
+ 0x210a, 0x210d, 0x2110, 0x2113, 0x2116, 0x2119, 0x211c, 0x211f,
+ 0x2122, 0x2125, 0x2128, 0x212b, 0x212e, 0x2131, 0x2134, 0x2137,
+ 0x213a, 0x213d, 0x2140, 0x2143, 0x2146, 0x2149, 0x214c, 0x214f,
+ 0x2152, 0x2155, 0x2158, 0x215b, 0x215e, 0x2161, 0x2164, 0x2167,
+ 0x216a, 0x216d, 0x2170, 0x2173, 0x2176, 0x2179, 0x217c, 0x217f,
+ 0x2182, 0x2185, 0x2188, 0x218b, 0x218e, 0x2191, 0x2194, 0x2197,
+ 0x219a, 0x219d, 0x21a0, 0x21a3, 0x21a6, 0x21a9, 0x21ac, 0x21af,
+ 0x21b2, 0x21b5, 0x21b8, 0x21bb, 0x21be, 0x21c1, 0x21c4, 0x21c7,
+ 0x21ca, 0x21cd, 0x21d0, 0x21d3, 0x21d6, 0x21d9, 0x21dc, 0x21df,
+ 0x21e2, 0x21e5, 0x21e8, 0x21eb, 0x21ee, 0x21f1, 0x21f4, 0x21f7,
+ 0x21fa, 0x21fd, 0x2200, 0x2203, 0x2206, 0x2209, 0x220c, 0x220f,
+ 0x2212, 0x2215, 0x2218, 0x221b, 0x221e, 0x2221, 0x2224, 0x2227,
+ 0x222a, 0x222d, 0x2230, 0x2233, 0x2236, 0x2239, 0x223c, 0x223f,
+ 0x2242, 0x2245, 0x2248, 0x224b, 0x224e, 0x2251, 0x2254, 0x2257,
+ 0x225a, 0x225d, 0x2260, 0x2264, 0x2268, 0x226c, 0x226f, 0x2272,
+ 0x2275, 0x2278, 0x227b, 0x227e, 0x2281, 0x2284, 0x2287, 0x228a,
+
+ 0x228d, 0x2290, 0x2293, 0x2296, 0x2299, 0x229c, 0x229f, 0x22a2,
+ 0x22a5, 0x22a8, 0x22ab, 0x22ae, 0x22b1, 0x22b4, 0x22b7, 0x22ba,
+ 0x22bd, 0x22c0, 0x22c3, 0x22c6, 0x22c9, 0x22cc, 0x22cf, 0x22d2,
+ 0x22d5, 0x22d8, 0x22db, 0x22de, 0x22e1, 0x22e4, 0x22e7, 0x22ea,
+ 0x22ed, 0x22f0, 0x22f3, 0x22f6, 0x22f9, 0x22fc, 0x22ff, 0x2302,
+ 0x2305, 0x2308, 0x230b, 0x230e, 0x2311, 0x2314, 0x2317, 0x231a,
+ 0x231d, 0x2320, 0x2323, 0x2326, 0x2329, 0x232c, 0x232f, 0x2332,
+ 0x2335, 0x2338, 0x233b, 0x233e, 0x2341, 0x2344, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x2347, 0x234b, 0x234f, 0x2353, 0x2357, 0x235b, 0x235f, 0x2363,
+ 0x2367, 0x236b, 0x236f, 0x2373, 0x2377, 0x237b, 0x237f, 0x2383,
+ 0x2387, 0x238b, 0x238f, 0x2393, 0x2397, 0x239b, 0x239f, 0x23a3,
+ 0x23a7, 0x23ab, 0x23af, 0x23b3, 0x23b7, 0x23bb, 0x23bf, 0x23c3,
+ 0x23c7, 0x23cb, 0x23cf, 0x23d3, 0x23d7, 0x23db, 0x23df, 0x23e3,
+ 0x23e7, 0x23eb, 0x23ef, 0x23f3, 0x23f7, 0x23fb, 0x23ff, 0x2403,
+ 0x2407, 0x240b, 0x240f, 0x2413, 0x2417, 0x241b, 0x241f, 0x2423,
+ 0x2427, 0x242b, 0x242f, 0x2433, 0x2437, 0x243b, 0x243f, 0x2443,
+ 0xffff, 0xffff, 0x2447, 0x244b, 0x244f, 0x2453, 0x2457, 0x245b,
+ 0x245f, 0x2463, 0x2467, 0x246b, 0x246f, 0x2473, 0x2477, 0x247b,
+ 0x247f, 0x2483, 0x2487, 0x248b, 0x248f, 0x2493, 0x2497, 0x249b,
+ 0x249f, 0x24a3, 0x24a7, 0x24ab, 0x24af, 0x24b3, 0x24b7, 0x24bb,
+ 0x24bf, 0x24c3, 0x24c7, 0x24cb, 0x24cf, 0x24d3, 0x24d7, 0x24db,
+ 0x24df, 0x24e3, 0x24e7, 0x24eb, 0x24ef, 0x24f3, 0x24f7, 0x24fb,
+ 0x24ff, 0x2503, 0x2507, 0x250b, 0x250f, 0x2513, 0x2517, 0x251b,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x1dc2, 0x1dc5, 0x1dc8, 0x1dcb, 0x1dce,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1dd1, 0xffff, 0x1dd4,
- 0x1dd7, 0x1dd9, 0x1ddb, 0x1ddd, 0x1ddf, 0x1de1, 0x1de3, 0x1de5,
- 0x1de7, 0x1de9, 0x1deb, 0x1dee, 0x1df1, 0x1df4, 0x1df7, 0x1dfa,
- 0x1dfd, 0x1e00, 0x1e03, 0x1e06, 0x1e09, 0x1e0c, 0x1e0f, 0xffff,
- 0x1e12, 0x1e15, 0x1e18, 0x1e1b, 0x1e1e, 0xffff, 0x1e21, 0xffff,
- 0x1e24, 0x1e27, 0xffff, 0x1e2a, 0x1e2d, 0xffff, 0x1e30, 0x1e33,
- 0x1e36, 0x1e39, 0x1e3c, 0x1e3f, 0x1e42, 0x1e45, 0x1e48, 0x1e4b,
- 0x1e4e, 0x1e50, 0x1e52, 0x1e54, 0x1e56, 0x1e58, 0x1e5a, 0x1e5c,
- 0x1e5e, 0x1e60, 0x1e62, 0x1e64, 0x1e66, 0x1e68, 0x1e6a, 0x1e6c,
- 0x1e6e, 0x1e70, 0x1e72, 0x1e74, 0x1e76, 0x1e78, 0x1e7a, 0x1e7c,
- 0x1e7e, 0x1e80, 0x1e82, 0x1e84, 0x1e86, 0x1e88, 0x1e8a, 0x1e8c,
- 0x1e8e, 0x1e90, 0x1e92, 0x1e94, 0x1e96, 0x1e98, 0x1e9a, 0x1e9c,
- 0x1e9e, 0x1ea0, 0x1ea2, 0x1ea4, 0x1ea6, 0x1ea8, 0x1eaa, 0x1eac,
- 0x1eae, 0x1eb0, 0x1eb2, 0x1eb4, 0x1eb6, 0x1eb8, 0x1eba, 0x1ebc,
- 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, 0x1ec8, 0x1eca, 0x1ecc,
- 0x1ece, 0x1ed0, 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8, 0x1eda, 0x1edc,
- 0x1ede, 0x1ee0, 0x1ee2, 0x1ee4, 0x1ee6, 0x1ee8, 0x1eea, 0x1eec,
- 0x1eee, 0x1ef0, 0x1ef2, 0x1ef4, 0x1ef6, 0x1ef8, 0x1efa, 0x1efc,
- 0x1efe, 0x1f00, 0x1f02, 0x1f04, 0x1f06, 0x1f08, 0x1f0a, 0x1f0c,
- 0x1f0e, 0x1f10, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x1f12, 0x1f14, 0x1f16, 0x1f18, 0x1f1a,
- 0x1f1c, 0x1f1e, 0x1f20, 0x1f22, 0x1f24, 0x1f26, 0x1f28, 0x1f2a,
- 0x1f2c, 0x1f2e, 0x1f30, 0x1f32, 0x1f34, 0x1f36, 0x1f38, 0x1f3a,
- 0x1f3c, 0x1f3e, 0x1f40, 0x1f43, 0x1f46, 0x1f49, 0x1f4c, 0x1f4f,
- 0x1f52, 0x1f55, 0x1f58, 0x1f5b, 0x1f5e, 0x1f61, 0x1f64, 0x1f67,
- 0x1f6a, 0x1f6d, 0x1f70, 0x1f73, 0x1f76, 0x1f78, 0x1f7a, 0x1f7c,
-
- 0x1f7e, 0x1f81, 0x1f84, 0x1f87, 0x1f8a, 0x1f8d, 0x1f90, 0x1f93,
- 0x1f96, 0x1f99, 0x1f9c, 0x1f9f, 0x1fa2, 0x1fa5, 0x1fa8, 0x1fab,
- 0x1fae, 0x1fb1, 0x1fb4, 0x1fb7, 0x1fba, 0x1fbd, 0x1fc0, 0x1fc3,
- 0x1fc6, 0x1fc9, 0x1fcc, 0x1fcf, 0x1fd2, 0x1fd5, 0x1fd8, 0x1fdb,
- 0x1fde, 0x1fe1, 0x1fe4, 0x1fe7, 0x1fea, 0x1fed, 0x1ff0, 0x1ff3,
- 0x1ff6, 0x1ff9, 0x1ffc, 0x1fff, 0x2002, 0x2005, 0x2008, 0x200b,
- 0x200e, 0x2011, 0x2014, 0x2017, 0x201a, 0x201d, 0x2020, 0x2023,
- 0x2026, 0x2029, 0x202c, 0x202f, 0x2032, 0x2035, 0x2038, 0x203b,
- 0x203e, 0x2041, 0x2044, 0x2047, 0x204a, 0x204d, 0x2050, 0x2053,
- 0x2056, 0x2059, 0x205c, 0x205f, 0x2062, 0x2065, 0x2068, 0x206b,
- 0x206e, 0x2071, 0x2074, 0x2077, 0x207a, 0x207d, 0x2080, 0x2083,
- 0x2086, 0x2089, 0x208c, 0x208f, 0x2092, 0x2095, 0x2098, 0x209c,
- 0x20a0, 0x20a4, 0x20a8, 0x20ac, 0x20b0, 0x20b3, 0x20b6, 0x20b9,
- 0x20bc, 0x20bf, 0x20c2, 0x20c5, 0x20c8, 0x20cb, 0x20ce, 0x20d1,
- 0x20d4, 0x20d7, 0x20da, 0x20dd, 0x20e0, 0x20e3, 0x20e6, 0x20e9,
- 0x20ec, 0x20ef, 0x20f2, 0x20f5, 0x20f8, 0x20fb, 0x20fe, 0x2101,
- 0x2104, 0x2107, 0x210a, 0x210d, 0x2110, 0x2113, 0x2116, 0x2119,
- 0x211c, 0x211f, 0x2122, 0x2125, 0x2128, 0x212b, 0x212e, 0x2131,
- 0x2134, 0x2137, 0x213a, 0x213d, 0x2140, 0x2143, 0x2146, 0x2149,
- 0x214c, 0x214f, 0x2152, 0x2155, 0x2158, 0x215b, 0x215e, 0x2161,
- 0x2164, 0x2167, 0x216a, 0x216d, 0x2170, 0x2173, 0x2176, 0x2179,
- 0x217c, 0x217f, 0x2182, 0x2185, 0x2188, 0x218b, 0x218e, 0x2191,
- 0x2194, 0x2197, 0x219a, 0x219d, 0x21a0, 0x21a3, 0x21a6, 0x21a9,
- 0x21ac, 0x21af, 0x21b2, 0x21b5, 0x21b8, 0x21bb, 0x21be, 0x21c1,
- 0x21c4, 0x21c7, 0x21ca, 0x21cd, 0x21d0, 0x21d3, 0x21d6, 0x21d9,
- 0x21dc, 0x21df, 0x21e2, 0x21e5, 0x21e8, 0x21eb, 0x21ee, 0x21f1,
- 0x21f4, 0x21f7, 0x21fa, 0x21fd, 0x2200, 0x2203, 0x2206, 0x2209,
- 0x220c, 0x220f, 0x2212, 0x2215, 0x2218, 0x221b, 0x221e, 0x2221,
- 0x2224, 0x2227, 0x222a, 0x222d, 0x2230, 0x2233, 0x2236, 0x2239,
- 0x223c, 0x223f, 0x2242, 0x2245, 0x2248, 0x224b, 0x224e, 0x2251,
- 0x2254, 0x2257, 0x225a, 0x225e, 0x2262, 0x2266, 0x2269, 0x226c,
- 0x226f, 0x2272, 0x2275, 0x2278, 0x227b, 0x227e, 0x2281, 0x2284,
-
- 0x2287, 0x228a, 0x228d, 0x2290, 0x2293, 0x2296, 0x2299, 0x229c,
- 0x229f, 0x22a2, 0x22a5, 0x22a8, 0x22ab, 0x22ae, 0x22b1, 0x22b4,
- 0x22b7, 0x22ba, 0x22bd, 0x22c0, 0x22c3, 0x22c6, 0x22c9, 0x22cc,
- 0x22cf, 0x22d2, 0x22d5, 0x22d8, 0x22db, 0x22de, 0x22e1, 0x22e4,
- 0x22e7, 0x22ea, 0x22ed, 0x22f0, 0x22f3, 0x22f6, 0x22f9, 0x22fc,
- 0x22ff, 0x2302, 0x2305, 0x2308, 0x230b, 0x230e, 0x2311, 0x2314,
- 0x2317, 0x231a, 0x231d, 0x2320, 0x2323, 0x2326, 0x2329, 0x232c,
- 0x232f, 0x2332, 0x2335, 0x2338, 0x233b, 0x233e, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2341, 0x2345, 0x2349, 0x234d, 0x2351, 0x2355, 0x2359, 0x235d,
- 0x2361, 0x2365, 0x2369, 0x236d, 0x2371, 0x2375, 0x2379, 0x237d,
- 0x2381, 0x2385, 0x2389, 0x238d, 0x2391, 0x2395, 0x2399, 0x239d,
- 0x23a1, 0x23a5, 0x23a9, 0x23ad, 0x23b1, 0x23b5, 0x23b9, 0x23bd,
- 0x23c1, 0x23c5, 0x23c9, 0x23cd, 0x23d1, 0x23d5, 0x23d9, 0x23dd,
- 0x23e1, 0x23e5, 0x23e9, 0x23ed, 0x23f1, 0x23f5, 0x23f9, 0x23fd,
- 0x2401, 0x2405, 0x2409, 0x240d, 0x2411, 0x2415, 0x2419, 0x241d,
- 0x2421, 0x2425, 0x2429, 0x242d, 0x2431, 0x2435, 0x2439, 0x243d,
- 0xffff, 0xffff, 0x2441, 0x2445, 0x2449, 0x244d, 0x2451, 0x2455,
- 0x2459, 0x245d, 0x2461, 0x2465, 0x2469, 0x246d, 0x2471, 0x2475,
- 0x2479, 0x247d, 0x2481, 0x2485, 0x2489, 0x248d, 0x2491, 0x2495,
- 0x2499, 0x249d, 0x24a1, 0x24a5, 0x24a9, 0x24ad, 0x24b1, 0x24b5,
- 0x24b9, 0x24bd, 0x24c1, 0x24c5, 0x24c9, 0x24cd, 0x24d1, 0x24d5,
- 0x24d9, 0x24dd, 0x24e1, 0x24e5, 0x24e9, 0x24ed, 0x24f1, 0x24f5,
- 0x24f9, 0x24fd, 0x2501, 0x2505, 0x2509, 0x250d, 0x2511, 0x2515,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x251f, 0x2523, 0x2527, 0x252c, 0x2531, 0x2536, 0x253b, 0x2540,
+ 0x2545, 0x254a, 0x254e, 0x2561, 0x256a, 0xffff, 0xffff, 0xffff,
+
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x256f, 0x2571, 0x2573, 0x2575, 0x2577, 0x2579, 0x257b, 0x257d,
+ 0x257f, 0x2581, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2519, 0x251d, 0x2521, 0x2526, 0x252b, 0x2530, 0x2535, 0x253a,
- 0x253f, 0x2544, 0x2548, 0x255b, 0x2564, 0xffff, 0xffff, 0xffff,
+ 0x2583, 0x2585, 0x2587, 0x2589, 0x258b, 0x258d, 0x258f, 0x2591,
+ 0x2593, 0x2595, 0x2597, 0x2599, 0x259b, 0x259d, 0x259f, 0x25a1,
+ 0x25a3, 0x25a5, 0x25a7, 0x25a9, 0x25ab, 0xffff, 0xffff, 0x25ad,
+ 0x25af, 0x25b1, 0x25b3, 0x25b5, 0x25b7, 0x25b9, 0x25bb, 0x25bd,
+ 0x25bf, 0x25c1, 0x25c3, 0xffff, 0x25c5, 0x25c7, 0x25c9, 0x25cb,
+ 0x25cd, 0x25cf, 0x25d1, 0x25d3, 0x25d5, 0x25d7, 0x25d9, 0x25db,
+ 0x25dd, 0x25df, 0x25e1, 0x25e3, 0x25e5, 0x25e7, 0x25e9, 0xffff,
+ 0x25eb, 0x25ed, 0x25ef, 0x25f1, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x25f3, 0x25f6, 0x25f9, 0xffff, 0x25fc, 0xffff, 0x25ff, 0x2602,
+ 0x2605, 0x2608, 0x260b, 0x260e, 0x2611, 0x2614, 0x2617, 0x261a,
+ 0x261d, 0x261f, 0x2621, 0x2623, 0x2625, 0x2627, 0x2629, 0x262b,
+ 0x262d, 0x262f, 0x2631, 0x2633, 0x2635, 0x2637, 0x2639, 0x263b,
+ 0x263d, 0x263f, 0x2641, 0x2643, 0x2645, 0x2647, 0x2649, 0x264b,
+ 0x264d, 0x264f, 0x2651, 0x2653, 0x2655, 0x2657, 0x2659, 0x265b,
+ 0x265d, 0x265f, 0x2661, 0x2663, 0x2665, 0x2667, 0x2669, 0x266b,
+ 0x266d, 0x266f, 0x2671, 0x2673, 0x2675, 0x2677, 0x2679, 0x267b,
+ 0x267d, 0x267f, 0x2681, 0x2683, 0x2685, 0x2687, 0x2689, 0x268b,
+ 0x268d, 0x268f, 0x2691, 0x2693, 0x2695, 0x2697, 0x2699, 0x269b,
+ 0x269d, 0x269f, 0x26a1, 0x26a3, 0x26a5, 0x26a7, 0x26a9, 0x26ab,
+ 0x26ad, 0x26af, 0x26b1, 0x26b3, 0x26b5, 0x26b7, 0x26b9, 0x26bb,
+ 0x26bd, 0x26bf, 0x26c1, 0x26c3, 0x26c5, 0x26c7, 0x26c9, 0x26cb,
+ 0x26cd, 0x26cf, 0x26d1, 0x26d3, 0x26d5, 0x26d7, 0x26d9, 0x26db,
+ 0x26dd, 0x26df, 0x26e1, 0x26e3, 0x26e5, 0x26e7, 0x26e9, 0x26eb,
+ 0x26ed, 0x26ef, 0x26f1, 0x26f3, 0x26f5, 0x26f7, 0x26f9, 0x26fb,
+ 0x26fd, 0x26ff, 0x2701, 0x2703, 0x2705, 0x2707, 0x270a, 0x270d,
+ 0x2710, 0x2713, 0x2716, 0x2719, 0x271c, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x271f, 0x2721, 0x2723, 0x2725, 0x2727, 0x2729, 0x272b,
+ 0x272d, 0x272f, 0x2731, 0x2733, 0x2735, 0x2737, 0x2739, 0x273b,
+ 0x273d, 0x273f, 0x2741, 0x2743, 0x2745, 0x2747, 0x2749, 0x274b,
+ 0x274d, 0x274f, 0x2751, 0x2753, 0x2755, 0x2757, 0x2759, 0x275b,
+ 0x275d, 0x275f, 0x2761, 0x2763, 0x2765, 0x2767, 0x2769, 0x276b,
+ 0x276d, 0x276f, 0x2771, 0x2773, 0x2775, 0x2777, 0x2779, 0x277b,
+ 0x277d, 0x277f, 0x2781, 0x2783, 0x2785, 0x2787, 0x2789, 0x278b,
+ 0x278d, 0x278f, 0x2791, 0x2793, 0x2795, 0x2797, 0x2799, 0x279b,
+ 0x279d, 0x279f, 0x27a1, 0x27a3, 0x27a5, 0x27a7, 0x27a9, 0x27ab,
+ 0x27ad, 0x27af, 0x27b1, 0x27b3, 0x27b5, 0x27b7, 0x27b9, 0x27bb,
+ 0x27bd, 0x27bf, 0x27c1, 0x27c3, 0x27c5, 0x27c7, 0x27c9, 0x27cb,
+ 0x27cd, 0x27cf, 0x27d1, 0x27d3, 0x27d5, 0x27d7, 0x27d9, 0x27db,
+ 0x27dd, 0x27df, 0x27e1, 0x27e3, 0x27e5, 0x27e7, 0x27e9, 0x27eb,
+ 0x27ed, 0x27ef, 0x27f1, 0x27f3, 0x27f5, 0x27f7, 0x27f9, 0x27fb,
+ 0x27fd, 0x27ff, 0x2801, 0x2803, 0x2805, 0x2807, 0x2809, 0x280b,
+ 0x280d, 0x280f, 0x2811, 0x2813, 0x2815, 0x2817, 0x2819, 0x281b,
+ 0x281d, 0x281f, 0x2821, 0x2823, 0x2825, 0x2827, 0x2829, 0x282b,
+ 0x282d, 0x282f, 0x2831, 0x2833, 0x2835, 0x2837, 0x2839, 0x283b,
+ 0x283d, 0x283f, 0x2841, 0x2843, 0x2845, 0x2847, 0x2849, 0x284b,
+ 0x284d, 0x284f, 0x2851, 0x2853, 0x2855, 0x2857, 0x2859, 0x285b,
+ 0x285d, 0x285f, 0x2861, 0x2863, 0x2865, 0x2867, 0x2869, 0x286b,
+ 0x286d, 0x286f, 0x2871, 0x2873, 0x2875, 0x2877, 0x2879, 0x287b,
+ 0x287d, 0x287f, 0x2881, 0x2883, 0x2885, 0x2887, 0x2889, 0x288b,
+ 0x288d, 0x288f, 0x2891, 0x2893, 0x2895, 0x2897, 0x2899, 0xffff,
+ 0xffff, 0xffff, 0x289b, 0x289d, 0x289f, 0x28a1, 0x28a3, 0x28a5,
+ 0xffff, 0xffff, 0x28a7, 0x28a9, 0x28ab, 0x28ad, 0x28af, 0x28b1,
+ 0xffff, 0xffff, 0x28b3, 0x28b5, 0x28b7, 0x28b9, 0x28bb, 0x28bd,
+ 0xffff, 0xffff, 0x28bf, 0x28c1, 0x28c3, 0xffff, 0xffff, 0xffff,
+ 0x28c5, 0x28c7, 0x28c9, 0x28cb, 0x28cd, 0x28cf, 0x28d1, 0xffff,
+ 0x28d3, 0x28d5, 0x28d7, 0x28d9, 0x28db, 0x28dd, 0x28df, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x28e1, 0x28e3, 0x28e5, 0x28e7, 0x28e9, 0xffff, 0x28eb,
+ 0x28ed, 0x28ef, 0x28f1, 0x28f3, 0x28f5, 0x28f7, 0x28f9, 0x28fb,
+ 0x28fd, 0x28ff, 0x2901, 0x2903, 0x2905, 0x2907, 0x2909, 0x290b,
+ 0x290d, 0x290f, 0x2911, 0x2913, 0x2915, 0x2918, 0x291a, 0x291c,
+ 0x291f, 0x2921, 0x2924, 0x2926, 0x2928, 0x292a, 0x292c, 0x292e,
+ 0x2931, 0x2933, 0x2935, 0x2937, 0x2939, 0x293b, 0x293d, 0x293f,
+ 0x2941, 0xffff, 0x2943, 0x2945, 0x2947, 0x2949, 0x294b, 0x294d,
+ 0x294f, 0x2951, 0x2954, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2569, 0x256b, 0x256d, 0x256f, 0x2571, 0x2573, 0x2575, 0x2577,
- 0x2579, 0x257b, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x257d, 0x257f, 0x2581, 0x2583, 0x2585, 0x2587, 0x2589, 0x258b,
- 0x258d, 0x258f, 0x2591, 0x2593, 0x2595, 0x2597, 0x2599, 0x259b,
- 0x259d, 0x259f, 0x25a1, 0x25a3, 0x25a5, 0xffff, 0xffff, 0x25a7,
- 0x25a9, 0x25ab, 0x25ad, 0x25af, 0x25b1, 0x25b3, 0x25b5, 0x25b7,
- 0x25b9, 0x25bb, 0x25bd, 0xffff, 0x25bf, 0x25c1, 0x25c3, 0x25c5,
- 0x25c7, 0x25c9, 0x25cb, 0x25cd, 0x25cf, 0x25d1, 0x25d3, 0x25d5,
- 0x25d7, 0x25d9, 0x25db, 0x25dd, 0x25df, 0x25e1, 0x25e3, 0xffff,
- 0x25e5, 0x25e7, 0x25e9, 0x25eb, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x25ed, 0x25f0, 0x25f3, 0xffff, 0x25f6, 0xffff, 0x25f9, 0x25fc,
- 0x25ff, 0x2602, 0x2605, 0x2608, 0x260b, 0x260e, 0x2611, 0x2614,
- 0x2617, 0x2619, 0x261b, 0x261d, 0x261f, 0x2621, 0x2623, 0x2625,
- 0x2627, 0x2629, 0x262b, 0x262d, 0x262f, 0x2631, 0x2633, 0x2635,
- 0x2637, 0x2639, 0x263b, 0x263d, 0x263f, 0x2641, 0x2643, 0x2645,
- 0x2647, 0x2649, 0x264b, 0x264d, 0x264f, 0x2651, 0x2653, 0x2655,
- 0x2657, 0x2659, 0x265b, 0x265d, 0x265f, 0x2661, 0x2663, 0x2665,
- 0x2667, 0x2669, 0x266b, 0x266d, 0x266f, 0x2671, 0x2673, 0x2675,
- 0x2677, 0x2679, 0x267b, 0x267d, 0x267f, 0x2681, 0x2683, 0x2685,
- 0x2687, 0x2689, 0x268b, 0x268d, 0x268f, 0x2691, 0x2693, 0x2695,
- 0x2697, 0x2699, 0x269b, 0x269d, 0x269f, 0x26a1, 0x26a3, 0x26a5,
- 0x26a7, 0x26a9, 0x26ab, 0x26ad, 0x26af, 0x26b1, 0x26b3, 0x26b5,
- 0x26b7, 0x26b9, 0x26bb, 0x26bd, 0x26bf, 0x26c1, 0x26c3, 0x26c5,
- 0x26c7, 0x26c9, 0x26cb, 0x26cd, 0x26cf, 0x26d1, 0x26d3, 0x26d5,
- 0x26d7, 0x26d9, 0x26db, 0x26dd, 0x26df, 0x26e1, 0x26e3, 0x26e5,
- 0x26e7, 0x26e9, 0x26eb, 0x26ed, 0x26ef, 0x26f1, 0x26f3, 0x26f5,
- 0x26f7, 0x26f9, 0x26fb, 0x26fd, 0x26ff, 0x2701, 0x2704, 0x2707,
- 0x270a, 0x270d, 0x2710, 0x2713, 0x2716, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0x2719, 0x271b, 0x271d, 0x271f, 0x2721, 0x2723, 0x2725,
- 0x2727, 0x2729, 0x272b, 0x272d, 0x272f, 0x2731, 0x2733, 0x2735,
- 0x2737, 0x2739, 0x273b, 0x273d, 0x273f, 0x2741, 0x2743, 0x2745,
- 0x2747, 0x2749, 0x274b, 0x274d, 0x274f, 0x2751, 0x2753, 0x2755,
- 0x2757, 0x2759, 0x275b, 0x275d, 0x275f, 0x2761, 0x2763, 0x2765,
- 0x2767, 0x2769, 0x276b, 0x276d, 0x276f, 0x2771, 0x2773, 0x2775,
- 0x2777, 0x2779, 0x277b, 0x277d, 0x277f, 0x2781, 0x2783, 0x2785,
- 0x2787, 0x2789, 0x278b, 0x278d, 0x278f, 0x2791, 0x2793, 0x2795,
- 0x2797, 0x2799, 0x279b, 0x279d, 0x279f, 0x27a1, 0x27a3, 0x27a5,
- 0x27a7, 0x27a9, 0x27ab, 0x27ad, 0x27af, 0x27b1, 0x27b3, 0x27b5,
- 0x27b7, 0x27b9, 0x27bb, 0x27bd, 0x27bf, 0x27c1, 0x27c3, 0x27c5,
- 0x27c7, 0x27c9, 0x27cb, 0x27cd, 0x27cf, 0x27d1, 0x27d3, 0x27d5,
- 0x27d7, 0x27d9, 0x27db, 0x27dd, 0x27df, 0x27e1, 0x27e3, 0x27e5,
- 0x27e7, 0x27e9, 0x27eb, 0x27ed, 0x27ef, 0x27f1, 0x27f3, 0x27f5,
- 0x27f7, 0x27f9, 0x27fb, 0x27fd, 0x27ff, 0x2801, 0x2803, 0x2805,
- 0x2807, 0x2809, 0x280b, 0x280d, 0x280f, 0x2811, 0x2813, 0x2815,
- 0x2817, 0x2819, 0x281b, 0x281d, 0x281f, 0x2821, 0x2823, 0x2825,
- 0x2827, 0x2829, 0x282b, 0x282d, 0x282f, 0x2831, 0x2833, 0x2835,
- 0x2837, 0x2839, 0x283b, 0x283d, 0x283f, 0x2841, 0x2843, 0x2845,
- 0x2847, 0x2849, 0x284b, 0x284d, 0x284f, 0x2851, 0x2853, 0x2855,
- 0x2857, 0x2859, 0x285b, 0x285d, 0x285f, 0x2861, 0x2863, 0x2865,
- 0x2867, 0x2869, 0x286b, 0x286d, 0x286f, 0x2871, 0x2873, 0x2875,
- 0x2877, 0x2879, 0x287b, 0x287d, 0x287f, 0x2881, 0x2883, 0x2885,
- 0x2887, 0x2889, 0x288b, 0x288d, 0x288f, 0x2891, 0x2893, 0xffff,
- 0xffff, 0xffff, 0x2895, 0x2897, 0x2899, 0x289b, 0x289d, 0x289f,
- 0xffff, 0xffff, 0x28a1, 0x28a3, 0x28a5, 0x28a7, 0x28a9, 0x28ab,
- 0xffff, 0xffff, 0x28ad, 0x28af, 0x28b1, 0x28b3, 0x28b5, 0x28b7,
- 0xffff, 0xffff, 0x28b9, 0x28bb, 0x28bd, 0xffff, 0xffff, 0xffff,
- 0x28bf, 0x28c1, 0x28c3, 0x28c5, 0x28c7, 0x28c9, 0x28cb, 0xffff,
- 0x28cd, 0x28cf, 0x28d1, 0x28d3, 0x28d5, 0x28d7, 0x28d9, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11253,9 +12143,9 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x28db, 0xffff, 0x28e0, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x2957, 0xffff, 0x295c, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x28e5, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x2961, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11272,7 +12162,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x28ea, 0x28ef,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x2966, 0x296b,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11309,7 +12199,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x28f4, 0x28f9, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x2970, 0x2975, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11356,7 +12246,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x28fe, 0x2903, 0xffff, 0x2908, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x297a, 0x297f, 0xffff, 0x2984, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11389,7 +12279,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x290d, 0x2912, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x2989, 0x298e, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11406,7 +12296,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2917, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x2993, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11443,8 +12333,8 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x291c, 0x2921,
- 0x2926, 0x292b, 0x2930, 0x2935, 0x293a, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x2998, 0x299d,
+ 0x29a2, 0x29a7, 0x29ac, 0x29b1, 0x29b6, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11455,8 +12345,8 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x293f, 0x2944, 0x2949, 0x294e, 0x2953,
- 0x2958, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x29bb, 0x29c0, 0x29c5, 0x29ca, 0x29cf,
+ 0x29d4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11465,93 +12355,85 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x295d, 0x295f, 0x2961, 0x2963, 0x2965, 0x2967, 0x2969, 0x296b,
- 0x296d, 0x296f, 0x2971, 0x2973, 0x2975, 0x2977, 0x2979, 0x297b,
- 0x297d, 0x297f, 0x2981, 0x2983, 0x2985, 0x2987, 0x2989, 0x298b,
- 0x298d, 0x298f, 0x2991, 0x2993, 0x2995, 0x2997, 0x2999, 0x299b,
- 0x299d, 0x299f, 0x29a1, 0x29a3, 0x29a5, 0x29a7, 0x29a9, 0x29ab,
- 0x29ad, 0x29af, 0x29b1, 0x29b3, 0x29b5, 0x29b7, 0x29b9, 0x29bb,
- 0x29bd, 0x29bf, 0x29c1, 0x29c3, 0x29c5, 0x29c7, 0x29c9, 0x29cb,
- 0x29cd, 0x29cf, 0x29d1, 0x29d3, 0x29d5, 0x29d7, 0x29d9, 0x29db,
- 0x29dd, 0x29df, 0x29e1, 0x29e3, 0x29e5, 0x29e7, 0x29e9, 0x29eb,
- 0x29ed, 0x29ef, 0x29f1, 0x29f3, 0x29f5, 0x29f7, 0x29f9, 0x29fb,
- 0x29fd, 0x29ff, 0x2a01, 0x2a03, 0x2a05, 0xffff, 0x2a07, 0x2a09,
- 0x2a0b, 0x2a0d, 0x2a0f, 0x2a11, 0x2a13, 0x2a15, 0x2a17, 0x2a19,
- 0x2a1b, 0x2a1d, 0x2a1f, 0x2a21, 0x2a23, 0x2a25, 0x2a27, 0x2a29,
- 0x2a2b, 0x2a2d, 0x2a2f, 0x2a31, 0x2a33, 0x2a35, 0x2a37, 0x2a39,
- 0x2a3b, 0x2a3d, 0x2a3f, 0x2a41, 0x2a43, 0x2a45, 0x2a47, 0x2a49,
- 0x2a4b, 0x2a4d, 0x2a4f, 0x2a51, 0x2a53, 0x2a55, 0x2a57, 0x2a59,
- 0x2a5b, 0x2a5d, 0x2a5f, 0x2a61, 0x2a63, 0x2a65, 0x2a67, 0x2a69,
- 0x2a6b, 0x2a6d, 0x2a6f, 0x2a71, 0x2a73, 0x2a75, 0x2a77, 0x2a79,
- 0x2a7b, 0x2a7d, 0x2a7f, 0x2a81, 0x2a83, 0x2a85, 0x2a87, 0x2a89,
- 0x2a8b, 0x2a8d, 0x2a8f, 0x2a91, 0x2a93, 0xffff, 0x2a95, 0x2a97,
- 0xffff, 0xffff, 0x2a99, 0xffff, 0xffff, 0x2a9b, 0x2a9d, 0xffff,
- 0xffff, 0x2a9f, 0x2aa1, 0x2aa3, 0x2aa5, 0xffff, 0x2aa7, 0x2aa9,
- 0x2aab, 0x2aad, 0x2aaf, 0x2ab1, 0x2ab3, 0x2ab5, 0x2ab7, 0x2ab9,
- 0x2abb, 0x2abd, 0xffff, 0x2abf, 0xffff, 0x2ac1, 0x2ac3, 0x2ac5,
- 0x2ac7, 0x2ac9, 0x2acb, 0x2acd, 0xffff, 0x2acf, 0x2ad1, 0x2ad3,
- 0x2ad5, 0x2ad7, 0x2ad9, 0x2adb, 0x2add, 0x2adf, 0x2ae1, 0x2ae3,
- 0x2ae5, 0x2ae7, 0x2ae9, 0x2aeb, 0x2aed, 0x2aef, 0x2af1, 0x2af3,
- 0x2af5, 0x2af7, 0x2af9, 0x2afb, 0x2afd, 0x2aff, 0x2b01, 0x2b03,
- 0x2b05, 0x2b07, 0x2b09, 0x2b0b, 0x2b0d, 0x2b0f, 0x2b11, 0x2b13,
- 0x2b15, 0x2b17, 0x2b19, 0x2b1b, 0x2b1d, 0x2b1f, 0x2b21, 0x2b23,
- 0x2b25, 0x2b27, 0x2b29, 0x2b2b, 0x2b2d, 0x2b2f, 0x2b31, 0x2b33,
- 0x2b35, 0x2b37, 0x2b39, 0x2b3b, 0x2b3d, 0x2b3f, 0x2b41, 0x2b43,
+ 0x29d9, 0x29db, 0x29dd, 0x29df, 0x29e1, 0x29e3, 0x29e5, 0x29e7,
+ 0x29e9, 0x29eb, 0x29ed, 0x29ef, 0x29f1, 0x29f3, 0x29f5, 0x29f7,
+ 0x29f9, 0x29fb, 0x29fd, 0x29ff, 0x2a01, 0x2a03, 0x2a05, 0x2a07,
+ 0x2a09, 0x2a0b, 0x2a0d, 0x2a0f, 0x2a11, 0x2a13, 0x2a15, 0x2a17,
+ 0x2a19, 0x2a1b, 0x2a1d, 0x2a1f, 0x2a21, 0x2a23, 0x2a25, 0x2a27,
+ 0x2a29, 0x2a2b, 0x2a2d, 0x2a2f, 0x2a31, 0x2a33, 0x2a35, 0x2a37,
+ 0x2a39, 0x2a3b, 0x2a3d, 0x2a3f, 0x2a41, 0x2a43, 0x2a45, 0x2a47,
+ 0x2a49, 0x2a4b, 0x2a4d, 0x2a4f, 0x2a51, 0x2a53, 0x2a55, 0x2a57,
+ 0x2a59, 0x2a5b, 0x2a5d, 0x2a5f, 0x2a61, 0x2a63, 0x2a65, 0x2a67,
+ 0x2a69, 0x2a6b, 0x2a6d, 0x2a6f, 0x2a71, 0x2a73, 0x2a75, 0x2a77,
+ 0x2a79, 0x2a7b, 0x2a7d, 0x2a7f, 0x2a81, 0xffff, 0x2a83, 0x2a85,
+ 0x2a87, 0x2a89, 0x2a8b, 0x2a8d, 0x2a8f, 0x2a91, 0x2a93, 0x2a95,
+ 0x2a97, 0x2a99, 0x2a9b, 0x2a9d, 0x2a9f, 0x2aa1, 0x2aa3, 0x2aa5,
+ 0x2aa7, 0x2aa9, 0x2aab, 0x2aad, 0x2aaf, 0x2ab1, 0x2ab3, 0x2ab5,
+ 0x2ab7, 0x2ab9, 0x2abb, 0x2abd, 0x2abf, 0x2ac1, 0x2ac3, 0x2ac5,
+ 0x2ac7, 0x2ac9, 0x2acb, 0x2acd, 0x2acf, 0x2ad1, 0x2ad3, 0x2ad5,
+ 0x2ad7, 0x2ad9, 0x2adb, 0x2add, 0x2adf, 0x2ae1, 0x2ae3, 0x2ae5,
+ 0x2ae7, 0x2ae9, 0x2aeb, 0x2aed, 0x2aef, 0x2af1, 0x2af3, 0x2af5,
+ 0x2af7, 0x2af9, 0x2afb, 0x2afd, 0x2aff, 0x2b01, 0x2b03, 0x2b05,
+ 0x2b07, 0x2b09, 0x2b0b, 0x2b0d, 0x2b0f, 0xffff, 0x2b11, 0x2b13,
+ 0xffff, 0xffff, 0x2b15, 0xffff, 0xffff, 0x2b17, 0x2b19, 0xffff,
+ 0xffff, 0x2b1b, 0x2b1d, 0x2b1f, 0x2b21, 0xffff, 0x2b23, 0x2b25,
+ 0x2b27, 0x2b29, 0x2b2b, 0x2b2d, 0x2b2f, 0x2b31, 0x2b33, 0x2b35,
+ 0x2b37, 0x2b39, 0xffff, 0x2b3b, 0xffff, 0x2b3d, 0x2b3f, 0x2b41,
+ 0x2b43, 0x2b45, 0x2b47, 0x2b49, 0xffff, 0x2b4b, 0x2b4d, 0x2b4f,
+ 0x2b51, 0x2b53, 0x2b55, 0x2b57, 0x2b59, 0x2b5b, 0x2b5d, 0x2b5f,
+ 0x2b61, 0x2b63, 0x2b65, 0x2b67, 0x2b69, 0x2b6b, 0x2b6d, 0x2b6f,
+ 0x2b71, 0x2b73, 0x2b75, 0x2b77, 0x2b79, 0x2b7b, 0x2b7d, 0x2b7f,
+ 0x2b81, 0x2b83, 0x2b85, 0x2b87, 0x2b89, 0x2b8b, 0x2b8d, 0x2b8f,
+ 0x2b91, 0x2b93, 0x2b95, 0x2b97, 0x2b99, 0x2b9b, 0x2b9d, 0x2b9f,
+ 0x2ba1, 0x2ba3, 0x2ba5, 0x2ba7, 0x2ba9, 0x2bab, 0x2bad, 0x2baf,
+ 0x2bb1, 0x2bb3, 0x2bb5, 0x2bb7, 0x2bb9, 0x2bbb, 0x2bbd, 0x2bbf,
- 0x2b45, 0x2b47, 0x2b49, 0x2b4b, 0x2b4d, 0x2b4f, 0xffff, 0x2b51,
- 0x2b53, 0x2b55, 0x2b57, 0xffff, 0xffff, 0x2b59, 0x2b5b, 0x2b5d,
- 0x2b5f, 0x2b61, 0x2b63, 0x2b65, 0x2b67, 0xffff, 0x2b69, 0x2b6b,
- 0x2b6d, 0x2b6f, 0x2b71, 0x2b73, 0x2b75, 0xffff, 0x2b77, 0x2b79,
- 0x2b7b, 0x2b7d, 0x2b7f, 0x2b81, 0x2b83, 0x2b85, 0x2b87, 0x2b89,
- 0x2b8b, 0x2b8d, 0x2b8f, 0x2b91, 0x2b93, 0x2b95, 0x2b97, 0x2b99,
- 0x2b9b, 0x2b9d, 0x2b9f, 0x2ba1, 0x2ba3, 0x2ba5, 0x2ba7, 0x2ba9,
- 0x2bab, 0x2bad, 0xffff, 0x2baf, 0x2bb1, 0x2bb3, 0x2bb5, 0xffff,
- 0x2bb7, 0x2bb9, 0x2bbb, 0x2bbd, 0x2bbf, 0xffff, 0x2bc1, 0xffff,
- 0xffff, 0xffff, 0x2bc3, 0x2bc5, 0x2bc7, 0x2bc9, 0x2bcb, 0x2bcd,
- 0x2bcf, 0xffff, 0x2bd1, 0x2bd3, 0x2bd5, 0x2bd7, 0x2bd9, 0x2bdb,
- 0x2bdd, 0x2bdf, 0x2be1, 0x2be3, 0x2be5, 0x2be7, 0x2be9, 0x2beb,
- 0x2bed, 0x2bef, 0x2bf1, 0x2bf3, 0x2bf5, 0x2bf7, 0x2bf9, 0x2bfb,
- 0x2bfd, 0x2bff, 0x2c01, 0x2c03, 0x2c05, 0x2c07, 0x2c09, 0x2c0b,
- 0x2c0d, 0x2c0f, 0x2c11, 0x2c13, 0x2c15, 0x2c17, 0x2c19, 0x2c1b,
- 0x2c1d, 0x2c1f, 0x2c21, 0x2c23, 0x2c25, 0x2c27, 0x2c29, 0x2c2b,
- 0x2c2d, 0x2c2f, 0x2c31, 0x2c33, 0x2c35, 0x2c37, 0x2c39, 0x2c3b,
- 0x2c3d, 0x2c3f, 0x2c41, 0x2c43, 0x2c45, 0x2c47, 0x2c49, 0x2c4b,
- 0x2c4d, 0x2c4f, 0x2c51, 0x2c53, 0x2c55, 0x2c57, 0x2c59, 0x2c5b,
- 0x2c5d, 0x2c5f, 0x2c61, 0x2c63, 0x2c65, 0x2c67, 0x2c69, 0x2c6b,
- 0x2c6d, 0x2c6f, 0x2c71, 0x2c73, 0x2c75, 0x2c77, 0x2c79, 0x2c7b,
- 0x2c7d, 0x2c7f, 0x2c81, 0x2c83, 0x2c85, 0x2c87, 0x2c89, 0x2c8b,
- 0x2c8d, 0x2c8f, 0x2c91, 0x2c93, 0x2c95, 0x2c97, 0x2c99, 0x2c9b,
- 0x2c9d, 0x2c9f, 0x2ca1, 0x2ca3, 0x2ca5, 0x2ca7, 0x2ca9, 0x2cab,
- 0x2cad, 0x2caf, 0x2cb1, 0x2cb3, 0x2cb5, 0x2cb7, 0x2cb9, 0x2cbb,
- 0x2cbd, 0x2cbf, 0x2cc1, 0x2cc3, 0x2cc5, 0x2cc7, 0x2cc9, 0x2ccb,
- 0x2ccd, 0x2ccf, 0x2cd1, 0x2cd3, 0x2cd5, 0x2cd7, 0x2cd9, 0x2cdb,
- 0x2cdd, 0x2cdf, 0x2ce1, 0x2ce3, 0x2ce5, 0x2ce7, 0x2ce9, 0x2ceb,
- 0x2ced, 0x2cef, 0x2cf1, 0x2cf3, 0x2cf5, 0x2cf7, 0x2cf9, 0x2cfb,
- 0x2cfd, 0x2cff, 0x2d01, 0x2d03, 0x2d05, 0x2d07, 0x2d09, 0x2d0b,
- 0x2d0d, 0x2d0f, 0x2d11, 0x2d13, 0x2d15, 0x2d17, 0x2d19, 0x2d1b,
- 0x2d1d, 0x2d1f, 0x2d21, 0x2d23, 0x2d25, 0x2d27, 0x2d29, 0x2d2b,
+ 0x2bc1, 0x2bc3, 0x2bc5, 0x2bc7, 0x2bc9, 0x2bcb, 0xffff, 0x2bcd,
+ 0x2bcf, 0x2bd1, 0x2bd3, 0xffff, 0xffff, 0x2bd5, 0x2bd7, 0x2bd9,
+ 0x2bdb, 0x2bdd, 0x2bdf, 0x2be1, 0x2be3, 0xffff, 0x2be5, 0x2be7,
+ 0x2be9, 0x2beb, 0x2bed, 0x2bef, 0x2bf1, 0xffff, 0x2bf3, 0x2bf5,
+ 0x2bf7, 0x2bf9, 0x2bfb, 0x2bfd, 0x2bff, 0x2c01, 0x2c03, 0x2c05,
+ 0x2c07, 0x2c09, 0x2c0b, 0x2c0d, 0x2c0f, 0x2c11, 0x2c13, 0x2c15,
+ 0x2c17, 0x2c19, 0x2c1b, 0x2c1d, 0x2c1f, 0x2c21, 0x2c23, 0x2c25,
+ 0x2c27, 0x2c29, 0xffff, 0x2c2b, 0x2c2d, 0x2c2f, 0x2c31, 0xffff,
+ 0x2c33, 0x2c35, 0x2c37, 0x2c39, 0x2c3b, 0xffff, 0x2c3d, 0xffff,
+ 0xffff, 0xffff, 0x2c3f, 0x2c41, 0x2c43, 0x2c45, 0x2c47, 0x2c49,
+ 0x2c4b, 0xffff, 0x2c4d, 0x2c4f, 0x2c51, 0x2c53, 0x2c55, 0x2c57,
+ 0x2c59, 0x2c5b, 0x2c5d, 0x2c5f, 0x2c61, 0x2c63, 0x2c65, 0x2c67,
+ 0x2c69, 0x2c6b, 0x2c6d, 0x2c6f, 0x2c71, 0x2c73, 0x2c75, 0x2c77,
+ 0x2c79, 0x2c7b, 0x2c7d, 0x2c7f, 0x2c81, 0x2c83, 0x2c85, 0x2c87,
+ 0x2c89, 0x2c8b, 0x2c8d, 0x2c8f, 0x2c91, 0x2c93, 0x2c95, 0x2c97,
+ 0x2c99, 0x2c9b, 0x2c9d, 0x2c9f, 0x2ca1, 0x2ca3, 0x2ca5, 0x2ca7,
+ 0x2ca9, 0x2cab, 0x2cad, 0x2caf, 0x2cb1, 0x2cb3, 0x2cb5, 0x2cb7,
+ 0x2cb9, 0x2cbb, 0x2cbd, 0x2cbf, 0x2cc1, 0x2cc3, 0x2cc5, 0x2cc7,
+ 0x2cc9, 0x2ccb, 0x2ccd, 0x2ccf, 0x2cd1, 0x2cd3, 0x2cd5, 0x2cd7,
+ 0x2cd9, 0x2cdb, 0x2cdd, 0x2cdf, 0x2ce1, 0x2ce3, 0x2ce5, 0x2ce7,
+ 0x2ce9, 0x2ceb, 0x2ced, 0x2cef, 0x2cf1, 0x2cf3, 0x2cf5, 0x2cf7,
+ 0x2cf9, 0x2cfb, 0x2cfd, 0x2cff, 0x2d01, 0x2d03, 0x2d05, 0x2d07,
+ 0x2d09, 0x2d0b, 0x2d0d, 0x2d0f, 0x2d11, 0x2d13, 0x2d15, 0x2d17,
+ 0x2d19, 0x2d1b, 0x2d1d, 0x2d1f, 0x2d21, 0x2d23, 0x2d25, 0x2d27,
+ 0x2d29, 0x2d2b, 0x2d2d, 0x2d2f, 0x2d31, 0x2d33, 0x2d35, 0x2d37,
+ 0x2d39, 0x2d3b, 0x2d3d, 0x2d3f, 0x2d41, 0x2d43, 0x2d45, 0x2d47,
+ 0x2d49, 0x2d4b, 0x2d4d, 0x2d4f, 0x2d51, 0x2d53, 0x2d55, 0x2d57,
+ 0x2d59, 0x2d5b, 0x2d5d, 0x2d5f, 0x2d61, 0x2d63, 0x2d65, 0x2d67,
+ 0x2d69, 0x2d6b, 0x2d6d, 0x2d6f, 0x2d71, 0x2d73, 0x2d75, 0x2d77,
+ 0x2d79, 0x2d7b, 0x2d7d, 0x2d7f, 0x2d81, 0x2d83, 0x2d85, 0x2d87,
+ 0x2d89, 0x2d8b, 0x2d8d, 0x2d8f, 0x2d91, 0x2d93, 0x2d95, 0x2d97,
+ 0x2d99, 0x2d9b, 0x2d9d, 0x2d9f, 0x2da1, 0x2da3, 0x2da5, 0x2da7,
- 0x2d2d, 0x2d2f, 0x2d31, 0x2d33, 0x2d35, 0x2d37, 0x2d39, 0x2d3b,
- 0x2d3d, 0x2d3f, 0x2d41, 0x2d43, 0x2d45, 0x2d47, 0x2d49, 0x2d4b,
- 0x2d4d, 0x2d4f, 0x2d51, 0x2d53, 0x2d55, 0x2d57, 0x2d59, 0x2d5b,
- 0x2d5d, 0x2d5f, 0x2d61, 0x2d63, 0x2d65, 0x2d67, 0x2d69, 0x2d6b,
- 0x2d6d, 0x2d6f, 0x2d71, 0x2d73, 0x2d75, 0x2d77, 0x2d79, 0x2d7b,
- 0x2d7d, 0x2d7f, 0x2d81, 0x2d83, 0x2d85, 0x2d87, 0x2d89, 0x2d8b,
- 0x2d8d, 0x2d8f, 0x2d91, 0x2d93, 0x2d95, 0x2d97, 0x2d99, 0x2d9b,
- 0x2d9d, 0x2d9f, 0x2da1, 0x2da3, 0x2da5, 0x2da7, 0x2da9, 0x2dab,
- 0x2dad, 0x2daf, 0x2db1, 0x2db3, 0x2db5, 0x2db7, 0x2db9, 0x2dbb,
- 0x2dbd, 0x2dbf, 0x2dc1, 0x2dc3, 0x2dc5, 0x2dc7, 0x2dc9, 0x2dcb,
- 0x2dcd, 0x2dcf, 0x2dd1, 0x2dd3, 0x2dd5, 0x2dd7, 0x2dd9, 0x2ddb,
- 0x2ddd, 0x2ddf, 0x2de1, 0x2de3, 0x2de5, 0x2de7, 0x2de9, 0x2deb,
- 0x2ded, 0x2def, 0x2df1, 0x2df3, 0x2df5, 0x2df7, 0x2df9, 0x2dfb,
- 0x2dfd, 0x2dff, 0x2e01, 0x2e03, 0x2e05, 0x2e07, 0x2e09, 0x2e0b,
- 0x2e0d, 0x2e0f, 0x2e11, 0x2e13, 0x2e15, 0x2e17, 0x2e19, 0x2e1b,
- 0x2e1d, 0x2e1f, 0x2e21, 0x2e23, 0x2e25, 0x2e27, 0x2e29, 0x2e2b,
- 0x2e2d, 0x2e2f, 0x2e31, 0x2e33, 0x2e35, 0x2e37, 0x2e39, 0x2e3b,
- 0x2e3d, 0x2e3f, 0x2e41, 0x2e43, 0x2e45, 0x2e47, 0x2e49, 0x2e4b,
- 0x2e4d, 0x2e4f, 0x2e51, 0x2e53, 0x2e55, 0x2e57, 0x2e59, 0x2e5b,
- 0x2e5d, 0x2e5f, 0x2e61, 0x2e63, 0x2e65, 0x2e67, 0x2e69, 0x2e6b,
- 0x2e6d, 0x2e6f, 0x2e71, 0x2e73, 0x2e75, 0x2e77, 0xffff, 0xffff,
+ 0x2da9, 0x2dab, 0x2dad, 0x2daf, 0x2db1, 0x2db3, 0x2db5, 0x2db7,
+ 0x2db9, 0x2dbb, 0x2dbd, 0x2dbf, 0x2dc1, 0x2dc3, 0x2dc5, 0x2dc7,
+ 0x2dc9, 0x2dcb, 0x2dcd, 0x2dcf, 0x2dd1, 0x2dd3, 0x2dd5, 0x2dd7,
+ 0x2dd9, 0x2ddb, 0x2ddd, 0x2ddf, 0x2de1, 0x2de3, 0x2de5, 0x2de7,
+ 0x2de9, 0x2deb, 0x2ded, 0x2def, 0x2df1, 0x2df3, 0x2df5, 0x2df7,
+ 0x2df9, 0x2dfb, 0x2dfd, 0x2dff, 0x2e01, 0x2e03, 0x2e05, 0x2e07,
+ 0x2e09, 0x2e0b, 0x2e0d, 0x2e0f, 0x2e11, 0x2e13, 0x2e15, 0x2e17,
+ 0x2e19, 0x2e1b, 0x2e1d, 0x2e1f, 0x2e21, 0x2e23, 0x2e25, 0x2e27,
+ 0x2e29, 0x2e2b, 0x2e2d, 0x2e2f, 0x2e31, 0x2e33, 0x2e35, 0x2e37,
+ 0x2e39, 0x2e3b, 0x2e3d, 0x2e3f, 0x2e41, 0x2e43, 0x2e45, 0x2e47,
+ 0x2e49, 0x2e4b, 0x2e4d, 0x2e4f, 0x2e51, 0x2e53, 0x2e55, 0x2e57,
+ 0x2e59, 0x2e5b, 0x2e5d, 0x2e5f, 0x2e61, 0x2e63, 0x2e65, 0x2e67,
+ 0x2e69, 0x2e6b, 0x2e6d, 0x2e6f, 0x2e71, 0x2e73, 0x2e75, 0x2e77,
0x2e79, 0x2e7b, 0x2e7d, 0x2e7f, 0x2e81, 0x2e83, 0x2e85, 0x2e87,
0x2e89, 0x2e8b, 0x2e8d, 0x2e8f, 0x2e91, 0x2e93, 0x2e95, 0x2e97,
0x2e99, 0x2e9b, 0x2e9d, 0x2e9f, 0x2ea1, 0x2ea3, 0x2ea5, 0x2ea7,
@@ -11559,68 +12441,76 @@ static const unsigned short uc_decomposition_trie[] = {
0x2eb9, 0x2ebb, 0x2ebd, 0x2ebf, 0x2ec1, 0x2ec3, 0x2ec5, 0x2ec7,
0x2ec9, 0x2ecb, 0x2ecd, 0x2ecf, 0x2ed1, 0x2ed3, 0x2ed5, 0x2ed7,
0x2ed9, 0x2edb, 0x2edd, 0x2edf, 0x2ee1, 0x2ee3, 0x2ee5, 0x2ee7,
- 0x2ee9, 0x2eeb, 0x2eed, 0x2eef, 0x2ef1, 0x2ef3, 0x2ef5, 0x2ef7,
- 0x2ef9, 0x2efb, 0x2efd, 0x2eff, 0x2f01, 0x2f03, 0x2f05, 0x2f07,
- 0x2f09, 0x2f0b, 0x2f0d, 0x2f0f, 0x2f11, 0x2f13, 0x2f15, 0x2f17,
- 0x2f19, 0x2f1b, 0x2f1d, 0x2f1f, 0x2f21, 0x2f23, 0x2f25, 0x2f27,
-
- 0x2f29, 0x2f2b, 0x2f2d, 0x2f2f, 0x2f31, 0x2f33, 0x2f35, 0x2f37,
- 0x2f39, 0x2f3b, 0x2f3d, 0x2f3f, 0x2f41, 0x2f43, 0x2f45, 0x2f47,
- 0x2f49, 0x2f4b, 0x2f4d, 0x2f4f, 0x2f51, 0x2f53, 0x2f55, 0x2f57,
- 0x2f59, 0x2f5b, 0x2f5d, 0x2f5f, 0x2f61, 0x2f63, 0x2f65, 0x2f67,
- 0x2f69, 0x2f6b, 0x2f6d, 0x2f6f, 0x2f71, 0x2f73, 0x2f75, 0x2f77,
- 0x2f79, 0x2f7b, 0x2f7d, 0x2f7f, 0x2f81, 0x2f83, 0x2f85, 0x2f87,
- 0x2f89, 0x2f8b, 0x2f8d, 0x2f8f, 0x2f91, 0x2f93, 0x2f95, 0x2f97,
- 0x2f99, 0x2f9b, 0x2f9d, 0x2f9f, 0x2fa1, 0x2fa3, 0x2fa5, 0x2fa7,
- 0x2fa9, 0x2fab, 0x2fad, 0x2faf, 0x2fb1, 0x2fb3, 0x2fb5, 0x2fb7,
- 0x2fb9, 0x2fbb, 0x2fbd, 0x2fbf, 0x2fc1, 0x2fc3, 0x2fc5, 0x2fc7,
- 0x2fc9, 0x2fcb, 0x2fcd, 0x2fcf, 0x2fd1, 0x2fd3, 0x2fd5, 0x2fd7,
- 0x2fd9, 0x2fdb, 0x2fdd, 0x2fdf, 0x2fe1, 0x2fe3, 0x2fe5, 0x2fe7,
- 0x2fe9, 0x2feb, 0x2fed, 0x2fef, 0x2ff1, 0x2ff3, 0x2ff5, 0x2ff7,
- 0x2ff9, 0x2ffb, 0x2ffd, 0x2fff, 0x3001, 0x3003, 0x3005, 0x3007,
- 0x3009, 0x300b, 0x300d, 0x300f, 0x3011, 0x3013, 0x3015, 0x3017,
- 0x3019, 0x301b, 0x301d, 0x301f, 0x3021, 0x3023, 0x3025, 0x3027,
- 0x3029, 0x302b, 0x302d, 0x302f, 0x3031, 0x3033, 0x3035, 0x3037,
- 0x3039, 0x303b, 0x303d, 0x303f, 0x3041, 0x3043, 0x3045, 0x3047,
- 0x3049, 0x304b, 0x304d, 0x304f, 0x3051, 0x3053, 0x3055, 0x3057,
- 0x3059, 0x305b, 0x305d, 0x305f, 0x3061, 0x3063, 0x3065, 0x3067,
- 0x3069, 0x306b, 0x306d, 0x306f, 0x3071, 0x3073, 0x3075, 0x3077,
- 0x3079, 0x307b, 0x307d, 0x307f, 0x3081, 0x3083, 0x3085, 0x3087,
- 0x3089, 0x308b, 0x308d, 0x308f, 0x3091, 0x3093, 0x3095, 0x3097,
- 0x3099, 0x309b, 0x309d, 0x309f, 0x30a1, 0x30a3, 0x30a5, 0x30a7,
- 0x30a9, 0x30ab, 0x30ad, 0x30af, 0x30b1, 0x30b3, 0x30b5, 0x30b7,
- 0x30b9, 0x30bb, 0x30bd, 0x30bf, 0xffff, 0xffff, 0x30c1, 0x30c3,
+ 0x2ee9, 0x2eeb, 0x2eed, 0x2eef, 0x2ef1, 0x2ef3, 0xffff, 0xffff,
+ 0x2ef5, 0x2ef7, 0x2ef9, 0x2efb, 0x2efd, 0x2eff, 0x2f01, 0x2f03,
+ 0x2f05, 0x2f07, 0x2f09, 0x2f0b, 0x2f0d, 0x2f0f, 0x2f11, 0x2f13,
+ 0x2f15, 0x2f17, 0x2f19, 0x2f1b, 0x2f1d, 0x2f1f, 0x2f21, 0x2f23,
+ 0x2f25, 0x2f27, 0x2f29, 0x2f2b, 0x2f2d, 0x2f2f, 0x2f31, 0x2f33,
+ 0x2f35, 0x2f37, 0x2f39, 0x2f3b, 0x2f3d, 0x2f3f, 0x2f41, 0x2f43,
+ 0x2f45, 0x2f47, 0x2f49, 0x2f4b, 0x2f4d, 0x2f4f, 0x2f51, 0x2f53,
+ 0x2f55, 0x2f57, 0x2f59, 0x2f5b, 0x2f5d, 0x2f5f, 0x2f61, 0x2f63,
+ 0x2f65, 0x2f67, 0x2f69, 0x2f6b, 0x2f6d, 0x2f6f, 0x2f71, 0x2f73,
+ 0x2f75, 0x2f77, 0x2f79, 0x2f7b, 0x2f7d, 0x2f7f, 0x2f81, 0x2f83,
+ 0x2f85, 0x2f87, 0x2f89, 0x2f8b, 0x2f8d, 0x2f8f, 0x2f91, 0x2f93,
+ 0x2f95, 0x2f97, 0x2f99, 0x2f9b, 0x2f9d, 0x2f9f, 0x2fa1, 0x2fa3,
+
+ 0x2fa5, 0x2fa7, 0x2fa9, 0x2fab, 0x2fad, 0x2faf, 0x2fb1, 0x2fb3,
+ 0x2fb5, 0x2fb7, 0x2fb9, 0x2fbb, 0x2fbd, 0x2fbf, 0x2fc1, 0x2fc3,
+ 0x2fc5, 0x2fc7, 0x2fc9, 0x2fcb, 0x2fcd, 0x2fcf, 0x2fd1, 0x2fd3,
+ 0x2fd5, 0x2fd7, 0x2fd9, 0x2fdb, 0x2fdd, 0x2fdf, 0x2fe1, 0x2fe3,
+ 0x2fe5, 0x2fe7, 0x2fe9, 0x2feb, 0x2fed, 0x2fef, 0x2ff1, 0x2ff3,
+ 0x2ff5, 0x2ff7, 0x2ff9, 0x2ffb, 0x2ffd, 0x2fff, 0x3001, 0x3003,
+ 0x3005, 0x3007, 0x3009, 0x300b, 0x300d, 0x300f, 0x3011, 0x3013,
+ 0x3015, 0x3017, 0x3019, 0x301b, 0x301d, 0x301f, 0x3021, 0x3023,
+ 0x3025, 0x3027, 0x3029, 0x302b, 0x302d, 0x302f, 0x3031, 0x3033,
+ 0x3035, 0x3037, 0x3039, 0x303b, 0x303d, 0x303f, 0x3041, 0x3043,
+ 0x3045, 0x3047, 0x3049, 0x304b, 0x304d, 0x304f, 0x3051, 0x3053,
+ 0x3055, 0x3057, 0x3059, 0x305b, 0x305d, 0x305f, 0x3061, 0x3063,
+ 0x3065, 0x3067, 0x3069, 0x306b, 0x306d, 0x306f, 0x3071, 0x3073,
+ 0x3075, 0x3077, 0x3079, 0x307b, 0x307d, 0x307f, 0x3081, 0x3083,
+ 0x3085, 0x3087, 0x3089, 0x308b, 0x308d, 0x308f, 0x3091, 0x3093,
+ 0x3095, 0x3097, 0x3099, 0x309b, 0x309d, 0x309f, 0x30a1, 0x30a3,
+ 0x30a5, 0x30a7, 0x30a9, 0x30ab, 0x30ad, 0x30af, 0x30b1, 0x30b3,
+ 0x30b5, 0x30b7, 0x30b9, 0x30bb, 0x30bd, 0x30bf, 0x30c1, 0x30c3,
0x30c5, 0x30c7, 0x30c9, 0x30cb, 0x30cd, 0x30cf, 0x30d1, 0x30d3,
0x30d5, 0x30d7, 0x30d9, 0x30db, 0x30dd, 0x30df, 0x30e1, 0x30e3,
0x30e5, 0x30e7, 0x30e9, 0x30eb, 0x30ed, 0x30ef, 0x30f1, 0x30f3,
0x30f5, 0x30f7, 0x30f9, 0x30fb, 0x30fd, 0x30ff, 0x3101, 0x3103,
0x3105, 0x3107, 0x3109, 0x310b, 0x310d, 0x310f, 0x3111, 0x3113,
0x3115, 0x3117, 0x3119, 0x311b, 0x311d, 0x311f, 0x3121, 0x3123,
+ 0x3125, 0x3127, 0x3129, 0x312b, 0x312d, 0x312f, 0x3131, 0x3133,
+ 0x3135, 0x3137, 0x3139, 0x313b, 0xffff, 0xffff, 0x313d, 0x313f,
+ 0x3141, 0x3143, 0x3145, 0x3147, 0x3149, 0x314b, 0x314d, 0x314f,
+ 0x3151, 0x3153, 0x3155, 0x3157, 0x3159, 0x315b, 0x315d, 0x315f,
+ 0x3161, 0x3163, 0x3165, 0x3167, 0x3169, 0x316b, 0x316d, 0x316f,
+ 0x3171, 0x3173, 0x3175, 0x3177, 0x3179, 0x317b, 0x317d, 0x317f,
+ 0x3181, 0x3183, 0x3185, 0x3187, 0x3189, 0x318b, 0x318d, 0x318f,
+ 0x3191, 0x3193, 0x3195, 0x3197, 0x3199, 0x319b, 0x319d, 0x319f,
- 0x3125, 0x3127, 0x3129, 0x312b, 0xffff, 0x312d, 0x312f, 0x3131,
- 0x3133, 0x3135, 0x3137, 0x3139, 0x313b, 0x313d, 0x313f, 0x3141,
- 0x3143, 0x3145, 0x3147, 0x3149, 0x314b, 0x314d, 0x314f, 0x3151,
- 0x3153, 0x3155, 0x3157, 0x3159, 0x315b, 0x315d, 0x315f, 0x3161,
- 0xffff, 0x3163, 0x3165, 0xffff, 0x3167, 0xffff, 0xffff, 0x3169,
- 0xffff, 0x316b, 0x316d, 0x316f, 0x3171, 0x3173, 0x3175, 0x3177,
- 0x3179, 0x317b, 0x317d, 0xffff, 0x317f, 0x3181, 0x3183, 0x3185,
- 0xffff, 0x3187, 0xffff, 0x3189, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x318b, 0xffff, 0xffff, 0xffff, 0xffff, 0x318d,
- 0xffff, 0x318f, 0xffff, 0x3191, 0xffff, 0x3193, 0x3195, 0x3197,
- 0xffff, 0x3199, 0x319b, 0xffff, 0x319d, 0xffff, 0xffff, 0x319f,
- 0xffff, 0x31a1, 0xffff, 0x31a3, 0xffff, 0x31a5, 0xffff, 0x31a7,
- 0xffff, 0x31a9, 0x31ab, 0xffff, 0x31ad, 0xffff, 0xffff, 0x31af,
- 0x31b1, 0x31b3, 0x31b5, 0xffff, 0x31b7, 0x31b9, 0x31bb, 0x31bd,
- 0x31bf, 0x31c1, 0x31c3, 0xffff, 0x31c5, 0x31c7, 0x31c9, 0x31cb,
- 0xffff, 0x31cd, 0x31cf, 0x31d1, 0x31d3, 0xffff, 0x31d5, 0xffff,
- 0x31d7, 0x31d9, 0x31db, 0x31dd, 0x31df, 0x31e1, 0x31e3, 0x31e5,
- 0x31e7, 0x31e9, 0xffff, 0x31eb, 0x31ed, 0x31ef, 0x31f1, 0x31f3,
- 0x31f5, 0x31f7, 0x31f9, 0x31fb, 0x31fd, 0x31ff, 0x3201, 0x3203,
- 0x3205, 0x3207, 0x3209, 0x320b, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x320d, 0x320f, 0x3211, 0xffff, 0x3213, 0x3215, 0x3217,
- 0x3219, 0x321b, 0xffff, 0x321d, 0x321f, 0x3221, 0x3223, 0x3225,
- 0x3227, 0x3229, 0x322b, 0x322d, 0x322f, 0x3231, 0x3233, 0x3235,
- 0x3237, 0x3239, 0x323b, 0x323d, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x31a1, 0x31a3, 0x31a5, 0x31a7, 0x31a9, 0x31ab, 0x31ad, 0x31af,
+ 0x31b1, 0x31b3, 0x31b5, 0x31b7, 0x31b9, 0x31bb, 0x31bd, 0x31bf,
+ 0x31c1, 0x31c3, 0x31c5, 0x31c7, 0x31c9, 0x31cb, 0x31cd, 0x31cf,
+ 0x31d1, 0x31d3, 0x31d5, 0x31d7, 0x31d9, 0x31db, 0x31dd, 0x31df,
+ 0x31e1, 0x31e3, 0x31e5, 0x31e7, 0x31e9, 0x31eb, 0x31ed, 0x31ef,
+ 0x31f1, 0x31f3, 0x31f5, 0x31f7, 0x31f9, 0x31fb, 0x31fd, 0x31ff,
+ 0x3201, 0x3203, 0x3205, 0x3207, 0x3209, 0x320b, 0x320d, 0x320f,
+ 0x3211, 0x3213, 0x3215, 0x3217, 0x3219, 0x321b, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11630,25 +12520,58 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x323f, 0x3242, 0x3245, 0x3248, 0x324b, 0x324e, 0x3251, 0x3254,
- 0x3257, 0x325a, 0x325d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3260, 0x3264, 0x3268, 0x326c, 0x3270, 0x3274, 0x3278, 0x327c,
- 0x3280, 0x3284, 0x3288, 0x328c, 0x3290, 0x3294, 0x3298, 0x329c,
- 0x32a0, 0x32a4, 0x32a8, 0x32ac, 0x32b0, 0x32b4, 0x32b8, 0x32bc,
- 0x32c0, 0x32c4, 0x32c8, 0x32cc, 0x32ce, 0x32d0, 0x32d3, 0xffff,
- 0x32d6, 0x32d8, 0x32da, 0x32dc, 0x32de, 0x32e0, 0x32e2, 0x32e4,
- 0x32e6, 0x32e8, 0x32ea, 0x32ec, 0x32ee, 0x32f0, 0x32f2, 0x32f4,
- 0x32f6, 0x32f8, 0x32fa, 0x32fc, 0x32fe, 0x3300, 0x3302, 0x3304,
- 0x3306, 0x3308, 0x330a, 0x330d, 0x3310, 0x3313, 0x3316, 0x331a,
+ 0x321d, 0x321f, 0x3221, 0x3223, 0xffff, 0x3225, 0x3227, 0x3229,
+ 0x322b, 0x322d, 0x322f, 0x3231, 0x3233, 0x3235, 0x3237, 0x3239,
+ 0x323b, 0x323d, 0x323f, 0x3241, 0x3243, 0x3245, 0x3247, 0x3249,
+ 0x324b, 0x324d, 0x324f, 0x3251, 0x3253, 0x3255, 0x3257, 0x3259,
+ 0xffff, 0x325b, 0x325d, 0xffff, 0x325f, 0xffff, 0xffff, 0x3261,
+ 0xffff, 0x3263, 0x3265, 0x3267, 0x3269, 0x326b, 0x326d, 0x326f,
+ 0x3271, 0x3273, 0x3275, 0xffff, 0x3277, 0x3279, 0x327b, 0x327d,
+ 0xffff, 0x327f, 0xffff, 0x3281, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x3283, 0xffff, 0xffff, 0xffff, 0xffff, 0x3285,
+ 0xffff, 0x3287, 0xffff, 0x3289, 0xffff, 0x328b, 0x328d, 0x328f,
+ 0xffff, 0x3291, 0x3293, 0xffff, 0x3295, 0xffff, 0xffff, 0x3297,
+ 0xffff, 0x3299, 0xffff, 0x329b, 0xffff, 0x329d, 0xffff, 0x329f,
+ 0xffff, 0x32a1, 0x32a3, 0xffff, 0x32a5, 0xffff, 0xffff, 0x32a7,
+ 0x32a9, 0x32ab, 0x32ad, 0xffff, 0x32af, 0x32b1, 0x32b3, 0x32b5,
+ 0x32b7, 0x32b9, 0x32bb, 0xffff, 0x32bd, 0x32bf, 0x32c1, 0x32c3,
+ 0xffff, 0x32c5, 0x32c7, 0x32c9, 0x32cb, 0xffff, 0x32cd, 0xffff,
+ 0x32cf, 0x32d1, 0x32d3, 0x32d5, 0x32d7, 0x32d9, 0x32db, 0x32dd,
+ 0x32df, 0x32e1, 0xffff, 0x32e3, 0x32e5, 0x32e7, 0x32e9, 0x32eb,
+ 0x32ed, 0x32ef, 0x32f1, 0x32f3, 0x32f5, 0x32f7, 0x32f9, 0x32fb,
+ 0x32fd, 0x32ff, 0x3301, 0x3303, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x3305, 0x3307, 0x3309, 0xffff, 0x330b, 0x330d, 0x330f,
+ 0x3311, 0x3313, 0xffff, 0x3315, 0x3317, 0x3319, 0x331b, 0x331d,
+ 0x331f, 0x3321, 0x3323, 0x3325, 0x3327, 0x3329, 0x332b, 0x332d,
+ 0x332f, 0x3331, 0x3333, 0x3335, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x331d, 0x3320, 0x3323, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+
+ 0x3337, 0x333a, 0x333d, 0x3340, 0x3343, 0x3346, 0x3349, 0x334c,
+ 0x334f, 0x3352, 0x3355, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3358, 0x335c, 0x3360, 0x3364, 0x3368, 0x336c, 0x3370, 0x3374,
+ 0x3378, 0x337c, 0x3380, 0x3384, 0x3388, 0x338c, 0x3390, 0x3394,
+ 0x3398, 0x339c, 0x33a0, 0x33a4, 0x33a8, 0x33ac, 0x33b0, 0x33b4,
+ 0x33b8, 0x33bc, 0x33c0, 0x33c4, 0x33c6, 0x33c8, 0x33cb, 0xffff,
+ 0x33ce, 0x33d0, 0x33d2, 0x33d4, 0x33d6, 0x33d8, 0x33da, 0x33dc,
+ 0x33de, 0x33e0, 0x33e2, 0x33e4, 0x33e6, 0x33e8, 0x33ea, 0x33ec,
+ 0x33ee, 0x33f0, 0x33f2, 0x33f4, 0x33f6, 0x33f8, 0x33fa, 0x33fc,
+ 0x33fe, 0x3400, 0x3402, 0x3405, 0x3408, 0x340b, 0x340e, 0x3412,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x3415, 0x3418, 0x341b, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3326, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x341e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11663,17 +12586,17 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3329, 0x332c, 0x332f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3421, 0x3424, 0x3427, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3331, 0x3333, 0x3335, 0x3337, 0x3339, 0x333b, 0x333d, 0x333f,
- 0x3341, 0x3343, 0x3345, 0x3347, 0x3349, 0x334b, 0x334d, 0x334f,
- 0x3351, 0x3353, 0x3355, 0x3357, 0x3359, 0x335b, 0x335d, 0x335f,
- 0x3361, 0x3363, 0x3365, 0x3367, 0x3369, 0x336b, 0x336d, 0x336f,
- 0x3371, 0x3373, 0x3375, 0x3377, 0x3379, 0x337b, 0x337d, 0x337f,
- 0x3381, 0x3383, 0x3385, 0x3387, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3389, 0x338d, 0x3391, 0x3395, 0x3399, 0x339d, 0x33a1, 0x33a5,
- 0x33a9, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x33ad, 0x33af, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3429, 0x342b, 0x342d, 0x342f, 0x3431, 0x3433, 0x3435, 0x3437,
+ 0x3439, 0x343b, 0x343d, 0x343f, 0x3441, 0x3443, 0x3445, 0x3447,
+ 0x3449, 0x344b, 0x344d, 0x344f, 0x3451, 0x3453, 0x3455, 0x3457,
+ 0x3459, 0x345b, 0x345d, 0x345f, 0x3461, 0x3463, 0x3465, 0x3467,
+ 0x3469, 0x346b, 0x346d, 0x346f, 0x3471, 0x3473, 0x3475, 0x3477,
+ 0x3479, 0x347b, 0x347d, 0x347f, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3481, 0x3485, 0x3489, 0x348d, 0x3491, 0x3495, 0x3499, 0x349d,
+ 0x34a1, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x34a5, 0x34a7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11726,79 +12649,79 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x33b1, 0x33b3, 0x33b5, 0x33b7, 0x33b9, 0x33bb, 0x33bd, 0x33bf,
- 0x33c1, 0x33c3, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x34a9, 0x34ab, 0x34ad, 0x34af, 0x34b1, 0x34b3, 0x34b5, 0x34b7,
+ 0x34b9, 0x34bb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x33c5, 0x33c7, 0x33c9, 0x33cb, 0x33ce, 0x33d0, 0x33d2, 0x33d4,
- 0x33d6, 0x33d8, 0x33da, 0x33dc, 0x33de, 0x33e0, 0x33e3, 0x33e5,
- 0x33e7, 0x33e9, 0x33eb, 0x33ee, 0x33f0, 0x33f2, 0x33f4, 0x33f7,
- 0x33f9, 0x33fb, 0x33fd, 0x33ff, 0x3401, 0x3404, 0x3406, 0x3408,
- 0x340a, 0x340c, 0x340e, 0x3410, 0x3412, 0x3414, 0x3416, 0x3418,
- 0x341a, 0x341c, 0x341e, 0x3420, 0x3422, 0x3424, 0x3426, 0x3428,
- 0x342a, 0x342c, 0x342e, 0x3430, 0x3432, 0x3435, 0x3437, 0x3439,
- 0x343b, 0x343e, 0x3440, 0x3442, 0x3444, 0x3446, 0x3448, 0x344a,
- 0x344c, 0x344e, 0x3450, 0x3452, 0x3454, 0x3456, 0x3458, 0x345a,
- 0x345c, 0x345e, 0x3460, 0x3462, 0x3464, 0x3466, 0x3468, 0x346a,
- 0x346c, 0x346e, 0x3470, 0x3472, 0x3474, 0x3476, 0x3478, 0x347a,
- 0x347c, 0x347e, 0x3481, 0x3483, 0x3485, 0x3487, 0x3489, 0x348b,
- 0x348d, 0x3490, 0x3493, 0x3495, 0x3497, 0x3499, 0x349b, 0x349d,
- 0x349f, 0x34a1, 0x34a3, 0x34a5, 0x34a7, 0x34aa, 0x34ac, 0x34ae,
- 0x34b0, 0x34b2, 0x34b5, 0x34b7, 0x34b9, 0x34bb, 0x34bd, 0x34bf,
- 0x34c1, 0x34c3, 0x34c5, 0x34c7, 0x34ca, 0x34cc, 0x34cf, 0x34d1,
- 0x34d3, 0x34d5, 0x34d7, 0x34d9, 0x34db, 0x34dd, 0x34df, 0x34e1,
- 0x34e3, 0x34e5, 0x34e8, 0x34ea, 0x34ec, 0x34ee, 0x34f0, 0x34f2,
- 0x34f5, 0x34f7, 0x34fa, 0x34fd, 0x34ff, 0x3501, 0x3503, 0x3505,
- 0x3508, 0x350b, 0x350d, 0x350f, 0x3511, 0x3513, 0x3515, 0x3517,
- 0x3519, 0x351b, 0x351d, 0x351f, 0x3521, 0x3524, 0x3526, 0x3528,
- 0x352a, 0x352c, 0x352e, 0x3530, 0x3532, 0x3534, 0x3536, 0x3538,
- 0x353a, 0x353c, 0x353e, 0x3540, 0x3542, 0x3544, 0x3546, 0x3548,
- 0x354a, 0x354d, 0x354f, 0x3551, 0x3553, 0x3555, 0x3557, 0x355a,
- 0x355c, 0x355e, 0x3560, 0x3562, 0x3564, 0x3566, 0x3568, 0x356a,
- 0x356c, 0x356e, 0x3570, 0x3573, 0x3575, 0x3577, 0x3579, 0x357b,
- 0x357d, 0x357f, 0x3581, 0x3583, 0x3585, 0x3587, 0x3589, 0x358b,
- 0x358d, 0x358f, 0x3591, 0x3593, 0x3595, 0x3597, 0x359a, 0x359c,
- 0x359e, 0x35a0, 0x35a2, 0x35a4, 0x35a7, 0x35a9, 0x35ab, 0x35ad,
- 0x35af, 0x35b1, 0x35b3, 0x35b5, 0x35b7, 0x35ba, 0x35bc, 0x35be,
- 0x35c0, 0x35c3, 0x35c5, 0x35c7, 0x35c9, 0x35cb, 0x35cd, 0x35cf,
- 0x35d2, 0x35d5, 0x35d8, 0x35da, 0x35dd, 0x35df, 0x35e1, 0x35e3,
+ 0x34bd, 0x34bf, 0x34c1, 0x34c3, 0x34c6, 0x34c8, 0x34ca, 0x34cc,
+ 0x34ce, 0x34d0, 0x34d2, 0x34d4, 0x34d6, 0x34d8, 0x34db, 0x34dd,
+ 0x34df, 0x34e1, 0x34e3, 0x34e6, 0x34e8, 0x34ea, 0x34ec, 0x34ef,
+ 0x34f1, 0x34f3, 0x34f5, 0x34f7, 0x34f9, 0x34fc, 0x34fe, 0x3500,
+ 0x3502, 0x3504, 0x3506, 0x3508, 0x350a, 0x350c, 0x350e, 0x3510,
+ 0x3512, 0x3514, 0x3516, 0x3518, 0x351a, 0x351c, 0x351e, 0x3520,
+ 0x3522, 0x3524, 0x3526, 0x3528, 0x352a, 0x352d, 0x352f, 0x3531,
+ 0x3533, 0x3536, 0x3538, 0x353a, 0x353c, 0x353e, 0x3540, 0x3542,
+ 0x3544, 0x3546, 0x3548, 0x354a, 0x354c, 0x354e, 0x3550, 0x3552,
+ 0x3554, 0x3556, 0x3558, 0x355a, 0x355c, 0x355e, 0x3560, 0x3562,
+ 0x3564, 0x3566, 0x3568, 0x356a, 0x356c, 0x356e, 0x3570, 0x3572,
+ 0x3574, 0x3576, 0x3579, 0x357b, 0x357d, 0x357f, 0x3581, 0x3583,
+ 0x3585, 0x3588, 0x358b, 0x358d, 0x358f, 0x3591, 0x3593, 0x3595,
+ 0x3597, 0x3599, 0x359b, 0x359d, 0x359f, 0x35a2, 0x35a4, 0x35a6,
+ 0x35a8, 0x35aa, 0x35ad, 0x35af, 0x35b1, 0x35b3, 0x35b5, 0x35b7,
+ 0x35b9, 0x35bb, 0x35bd, 0x35bf, 0x35c2, 0x35c4, 0x35c7, 0x35c9,
+ 0x35cb, 0x35cd, 0x35cf, 0x35d1, 0x35d3, 0x35d5, 0x35d7, 0x35d9,
+ 0x35db, 0x35dd, 0x35e0, 0x35e2, 0x35e4, 0x35e6, 0x35e8, 0x35ea,
+ 0x35ed, 0x35ef, 0x35f2, 0x35f5, 0x35f7, 0x35f9, 0x35fb, 0x35fd,
+ 0x3600, 0x3603, 0x3605, 0x3607, 0x3609, 0x360b, 0x360d, 0x360f,
+ 0x3611, 0x3613, 0x3615, 0x3617, 0x3619, 0x361c, 0x361e, 0x3620,
+ 0x3622, 0x3624, 0x3626, 0x3628, 0x362a, 0x362c, 0x362e, 0x3630,
+ 0x3632, 0x3634, 0x3636, 0x3638, 0x363a, 0x363c, 0x363e, 0x3640,
+ 0x3642, 0x3645, 0x3647, 0x3649, 0x364b, 0x364d, 0x364f, 0x3652,
+ 0x3654, 0x3656, 0x3658, 0x365a, 0x365c, 0x365e, 0x3660, 0x3662,
+ 0x3664, 0x3666, 0x3668, 0x366b, 0x366d, 0x366f, 0x3671, 0x3673,
+ 0x3675, 0x3677, 0x3679, 0x367b, 0x367d, 0x367f, 0x3681, 0x3683,
+ 0x3685, 0x3687, 0x3689, 0x368b, 0x368d, 0x368f, 0x3692, 0x3694,
+ 0x3696, 0x3698, 0x369a, 0x369c, 0x369f, 0x36a1, 0x36a3, 0x36a5,
+ 0x36a7, 0x36a9, 0x36ab, 0x36ad, 0x36af, 0x36b2, 0x36b4, 0x36b6,
+ 0x36b8, 0x36bb, 0x36bd, 0x36bf, 0x36c1, 0x36c3, 0x36c5, 0x36c7,
+ 0x36ca, 0x36cd, 0x36d0, 0x36d2, 0x36d5, 0x36d7, 0x36d9, 0x36db,
- 0x35e5, 0x35e7, 0x35e9, 0x35eb, 0x35ed, 0x35ef, 0x35f1, 0x35f4,
- 0x35f6, 0x35f8, 0x35fa, 0x35fc, 0x35fe, 0x3600, 0x3603, 0x3605,
- 0x3607, 0x360a, 0x360d, 0x360f, 0x3611, 0x3613, 0x3615, 0x3617,
- 0x3619, 0x361b, 0x361d, 0x361f, 0x3622, 0x3624, 0x3627, 0x3629,
- 0x362c, 0x362e, 0x3630, 0x3632, 0x3635, 0x3637, 0x3639, 0x363c,
- 0x363f, 0x3641, 0x3643, 0x3645, 0x3647, 0x3649, 0x364b, 0x364d,
- 0x364f, 0x3651, 0x3653, 0x3655, 0x3657, 0x3659, 0x365c, 0x365e,
- 0x3661, 0x3663, 0x3666, 0x3668, 0x366b, 0x366e, 0x3671, 0x3673,
- 0x3675, 0x3677, 0x367a, 0x367d, 0x3680, 0x3683, 0x3685, 0x3687,
- 0x3689, 0x368b, 0x368d, 0x368f, 0x3691, 0x3693, 0x3696, 0x3698,
- 0x369a, 0x369c, 0x369e, 0x36a1, 0x36a3, 0x36a6, 0x36a9, 0x36ab,
- 0x36ad, 0x36af, 0x36b1, 0x36b3, 0x36b5, 0x36b8, 0x36bb, 0x36be,
- 0x36c0, 0x36c2, 0x36c5, 0x36c7, 0x36c9, 0x36cb, 0x36ce, 0x36d0,
- 0x36d2, 0x36d4, 0x36d6, 0x36d8, 0x36db, 0x36dd, 0x36df, 0x36e1,
- 0x36e3, 0x36e5, 0x36e7, 0x36ea, 0x36ed, 0x36ef, 0x36f2, 0x36f4,
- 0x36f7, 0x36f9, 0x36fb, 0x36fd, 0x3700, 0x3703, 0x3705, 0x3708,
- 0x370a, 0x370d, 0x370f, 0x3711, 0x3713, 0x3715, 0x3717, 0x3719,
- 0x371c, 0x371f, 0x3722, 0x3725, 0x3727, 0x3729, 0x372b, 0x372d,
- 0x372f, 0x3731, 0x3733, 0x3735, 0x3737, 0x3739, 0x373b, 0x373d,
- 0x3740, 0x3742, 0x3744, 0x3746, 0x3748, 0x374a, 0x374c, 0x374e,
- 0x3750, 0x3752, 0x3754, 0x3756, 0x3758, 0x375b, 0x375e, 0x3761,
- 0x3763, 0x3765, 0x3767, 0x3769, 0x376c, 0x376e, 0x3771, 0x3773,
- 0x3775, 0x3778, 0x377b, 0x377d, 0x377f, 0x3781, 0x3783, 0x3785,
- 0x3787, 0x3789, 0x378b, 0x378d, 0x378f, 0x3791, 0x3793, 0x3795,
- 0x3797, 0x3799, 0x379b, 0x379d, 0x379f, 0x37a1, 0x37a4, 0x37a6,
- 0x37a8, 0x37aa, 0x37ac, 0x37ae, 0x37b1, 0x37b4, 0x37b6, 0x37b8,
- 0x37ba, 0x37bc, 0x37be, 0x37c0, 0x37c3, 0x37c5, 0x37c7, 0x37c9,
- 0x37cb, 0x37ce, 0x37d1, 0x37d3, 0x37d5, 0x37d7, 0x37da, 0x37dc,
- 0x37de, 0x37e1, 0x37e4, 0x37e6, 0x37e8, 0x37ea, 0x37ed, 0x37ef,
- 0x37f1, 0x37f3, 0x37f5, 0x37f7, 0x37f9, 0x37fb, 0x37fe, 0x3800,
- 0x3802, 0x3804, 0x3807, 0x3809, 0x380b, 0x380d, 0x380f, 0x3812,
- 0x3815, 0x3817, 0x3819, 0x381b, 0x381e, 0x3820, 0x3823, 0x3825,
+ 0x36dd, 0x36df, 0x36e1, 0x36e3, 0x36e5, 0x36e7, 0x36e9, 0x36ec,
+ 0x36ee, 0x36f0, 0x36f2, 0x36f4, 0x36f6, 0x36f8, 0x36fb, 0x36fd,
+ 0x36ff, 0x3702, 0x3705, 0x3707, 0x3709, 0x370b, 0x370d, 0x370f,
+ 0x3711, 0x3713, 0x3715, 0x3717, 0x371a, 0x371c, 0x371f, 0x3721,
+ 0x3724, 0x3726, 0x3728, 0x372a, 0x372d, 0x372f, 0x3731, 0x3734,
+ 0x3737, 0x3739, 0x373b, 0x373d, 0x373f, 0x3741, 0x3743, 0x3745,
+ 0x3747, 0x3749, 0x374b, 0x374d, 0x374f, 0x3751, 0x3754, 0x3756,
+ 0x3759, 0x375b, 0x375e, 0x3760, 0x3763, 0x3766, 0x3769, 0x376b,
+ 0x376d, 0x376f, 0x3772, 0x3775, 0x3778, 0x377b, 0x377d, 0x377f,
+ 0x3781, 0x3783, 0x3785, 0x3787, 0x3789, 0x378b, 0x378e, 0x3790,
+ 0x3792, 0x3794, 0x3796, 0x3799, 0x379b, 0x379e, 0x37a1, 0x37a3,
+ 0x37a5, 0x37a7, 0x37a9, 0x37ab, 0x37ad, 0x37b0, 0x37b3, 0x37b6,
+ 0x37b8, 0x37ba, 0x37bd, 0x37bf, 0x37c1, 0x37c3, 0x37c6, 0x37c8,
+ 0x37ca, 0x37cc, 0x37ce, 0x37d0, 0x37d3, 0x37d5, 0x37d7, 0x37d9,
+ 0x37db, 0x37dd, 0x37df, 0x37e2, 0x37e5, 0x37e7, 0x37ea, 0x37ec,
+ 0x37ef, 0x37f1, 0x37f3, 0x37f5, 0x37f8, 0x37fb, 0x37fd, 0x3800,
+ 0x3802, 0x3805, 0x3807, 0x3809, 0x380b, 0x380d, 0x380f, 0x3811,
+ 0x3814, 0x3817, 0x381a, 0x381d, 0x381f, 0x3821, 0x3823, 0x3825,
+ 0x3827, 0x3829, 0x382b, 0x382d, 0x382f, 0x3831, 0x3833, 0x3835,
+ 0x3838, 0x383a, 0x383c, 0x383e, 0x3840, 0x3842, 0x3844, 0x3846,
+ 0x3848, 0x384a, 0x384c, 0x384e, 0x3850, 0x3853, 0x3856, 0x3859,
+ 0x385b, 0x385d, 0x385f, 0x3861, 0x3864, 0x3866, 0x3869, 0x386b,
+ 0x386d, 0x3870, 0x3873, 0x3875, 0x3877, 0x3879, 0x387b, 0x387d,
+ 0x387f, 0x3881, 0x3883, 0x3885, 0x3887, 0x3889, 0x388b, 0x388d,
+ 0x388f, 0x3891, 0x3893, 0x3895, 0x3897, 0x3899, 0x389c, 0x389e,
+ 0x38a0, 0x38a2, 0x38a4, 0x38a6, 0x38a9, 0x38ac, 0x38ae, 0x38b0,
+ 0x38b2, 0x38b4, 0x38b6, 0x38b8, 0x38bb, 0x38bd, 0x38bf, 0x38c1,
+ 0x38c3, 0x38c6, 0x38c9, 0x38cb, 0x38cd, 0x38cf, 0x38d2, 0x38d4,
+ 0x38d6, 0x38d9, 0x38dc, 0x38de, 0x38e0, 0x38e2, 0x38e5, 0x38e7,
+ 0x38e9, 0x38eb, 0x38ed, 0x38ef, 0x38f1, 0x38f3, 0x38f6, 0x38f8,
+ 0x38fa, 0x38fc, 0x38ff, 0x3901, 0x3903, 0x3905, 0x3907, 0x390a,
+ 0x390d, 0x390f, 0x3911, 0x3913, 0x3916, 0x3918, 0x391b, 0x391d,
- 0x3827, 0x3829, 0x382c, 0x382e, 0x3830, 0x3832, 0x3834, 0x3836,
- 0x3838, 0x383a, 0x383d, 0x383f, 0x3841, 0x3843, 0x3845, 0x3847,
- 0x3849, 0x384c, 0x384e, 0x3851, 0x3854, 0x3857, 0x3859, 0x385b,
- 0x385d, 0x385f, 0x3861, 0x3863, 0x3865, 0x3867, 0xffff, 0xffff,
+ 0x391f, 0x3921, 0x3924, 0x3926, 0x3928, 0x392a, 0x392c, 0x392e,
+ 0x3930, 0x3932, 0x3935, 0x3937, 0x3939, 0x393b, 0x393d, 0x393f,
+ 0x3941, 0x3944, 0x3946, 0x3949, 0x394c, 0x394f, 0x3951, 0x3953,
+ 0x3955, 0x3957, 0x3959, 0x395b, 0x395d, 0x395f, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11831,12 +12754,12 @@ static const unsigned short uc_decomposition_trie[] = {
#define GET_DECOMPOSITION_INDEX(ucs4) \
(ucs4 < 0x3400 \
- ? (uc_decomposition_trie[uc_decomposition_trie[ucs4>>4] + (ucs4 & 0xf)]) \
- : (ucs4 < 0x30000 \
- ? uc_decomposition_trie[uc_decomposition_trie[((ucs4 - 0x3400)>>8) + 0x340] + (ucs4 & 0xff)] \
- : 0xffff))
+ ? (uc_decomposition_trie[uc_decomposition_trie[ucs4 >> 4] + (ucs4 & 0xf)]) \
+ : ucs4 < 0x30000 \
+ ? uc_decomposition_trie[uc_decomposition_trie[((ucs4 - 0x3400) >> 8) + 0x340] + (ucs4 & 0xff)] \
+ : 0xffff)
-static const unsigned short uc_decomposition_map[] = {
+static constexpr unsigned short uc_decomposition_map[] = {
0x103, 0x20, 0x210, 0x20, 0x308, 0x109, 0x61, 0x210,
0x20, 0x304, 0x109, 0x32, 0x109, 0x33, 0x210, 0x20,
0x301, 0x110, 0x3bc, 0x210, 0x20, 0x327, 0x109, 0x31,
@@ -12668,677 +13591,678 @@ static const unsigned short uc_decomposition_map[] = {
0x310, 0x32, 0x37, 0x65e5, 0x310, 0x32, 0x38, 0x65e5,
0x310, 0x32, 0x39, 0x65e5, 0x310, 0x33, 0x30, 0x65e5,
0x310, 0x33, 0x31, 0x65e5, 0x30f, 0x67, 0x61, 0x6c,
- 0x109, 0x44a, 0x109, 0x44c, 0x109, 0xa76f, 0x109, 0x126,
- 0x109, 0x153, 0x109, 0xa727, 0x109, 0xab37, 0x109, 0x26b,
- 0x109, 0xab52, 0x109, 0x28d, 0x101, 0x8c48, 0x101, 0x66f4,
- 0x101, 0x8eca, 0x101, 0x8cc8, 0x101, 0x6ed1, 0x101, 0x4e32,
- 0x101, 0x53e5, 0x101, 0x9f9c, 0x101, 0x9f9c, 0x101, 0x5951,
- 0x101, 0x91d1, 0x101, 0x5587, 0x101, 0x5948, 0x101, 0x61f6,
- 0x101, 0x7669, 0x101, 0x7f85, 0x101, 0x863f, 0x101, 0x87ba,
- 0x101, 0x88f8, 0x101, 0x908f, 0x101, 0x6a02, 0x101, 0x6d1b,
- 0x101, 0x70d9, 0x101, 0x73de, 0x101, 0x843d, 0x101, 0x916a,
- 0x101, 0x99f1, 0x101, 0x4e82, 0x101, 0x5375, 0x101, 0x6b04,
- 0x101, 0x721b, 0x101, 0x862d, 0x101, 0x9e1e, 0x101, 0x5d50,
- 0x101, 0x6feb, 0x101, 0x85cd, 0x101, 0x8964, 0x101, 0x62c9,
- 0x101, 0x81d8, 0x101, 0x881f, 0x101, 0x5eca, 0x101, 0x6717,
- 0x101, 0x6d6a, 0x101, 0x72fc, 0x101, 0x90ce, 0x101, 0x4f86,
- 0x101, 0x51b7, 0x101, 0x52de, 0x101, 0x64c4, 0x101, 0x6ad3,
- 0x101, 0x7210, 0x101, 0x76e7, 0x101, 0x8001, 0x101, 0x8606,
- 0x101, 0x865c, 0x101, 0x8def, 0x101, 0x9732, 0x101, 0x9b6f,
- 0x101, 0x9dfa, 0x101, 0x788c, 0x101, 0x797f, 0x101, 0x7da0,
- 0x101, 0x83c9, 0x101, 0x9304, 0x101, 0x9e7f, 0x101, 0x8ad6,
- 0x101, 0x58df, 0x101, 0x5f04, 0x101, 0x7c60, 0x101, 0x807e,
- 0x101, 0x7262, 0x101, 0x78ca, 0x101, 0x8cc2, 0x101, 0x96f7,
- 0x101, 0x58d8, 0x101, 0x5c62, 0x101, 0x6a13, 0x101, 0x6dda,
- 0x101, 0x6f0f, 0x101, 0x7d2f, 0x101, 0x7e37, 0x101, 0x964b,
- 0x101, 0x52d2, 0x101, 0x808b, 0x101, 0x51dc, 0x101, 0x51cc,
- 0x101, 0x7a1c, 0x101, 0x7dbe, 0x101, 0x83f1, 0x101, 0x9675,
- 0x101, 0x8b80, 0x101, 0x62cf, 0x101, 0x6a02, 0x101, 0x8afe,
- 0x101, 0x4e39, 0x101, 0x5be7, 0x101, 0x6012, 0x101, 0x7387,
- 0x101, 0x7570, 0x101, 0x5317, 0x101, 0x78fb, 0x101, 0x4fbf,
- 0x101, 0x5fa9, 0x101, 0x4e0d, 0x101, 0x6ccc, 0x101, 0x6578,
- 0x101, 0x7d22, 0x101, 0x53c3, 0x101, 0x585e, 0x101, 0x7701,
- 0x101, 0x8449, 0x101, 0x8aaa, 0x101, 0x6bba, 0x101, 0x8fb0,
- 0x101, 0x6c88, 0x101, 0x62fe, 0x101, 0x82e5, 0x101, 0x63a0,
- 0x101, 0x7565, 0x101, 0x4eae, 0x101, 0x5169, 0x101, 0x51c9,
- 0x101, 0x6881, 0x101, 0x7ce7, 0x101, 0x826f, 0x101, 0x8ad2,
- 0x101, 0x91cf, 0x101, 0x52f5, 0x101, 0x5442, 0x101, 0x5973,
- 0x101, 0x5eec, 0x101, 0x65c5, 0x101, 0x6ffe, 0x101, 0x792a,
- 0x101, 0x95ad, 0x101, 0x9a6a, 0x101, 0x9e97, 0x101, 0x9ece,
- 0x101, 0x529b, 0x101, 0x66c6, 0x101, 0x6b77, 0x101, 0x8f62,
- 0x101, 0x5e74, 0x101, 0x6190, 0x101, 0x6200, 0x101, 0x649a,
- 0x101, 0x6f23, 0x101, 0x7149, 0x101, 0x7489, 0x101, 0x79ca,
- 0x101, 0x7df4, 0x101, 0x806f, 0x101, 0x8f26, 0x101, 0x84ee,
- 0x101, 0x9023, 0x101, 0x934a, 0x101, 0x5217, 0x101, 0x52a3,
- 0x101, 0x54bd, 0x101, 0x70c8, 0x101, 0x88c2, 0x101, 0x8aaa,
- 0x101, 0x5ec9, 0x101, 0x5ff5, 0x101, 0x637b, 0x101, 0x6bae,
- 0x101, 0x7c3e, 0x101, 0x7375, 0x101, 0x4ee4, 0x101, 0x56f9,
- 0x101, 0x5be7, 0x101, 0x5dba, 0x101, 0x601c, 0x101, 0x73b2,
- 0x101, 0x7469, 0x101, 0x7f9a, 0x101, 0x8046, 0x101, 0x9234,
- 0x101, 0x96f6, 0x101, 0x9748, 0x101, 0x9818, 0x101, 0x4f8b,
- 0x101, 0x79ae, 0x101, 0x91b4, 0x101, 0x96b8, 0x101, 0x60e1,
- 0x101, 0x4e86, 0x101, 0x50da, 0x101, 0x5bee, 0x101, 0x5c3f,
- 0x101, 0x6599, 0x101, 0x6a02, 0x101, 0x71ce, 0x101, 0x7642,
- 0x101, 0x84fc, 0x101, 0x907c, 0x101, 0x9f8d, 0x101, 0x6688,
- 0x101, 0x962e, 0x101, 0x5289, 0x101, 0x677b, 0x101, 0x67f3,
- 0x101, 0x6d41, 0x101, 0x6e9c, 0x101, 0x7409, 0x101, 0x7559,
- 0x101, 0x786b, 0x101, 0x7d10, 0x101, 0x985e, 0x101, 0x516d,
- 0x101, 0x622e, 0x101, 0x9678, 0x101, 0x502b, 0x101, 0x5d19,
- 0x101, 0x6dea, 0x101, 0x8f2a, 0x101, 0x5f8b, 0x101, 0x6144,
- 0x101, 0x6817, 0x101, 0x7387, 0x101, 0x9686, 0x101, 0x5229,
- 0x101, 0x540f, 0x101, 0x5c65, 0x101, 0x6613, 0x101, 0x674e,
- 0x101, 0x68a8, 0x101, 0x6ce5, 0x101, 0x7406, 0x101, 0x75e2,
- 0x101, 0x7f79, 0x101, 0x88cf, 0x101, 0x88e1, 0x101, 0x91cc,
- 0x101, 0x96e2, 0x101, 0x533f, 0x101, 0x6eba, 0x101, 0x541d,
- 0x101, 0x71d0, 0x101, 0x7498, 0x101, 0x85fa, 0x101, 0x96a3,
- 0x101, 0x9c57, 0x101, 0x9e9f, 0x101, 0x6797, 0x101, 0x6dcb,
- 0x101, 0x81e8, 0x101, 0x7acb, 0x101, 0x7b20, 0x101, 0x7c92,
- 0x101, 0x72c0, 0x101, 0x7099, 0x101, 0x8b58, 0x101, 0x4ec0,
- 0x101, 0x8336, 0x101, 0x523a, 0x101, 0x5207, 0x101, 0x5ea6,
- 0x101, 0x62d3, 0x101, 0x7cd6, 0x101, 0x5b85, 0x101, 0x6d1e,
- 0x101, 0x66b4, 0x101, 0x8f3b, 0x101, 0x884c, 0x101, 0x964d,
- 0x101, 0x898b, 0x101, 0x5ed3, 0x101, 0x5140, 0x101, 0x55c0,
- 0x101, 0x585a, 0x101, 0x6674, 0x101, 0x51de, 0x101, 0x732a,
- 0x101, 0x76ca, 0x101, 0x793c, 0x101, 0x795e, 0x101, 0x7965,
- 0x101, 0x798f, 0x101, 0x9756, 0x101, 0x7cbe, 0x101, 0x7fbd,
- 0x101, 0x8612, 0x101, 0x8af8, 0x101, 0x9038, 0x101, 0x90fd,
- 0x101, 0x98ef, 0x101, 0x98fc, 0x101, 0x9928, 0x101, 0x9db4,
- 0x101, 0x90de, 0x101, 0x96b7, 0x101, 0x4fae, 0x101, 0x50e7,
- 0x101, 0x514d, 0x101, 0x52c9, 0x101, 0x52e4, 0x101, 0x5351,
- 0x101, 0x559d, 0x101, 0x5606, 0x101, 0x5668, 0x101, 0x5840,
- 0x101, 0x58a8, 0x101, 0x5c64, 0x101, 0x5c6e, 0x101, 0x6094,
- 0x101, 0x6168, 0x101, 0x618e, 0x101, 0x61f2, 0x101, 0x654f,
- 0x101, 0x65e2, 0x101, 0x6691, 0x101, 0x6885, 0x101, 0x6d77,
- 0x101, 0x6e1a, 0x101, 0x6f22, 0x101, 0x716e, 0x101, 0x722b,
- 0x101, 0x7422, 0x101, 0x7891, 0x101, 0x793e, 0x101, 0x7949,
- 0x101, 0x7948, 0x101, 0x7950, 0x101, 0x7956, 0x101, 0x795d,
- 0x101, 0x798d, 0x101, 0x798e, 0x101, 0x7a40, 0x101, 0x7a81,
- 0x101, 0x7bc0, 0x101, 0x7df4, 0x101, 0x7e09, 0x101, 0x7e41,
- 0x101, 0x7f72, 0x101, 0x8005, 0x101, 0x81ed, 0x101, 0x8279,
- 0x101, 0x8279, 0x101, 0x8457, 0x101, 0x8910, 0x101, 0x8996,
- 0x101, 0x8b01, 0x101, 0x8b39, 0x101, 0x8cd3, 0x101, 0x8d08,
- 0x101, 0x8fb6, 0x101, 0x9038, 0x101, 0x96e3, 0x101, 0x97ff,
- 0x101, 0x983b, 0x101, 0x6075, 0x201, 0xd850, 0xdeee, 0x101,
- 0x8218, 0x101, 0x4e26, 0x101, 0x51b5, 0x101, 0x5168, 0x101,
- 0x4f80, 0x101, 0x5145, 0x101, 0x5180, 0x101, 0x52c7, 0x101,
- 0x52fa, 0x101, 0x559d, 0x101, 0x5555, 0x101, 0x5599, 0x101,
- 0x55e2, 0x101, 0x585a, 0x101, 0x58b3, 0x101, 0x5944, 0x101,
- 0x5954, 0x101, 0x5a62, 0x101, 0x5b28, 0x101, 0x5ed2, 0x101,
- 0x5ed9, 0x101, 0x5f69, 0x101, 0x5fad, 0x101, 0x60d8, 0x101,
- 0x614e, 0x101, 0x6108, 0x101, 0x618e, 0x101, 0x6160, 0x101,
- 0x61f2, 0x101, 0x6234, 0x101, 0x63c4, 0x101, 0x641c, 0x101,
- 0x6452, 0x101, 0x6556, 0x101, 0x6674, 0x101, 0x6717, 0x101,
- 0x671b, 0x101, 0x6756, 0x101, 0x6b79, 0x101, 0x6bba, 0x101,
- 0x6d41, 0x101, 0x6edb, 0x101, 0x6ecb, 0x101, 0x6f22, 0x101,
- 0x701e, 0x101, 0x716e, 0x101, 0x77a7, 0x101, 0x7235, 0x101,
- 0x72af, 0x101, 0x732a, 0x101, 0x7471, 0x101, 0x7506, 0x101,
- 0x753b, 0x101, 0x761d, 0x101, 0x761f, 0x101, 0x76ca, 0x101,
- 0x76db, 0x101, 0x76f4, 0x101, 0x774a, 0x101, 0x7740, 0x101,
- 0x78cc, 0x101, 0x7ab1, 0x101, 0x7bc0, 0x101, 0x7c7b, 0x101,
- 0x7d5b, 0x101, 0x7df4, 0x101, 0x7f3e, 0x101, 0x8005, 0x101,
- 0x8352, 0x101, 0x83ef, 0x101, 0x8779, 0x101, 0x8941, 0x101,
- 0x8986, 0x101, 0x8996, 0x101, 0x8abf, 0x101, 0x8af8, 0x101,
- 0x8acb, 0x101, 0x8b01, 0x101, 0x8afe, 0x101, 0x8aed, 0x101,
- 0x8b39, 0x101, 0x8b8a, 0x101, 0x8d08, 0x101, 0x8f38, 0x101,
- 0x9072, 0x101, 0x9199, 0x101, 0x9276, 0x101, 0x967c, 0x101,
- 0x96e3, 0x101, 0x9756, 0x101, 0x97db, 0x101, 0x97ff, 0x101,
- 0x980b, 0x101, 0x983b, 0x101, 0x9b12, 0x101, 0x9f9c, 0x201,
- 0xd84a, 0xdc4a, 0x201, 0xd84a, 0xdc44, 0x201, 0xd84c, 0xdfd5,
- 0x101, 0x3b9d, 0x101, 0x4018, 0x101, 0x4039, 0x201, 0xd854,
- 0xde49, 0x201, 0xd857, 0xdcd0, 0x201, 0xd85f, 0xded3, 0x101,
- 0x9f43, 0x101, 0x9f8e, 0x210, 0x66, 0x66, 0x210, 0x66,
- 0x69, 0x210, 0x66, 0x6c, 0x310, 0x66, 0x66, 0x69,
- 0x310, 0x66, 0x66, 0x6c, 0x210, 0x17f, 0x74, 0x210,
- 0x73, 0x74, 0x210, 0x574, 0x576, 0x210, 0x574, 0x565,
- 0x210, 0x574, 0x56b, 0x210, 0x57e, 0x576, 0x210, 0x574,
- 0x56d, 0x201, 0x5d9, 0x5b4, 0x201, 0x5f2, 0x5b7, 0x102,
- 0x5e2, 0x102, 0x5d0, 0x102, 0x5d3, 0x102, 0x5d4, 0x102,
- 0x5db, 0x102, 0x5dc, 0x102, 0x5dd, 0x102, 0x5e8, 0x102,
- 0x5ea, 0x102, 0x2b, 0x201, 0x5e9, 0x5c1, 0x201, 0x5e9,
- 0x5c2, 0x201, 0xfb49, 0x5c1, 0x201, 0xfb49, 0x5c2, 0x201,
- 0x5d0, 0x5b7, 0x201, 0x5d0, 0x5b8, 0x201, 0x5d0, 0x5bc,
- 0x201, 0x5d1, 0x5bc, 0x201, 0x5d2, 0x5bc, 0x201, 0x5d3,
- 0x5bc, 0x201, 0x5d4, 0x5bc, 0x201, 0x5d5, 0x5bc, 0x201,
- 0x5d6, 0x5bc, 0x201, 0x5d8, 0x5bc, 0x201, 0x5d9, 0x5bc,
- 0x201, 0x5da, 0x5bc, 0x201, 0x5db, 0x5bc, 0x201, 0x5dc,
- 0x5bc, 0x201, 0x5de, 0x5bc, 0x201, 0x5e0, 0x5bc, 0x201,
- 0x5e1, 0x5bc, 0x201, 0x5e3, 0x5bc, 0x201, 0x5e4, 0x5bc,
- 0x201, 0x5e6, 0x5bc, 0x201, 0x5e7, 0x5bc, 0x201, 0x5e8,
- 0x5bc, 0x201, 0x5e9, 0x5bc, 0x201, 0x5ea, 0x5bc, 0x201,
- 0x5d5, 0x5b9, 0x201, 0x5d1, 0x5bf, 0x201, 0x5db, 0x5bf,
- 0x201, 0x5e4, 0x5bf, 0x210, 0x5d0, 0x5dc, 0x107, 0x671,
- 0x106, 0x671, 0x107, 0x67b, 0x106, 0x67b, 0x104, 0x67b,
- 0x105, 0x67b, 0x107, 0x67e, 0x106, 0x67e, 0x104, 0x67e,
- 0x105, 0x67e, 0x107, 0x680, 0x106, 0x680, 0x104, 0x680,
- 0x105, 0x680, 0x107, 0x67a, 0x106, 0x67a, 0x104, 0x67a,
- 0x105, 0x67a, 0x107, 0x67f, 0x106, 0x67f, 0x104, 0x67f,
- 0x105, 0x67f, 0x107, 0x679, 0x106, 0x679, 0x104, 0x679,
- 0x105, 0x679, 0x107, 0x6a4, 0x106, 0x6a4, 0x104, 0x6a4,
- 0x105, 0x6a4, 0x107, 0x6a6, 0x106, 0x6a6, 0x104, 0x6a6,
- 0x105, 0x6a6, 0x107, 0x684, 0x106, 0x684, 0x104, 0x684,
- 0x105, 0x684, 0x107, 0x683, 0x106, 0x683, 0x104, 0x683,
- 0x105, 0x683, 0x107, 0x686, 0x106, 0x686, 0x104, 0x686,
- 0x105, 0x686, 0x107, 0x687, 0x106, 0x687, 0x104, 0x687,
- 0x105, 0x687, 0x107, 0x68d, 0x106, 0x68d, 0x107, 0x68c,
- 0x106, 0x68c, 0x107, 0x68e, 0x106, 0x68e, 0x107, 0x688,
- 0x106, 0x688, 0x107, 0x698, 0x106, 0x698, 0x107, 0x691,
- 0x106, 0x691, 0x107, 0x6a9, 0x106, 0x6a9, 0x104, 0x6a9,
- 0x105, 0x6a9, 0x107, 0x6af, 0x106, 0x6af, 0x104, 0x6af,
- 0x105, 0x6af, 0x107, 0x6b3, 0x106, 0x6b3, 0x104, 0x6b3,
- 0x105, 0x6b3, 0x107, 0x6b1, 0x106, 0x6b1, 0x104, 0x6b1,
- 0x105, 0x6b1, 0x107, 0x6ba, 0x106, 0x6ba, 0x107, 0x6bb,
- 0x106, 0x6bb, 0x104, 0x6bb, 0x105, 0x6bb, 0x107, 0x6c0,
- 0x106, 0x6c0, 0x107, 0x6c1, 0x106, 0x6c1, 0x104, 0x6c1,
- 0x105, 0x6c1, 0x107, 0x6be, 0x106, 0x6be, 0x104, 0x6be,
- 0x105, 0x6be, 0x107, 0x6d2, 0x106, 0x6d2, 0x107, 0x6d3,
- 0x106, 0x6d3, 0x107, 0x6ad, 0x106, 0x6ad, 0x104, 0x6ad,
- 0x105, 0x6ad, 0x107, 0x6c7, 0x106, 0x6c7, 0x107, 0x6c6,
- 0x106, 0x6c6, 0x107, 0x6c8, 0x106, 0x6c8, 0x107, 0x677,
- 0x107, 0x6cb, 0x106, 0x6cb, 0x107, 0x6c5, 0x106, 0x6c5,
- 0x107, 0x6c9, 0x106, 0x6c9, 0x107, 0x6d0, 0x106, 0x6d0,
- 0x104, 0x6d0, 0x105, 0x6d0, 0x104, 0x649, 0x105, 0x649,
- 0x207, 0x626, 0x627, 0x206, 0x626, 0x627, 0x207, 0x626,
- 0x6d5, 0x206, 0x626, 0x6d5, 0x207, 0x626, 0x648, 0x206,
- 0x626, 0x648, 0x207, 0x626, 0x6c7, 0x206, 0x626, 0x6c7,
- 0x207, 0x626, 0x6c6, 0x206, 0x626, 0x6c6, 0x207, 0x626,
- 0x6c8, 0x206, 0x626, 0x6c8, 0x207, 0x626, 0x6d0, 0x206,
- 0x626, 0x6d0, 0x204, 0x626, 0x6d0, 0x207, 0x626, 0x649,
- 0x206, 0x626, 0x649, 0x204, 0x626, 0x649, 0x107, 0x6cc,
- 0x106, 0x6cc, 0x104, 0x6cc, 0x105, 0x6cc, 0x207, 0x626,
- 0x62c, 0x207, 0x626, 0x62d, 0x207, 0x626, 0x645, 0x207,
- 0x626, 0x649, 0x207, 0x626, 0x64a, 0x207, 0x628, 0x62c,
- 0x207, 0x628, 0x62d, 0x207, 0x628, 0x62e, 0x207, 0x628,
- 0x645, 0x207, 0x628, 0x649, 0x207, 0x628, 0x64a, 0x207,
- 0x62a, 0x62c, 0x207, 0x62a, 0x62d, 0x207, 0x62a, 0x62e,
- 0x207, 0x62a, 0x645, 0x207, 0x62a, 0x649, 0x207, 0x62a,
- 0x64a, 0x207, 0x62b, 0x62c, 0x207, 0x62b, 0x645, 0x207,
- 0x62b, 0x649, 0x207, 0x62b, 0x64a, 0x207, 0x62c, 0x62d,
- 0x207, 0x62c, 0x645, 0x207, 0x62d, 0x62c, 0x207, 0x62d,
- 0x645, 0x207, 0x62e, 0x62c, 0x207, 0x62e, 0x62d, 0x207,
- 0x62e, 0x645, 0x207, 0x633, 0x62c, 0x207, 0x633, 0x62d,
- 0x207, 0x633, 0x62e, 0x207, 0x633, 0x645, 0x207, 0x635,
- 0x62d, 0x207, 0x635, 0x645, 0x207, 0x636, 0x62c, 0x207,
- 0x636, 0x62d, 0x207, 0x636, 0x62e, 0x207, 0x636, 0x645,
- 0x207, 0x637, 0x62d, 0x207, 0x637, 0x645, 0x207, 0x638,
- 0x645, 0x207, 0x639, 0x62c, 0x207, 0x639, 0x645, 0x207,
- 0x63a, 0x62c, 0x207, 0x63a, 0x645, 0x207, 0x641, 0x62c,
- 0x207, 0x641, 0x62d, 0x207, 0x641, 0x62e, 0x207, 0x641,
- 0x645, 0x207, 0x641, 0x649, 0x207, 0x641, 0x64a, 0x207,
- 0x642, 0x62d, 0x207, 0x642, 0x645, 0x207, 0x642, 0x649,
- 0x207, 0x642, 0x64a, 0x207, 0x643, 0x627, 0x207, 0x643,
- 0x62c, 0x207, 0x643, 0x62d, 0x207, 0x643, 0x62e, 0x207,
- 0x643, 0x644, 0x207, 0x643, 0x645, 0x207, 0x643, 0x649,
- 0x207, 0x643, 0x64a, 0x207, 0x644, 0x62c, 0x207, 0x644,
- 0x62d, 0x207, 0x644, 0x62e, 0x207, 0x644, 0x645, 0x207,
- 0x644, 0x649, 0x207, 0x644, 0x64a, 0x207, 0x645, 0x62c,
- 0x207, 0x645, 0x62d, 0x207, 0x645, 0x62e, 0x207, 0x645,
- 0x645, 0x207, 0x645, 0x649, 0x207, 0x645, 0x64a, 0x207,
- 0x646, 0x62c, 0x207, 0x646, 0x62d, 0x207, 0x646, 0x62e,
- 0x207, 0x646, 0x645, 0x207, 0x646, 0x649, 0x207, 0x646,
- 0x64a, 0x207, 0x647, 0x62c, 0x207, 0x647, 0x645, 0x207,
- 0x647, 0x649, 0x207, 0x647, 0x64a, 0x207, 0x64a, 0x62c,
- 0x207, 0x64a, 0x62d, 0x207, 0x64a, 0x62e, 0x207, 0x64a,
- 0x645, 0x207, 0x64a, 0x649, 0x207, 0x64a, 0x64a, 0x207,
- 0x630, 0x670, 0x207, 0x631, 0x670, 0x207, 0x649, 0x670,
- 0x307, 0x20, 0x64c, 0x651, 0x307, 0x20, 0x64d, 0x651,
- 0x307, 0x20, 0x64e, 0x651, 0x307, 0x20, 0x64f, 0x651,
- 0x307, 0x20, 0x650, 0x651, 0x307, 0x20, 0x651, 0x670,
- 0x206, 0x626, 0x631, 0x206, 0x626, 0x632, 0x206, 0x626,
- 0x645, 0x206, 0x626, 0x646, 0x206, 0x626, 0x649, 0x206,
- 0x626, 0x64a, 0x206, 0x628, 0x631, 0x206, 0x628, 0x632,
- 0x206, 0x628, 0x645, 0x206, 0x628, 0x646, 0x206, 0x628,
- 0x649, 0x206, 0x628, 0x64a, 0x206, 0x62a, 0x631, 0x206,
- 0x62a, 0x632, 0x206, 0x62a, 0x645, 0x206, 0x62a, 0x646,
- 0x206, 0x62a, 0x649, 0x206, 0x62a, 0x64a, 0x206, 0x62b,
- 0x631, 0x206, 0x62b, 0x632, 0x206, 0x62b, 0x645, 0x206,
- 0x62b, 0x646, 0x206, 0x62b, 0x649, 0x206, 0x62b, 0x64a,
- 0x206, 0x641, 0x649, 0x206, 0x641, 0x64a, 0x206, 0x642,
- 0x649, 0x206, 0x642, 0x64a, 0x206, 0x643, 0x627, 0x206,
- 0x643, 0x644, 0x206, 0x643, 0x645, 0x206, 0x643, 0x649,
- 0x206, 0x643, 0x64a, 0x206, 0x644, 0x645, 0x206, 0x644,
- 0x649, 0x206, 0x644, 0x64a, 0x206, 0x645, 0x627, 0x206,
- 0x645, 0x645, 0x206, 0x646, 0x631, 0x206, 0x646, 0x632,
- 0x206, 0x646, 0x645, 0x206, 0x646, 0x646, 0x206, 0x646,
- 0x649, 0x206, 0x646, 0x64a, 0x206, 0x649, 0x670, 0x206,
- 0x64a, 0x631, 0x206, 0x64a, 0x632, 0x206, 0x64a, 0x645,
- 0x206, 0x64a, 0x646, 0x206, 0x64a, 0x649, 0x206, 0x64a,
- 0x64a, 0x204, 0x626, 0x62c, 0x204, 0x626, 0x62d, 0x204,
- 0x626, 0x62e, 0x204, 0x626, 0x645, 0x204, 0x626, 0x647,
- 0x204, 0x628, 0x62c, 0x204, 0x628, 0x62d, 0x204, 0x628,
- 0x62e, 0x204, 0x628, 0x645, 0x204, 0x628, 0x647, 0x204,
- 0x62a, 0x62c, 0x204, 0x62a, 0x62d, 0x204, 0x62a, 0x62e,
- 0x204, 0x62a, 0x645, 0x204, 0x62a, 0x647, 0x204, 0x62b,
- 0x645, 0x204, 0x62c, 0x62d, 0x204, 0x62c, 0x645, 0x204,
- 0x62d, 0x62c, 0x204, 0x62d, 0x645, 0x204, 0x62e, 0x62c,
- 0x204, 0x62e, 0x645, 0x204, 0x633, 0x62c, 0x204, 0x633,
- 0x62d, 0x204, 0x633, 0x62e, 0x204, 0x633, 0x645, 0x204,
- 0x635, 0x62d, 0x204, 0x635, 0x62e, 0x204, 0x635, 0x645,
- 0x204, 0x636, 0x62c, 0x204, 0x636, 0x62d, 0x204, 0x636,
- 0x62e, 0x204, 0x636, 0x645, 0x204, 0x637, 0x62d, 0x204,
- 0x638, 0x645, 0x204, 0x639, 0x62c, 0x204, 0x639, 0x645,
- 0x204, 0x63a, 0x62c, 0x204, 0x63a, 0x645, 0x204, 0x641,
- 0x62c, 0x204, 0x641, 0x62d, 0x204, 0x641, 0x62e, 0x204,
- 0x641, 0x645, 0x204, 0x642, 0x62d, 0x204, 0x642, 0x645,
- 0x204, 0x643, 0x62c, 0x204, 0x643, 0x62d, 0x204, 0x643,
- 0x62e, 0x204, 0x643, 0x644, 0x204, 0x643, 0x645, 0x204,
- 0x644, 0x62c, 0x204, 0x644, 0x62d, 0x204, 0x644, 0x62e,
- 0x204, 0x644, 0x645, 0x204, 0x644, 0x647, 0x204, 0x645,
- 0x62c, 0x204, 0x645, 0x62d, 0x204, 0x645, 0x62e, 0x204,
- 0x645, 0x645, 0x204, 0x646, 0x62c, 0x204, 0x646, 0x62d,
- 0x204, 0x646, 0x62e, 0x204, 0x646, 0x645, 0x204, 0x646,
- 0x647, 0x204, 0x647, 0x62c, 0x204, 0x647, 0x645, 0x204,
- 0x647, 0x670, 0x204, 0x64a, 0x62c, 0x204, 0x64a, 0x62d,
- 0x204, 0x64a, 0x62e, 0x204, 0x64a, 0x645, 0x204, 0x64a,
- 0x647, 0x205, 0x626, 0x645, 0x205, 0x626, 0x647, 0x205,
- 0x628, 0x645, 0x205, 0x628, 0x647, 0x205, 0x62a, 0x645,
- 0x205, 0x62a, 0x647, 0x205, 0x62b, 0x645, 0x205, 0x62b,
- 0x647, 0x205, 0x633, 0x645, 0x205, 0x633, 0x647, 0x205,
- 0x634, 0x645, 0x205, 0x634, 0x647, 0x205, 0x643, 0x644,
- 0x205, 0x643, 0x645, 0x205, 0x644, 0x645, 0x205, 0x646,
- 0x645, 0x205, 0x646, 0x647, 0x205, 0x64a, 0x645, 0x205,
- 0x64a, 0x647, 0x305, 0x640, 0x64e, 0x651, 0x305, 0x640,
- 0x64f, 0x651, 0x305, 0x640, 0x650, 0x651, 0x207, 0x637,
- 0x649, 0x207, 0x637, 0x64a, 0x207, 0x639, 0x649, 0x207,
- 0x639, 0x64a, 0x207, 0x63a, 0x649, 0x207, 0x63a, 0x64a,
- 0x207, 0x633, 0x649, 0x207, 0x633, 0x64a, 0x207, 0x634,
- 0x649, 0x207, 0x634, 0x64a, 0x207, 0x62d, 0x649, 0x207,
- 0x62d, 0x64a, 0x207, 0x62c, 0x649, 0x207, 0x62c, 0x64a,
- 0x207, 0x62e, 0x649, 0x207, 0x62e, 0x64a, 0x207, 0x635,
- 0x649, 0x207, 0x635, 0x64a, 0x207, 0x636, 0x649, 0x207,
- 0x636, 0x64a, 0x207, 0x634, 0x62c, 0x207, 0x634, 0x62d,
- 0x207, 0x634, 0x62e, 0x207, 0x634, 0x645, 0x207, 0x634,
- 0x631, 0x207, 0x633, 0x631, 0x207, 0x635, 0x631, 0x207,
- 0x636, 0x631, 0x206, 0x637, 0x649, 0x206, 0x637, 0x64a,
- 0x206, 0x639, 0x649, 0x206, 0x639, 0x64a, 0x206, 0x63a,
- 0x649, 0x206, 0x63a, 0x64a, 0x206, 0x633, 0x649, 0x206,
- 0x633, 0x64a, 0x206, 0x634, 0x649, 0x206, 0x634, 0x64a,
- 0x206, 0x62d, 0x649, 0x206, 0x62d, 0x64a, 0x206, 0x62c,
- 0x649, 0x206, 0x62c, 0x64a, 0x206, 0x62e, 0x649, 0x206,
- 0x62e, 0x64a, 0x206, 0x635, 0x649, 0x206, 0x635, 0x64a,
- 0x206, 0x636, 0x649, 0x206, 0x636, 0x64a, 0x206, 0x634,
- 0x62c, 0x206, 0x634, 0x62d, 0x206, 0x634, 0x62e, 0x206,
- 0x634, 0x645, 0x206, 0x634, 0x631, 0x206, 0x633, 0x631,
- 0x206, 0x635, 0x631, 0x206, 0x636, 0x631, 0x204, 0x634,
- 0x62c, 0x204, 0x634, 0x62d, 0x204, 0x634, 0x62e, 0x204,
- 0x634, 0x645, 0x204, 0x633, 0x647, 0x204, 0x634, 0x647,
- 0x204, 0x637, 0x645, 0x205, 0x633, 0x62c, 0x205, 0x633,
- 0x62d, 0x205, 0x633, 0x62e, 0x205, 0x634, 0x62c, 0x205,
- 0x634, 0x62d, 0x205, 0x634, 0x62e, 0x205, 0x637, 0x645,
- 0x205, 0x638, 0x645, 0x206, 0x627, 0x64b, 0x207, 0x627,
- 0x64b, 0x304, 0x62a, 0x62c, 0x645, 0x306, 0x62a, 0x62d,
- 0x62c, 0x304, 0x62a, 0x62d, 0x62c, 0x304, 0x62a, 0x62d,
- 0x645, 0x304, 0x62a, 0x62e, 0x645, 0x304, 0x62a, 0x645,
- 0x62c, 0x304, 0x62a, 0x645, 0x62d, 0x304, 0x62a, 0x645,
- 0x62e, 0x306, 0x62c, 0x645, 0x62d, 0x304, 0x62c, 0x645,
- 0x62d, 0x306, 0x62d, 0x645, 0x64a, 0x306, 0x62d, 0x645,
- 0x649, 0x304, 0x633, 0x62d, 0x62c, 0x304, 0x633, 0x62c,
- 0x62d, 0x306, 0x633, 0x62c, 0x649, 0x306, 0x633, 0x645,
- 0x62d, 0x304, 0x633, 0x645, 0x62d, 0x304, 0x633, 0x645,
- 0x62c, 0x306, 0x633, 0x645, 0x645, 0x304, 0x633, 0x645,
- 0x645, 0x306, 0x635, 0x62d, 0x62d, 0x304, 0x635, 0x62d,
- 0x62d, 0x306, 0x635, 0x645, 0x645, 0x306, 0x634, 0x62d,
- 0x645, 0x304, 0x634, 0x62d, 0x645, 0x306, 0x634, 0x62c,
- 0x64a, 0x306, 0x634, 0x645, 0x62e, 0x304, 0x634, 0x645,
- 0x62e, 0x306, 0x634, 0x645, 0x645, 0x304, 0x634, 0x645,
- 0x645, 0x306, 0x636, 0x62d, 0x649, 0x306, 0x636, 0x62e,
- 0x645, 0x304, 0x636, 0x62e, 0x645, 0x306, 0x637, 0x645,
- 0x62d, 0x304, 0x637, 0x645, 0x62d, 0x304, 0x637, 0x645,
- 0x645, 0x306, 0x637, 0x645, 0x64a, 0x306, 0x639, 0x62c,
- 0x645, 0x306, 0x639, 0x645, 0x645, 0x304, 0x639, 0x645,
- 0x645, 0x306, 0x639, 0x645, 0x649, 0x306, 0x63a, 0x645,
- 0x645, 0x306, 0x63a, 0x645, 0x64a, 0x306, 0x63a, 0x645,
- 0x649, 0x306, 0x641, 0x62e, 0x645, 0x304, 0x641, 0x62e,
- 0x645, 0x306, 0x642, 0x645, 0x62d, 0x306, 0x642, 0x645,
- 0x645, 0x306, 0x644, 0x62d, 0x645, 0x306, 0x644, 0x62d,
- 0x64a, 0x306, 0x644, 0x62d, 0x649, 0x304, 0x644, 0x62c,
- 0x62c, 0x306, 0x644, 0x62c, 0x62c, 0x306, 0x644, 0x62e,
- 0x645, 0x304, 0x644, 0x62e, 0x645, 0x306, 0x644, 0x645,
- 0x62d, 0x304, 0x644, 0x645, 0x62d, 0x304, 0x645, 0x62d,
- 0x62c, 0x304, 0x645, 0x62d, 0x645, 0x306, 0x645, 0x62d,
- 0x64a, 0x304, 0x645, 0x62c, 0x62d, 0x304, 0x645, 0x62c,
- 0x645, 0x304, 0x645, 0x62e, 0x62c, 0x304, 0x645, 0x62e,
- 0x645, 0x304, 0x645, 0x62c, 0x62e, 0x304, 0x647, 0x645,
- 0x62c, 0x304, 0x647, 0x645, 0x645, 0x304, 0x646, 0x62d,
- 0x645, 0x306, 0x646, 0x62d, 0x649, 0x306, 0x646, 0x62c,
- 0x645, 0x304, 0x646, 0x62c, 0x645, 0x306, 0x646, 0x62c,
- 0x649, 0x306, 0x646, 0x645, 0x64a, 0x306, 0x646, 0x645,
- 0x649, 0x306, 0x64a, 0x645, 0x645, 0x304, 0x64a, 0x645,
- 0x645, 0x306, 0x628, 0x62e, 0x64a, 0x306, 0x62a, 0x62c,
- 0x64a, 0x306, 0x62a, 0x62c, 0x649, 0x306, 0x62a, 0x62e,
- 0x64a, 0x306, 0x62a, 0x62e, 0x649, 0x306, 0x62a, 0x645,
- 0x64a, 0x306, 0x62a, 0x645, 0x649, 0x306, 0x62c, 0x645,
- 0x64a, 0x306, 0x62c, 0x62d, 0x649, 0x306, 0x62c, 0x645,
- 0x649, 0x306, 0x633, 0x62e, 0x649, 0x306, 0x635, 0x62d,
- 0x64a, 0x306, 0x634, 0x62d, 0x64a, 0x306, 0x636, 0x62d,
- 0x64a, 0x306, 0x644, 0x62c, 0x64a, 0x306, 0x644, 0x645,
- 0x64a, 0x306, 0x64a, 0x62d, 0x64a, 0x306, 0x64a, 0x62c,
- 0x64a, 0x306, 0x64a, 0x645, 0x64a, 0x306, 0x645, 0x645,
- 0x64a, 0x306, 0x642, 0x645, 0x64a, 0x306, 0x646, 0x62d,
- 0x64a, 0x304, 0x642, 0x645, 0x62d, 0x304, 0x644, 0x62d,
- 0x645, 0x306, 0x639, 0x645, 0x64a, 0x306, 0x643, 0x645,
- 0x64a, 0x304, 0x646, 0x62c, 0x62d, 0x306, 0x645, 0x62e,
- 0x64a, 0x304, 0x644, 0x62c, 0x645, 0x306, 0x643, 0x645,
- 0x645, 0x306, 0x644, 0x62c, 0x645, 0x306, 0x646, 0x62c,
- 0x62d, 0x306, 0x62c, 0x62d, 0x64a, 0x306, 0x62d, 0x62c,
- 0x64a, 0x306, 0x645, 0x62c, 0x64a, 0x306, 0x641, 0x645,
- 0x64a, 0x306, 0x628, 0x62d, 0x64a, 0x304, 0x643, 0x645,
- 0x645, 0x304, 0x639, 0x62c, 0x645, 0x304, 0x635, 0x645,
- 0x645, 0x306, 0x633, 0x62e, 0x64a, 0x306, 0x646, 0x62c,
- 0x64a, 0x307, 0x635, 0x644, 0x6d2, 0x307, 0x642, 0x644,
- 0x6d2, 0x407, 0x627, 0x644, 0x644, 0x647, 0x407, 0x627,
- 0x643, 0x628, 0x631, 0x407, 0x645, 0x62d, 0x645, 0x62f,
- 0x407, 0x635, 0x644, 0x639, 0x645, 0x407, 0x631, 0x633,
- 0x648, 0x644, 0x407, 0x639, 0x644, 0x64a, 0x647, 0x407,
- 0x648, 0x633, 0x644, 0x645, 0x307, 0x635, 0x644, 0x649,
- 0x1207, 0x635, 0x644, 0x649, 0x20, 0x627, 0x644, 0x644,
- 0x647, 0x20, 0x639, 0x644, 0x64a, 0x647, 0x20, 0x648,
- 0x633, 0x644, 0x645, 0x807, 0x62c, 0x644, 0x20, 0x62c,
- 0x644, 0x627, 0x644, 0x647, 0x407, 0x631, 0x6cc, 0x627,
- 0x644, 0x10b, 0x2c, 0x10b, 0x3001, 0x10b, 0x3002, 0x10b,
- 0x3a, 0x10b, 0x3b, 0x10b, 0x21, 0x10b, 0x3f, 0x10b,
- 0x3016, 0x10b, 0x3017, 0x10b, 0x2026, 0x10b, 0x2025, 0x10b,
- 0x2014, 0x10b, 0x2013, 0x10b, 0x5f, 0x10b, 0x5f, 0x10b,
- 0x28, 0x10b, 0x29, 0x10b, 0x7b, 0x10b, 0x7d, 0x10b,
- 0x3014, 0x10b, 0x3015, 0x10b, 0x3010, 0x10b, 0x3011, 0x10b,
- 0x300a, 0x10b, 0x300b, 0x10b, 0x3008, 0x10b, 0x3009, 0x10b,
- 0x300c, 0x10b, 0x300d, 0x10b, 0x300e, 0x10b, 0x300f, 0x10b,
- 0x5b, 0x10b, 0x5d, 0x110, 0x203e, 0x110, 0x203e, 0x110,
- 0x203e, 0x110, 0x203e, 0x110, 0x5f, 0x110, 0x5f, 0x110,
- 0x5f, 0x10e, 0x2c, 0x10e, 0x3001, 0x10e, 0x2e, 0x10e,
- 0x3b, 0x10e, 0x3a, 0x10e, 0x3f, 0x10e, 0x21, 0x10e,
- 0x2014, 0x10e, 0x28, 0x10e, 0x29, 0x10e, 0x7b, 0x10e,
- 0x7d, 0x10e, 0x3014, 0x10e, 0x3015, 0x10e, 0x23, 0x10e,
- 0x26, 0x10e, 0x2a, 0x10e, 0x2b, 0x10e, 0x2d, 0x10e,
- 0x3c, 0x10e, 0x3e, 0x10e, 0x3d, 0x10e, 0x5c, 0x10e,
- 0x24, 0x10e, 0x25, 0x10e, 0x40, 0x207, 0x20, 0x64b,
- 0x205, 0x640, 0x64b, 0x207, 0x20, 0x64c, 0x207, 0x20,
- 0x64d, 0x207, 0x20, 0x64e, 0x205, 0x640, 0x64e, 0x207,
- 0x20, 0x64f, 0x205, 0x640, 0x64f, 0x207, 0x20, 0x650,
- 0x205, 0x640, 0x650, 0x207, 0x20, 0x651, 0x205, 0x640,
- 0x651, 0x207, 0x20, 0x652, 0x205, 0x640, 0x652, 0x107,
- 0x621, 0x107, 0x622, 0x106, 0x622, 0x107, 0x623, 0x106,
- 0x623, 0x107, 0x624, 0x106, 0x624, 0x107, 0x625, 0x106,
- 0x625, 0x107, 0x626, 0x106, 0x626, 0x104, 0x626, 0x105,
- 0x626, 0x107, 0x627, 0x106, 0x627, 0x107, 0x628, 0x106,
- 0x628, 0x104, 0x628, 0x105, 0x628, 0x107, 0x629, 0x106,
- 0x629, 0x107, 0x62a, 0x106, 0x62a, 0x104, 0x62a, 0x105,
- 0x62a, 0x107, 0x62b, 0x106, 0x62b, 0x104, 0x62b, 0x105,
- 0x62b, 0x107, 0x62c, 0x106, 0x62c, 0x104, 0x62c, 0x105,
- 0x62c, 0x107, 0x62d, 0x106, 0x62d, 0x104, 0x62d, 0x105,
- 0x62d, 0x107, 0x62e, 0x106, 0x62e, 0x104, 0x62e, 0x105,
- 0x62e, 0x107, 0x62f, 0x106, 0x62f, 0x107, 0x630, 0x106,
- 0x630, 0x107, 0x631, 0x106, 0x631, 0x107, 0x632, 0x106,
- 0x632, 0x107, 0x633, 0x106, 0x633, 0x104, 0x633, 0x105,
- 0x633, 0x107, 0x634, 0x106, 0x634, 0x104, 0x634, 0x105,
- 0x634, 0x107, 0x635, 0x106, 0x635, 0x104, 0x635, 0x105,
- 0x635, 0x107, 0x636, 0x106, 0x636, 0x104, 0x636, 0x105,
- 0x636, 0x107, 0x637, 0x106, 0x637, 0x104, 0x637, 0x105,
- 0x637, 0x107, 0x638, 0x106, 0x638, 0x104, 0x638, 0x105,
- 0x638, 0x107, 0x639, 0x106, 0x639, 0x104, 0x639, 0x105,
- 0x639, 0x107, 0x63a, 0x106, 0x63a, 0x104, 0x63a, 0x105,
- 0x63a, 0x107, 0x641, 0x106, 0x641, 0x104, 0x641, 0x105,
- 0x641, 0x107, 0x642, 0x106, 0x642, 0x104, 0x642, 0x105,
- 0x642, 0x107, 0x643, 0x106, 0x643, 0x104, 0x643, 0x105,
- 0x643, 0x107, 0x644, 0x106, 0x644, 0x104, 0x644, 0x105,
- 0x644, 0x107, 0x645, 0x106, 0x645, 0x104, 0x645, 0x105,
- 0x645, 0x107, 0x646, 0x106, 0x646, 0x104, 0x646, 0x105,
- 0x646, 0x107, 0x647, 0x106, 0x647, 0x104, 0x647, 0x105,
- 0x647, 0x107, 0x648, 0x106, 0x648, 0x107, 0x649, 0x106,
- 0x649, 0x107, 0x64a, 0x106, 0x64a, 0x104, 0x64a, 0x105,
- 0x64a, 0x207, 0x644, 0x622, 0x206, 0x644, 0x622, 0x207,
- 0x644, 0x623, 0x206, 0x644, 0x623, 0x207, 0x644, 0x625,
- 0x206, 0x644, 0x625, 0x207, 0x644, 0x627, 0x206, 0x644,
- 0x627, 0x10c, 0x21, 0x10c, 0x22, 0x10c, 0x23, 0x10c,
- 0x24, 0x10c, 0x25, 0x10c, 0x26, 0x10c, 0x27, 0x10c,
- 0x28, 0x10c, 0x29, 0x10c, 0x2a, 0x10c, 0x2b, 0x10c,
- 0x2c, 0x10c, 0x2d, 0x10c, 0x2e, 0x10c, 0x2f, 0x10c,
- 0x30, 0x10c, 0x31, 0x10c, 0x32, 0x10c, 0x33, 0x10c,
- 0x34, 0x10c, 0x35, 0x10c, 0x36, 0x10c, 0x37, 0x10c,
- 0x38, 0x10c, 0x39, 0x10c, 0x3a, 0x10c, 0x3b, 0x10c,
- 0x3c, 0x10c, 0x3d, 0x10c, 0x3e, 0x10c, 0x3f, 0x10c,
- 0x40, 0x10c, 0x41, 0x10c, 0x42, 0x10c, 0x43, 0x10c,
- 0x44, 0x10c, 0x45, 0x10c, 0x46, 0x10c, 0x47, 0x10c,
- 0x48, 0x10c, 0x49, 0x10c, 0x4a, 0x10c, 0x4b, 0x10c,
- 0x4c, 0x10c, 0x4d, 0x10c, 0x4e, 0x10c, 0x4f, 0x10c,
- 0x50, 0x10c, 0x51, 0x10c, 0x52, 0x10c, 0x53, 0x10c,
- 0x54, 0x10c, 0x55, 0x10c, 0x56, 0x10c, 0x57, 0x10c,
- 0x58, 0x10c, 0x59, 0x10c, 0x5a, 0x10c, 0x5b, 0x10c,
- 0x5c, 0x10c, 0x5d, 0x10c, 0x5e, 0x10c, 0x5f, 0x10c,
- 0x60, 0x10c, 0x61, 0x10c, 0x62, 0x10c, 0x63, 0x10c,
- 0x64, 0x10c, 0x65, 0x10c, 0x66, 0x10c, 0x67, 0x10c,
- 0x68, 0x10c, 0x69, 0x10c, 0x6a, 0x10c, 0x6b, 0x10c,
- 0x6c, 0x10c, 0x6d, 0x10c, 0x6e, 0x10c, 0x6f, 0x10c,
- 0x70, 0x10c, 0x71, 0x10c, 0x72, 0x10c, 0x73, 0x10c,
- 0x74, 0x10c, 0x75, 0x10c, 0x76, 0x10c, 0x77, 0x10c,
- 0x78, 0x10c, 0x79, 0x10c, 0x7a, 0x10c, 0x7b, 0x10c,
- 0x7c, 0x10c, 0x7d, 0x10c, 0x7e, 0x10c, 0x2985, 0x10c,
- 0x2986, 0x10d, 0x3002, 0x10d, 0x300c, 0x10d, 0x300d, 0x10d,
- 0x3001, 0x10d, 0x30fb, 0x10d, 0x30f2, 0x10d, 0x30a1, 0x10d,
- 0x30a3, 0x10d, 0x30a5, 0x10d, 0x30a7, 0x10d, 0x30a9, 0x10d,
- 0x30e3, 0x10d, 0x30e5, 0x10d, 0x30e7, 0x10d, 0x30c3, 0x10d,
- 0x30fc, 0x10d, 0x30a2, 0x10d, 0x30a4, 0x10d, 0x30a6, 0x10d,
- 0x30a8, 0x10d, 0x30aa, 0x10d, 0x30ab, 0x10d, 0x30ad, 0x10d,
- 0x30af, 0x10d, 0x30b1, 0x10d, 0x30b3, 0x10d, 0x30b5, 0x10d,
- 0x30b7, 0x10d, 0x30b9, 0x10d, 0x30bb, 0x10d, 0x30bd, 0x10d,
- 0x30bf, 0x10d, 0x30c1, 0x10d, 0x30c4, 0x10d, 0x30c6, 0x10d,
- 0x30c8, 0x10d, 0x30ca, 0x10d, 0x30cb, 0x10d, 0x30cc, 0x10d,
- 0x30cd, 0x10d, 0x30ce, 0x10d, 0x30cf, 0x10d, 0x30d2, 0x10d,
- 0x30d5, 0x10d, 0x30d8, 0x10d, 0x30db, 0x10d, 0x30de, 0x10d,
- 0x30df, 0x10d, 0x30e0, 0x10d, 0x30e1, 0x10d, 0x30e2, 0x10d,
- 0x30e4, 0x10d, 0x30e6, 0x10d, 0x30e8, 0x10d, 0x30e9, 0x10d,
- 0x30ea, 0x10d, 0x30eb, 0x10d, 0x30ec, 0x10d, 0x30ed, 0x10d,
- 0x30ef, 0x10d, 0x30f3, 0x10d, 0x3099, 0x10d, 0x309a, 0x10d,
- 0x3164, 0x10d, 0x3131, 0x10d, 0x3132, 0x10d, 0x3133, 0x10d,
- 0x3134, 0x10d, 0x3135, 0x10d, 0x3136, 0x10d, 0x3137, 0x10d,
- 0x3138, 0x10d, 0x3139, 0x10d, 0x313a, 0x10d, 0x313b, 0x10d,
- 0x313c, 0x10d, 0x313d, 0x10d, 0x313e, 0x10d, 0x313f, 0x10d,
- 0x3140, 0x10d, 0x3141, 0x10d, 0x3142, 0x10d, 0x3143, 0x10d,
- 0x3144, 0x10d, 0x3145, 0x10d, 0x3146, 0x10d, 0x3147, 0x10d,
- 0x3148, 0x10d, 0x3149, 0x10d, 0x314a, 0x10d, 0x314b, 0x10d,
- 0x314c, 0x10d, 0x314d, 0x10d, 0x314e, 0x10d, 0x314f, 0x10d,
- 0x3150, 0x10d, 0x3151, 0x10d, 0x3152, 0x10d, 0x3153, 0x10d,
- 0x3154, 0x10d, 0x3155, 0x10d, 0x3156, 0x10d, 0x3157, 0x10d,
- 0x3158, 0x10d, 0x3159, 0x10d, 0x315a, 0x10d, 0x315b, 0x10d,
- 0x315c, 0x10d, 0x315d, 0x10d, 0x315e, 0x10d, 0x315f, 0x10d,
- 0x3160, 0x10d, 0x3161, 0x10d, 0x3162, 0x10d, 0x3163, 0x10c,
- 0xa2, 0x10c, 0xa3, 0x10c, 0xac, 0x10c, 0xaf, 0x10c,
- 0xa6, 0x10c, 0xa5, 0x10c, 0x20a9, 0x10d, 0x2502, 0x10d,
- 0x2190, 0x10d, 0x2191, 0x10d, 0x2192, 0x10d, 0x2193, 0x10d,
- 0x25a0, 0x10d, 0x25cb, 0x401, 0xd804, 0xdc99, 0xd804, 0xdcba,
- 0x401, 0xd804, 0xdc9b, 0xd804, 0xdcba, 0x401, 0xd804, 0xdca5,
- 0xd804, 0xdcba, 0x401, 0xd804, 0xdd31, 0xd804, 0xdd27, 0x401,
- 0xd804, 0xdd32, 0xd804, 0xdd27, 0x401, 0xd804, 0xdf47, 0xd804,
- 0xdf3e, 0x401, 0xd804, 0xdf47, 0xd804, 0xdf57, 0x401, 0xd805,
- 0xdcb9, 0xd805, 0xdcba, 0x401, 0xd805, 0xdcb9, 0xd805, 0xdcb0,
- 0x401, 0xd805, 0xdcb9, 0xd805, 0xdcbd, 0x401, 0xd805, 0xddb8,
- 0xd805, 0xddaf, 0x401, 0xd805, 0xddb9, 0xd805, 0xddaf, 0x401,
- 0xd806, 0xdd35, 0xd806, 0xdd30, 0x401, 0xd834, 0xdd57, 0xd834,
- 0xdd65, 0x401, 0xd834, 0xdd58, 0xd834, 0xdd65, 0x401, 0xd834,
- 0xdd5f, 0xd834, 0xdd6e, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd6f,
- 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd70, 0x401, 0xd834, 0xdd5f,
- 0xd834, 0xdd71, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd72, 0x401,
- 0xd834, 0xddb9, 0xd834, 0xdd65, 0x401, 0xd834, 0xddba, 0xd834,
- 0xdd65, 0x401, 0xd834, 0xddbb, 0xd834, 0xdd6e, 0x401, 0xd834,
- 0xddbc, 0xd834, 0xdd6e, 0x401, 0xd834, 0xddbb, 0xd834, 0xdd6f,
- 0x401, 0xd834, 0xddbc, 0xd834, 0xdd6f, 0x102, 0x41, 0x102,
- 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45, 0x102,
- 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102,
- 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102,
- 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102,
- 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102,
- 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102,
- 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45, 0x102,
- 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102,
- 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x43, 0x102,
- 0x44, 0x102, 0x47, 0x102, 0x4a, 0x102, 0x4b, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x66, 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102,
+ 0x109, 0x44a, 0x109, 0x44c, 0x109, 0xa76f, 0x109, 0x43,
+ 0x109, 0x46, 0x109, 0x51, 0x109, 0x126, 0x109, 0x153,
+ 0x109, 0xa727, 0x109, 0xab37, 0x109, 0x26b, 0x109, 0xab52,
+ 0x109, 0x28d, 0x101, 0x8c48, 0x101, 0x66f4, 0x101, 0x8eca,
+ 0x101, 0x8cc8, 0x101, 0x6ed1, 0x101, 0x4e32, 0x101, 0x53e5,
+ 0x101, 0x9f9c, 0x101, 0x9f9c, 0x101, 0x5951, 0x101, 0x91d1,
+ 0x101, 0x5587, 0x101, 0x5948, 0x101, 0x61f6, 0x101, 0x7669,
+ 0x101, 0x7f85, 0x101, 0x863f, 0x101, 0x87ba, 0x101, 0x88f8,
+ 0x101, 0x908f, 0x101, 0x6a02, 0x101, 0x6d1b, 0x101, 0x70d9,
+ 0x101, 0x73de, 0x101, 0x843d, 0x101, 0x916a, 0x101, 0x99f1,
+ 0x101, 0x4e82, 0x101, 0x5375, 0x101, 0x6b04, 0x101, 0x721b,
+ 0x101, 0x862d, 0x101, 0x9e1e, 0x101, 0x5d50, 0x101, 0x6feb,
+ 0x101, 0x85cd, 0x101, 0x8964, 0x101, 0x62c9, 0x101, 0x81d8,
+ 0x101, 0x881f, 0x101, 0x5eca, 0x101, 0x6717, 0x101, 0x6d6a,
+ 0x101, 0x72fc, 0x101, 0x90ce, 0x101, 0x4f86, 0x101, 0x51b7,
+ 0x101, 0x52de, 0x101, 0x64c4, 0x101, 0x6ad3, 0x101, 0x7210,
+ 0x101, 0x76e7, 0x101, 0x8001, 0x101, 0x8606, 0x101, 0x865c,
+ 0x101, 0x8def, 0x101, 0x9732, 0x101, 0x9b6f, 0x101, 0x9dfa,
+ 0x101, 0x788c, 0x101, 0x797f, 0x101, 0x7da0, 0x101, 0x83c9,
+ 0x101, 0x9304, 0x101, 0x9e7f, 0x101, 0x8ad6, 0x101, 0x58df,
+ 0x101, 0x5f04, 0x101, 0x7c60, 0x101, 0x807e, 0x101, 0x7262,
+ 0x101, 0x78ca, 0x101, 0x8cc2, 0x101, 0x96f7, 0x101, 0x58d8,
+ 0x101, 0x5c62, 0x101, 0x6a13, 0x101, 0x6dda, 0x101, 0x6f0f,
+ 0x101, 0x7d2f, 0x101, 0x7e37, 0x101, 0x964b, 0x101, 0x52d2,
+ 0x101, 0x808b, 0x101, 0x51dc, 0x101, 0x51cc, 0x101, 0x7a1c,
+ 0x101, 0x7dbe, 0x101, 0x83f1, 0x101, 0x9675, 0x101, 0x8b80,
+ 0x101, 0x62cf, 0x101, 0x6a02, 0x101, 0x8afe, 0x101, 0x4e39,
+ 0x101, 0x5be7, 0x101, 0x6012, 0x101, 0x7387, 0x101, 0x7570,
+ 0x101, 0x5317, 0x101, 0x78fb, 0x101, 0x4fbf, 0x101, 0x5fa9,
+ 0x101, 0x4e0d, 0x101, 0x6ccc, 0x101, 0x6578, 0x101, 0x7d22,
+ 0x101, 0x53c3, 0x101, 0x585e, 0x101, 0x7701, 0x101, 0x8449,
+ 0x101, 0x8aaa, 0x101, 0x6bba, 0x101, 0x8fb0, 0x101, 0x6c88,
+ 0x101, 0x62fe, 0x101, 0x82e5, 0x101, 0x63a0, 0x101, 0x7565,
+ 0x101, 0x4eae, 0x101, 0x5169, 0x101, 0x51c9, 0x101, 0x6881,
+ 0x101, 0x7ce7, 0x101, 0x826f, 0x101, 0x8ad2, 0x101, 0x91cf,
+ 0x101, 0x52f5, 0x101, 0x5442, 0x101, 0x5973, 0x101, 0x5eec,
+ 0x101, 0x65c5, 0x101, 0x6ffe, 0x101, 0x792a, 0x101, 0x95ad,
+ 0x101, 0x9a6a, 0x101, 0x9e97, 0x101, 0x9ece, 0x101, 0x529b,
+ 0x101, 0x66c6, 0x101, 0x6b77, 0x101, 0x8f62, 0x101, 0x5e74,
+ 0x101, 0x6190, 0x101, 0x6200, 0x101, 0x649a, 0x101, 0x6f23,
+ 0x101, 0x7149, 0x101, 0x7489, 0x101, 0x79ca, 0x101, 0x7df4,
+ 0x101, 0x806f, 0x101, 0x8f26, 0x101, 0x84ee, 0x101, 0x9023,
+ 0x101, 0x934a, 0x101, 0x5217, 0x101, 0x52a3, 0x101, 0x54bd,
+ 0x101, 0x70c8, 0x101, 0x88c2, 0x101, 0x8aaa, 0x101, 0x5ec9,
+ 0x101, 0x5ff5, 0x101, 0x637b, 0x101, 0x6bae, 0x101, 0x7c3e,
+ 0x101, 0x7375, 0x101, 0x4ee4, 0x101, 0x56f9, 0x101, 0x5be7,
+ 0x101, 0x5dba, 0x101, 0x601c, 0x101, 0x73b2, 0x101, 0x7469,
+ 0x101, 0x7f9a, 0x101, 0x8046, 0x101, 0x9234, 0x101, 0x96f6,
+ 0x101, 0x9748, 0x101, 0x9818, 0x101, 0x4f8b, 0x101, 0x79ae,
+ 0x101, 0x91b4, 0x101, 0x96b8, 0x101, 0x60e1, 0x101, 0x4e86,
+ 0x101, 0x50da, 0x101, 0x5bee, 0x101, 0x5c3f, 0x101, 0x6599,
+ 0x101, 0x6a02, 0x101, 0x71ce, 0x101, 0x7642, 0x101, 0x84fc,
+ 0x101, 0x907c, 0x101, 0x9f8d, 0x101, 0x6688, 0x101, 0x962e,
+ 0x101, 0x5289, 0x101, 0x677b, 0x101, 0x67f3, 0x101, 0x6d41,
+ 0x101, 0x6e9c, 0x101, 0x7409, 0x101, 0x7559, 0x101, 0x786b,
+ 0x101, 0x7d10, 0x101, 0x985e, 0x101, 0x516d, 0x101, 0x622e,
+ 0x101, 0x9678, 0x101, 0x502b, 0x101, 0x5d19, 0x101, 0x6dea,
+ 0x101, 0x8f2a, 0x101, 0x5f8b, 0x101, 0x6144, 0x101, 0x6817,
+ 0x101, 0x7387, 0x101, 0x9686, 0x101, 0x5229, 0x101, 0x540f,
+ 0x101, 0x5c65, 0x101, 0x6613, 0x101, 0x674e, 0x101, 0x68a8,
+ 0x101, 0x6ce5, 0x101, 0x7406, 0x101, 0x75e2, 0x101, 0x7f79,
+ 0x101, 0x88cf, 0x101, 0x88e1, 0x101, 0x91cc, 0x101, 0x96e2,
+ 0x101, 0x533f, 0x101, 0x6eba, 0x101, 0x541d, 0x101, 0x71d0,
+ 0x101, 0x7498, 0x101, 0x85fa, 0x101, 0x96a3, 0x101, 0x9c57,
+ 0x101, 0x9e9f, 0x101, 0x6797, 0x101, 0x6dcb, 0x101, 0x81e8,
+ 0x101, 0x7acb, 0x101, 0x7b20, 0x101, 0x7c92, 0x101, 0x72c0,
+ 0x101, 0x7099, 0x101, 0x8b58, 0x101, 0x4ec0, 0x101, 0x8336,
+ 0x101, 0x523a, 0x101, 0x5207, 0x101, 0x5ea6, 0x101, 0x62d3,
+ 0x101, 0x7cd6, 0x101, 0x5b85, 0x101, 0x6d1e, 0x101, 0x66b4,
+ 0x101, 0x8f3b, 0x101, 0x884c, 0x101, 0x964d, 0x101, 0x898b,
+ 0x101, 0x5ed3, 0x101, 0x5140, 0x101, 0x55c0, 0x101, 0x585a,
+ 0x101, 0x6674, 0x101, 0x51de, 0x101, 0x732a, 0x101, 0x76ca,
+ 0x101, 0x793c, 0x101, 0x795e, 0x101, 0x7965, 0x101, 0x798f,
+ 0x101, 0x9756, 0x101, 0x7cbe, 0x101, 0x7fbd, 0x101, 0x8612,
+ 0x101, 0x8af8, 0x101, 0x9038, 0x101, 0x90fd, 0x101, 0x98ef,
+ 0x101, 0x98fc, 0x101, 0x9928, 0x101, 0x9db4, 0x101, 0x90de,
+ 0x101, 0x96b7, 0x101, 0x4fae, 0x101, 0x50e7, 0x101, 0x514d,
+ 0x101, 0x52c9, 0x101, 0x52e4, 0x101, 0x5351, 0x101, 0x559d,
+ 0x101, 0x5606, 0x101, 0x5668, 0x101, 0x5840, 0x101, 0x58a8,
+ 0x101, 0x5c64, 0x101, 0x5c6e, 0x101, 0x6094, 0x101, 0x6168,
+ 0x101, 0x618e, 0x101, 0x61f2, 0x101, 0x654f, 0x101, 0x65e2,
+ 0x101, 0x6691, 0x101, 0x6885, 0x101, 0x6d77, 0x101, 0x6e1a,
+ 0x101, 0x6f22, 0x101, 0x716e, 0x101, 0x722b, 0x101, 0x7422,
+ 0x101, 0x7891, 0x101, 0x793e, 0x101, 0x7949, 0x101, 0x7948,
+ 0x101, 0x7950, 0x101, 0x7956, 0x101, 0x795d, 0x101, 0x798d,
+ 0x101, 0x798e, 0x101, 0x7a40, 0x101, 0x7a81, 0x101, 0x7bc0,
+ 0x101, 0x7df4, 0x101, 0x7e09, 0x101, 0x7e41, 0x101, 0x7f72,
+ 0x101, 0x8005, 0x101, 0x81ed, 0x101, 0x8279, 0x101, 0x8279,
+ 0x101, 0x8457, 0x101, 0x8910, 0x101, 0x8996, 0x101, 0x8b01,
+ 0x101, 0x8b39, 0x101, 0x8cd3, 0x101, 0x8d08, 0x101, 0x8fb6,
+ 0x101, 0x9038, 0x101, 0x96e3, 0x101, 0x97ff, 0x101, 0x983b,
+ 0x101, 0x6075, 0x201, 0xd850, 0xdeee, 0x101, 0x8218, 0x101,
+ 0x4e26, 0x101, 0x51b5, 0x101, 0x5168, 0x101, 0x4f80, 0x101,
+ 0x5145, 0x101, 0x5180, 0x101, 0x52c7, 0x101, 0x52fa, 0x101,
+ 0x559d, 0x101, 0x5555, 0x101, 0x5599, 0x101, 0x55e2, 0x101,
+ 0x585a, 0x101, 0x58b3, 0x101, 0x5944, 0x101, 0x5954, 0x101,
+ 0x5a62, 0x101, 0x5b28, 0x101, 0x5ed2, 0x101, 0x5ed9, 0x101,
+ 0x5f69, 0x101, 0x5fad, 0x101, 0x60d8, 0x101, 0x614e, 0x101,
+ 0x6108, 0x101, 0x618e, 0x101, 0x6160, 0x101, 0x61f2, 0x101,
+ 0x6234, 0x101, 0x63c4, 0x101, 0x641c, 0x101, 0x6452, 0x101,
+ 0x6556, 0x101, 0x6674, 0x101, 0x6717, 0x101, 0x671b, 0x101,
+ 0x6756, 0x101, 0x6b79, 0x101, 0x6bba, 0x101, 0x6d41, 0x101,
+ 0x6edb, 0x101, 0x6ecb, 0x101, 0x6f22, 0x101, 0x701e, 0x101,
+ 0x716e, 0x101, 0x77a7, 0x101, 0x7235, 0x101, 0x72af, 0x101,
+ 0x732a, 0x101, 0x7471, 0x101, 0x7506, 0x101, 0x753b, 0x101,
+ 0x761d, 0x101, 0x761f, 0x101, 0x76ca, 0x101, 0x76db, 0x101,
+ 0x76f4, 0x101, 0x774a, 0x101, 0x7740, 0x101, 0x78cc, 0x101,
+ 0x7ab1, 0x101, 0x7bc0, 0x101, 0x7c7b, 0x101, 0x7d5b, 0x101,
+ 0x7df4, 0x101, 0x7f3e, 0x101, 0x8005, 0x101, 0x8352, 0x101,
+ 0x83ef, 0x101, 0x8779, 0x101, 0x8941, 0x101, 0x8986, 0x101,
+ 0x8996, 0x101, 0x8abf, 0x101, 0x8af8, 0x101, 0x8acb, 0x101,
+ 0x8b01, 0x101, 0x8afe, 0x101, 0x8aed, 0x101, 0x8b39, 0x101,
+ 0x8b8a, 0x101, 0x8d08, 0x101, 0x8f38, 0x101, 0x9072, 0x101,
+ 0x9199, 0x101, 0x9276, 0x101, 0x967c, 0x101, 0x96e3, 0x101,
+ 0x9756, 0x101, 0x97db, 0x101, 0x97ff, 0x101, 0x980b, 0x101,
+ 0x983b, 0x101, 0x9b12, 0x101, 0x9f9c, 0x201, 0xd84a, 0xdc4a,
+ 0x201, 0xd84a, 0xdc44, 0x201, 0xd84c, 0xdfd5, 0x101, 0x3b9d,
+ 0x101, 0x4018, 0x101, 0x4039, 0x201, 0xd854, 0xde49, 0x201,
+ 0xd857, 0xdcd0, 0x201, 0xd85f, 0xded3, 0x101, 0x9f43, 0x101,
+ 0x9f8e, 0x210, 0x66, 0x66, 0x210, 0x66, 0x69, 0x210,
+ 0x66, 0x6c, 0x310, 0x66, 0x66, 0x69, 0x310, 0x66,
+ 0x66, 0x6c, 0x210, 0x17f, 0x74, 0x210, 0x73, 0x74,
+ 0x210, 0x574, 0x576, 0x210, 0x574, 0x565, 0x210, 0x574,
+ 0x56b, 0x210, 0x57e, 0x576, 0x210, 0x574, 0x56d, 0x201,
+ 0x5d9, 0x5b4, 0x201, 0x5f2, 0x5b7, 0x102, 0x5e2, 0x102,
+ 0x5d0, 0x102, 0x5d3, 0x102, 0x5d4, 0x102, 0x5db, 0x102,
+ 0x5dc, 0x102, 0x5dd, 0x102, 0x5e8, 0x102, 0x5ea, 0x102,
+ 0x2b, 0x201, 0x5e9, 0x5c1, 0x201, 0x5e9, 0x5c2, 0x201,
+ 0xfb49, 0x5c1, 0x201, 0xfb49, 0x5c2, 0x201, 0x5d0, 0x5b7,
+ 0x201, 0x5d0, 0x5b8, 0x201, 0x5d0, 0x5bc, 0x201, 0x5d1,
+ 0x5bc, 0x201, 0x5d2, 0x5bc, 0x201, 0x5d3, 0x5bc, 0x201,
+ 0x5d4, 0x5bc, 0x201, 0x5d5, 0x5bc, 0x201, 0x5d6, 0x5bc,
+ 0x201, 0x5d8, 0x5bc, 0x201, 0x5d9, 0x5bc, 0x201, 0x5da,
+ 0x5bc, 0x201, 0x5db, 0x5bc, 0x201, 0x5dc, 0x5bc, 0x201,
+ 0x5de, 0x5bc, 0x201, 0x5e0, 0x5bc, 0x201, 0x5e1, 0x5bc,
+ 0x201, 0x5e3, 0x5bc, 0x201, 0x5e4, 0x5bc, 0x201, 0x5e6,
+ 0x5bc, 0x201, 0x5e7, 0x5bc, 0x201, 0x5e8, 0x5bc, 0x201,
+ 0x5e9, 0x5bc, 0x201, 0x5ea, 0x5bc, 0x201, 0x5d5, 0x5b9,
+ 0x201, 0x5d1, 0x5bf, 0x201, 0x5db, 0x5bf, 0x201, 0x5e4,
+ 0x5bf, 0x210, 0x5d0, 0x5dc, 0x107, 0x671, 0x106, 0x671,
+ 0x107, 0x67b, 0x106, 0x67b, 0x104, 0x67b, 0x105, 0x67b,
+ 0x107, 0x67e, 0x106, 0x67e, 0x104, 0x67e, 0x105, 0x67e,
+ 0x107, 0x680, 0x106, 0x680, 0x104, 0x680, 0x105, 0x680,
+ 0x107, 0x67a, 0x106, 0x67a, 0x104, 0x67a, 0x105, 0x67a,
+ 0x107, 0x67f, 0x106, 0x67f, 0x104, 0x67f, 0x105, 0x67f,
+ 0x107, 0x679, 0x106, 0x679, 0x104, 0x679, 0x105, 0x679,
+ 0x107, 0x6a4, 0x106, 0x6a4, 0x104, 0x6a4, 0x105, 0x6a4,
+ 0x107, 0x6a6, 0x106, 0x6a6, 0x104, 0x6a6, 0x105, 0x6a6,
+ 0x107, 0x684, 0x106, 0x684, 0x104, 0x684, 0x105, 0x684,
+ 0x107, 0x683, 0x106, 0x683, 0x104, 0x683, 0x105, 0x683,
+ 0x107, 0x686, 0x106, 0x686, 0x104, 0x686, 0x105, 0x686,
+ 0x107, 0x687, 0x106, 0x687, 0x104, 0x687, 0x105, 0x687,
+ 0x107, 0x68d, 0x106, 0x68d, 0x107, 0x68c, 0x106, 0x68c,
+ 0x107, 0x68e, 0x106, 0x68e, 0x107, 0x688, 0x106, 0x688,
+ 0x107, 0x698, 0x106, 0x698, 0x107, 0x691, 0x106, 0x691,
+ 0x107, 0x6a9, 0x106, 0x6a9, 0x104, 0x6a9, 0x105, 0x6a9,
+ 0x107, 0x6af, 0x106, 0x6af, 0x104, 0x6af, 0x105, 0x6af,
+ 0x107, 0x6b3, 0x106, 0x6b3, 0x104, 0x6b3, 0x105, 0x6b3,
+ 0x107, 0x6b1, 0x106, 0x6b1, 0x104, 0x6b1, 0x105, 0x6b1,
+ 0x107, 0x6ba, 0x106, 0x6ba, 0x107, 0x6bb, 0x106, 0x6bb,
+ 0x104, 0x6bb, 0x105, 0x6bb, 0x107, 0x6c0, 0x106, 0x6c0,
+ 0x107, 0x6c1, 0x106, 0x6c1, 0x104, 0x6c1, 0x105, 0x6c1,
+ 0x107, 0x6be, 0x106, 0x6be, 0x104, 0x6be, 0x105, 0x6be,
+ 0x107, 0x6d2, 0x106, 0x6d2, 0x107, 0x6d3, 0x106, 0x6d3,
+ 0x107, 0x6ad, 0x106, 0x6ad, 0x104, 0x6ad, 0x105, 0x6ad,
+ 0x107, 0x6c7, 0x106, 0x6c7, 0x107, 0x6c6, 0x106, 0x6c6,
+ 0x107, 0x6c8, 0x106, 0x6c8, 0x107, 0x677, 0x107, 0x6cb,
+ 0x106, 0x6cb, 0x107, 0x6c5, 0x106, 0x6c5, 0x107, 0x6c9,
+ 0x106, 0x6c9, 0x107, 0x6d0, 0x106, 0x6d0, 0x104, 0x6d0,
+ 0x105, 0x6d0, 0x104, 0x649, 0x105, 0x649, 0x207, 0x626,
+ 0x627, 0x206, 0x626, 0x627, 0x207, 0x626, 0x6d5, 0x206,
+ 0x626, 0x6d5, 0x207, 0x626, 0x648, 0x206, 0x626, 0x648,
+ 0x207, 0x626, 0x6c7, 0x206, 0x626, 0x6c7, 0x207, 0x626,
+ 0x6c6, 0x206, 0x626, 0x6c6, 0x207, 0x626, 0x6c8, 0x206,
+ 0x626, 0x6c8, 0x207, 0x626, 0x6d0, 0x206, 0x626, 0x6d0,
+ 0x204, 0x626, 0x6d0, 0x207, 0x626, 0x649, 0x206, 0x626,
+ 0x649, 0x204, 0x626, 0x649, 0x107, 0x6cc, 0x106, 0x6cc,
+ 0x104, 0x6cc, 0x105, 0x6cc, 0x207, 0x626, 0x62c, 0x207,
+ 0x626, 0x62d, 0x207, 0x626, 0x645, 0x207, 0x626, 0x649,
+ 0x207, 0x626, 0x64a, 0x207, 0x628, 0x62c, 0x207, 0x628,
+ 0x62d, 0x207, 0x628, 0x62e, 0x207, 0x628, 0x645, 0x207,
+ 0x628, 0x649, 0x207, 0x628, 0x64a, 0x207, 0x62a, 0x62c,
+ 0x207, 0x62a, 0x62d, 0x207, 0x62a, 0x62e, 0x207, 0x62a,
+ 0x645, 0x207, 0x62a, 0x649, 0x207, 0x62a, 0x64a, 0x207,
+ 0x62b, 0x62c, 0x207, 0x62b, 0x645, 0x207, 0x62b, 0x649,
+ 0x207, 0x62b, 0x64a, 0x207, 0x62c, 0x62d, 0x207, 0x62c,
+ 0x645, 0x207, 0x62d, 0x62c, 0x207, 0x62d, 0x645, 0x207,
+ 0x62e, 0x62c, 0x207, 0x62e, 0x62d, 0x207, 0x62e, 0x645,
+ 0x207, 0x633, 0x62c, 0x207, 0x633, 0x62d, 0x207, 0x633,
+ 0x62e, 0x207, 0x633, 0x645, 0x207, 0x635, 0x62d, 0x207,
+ 0x635, 0x645, 0x207, 0x636, 0x62c, 0x207, 0x636, 0x62d,
+ 0x207, 0x636, 0x62e, 0x207, 0x636, 0x645, 0x207, 0x637,
+ 0x62d, 0x207, 0x637, 0x645, 0x207, 0x638, 0x645, 0x207,
+ 0x639, 0x62c, 0x207, 0x639, 0x645, 0x207, 0x63a, 0x62c,
+ 0x207, 0x63a, 0x645, 0x207, 0x641, 0x62c, 0x207, 0x641,
+ 0x62d, 0x207, 0x641, 0x62e, 0x207, 0x641, 0x645, 0x207,
+ 0x641, 0x649, 0x207, 0x641, 0x64a, 0x207, 0x642, 0x62d,
+ 0x207, 0x642, 0x645, 0x207, 0x642, 0x649, 0x207, 0x642,
+ 0x64a, 0x207, 0x643, 0x627, 0x207, 0x643, 0x62c, 0x207,
+ 0x643, 0x62d, 0x207, 0x643, 0x62e, 0x207, 0x643, 0x644,
+ 0x207, 0x643, 0x645, 0x207, 0x643, 0x649, 0x207, 0x643,
+ 0x64a, 0x207, 0x644, 0x62c, 0x207, 0x644, 0x62d, 0x207,
+ 0x644, 0x62e, 0x207, 0x644, 0x645, 0x207, 0x644, 0x649,
+ 0x207, 0x644, 0x64a, 0x207, 0x645, 0x62c, 0x207, 0x645,
+ 0x62d, 0x207, 0x645, 0x62e, 0x207, 0x645, 0x645, 0x207,
+ 0x645, 0x649, 0x207, 0x645, 0x64a, 0x207, 0x646, 0x62c,
+ 0x207, 0x646, 0x62d, 0x207, 0x646, 0x62e, 0x207, 0x646,
+ 0x645, 0x207, 0x646, 0x649, 0x207, 0x646, 0x64a, 0x207,
+ 0x647, 0x62c, 0x207, 0x647, 0x645, 0x207, 0x647, 0x649,
+ 0x207, 0x647, 0x64a, 0x207, 0x64a, 0x62c, 0x207, 0x64a,
+ 0x62d, 0x207, 0x64a, 0x62e, 0x207, 0x64a, 0x645, 0x207,
+ 0x64a, 0x649, 0x207, 0x64a, 0x64a, 0x207, 0x630, 0x670,
+ 0x207, 0x631, 0x670, 0x207, 0x649, 0x670, 0x307, 0x20,
+ 0x64c, 0x651, 0x307, 0x20, 0x64d, 0x651, 0x307, 0x20,
+ 0x64e, 0x651, 0x307, 0x20, 0x64f, 0x651, 0x307, 0x20,
+ 0x650, 0x651, 0x307, 0x20, 0x651, 0x670, 0x206, 0x626,
+ 0x631, 0x206, 0x626, 0x632, 0x206, 0x626, 0x645, 0x206,
+ 0x626, 0x646, 0x206, 0x626, 0x649, 0x206, 0x626, 0x64a,
+ 0x206, 0x628, 0x631, 0x206, 0x628, 0x632, 0x206, 0x628,
+ 0x645, 0x206, 0x628, 0x646, 0x206, 0x628, 0x649, 0x206,
+ 0x628, 0x64a, 0x206, 0x62a, 0x631, 0x206, 0x62a, 0x632,
+ 0x206, 0x62a, 0x645, 0x206, 0x62a, 0x646, 0x206, 0x62a,
+ 0x649, 0x206, 0x62a, 0x64a, 0x206, 0x62b, 0x631, 0x206,
+ 0x62b, 0x632, 0x206, 0x62b, 0x645, 0x206, 0x62b, 0x646,
+ 0x206, 0x62b, 0x649, 0x206, 0x62b, 0x64a, 0x206, 0x641,
+ 0x649, 0x206, 0x641, 0x64a, 0x206, 0x642, 0x649, 0x206,
+ 0x642, 0x64a, 0x206, 0x643, 0x627, 0x206, 0x643, 0x644,
+ 0x206, 0x643, 0x645, 0x206, 0x643, 0x649, 0x206, 0x643,
+ 0x64a, 0x206, 0x644, 0x645, 0x206, 0x644, 0x649, 0x206,
+ 0x644, 0x64a, 0x206, 0x645, 0x627, 0x206, 0x645, 0x645,
+ 0x206, 0x646, 0x631, 0x206, 0x646, 0x632, 0x206, 0x646,
+ 0x645, 0x206, 0x646, 0x646, 0x206, 0x646, 0x649, 0x206,
+ 0x646, 0x64a, 0x206, 0x649, 0x670, 0x206, 0x64a, 0x631,
+ 0x206, 0x64a, 0x632, 0x206, 0x64a, 0x645, 0x206, 0x64a,
+ 0x646, 0x206, 0x64a, 0x649, 0x206, 0x64a, 0x64a, 0x204,
+ 0x626, 0x62c, 0x204, 0x626, 0x62d, 0x204, 0x626, 0x62e,
+ 0x204, 0x626, 0x645, 0x204, 0x626, 0x647, 0x204, 0x628,
+ 0x62c, 0x204, 0x628, 0x62d, 0x204, 0x628, 0x62e, 0x204,
+ 0x628, 0x645, 0x204, 0x628, 0x647, 0x204, 0x62a, 0x62c,
+ 0x204, 0x62a, 0x62d, 0x204, 0x62a, 0x62e, 0x204, 0x62a,
+ 0x645, 0x204, 0x62a, 0x647, 0x204, 0x62b, 0x645, 0x204,
+ 0x62c, 0x62d, 0x204, 0x62c, 0x645, 0x204, 0x62d, 0x62c,
+ 0x204, 0x62d, 0x645, 0x204, 0x62e, 0x62c, 0x204, 0x62e,
+ 0x645, 0x204, 0x633, 0x62c, 0x204, 0x633, 0x62d, 0x204,
+ 0x633, 0x62e, 0x204, 0x633, 0x645, 0x204, 0x635, 0x62d,
+ 0x204, 0x635, 0x62e, 0x204, 0x635, 0x645, 0x204, 0x636,
+ 0x62c, 0x204, 0x636, 0x62d, 0x204, 0x636, 0x62e, 0x204,
+ 0x636, 0x645, 0x204, 0x637, 0x62d, 0x204, 0x638, 0x645,
+ 0x204, 0x639, 0x62c, 0x204, 0x639, 0x645, 0x204, 0x63a,
+ 0x62c, 0x204, 0x63a, 0x645, 0x204, 0x641, 0x62c, 0x204,
+ 0x641, 0x62d, 0x204, 0x641, 0x62e, 0x204, 0x641, 0x645,
+ 0x204, 0x642, 0x62d, 0x204, 0x642, 0x645, 0x204, 0x643,
+ 0x62c, 0x204, 0x643, 0x62d, 0x204, 0x643, 0x62e, 0x204,
+ 0x643, 0x644, 0x204, 0x643, 0x645, 0x204, 0x644, 0x62c,
+ 0x204, 0x644, 0x62d, 0x204, 0x644, 0x62e, 0x204, 0x644,
+ 0x645, 0x204, 0x644, 0x647, 0x204, 0x645, 0x62c, 0x204,
+ 0x645, 0x62d, 0x204, 0x645, 0x62e, 0x204, 0x645, 0x645,
+ 0x204, 0x646, 0x62c, 0x204, 0x646, 0x62d, 0x204, 0x646,
+ 0x62e, 0x204, 0x646, 0x645, 0x204, 0x646, 0x647, 0x204,
+ 0x647, 0x62c, 0x204, 0x647, 0x645, 0x204, 0x647, 0x670,
+ 0x204, 0x64a, 0x62c, 0x204, 0x64a, 0x62d, 0x204, 0x64a,
+ 0x62e, 0x204, 0x64a, 0x645, 0x204, 0x64a, 0x647, 0x205,
+ 0x626, 0x645, 0x205, 0x626, 0x647, 0x205, 0x628, 0x645,
+ 0x205, 0x628, 0x647, 0x205, 0x62a, 0x645, 0x205, 0x62a,
+ 0x647, 0x205, 0x62b, 0x645, 0x205, 0x62b, 0x647, 0x205,
+ 0x633, 0x645, 0x205, 0x633, 0x647, 0x205, 0x634, 0x645,
+ 0x205, 0x634, 0x647, 0x205, 0x643, 0x644, 0x205, 0x643,
+ 0x645, 0x205, 0x644, 0x645, 0x205, 0x646, 0x645, 0x205,
+ 0x646, 0x647, 0x205, 0x64a, 0x645, 0x205, 0x64a, 0x647,
+ 0x305, 0x640, 0x64e, 0x651, 0x305, 0x640, 0x64f, 0x651,
+ 0x305, 0x640, 0x650, 0x651, 0x207, 0x637, 0x649, 0x207,
+ 0x637, 0x64a, 0x207, 0x639, 0x649, 0x207, 0x639, 0x64a,
+ 0x207, 0x63a, 0x649, 0x207, 0x63a, 0x64a, 0x207, 0x633,
+ 0x649, 0x207, 0x633, 0x64a, 0x207, 0x634, 0x649, 0x207,
+ 0x634, 0x64a, 0x207, 0x62d, 0x649, 0x207, 0x62d, 0x64a,
+ 0x207, 0x62c, 0x649, 0x207, 0x62c, 0x64a, 0x207, 0x62e,
+ 0x649, 0x207, 0x62e, 0x64a, 0x207, 0x635, 0x649, 0x207,
+ 0x635, 0x64a, 0x207, 0x636, 0x649, 0x207, 0x636, 0x64a,
+ 0x207, 0x634, 0x62c, 0x207, 0x634, 0x62d, 0x207, 0x634,
+ 0x62e, 0x207, 0x634, 0x645, 0x207, 0x634, 0x631, 0x207,
+ 0x633, 0x631, 0x207, 0x635, 0x631, 0x207, 0x636, 0x631,
+ 0x206, 0x637, 0x649, 0x206, 0x637, 0x64a, 0x206, 0x639,
+ 0x649, 0x206, 0x639, 0x64a, 0x206, 0x63a, 0x649, 0x206,
+ 0x63a, 0x64a, 0x206, 0x633, 0x649, 0x206, 0x633, 0x64a,
+ 0x206, 0x634, 0x649, 0x206, 0x634, 0x64a, 0x206, 0x62d,
+ 0x649, 0x206, 0x62d, 0x64a, 0x206, 0x62c, 0x649, 0x206,
+ 0x62c, 0x64a, 0x206, 0x62e, 0x649, 0x206, 0x62e, 0x64a,
+ 0x206, 0x635, 0x649, 0x206, 0x635, 0x64a, 0x206, 0x636,
+ 0x649, 0x206, 0x636, 0x64a, 0x206, 0x634, 0x62c, 0x206,
+ 0x634, 0x62d, 0x206, 0x634, 0x62e, 0x206, 0x634, 0x645,
+ 0x206, 0x634, 0x631, 0x206, 0x633, 0x631, 0x206, 0x635,
+ 0x631, 0x206, 0x636, 0x631, 0x204, 0x634, 0x62c, 0x204,
+ 0x634, 0x62d, 0x204, 0x634, 0x62e, 0x204, 0x634, 0x645,
+ 0x204, 0x633, 0x647, 0x204, 0x634, 0x647, 0x204, 0x637,
+ 0x645, 0x205, 0x633, 0x62c, 0x205, 0x633, 0x62d, 0x205,
+ 0x633, 0x62e, 0x205, 0x634, 0x62c, 0x205, 0x634, 0x62d,
+ 0x205, 0x634, 0x62e, 0x205, 0x637, 0x645, 0x205, 0x638,
+ 0x645, 0x206, 0x627, 0x64b, 0x207, 0x627, 0x64b, 0x304,
+ 0x62a, 0x62c, 0x645, 0x306, 0x62a, 0x62d, 0x62c, 0x304,
+ 0x62a, 0x62d, 0x62c, 0x304, 0x62a, 0x62d, 0x645, 0x304,
+ 0x62a, 0x62e, 0x645, 0x304, 0x62a, 0x645, 0x62c, 0x304,
+ 0x62a, 0x645, 0x62d, 0x304, 0x62a, 0x645, 0x62e, 0x306,
+ 0x62c, 0x645, 0x62d, 0x304, 0x62c, 0x645, 0x62d, 0x306,
+ 0x62d, 0x645, 0x64a, 0x306, 0x62d, 0x645, 0x649, 0x304,
+ 0x633, 0x62d, 0x62c, 0x304, 0x633, 0x62c, 0x62d, 0x306,
+ 0x633, 0x62c, 0x649, 0x306, 0x633, 0x645, 0x62d, 0x304,
+ 0x633, 0x645, 0x62d, 0x304, 0x633, 0x645, 0x62c, 0x306,
+ 0x633, 0x645, 0x645, 0x304, 0x633, 0x645, 0x645, 0x306,
+ 0x635, 0x62d, 0x62d, 0x304, 0x635, 0x62d, 0x62d, 0x306,
+ 0x635, 0x645, 0x645, 0x306, 0x634, 0x62d, 0x645, 0x304,
+ 0x634, 0x62d, 0x645, 0x306, 0x634, 0x62c, 0x64a, 0x306,
+ 0x634, 0x645, 0x62e, 0x304, 0x634, 0x645, 0x62e, 0x306,
+ 0x634, 0x645, 0x645, 0x304, 0x634, 0x645, 0x645, 0x306,
+ 0x636, 0x62d, 0x649, 0x306, 0x636, 0x62e, 0x645, 0x304,
+ 0x636, 0x62e, 0x645, 0x306, 0x637, 0x645, 0x62d, 0x304,
+ 0x637, 0x645, 0x62d, 0x304, 0x637, 0x645, 0x645, 0x306,
+ 0x637, 0x645, 0x64a, 0x306, 0x639, 0x62c, 0x645, 0x306,
+ 0x639, 0x645, 0x645, 0x304, 0x639, 0x645, 0x645, 0x306,
+ 0x639, 0x645, 0x649, 0x306, 0x63a, 0x645, 0x645, 0x306,
+ 0x63a, 0x645, 0x64a, 0x306, 0x63a, 0x645, 0x649, 0x306,
+ 0x641, 0x62e, 0x645, 0x304, 0x641, 0x62e, 0x645, 0x306,
+ 0x642, 0x645, 0x62d, 0x306, 0x642, 0x645, 0x645, 0x306,
+ 0x644, 0x62d, 0x645, 0x306, 0x644, 0x62d, 0x64a, 0x306,
+ 0x644, 0x62d, 0x649, 0x304, 0x644, 0x62c, 0x62c, 0x306,
+ 0x644, 0x62c, 0x62c, 0x306, 0x644, 0x62e, 0x645, 0x304,
+ 0x644, 0x62e, 0x645, 0x306, 0x644, 0x645, 0x62d, 0x304,
+ 0x644, 0x645, 0x62d, 0x304, 0x645, 0x62d, 0x62c, 0x304,
+ 0x645, 0x62d, 0x645, 0x306, 0x645, 0x62d, 0x64a, 0x304,
+ 0x645, 0x62c, 0x62d, 0x304, 0x645, 0x62c, 0x645, 0x304,
+ 0x645, 0x62e, 0x62c, 0x304, 0x645, 0x62e, 0x645, 0x304,
+ 0x645, 0x62c, 0x62e, 0x304, 0x647, 0x645, 0x62c, 0x304,
+ 0x647, 0x645, 0x645, 0x304, 0x646, 0x62d, 0x645, 0x306,
+ 0x646, 0x62d, 0x649, 0x306, 0x646, 0x62c, 0x645, 0x304,
+ 0x646, 0x62c, 0x645, 0x306, 0x646, 0x62c, 0x649, 0x306,
+ 0x646, 0x645, 0x64a, 0x306, 0x646, 0x645, 0x649, 0x306,
+ 0x64a, 0x645, 0x645, 0x304, 0x64a, 0x645, 0x645, 0x306,
+ 0x628, 0x62e, 0x64a, 0x306, 0x62a, 0x62c, 0x64a, 0x306,
+ 0x62a, 0x62c, 0x649, 0x306, 0x62a, 0x62e, 0x64a, 0x306,
+ 0x62a, 0x62e, 0x649, 0x306, 0x62a, 0x645, 0x64a, 0x306,
+ 0x62a, 0x645, 0x649, 0x306, 0x62c, 0x645, 0x64a, 0x306,
+ 0x62c, 0x62d, 0x649, 0x306, 0x62c, 0x645, 0x649, 0x306,
+ 0x633, 0x62e, 0x649, 0x306, 0x635, 0x62d, 0x64a, 0x306,
+ 0x634, 0x62d, 0x64a, 0x306, 0x636, 0x62d, 0x64a, 0x306,
+ 0x644, 0x62c, 0x64a, 0x306, 0x644, 0x645, 0x64a, 0x306,
+ 0x64a, 0x62d, 0x64a, 0x306, 0x64a, 0x62c, 0x64a, 0x306,
+ 0x64a, 0x645, 0x64a, 0x306, 0x645, 0x645, 0x64a, 0x306,
+ 0x642, 0x645, 0x64a, 0x306, 0x646, 0x62d, 0x64a, 0x304,
+ 0x642, 0x645, 0x62d, 0x304, 0x644, 0x62d, 0x645, 0x306,
+ 0x639, 0x645, 0x64a, 0x306, 0x643, 0x645, 0x64a, 0x304,
+ 0x646, 0x62c, 0x62d, 0x306, 0x645, 0x62e, 0x64a, 0x304,
+ 0x644, 0x62c, 0x645, 0x306, 0x643, 0x645, 0x645, 0x306,
+ 0x644, 0x62c, 0x645, 0x306, 0x646, 0x62c, 0x62d, 0x306,
+ 0x62c, 0x62d, 0x64a, 0x306, 0x62d, 0x62c, 0x64a, 0x306,
+ 0x645, 0x62c, 0x64a, 0x306, 0x641, 0x645, 0x64a, 0x306,
+ 0x628, 0x62d, 0x64a, 0x304, 0x643, 0x645, 0x645, 0x304,
+ 0x639, 0x62c, 0x645, 0x304, 0x635, 0x645, 0x645, 0x306,
+ 0x633, 0x62e, 0x64a, 0x306, 0x646, 0x62c, 0x64a, 0x307,
+ 0x635, 0x644, 0x6d2, 0x307, 0x642, 0x644, 0x6d2, 0x407,
+ 0x627, 0x644, 0x644, 0x647, 0x407, 0x627, 0x643, 0x628,
+ 0x631, 0x407, 0x645, 0x62d, 0x645, 0x62f, 0x407, 0x635,
+ 0x644, 0x639, 0x645, 0x407, 0x631, 0x633, 0x648, 0x644,
+ 0x407, 0x639, 0x644, 0x64a, 0x647, 0x407, 0x648, 0x633,
+ 0x644, 0x645, 0x307, 0x635, 0x644, 0x649, 0x1207, 0x635,
+ 0x644, 0x649, 0x20, 0x627, 0x644, 0x644, 0x647, 0x20,
+ 0x639, 0x644, 0x64a, 0x647, 0x20, 0x648, 0x633, 0x644,
+ 0x645, 0x807, 0x62c, 0x644, 0x20, 0x62c, 0x644, 0x627,
+ 0x644, 0x647, 0x407, 0x631, 0x6cc, 0x627, 0x644, 0x10b,
+ 0x2c, 0x10b, 0x3001, 0x10b, 0x3002, 0x10b, 0x3a, 0x10b,
+ 0x3b, 0x10b, 0x21, 0x10b, 0x3f, 0x10b, 0x3016, 0x10b,
+ 0x3017, 0x10b, 0x2026, 0x10b, 0x2025, 0x10b, 0x2014, 0x10b,
+ 0x2013, 0x10b, 0x5f, 0x10b, 0x5f, 0x10b, 0x28, 0x10b,
+ 0x29, 0x10b, 0x7b, 0x10b, 0x7d, 0x10b, 0x3014, 0x10b,
+ 0x3015, 0x10b, 0x3010, 0x10b, 0x3011, 0x10b, 0x300a, 0x10b,
+ 0x300b, 0x10b, 0x3008, 0x10b, 0x3009, 0x10b, 0x300c, 0x10b,
+ 0x300d, 0x10b, 0x300e, 0x10b, 0x300f, 0x10b, 0x5b, 0x10b,
+ 0x5d, 0x110, 0x203e, 0x110, 0x203e, 0x110, 0x203e, 0x110,
+ 0x203e, 0x110, 0x5f, 0x110, 0x5f, 0x110, 0x5f, 0x10e,
+ 0x2c, 0x10e, 0x3001, 0x10e, 0x2e, 0x10e, 0x3b, 0x10e,
+ 0x3a, 0x10e, 0x3f, 0x10e, 0x21, 0x10e, 0x2014, 0x10e,
+ 0x28, 0x10e, 0x29, 0x10e, 0x7b, 0x10e, 0x7d, 0x10e,
+ 0x3014, 0x10e, 0x3015, 0x10e, 0x23, 0x10e, 0x26, 0x10e,
+ 0x2a, 0x10e, 0x2b, 0x10e, 0x2d, 0x10e, 0x3c, 0x10e,
+ 0x3e, 0x10e, 0x3d, 0x10e, 0x5c, 0x10e, 0x24, 0x10e,
+ 0x25, 0x10e, 0x40, 0x207, 0x20, 0x64b, 0x205, 0x640,
+ 0x64b, 0x207, 0x20, 0x64c, 0x207, 0x20, 0x64d, 0x207,
+ 0x20, 0x64e, 0x205, 0x640, 0x64e, 0x207, 0x20, 0x64f,
+ 0x205, 0x640, 0x64f, 0x207, 0x20, 0x650, 0x205, 0x640,
+ 0x650, 0x207, 0x20, 0x651, 0x205, 0x640, 0x651, 0x207,
+ 0x20, 0x652, 0x205, 0x640, 0x652, 0x107, 0x621, 0x107,
+ 0x622, 0x106, 0x622, 0x107, 0x623, 0x106, 0x623, 0x107,
+ 0x624, 0x106, 0x624, 0x107, 0x625, 0x106, 0x625, 0x107,
+ 0x626, 0x106, 0x626, 0x104, 0x626, 0x105, 0x626, 0x107,
+ 0x627, 0x106, 0x627, 0x107, 0x628, 0x106, 0x628, 0x104,
+ 0x628, 0x105, 0x628, 0x107, 0x629, 0x106, 0x629, 0x107,
+ 0x62a, 0x106, 0x62a, 0x104, 0x62a, 0x105, 0x62a, 0x107,
+ 0x62b, 0x106, 0x62b, 0x104, 0x62b, 0x105, 0x62b, 0x107,
+ 0x62c, 0x106, 0x62c, 0x104, 0x62c, 0x105, 0x62c, 0x107,
+ 0x62d, 0x106, 0x62d, 0x104, 0x62d, 0x105, 0x62d, 0x107,
+ 0x62e, 0x106, 0x62e, 0x104, 0x62e, 0x105, 0x62e, 0x107,
+ 0x62f, 0x106, 0x62f, 0x107, 0x630, 0x106, 0x630, 0x107,
+ 0x631, 0x106, 0x631, 0x107, 0x632, 0x106, 0x632, 0x107,
+ 0x633, 0x106, 0x633, 0x104, 0x633, 0x105, 0x633, 0x107,
+ 0x634, 0x106, 0x634, 0x104, 0x634, 0x105, 0x634, 0x107,
+ 0x635, 0x106, 0x635, 0x104, 0x635, 0x105, 0x635, 0x107,
+ 0x636, 0x106, 0x636, 0x104, 0x636, 0x105, 0x636, 0x107,
+ 0x637, 0x106, 0x637, 0x104, 0x637, 0x105, 0x637, 0x107,
+ 0x638, 0x106, 0x638, 0x104, 0x638, 0x105, 0x638, 0x107,
+ 0x639, 0x106, 0x639, 0x104, 0x639, 0x105, 0x639, 0x107,
+ 0x63a, 0x106, 0x63a, 0x104, 0x63a, 0x105, 0x63a, 0x107,
+ 0x641, 0x106, 0x641, 0x104, 0x641, 0x105, 0x641, 0x107,
+ 0x642, 0x106, 0x642, 0x104, 0x642, 0x105, 0x642, 0x107,
+ 0x643, 0x106, 0x643, 0x104, 0x643, 0x105, 0x643, 0x107,
+ 0x644, 0x106, 0x644, 0x104, 0x644, 0x105, 0x644, 0x107,
+ 0x645, 0x106, 0x645, 0x104, 0x645, 0x105, 0x645, 0x107,
+ 0x646, 0x106, 0x646, 0x104, 0x646, 0x105, 0x646, 0x107,
+ 0x647, 0x106, 0x647, 0x104, 0x647, 0x105, 0x647, 0x107,
+ 0x648, 0x106, 0x648, 0x107, 0x649, 0x106, 0x649, 0x107,
+ 0x64a, 0x106, 0x64a, 0x104, 0x64a, 0x105, 0x64a, 0x207,
+ 0x644, 0x622, 0x206, 0x644, 0x622, 0x207, 0x644, 0x623,
+ 0x206, 0x644, 0x623, 0x207, 0x644, 0x625, 0x206, 0x644,
+ 0x625, 0x207, 0x644, 0x627, 0x206, 0x644, 0x627, 0x10c,
+ 0x21, 0x10c, 0x22, 0x10c, 0x23, 0x10c, 0x24, 0x10c,
+ 0x25, 0x10c, 0x26, 0x10c, 0x27, 0x10c, 0x28, 0x10c,
+ 0x29, 0x10c, 0x2a, 0x10c, 0x2b, 0x10c, 0x2c, 0x10c,
+ 0x2d, 0x10c, 0x2e, 0x10c, 0x2f, 0x10c, 0x30, 0x10c,
+ 0x31, 0x10c, 0x32, 0x10c, 0x33, 0x10c, 0x34, 0x10c,
+ 0x35, 0x10c, 0x36, 0x10c, 0x37, 0x10c, 0x38, 0x10c,
+ 0x39, 0x10c, 0x3a, 0x10c, 0x3b, 0x10c, 0x3c, 0x10c,
+ 0x3d, 0x10c, 0x3e, 0x10c, 0x3f, 0x10c, 0x40, 0x10c,
+ 0x41, 0x10c, 0x42, 0x10c, 0x43, 0x10c, 0x44, 0x10c,
+ 0x45, 0x10c, 0x46, 0x10c, 0x47, 0x10c, 0x48, 0x10c,
+ 0x49, 0x10c, 0x4a, 0x10c, 0x4b, 0x10c, 0x4c, 0x10c,
+ 0x4d, 0x10c, 0x4e, 0x10c, 0x4f, 0x10c, 0x50, 0x10c,
+ 0x51, 0x10c, 0x52, 0x10c, 0x53, 0x10c, 0x54, 0x10c,
+ 0x55, 0x10c, 0x56, 0x10c, 0x57, 0x10c, 0x58, 0x10c,
+ 0x59, 0x10c, 0x5a, 0x10c, 0x5b, 0x10c, 0x5c, 0x10c,
+ 0x5d, 0x10c, 0x5e, 0x10c, 0x5f, 0x10c, 0x60, 0x10c,
+ 0x61, 0x10c, 0x62, 0x10c, 0x63, 0x10c, 0x64, 0x10c,
+ 0x65, 0x10c, 0x66, 0x10c, 0x67, 0x10c, 0x68, 0x10c,
+ 0x69, 0x10c, 0x6a, 0x10c, 0x6b, 0x10c, 0x6c, 0x10c,
+ 0x6d, 0x10c, 0x6e, 0x10c, 0x6f, 0x10c, 0x70, 0x10c,
+ 0x71, 0x10c, 0x72, 0x10c, 0x73, 0x10c, 0x74, 0x10c,
+ 0x75, 0x10c, 0x76, 0x10c, 0x77, 0x10c, 0x78, 0x10c,
+ 0x79, 0x10c, 0x7a, 0x10c, 0x7b, 0x10c, 0x7c, 0x10c,
+ 0x7d, 0x10c, 0x7e, 0x10c, 0x2985, 0x10c, 0x2986, 0x10d,
+ 0x3002, 0x10d, 0x300c, 0x10d, 0x300d, 0x10d, 0x3001, 0x10d,
+ 0x30fb, 0x10d, 0x30f2, 0x10d, 0x30a1, 0x10d, 0x30a3, 0x10d,
+ 0x30a5, 0x10d, 0x30a7, 0x10d, 0x30a9, 0x10d, 0x30e3, 0x10d,
+ 0x30e5, 0x10d, 0x30e7, 0x10d, 0x30c3, 0x10d, 0x30fc, 0x10d,
+ 0x30a2, 0x10d, 0x30a4, 0x10d, 0x30a6, 0x10d, 0x30a8, 0x10d,
+ 0x30aa, 0x10d, 0x30ab, 0x10d, 0x30ad, 0x10d, 0x30af, 0x10d,
+ 0x30b1, 0x10d, 0x30b3, 0x10d, 0x30b5, 0x10d, 0x30b7, 0x10d,
+ 0x30b9, 0x10d, 0x30bb, 0x10d, 0x30bd, 0x10d, 0x30bf, 0x10d,
+ 0x30c1, 0x10d, 0x30c4, 0x10d, 0x30c6, 0x10d, 0x30c8, 0x10d,
+ 0x30ca, 0x10d, 0x30cb, 0x10d, 0x30cc, 0x10d, 0x30cd, 0x10d,
+ 0x30ce, 0x10d, 0x30cf, 0x10d, 0x30d2, 0x10d, 0x30d5, 0x10d,
+ 0x30d8, 0x10d, 0x30db, 0x10d, 0x30de, 0x10d, 0x30df, 0x10d,
+ 0x30e0, 0x10d, 0x30e1, 0x10d, 0x30e2, 0x10d, 0x30e4, 0x10d,
+ 0x30e6, 0x10d, 0x30e8, 0x10d, 0x30e9, 0x10d, 0x30ea, 0x10d,
+ 0x30eb, 0x10d, 0x30ec, 0x10d, 0x30ed, 0x10d, 0x30ef, 0x10d,
+ 0x30f3, 0x10d, 0x3099, 0x10d, 0x309a, 0x10d, 0x3164, 0x10d,
+ 0x3131, 0x10d, 0x3132, 0x10d, 0x3133, 0x10d, 0x3134, 0x10d,
+ 0x3135, 0x10d, 0x3136, 0x10d, 0x3137, 0x10d, 0x3138, 0x10d,
+ 0x3139, 0x10d, 0x313a, 0x10d, 0x313b, 0x10d, 0x313c, 0x10d,
+ 0x313d, 0x10d, 0x313e, 0x10d, 0x313f, 0x10d, 0x3140, 0x10d,
+ 0x3141, 0x10d, 0x3142, 0x10d, 0x3143, 0x10d, 0x3144, 0x10d,
+ 0x3145, 0x10d, 0x3146, 0x10d, 0x3147, 0x10d, 0x3148, 0x10d,
+ 0x3149, 0x10d, 0x314a, 0x10d, 0x314b, 0x10d, 0x314c, 0x10d,
+ 0x314d, 0x10d, 0x314e, 0x10d, 0x314f, 0x10d, 0x3150, 0x10d,
+ 0x3151, 0x10d, 0x3152, 0x10d, 0x3153, 0x10d, 0x3154, 0x10d,
+ 0x3155, 0x10d, 0x3156, 0x10d, 0x3157, 0x10d, 0x3158, 0x10d,
+ 0x3159, 0x10d, 0x315a, 0x10d, 0x315b, 0x10d, 0x315c, 0x10d,
+ 0x315d, 0x10d, 0x315e, 0x10d, 0x315f, 0x10d, 0x3160, 0x10d,
+ 0x3161, 0x10d, 0x3162, 0x10d, 0x3163, 0x10c, 0xa2, 0x10c,
+ 0xa3, 0x10c, 0xac, 0x10c, 0xaf, 0x10c, 0xa6, 0x10c,
+ 0xa5, 0x10c, 0x20a9, 0x10d, 0x2502, 0x10d, 0x2190, 0x10d,
+ 0x2191, 0x10d, 0x2192, 0x10d, 0x2193, 0x10d, 0x25a0, 0x10d,
+ 0x25cb, 0x109, 0x2d0, 0x109, 0x2d1, 0x109, 0xe6, 0x109,
+ 0x299, 0x109, 0x253, 0x109, 0x2a3, 0x109, 0xab66, 0x109,
+ 0x2a5, 0x109, 0x2a4, 0x109, 0x256, 0x109, 0x257, 0x109,
+ 0x1d91, 0x109, 0x258, 0x109, 0x25e, 0x109, 0x2a9, 0x109,
+ 0x264, 0x109, 0x262, 0x109, 0x260, 0x109, 0x29b, 0x109,
+ 0x127, 0x109, 0x29c, 0x109, 0x267, 0x109, 0x284, 0x109,
+ 0x2aa, 0x109, 0x2ab, 0x109, 0x26c, 0x209, 0xd837, 0xdf04,
+ 0x109, 0xa78e, 0x109, 0x26e, 0x209, 0xd837, 0xdf05, 0x109,
+ 0x28e, 0x209, 0xd837, 0xdf06, 0x109, 0xf8, 0x109, 0x276,
+ 0x109, 0x277, 0x109, 0x71, 0x109, 0x27a, 0x209, 0xd837,
+ 0xdf08, 0x109, 0x27d, 0x109, 0x27e, 0x109, 0x280, 0x109,
+ 0x2a8, 0x109, 0x2a6, 0x109, 0xab67, 0x109, 0x2a7, 0x109,
+ 0x288, 0x109, 0x2c71, 0x109, 0x28f, 0x109, 0x2a1, 0x109,
+ 0x2a2, 0x109, 0x298, 0x109, 0x1c0, 0x109, 0x1c1, 0x109,
+ 0x1c2, 0x209, 0xd837, 0xdf0a, 0x209, 0xd837, 0xdf1e, 0x401,
+ 0xd804, 0xdc99, 0xd804, 0xdcba, 0x401, 0xd804, 0xdc9b, 0xd804,
+ 0xdcba, 0x401, 0xd804, 0xdca5, 0xd804, 0xdcba, 0x401, 0xd804,
+ 0xdd31, 0xd804, 0xdd27, 0x401, 0xd804, 0xdd32, 0xd804, 0xdd27,
+ 0x401, 0xd804, 0xdf47, 0xd804, 0xdf3e, 0x401, 0xd804, 0xdf47,
+ 0xd804, 0xdf57, 0x401, 0xd805, 0xdcb9, 0xd805, 0xdcba, 0x401,
+ 0xd805, 0xdcb9, 0xd805, 0xdcb0, 0x401, 0xd805, 0xdcb9, 0xd805,
+ 0xdcbd, 0x401, 0xd805, 0xddb8, 0xd805, 0xddaf, 0x401, 0xd805,
+ 0xddb9, 0xd805, 0xddaf, 0x401, 0xd806, 0xdd35, 0xd806, 0xdd30,
+ 0x401, 0xd834, 0xdd57, 0xd834, 0xdd65, 0x401, 0xd834, 0xdd58,
+ 0xd834, 0xdd65, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd6e, 0x401,
+ 0xd834, 0xdd5f, 0xd834, 0xdd6f, 0x401, 0xd834, 0xdd5f, 0xd834,
+ 0xdd70, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd71, 0x401, 0xd834,
+ 0xdd5f, 0xd834, 0xdd72, 0x401, 0xd834, 0xddb9, 0xd834, 0xdd65,
+ 0x401, 0xd834, 0xddba, 0xd834, 0xdd65, 0x401, 0xd834, 0xddbb,
+ 0xd834, 0xdd6e, 0x401, 0xd834, 0xddbc, 0xd834, 0xdd6e, 0x401,
+ 0xd834, 0xddbb, 0xd834, 0xdd6f, 0x401, 0xd834, 0xddbc, 0xd834,
+ 0xdd6f, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
+ 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
+ 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
+ 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
+ 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
+ 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
+ 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
+ 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
+ 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
+ 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
+ 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
+ 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
+ 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
+ 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
+ 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
+ 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
+ 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
+ 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
+ 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
+ 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
+ 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
+ 0x66, 0x102, 0x67, 0x102, 0x69, 0x102, 0x6a, 0x102,
0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102,
- 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102,
- 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102,
- 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102,
- 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45, 0x102,
- 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102,
- 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102,
- 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102,
- 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102,
- 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102,
- 0x42, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102,
+ 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102,
+ 0x73, 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102,
+ 0x77, 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102,
+ 0x41, 0x102, 0x42, 0x102, 0x43, 0x102, 0x44, 0x102,
+ 0x45, 0x102, 0x46, 0x102, 0x47, 0x102, 0x48, 0x102,
+ 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102,
0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102,
- 0x51, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
+ 0x51, 0x102, 0x52, 0x102, 0x53, 0x102, 0x54, 0x102,
+ 0x55, 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102,
+ 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102,
+ 0x63, 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102,
+ 0x67, 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102,
+ 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102,
+ 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102,
+ 0x73, 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102,
+ 0x77, 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102,
+ 0x41, 0x102, 0x43, 0x102, 0x44, 0x102, 0x47, 0x102,
+ 0x4a, 0x102, 0x4b, 0x102, 0x4e, 0x102, 0x4f, 0x102,
+ 0x50, 0x102, 0x51, 0x102, 0x53, 0x102, 0x54, 0x102,
+ 0x55, 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102,
+ 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102,
+ 0x63, 0x102, 0x64, 0x102, 0x66, 0x102, 0x68, 0x102,
0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
+ 0x6d, 0x102, 0x6e, 0x102, 0x70, 0x102, 0x71, 0x102,
+ 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
+ 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
+ 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
- 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102,
- 0x4d, 0x102, 0x4f, 0x102, 0x53, 0x102, 0x54, 0x102,
- 0x55, 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102,
- 0x59, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102,
- 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102,
- 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102,
- 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102,
- 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102,
- 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45, 0x102,
- 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102,
- 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102,
- 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102,
- 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102,
- 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102,
- 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45, 0x102,
- 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102,
- 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102,
- 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102,
- 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102,
- 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102,
- 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45, 0x102,
- 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102,
- 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102,
- 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102,
- 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102,
- 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102,
- 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45, 0x102,
- 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102,
- 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102,
- 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102,
- 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102,
- 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102,
- 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45, 0x102,
- 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102,
- 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102,
- 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102,
- 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102,
- 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102,
- 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45, 0x102,
- 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102,
- 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102,
- 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102,
- 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102,
- 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x131, 0x102,
- 0x237, 0x102, 0x391, 0x102, 0x392, 0x102, 0x393, 0x102,
- 0x394, 0x102, 0x395, 0x102, 0x396, 0x102, 0x397, 0x102,
- 0x398, 0x102, 0x399, 0x102, 0x39a, 0x102, 0x39b, 0x102,
- 0x39c, 0x102, 0x39d, 0x102, 0x39e, 0x102, 0x39f, 0x102,
- 0x3a0, 0x102, 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3, 0x102,
- 0x3a4, 0x102, 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7, 0x102,
- 0x3a8, 0x102, 0x3a9, 0x102, 0x2207, 0x102, 0x3b1, 0x102,
- 0x3b2, 0x102, 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5, 0x102,
- 0x3b6, 0x102, 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9, 0x102,
- 0x3ba, 0x102, 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd, 0x102,
- 0x3be, 0x102, 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1, 0x102,
- 0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102,
- 0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102,
- 0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102,
- 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102, 0x391, 0x102,
+ 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
+ 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
+ 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
+ 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
+ 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
+ 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
+ 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
+ 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
+ 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
+ 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
+ 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
+ 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x44, 0x102,
+ 0x45, 0x102, 0x46, 0x102, 0x47, 0x102, 0x4a, 0x102,
+ 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
+ 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x53, 0x102,
+ 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
+ 0x58, 0x102, 0x59, 0x102, 0x61, 0x102, 0x62, 0x102,
+ 0x63, 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102,
+ 0x67, 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102,
+ 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102,
+ 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102,
+ 0x73, 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102,
+ 0x77, 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102,
+ 0x41, 0x102, 0x42, 0x102, 0x44, 0x102, 0x45, 0x102,
+ 0x46, 0x102, 0x47, 0x102, 0x49, 0x102, 0x4a, 0x102,
+ 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4f, 0x102,
+ 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
+ 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x61, 0x102,
+ 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
+ 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
+ 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
+ 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
+ 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
+ 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
+ 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
+ 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
+ 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
+ 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
+ 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
+ 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
+ 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
+ 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
+ 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
+ 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
+ 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
+ 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
+ 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
+ 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
+ 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
+ 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
+ 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
+ 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
+ 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
+ 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
+ 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
+ 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
+ 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
+ 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
+ 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
+ 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
+ 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
+ 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
+ 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
+ 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
+ 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
+ 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
+ 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
+ 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
+ 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
+ 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
+ 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
+ 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
+ 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
+ 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
+ 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
+ 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
+ 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
+ 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
+ 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
+ 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
+ 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
+ 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
+ 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
+ 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
+ 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
+ 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
+ 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
+ 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
+ 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
+ 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
+ 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
+ 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
+ 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
+ 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
+ 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
+ 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
+ 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
+ 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
+ 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
+ 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
+ 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
+ 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
+ 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
+ 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
+ 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
+ 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
+ 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
+ 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
+ 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
+ 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
+ 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
+ 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
+ 0x7a, 0x102, 0x131, 0x102, 0x237, 0x102, 0x391, 0x102,
0x392, 0x102, 0x393, 0x102, 0x394, 0x102, 0x395, 0x102,
0x396, 0x102, 0x397, 0x102, 0x398, 0x102, 0x399, 0x102,
0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102, 0x39d, 0x102,
@@ -13396,10 +14320,22 @@ static const unsigned short uc_decomposition_map[] = {
0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102,
0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102,
0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102,
- 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102, 0x3dc, 0x102,
- 0x3dd, 0x102, 0x30, 0x102, 0x31, 0x102, 0x32, 0x102,
- 0x33, 0x102, 0x34, 0x102, 0x35, 0x102, 0x36, 0x102,
- 0x37, 0x102, 0x38, 0x102, 0x39, 0x102, 0x30, 0x102,
+ 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102, 0x391, 0x102,
+ 0x392, 0x102, 0x393, 0x102, 0x394, 0x102, 0x395, 0x102,
+ 0x396, 0x102, 0x397, 0x102, 0x398, 0x102, 0x399, 0x102,
+ 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102, 0x39d, 0x102,
+ 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102, 0x3a1, 0x102,
+ 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102, 0x3a5, 0x102,
+ 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102, 0x3a9, 0x102,
+ 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102, 0x3b3, 0x102,
+ 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102, 0x3b7, 0x102,
+ 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102, 0x3bb, 0x102,
+ 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102, 0x3bf, 0x102,
+ 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102, 0x3c3, 0x102,
+ 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102, 0x3c7, 0x102,
+ 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102, 0x3f5, 0x102,
+ 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102, 0x3f1, 0x102,
+ 0x3d6, 0x102, 0x3dc, 0x102, 0x3dd, 0x102, 0x30, 0x102,
0x31, 0x102, 0x32, 0x102, 0x33, 0x102, 0x34, 0x102,
0x35, 0x102, 0x36, 0x102, 0x37, 0x102, 0x38, 0x102,
0x39, 0x102, 0x30, 0x102, 0x31, 0x102, 0x32, 0x102,
@@ -13409,7 +14345,25 @@ static const unsigned short uc_decomposition_map[] = {
0x35, 0x102, 0x36, 0x102, 0x37, 0x102, 0x38, 0x102,
0x39, 0x102, 0x30, 0x102, 0x31, 0x102, 0x32, 0x102,
0x33, 0x102, 0x34, 0x102, 0x35, 0x102, 0x36, 0x102,
- 0x37, 0x102, 0x38, 0x102, 0x39, 0x102, 0x627, 0x102,
+ 0x37, 0x102, 0x38, 0x102, 0x39, 0x102, 0x30, 0x102,
+ 0x31, 0x102, 0x32, 0x102, 0x33, 0x102, 0x34, 0x102,
+ 0x35, 0x102, 0x36, 0x102, 0x37, 0x102, 0x38, 0x102,
+ 0x39, 0x109, 0x430, 0x109, 0x431, 0x109, 0x432, 0x109,
+ 0x433, 0x109, 0x434, 0x109, 0x435, 0x109, 0x436, 0x109,
+ 0x437, 0x109, 0x438, 0x109, 0x43a, 0x109, 0x43b, 0x109,
+ 0x43c, 0x109, 0x43e, 0x109, 0x43f, 0x109, 0x440, 0x109,
+ 0x441, 0x109, 0x442, 0x109, 0x443, 0x109, 0x444, 0x109,
+ 0x445, 0x109, 0x446, 0x109, 0x447, 0x109, 0x448, 0x109,
+ 0x44b, 0x109, 0x44d, 0x109, 0x44e, 0x109, 0xa689, 0x109,
+ 0x4d9, 0x109, 0x456, 0x109, 0x458, 0x109, 0x4e9, 0x109,
+ 0x4af, 0x109, 0x4cf, 0x10a, 0x430, 0x10a, 0x431, 0x10a,
+ 0x432, 0x10a, 0x433, 0x10a, 0x434, 0x10a, 0x435, 0x10a,
+ 0x436, 0x10a, 0x437, 0x10a, 0x438, 0x10a, 0x43a, 0x10a,
+ 0x43b, 0x10a, 0x43e, 0x10a, 0x43f, 0x10a, 0x441, 0x10a,
+ 0x443, 0x10a, 0x444, 0x10a, 0x445, 0x10a, 0x446, 0x10a,
+ 0x447, 0x10a, 0x448, 0x10a, 0x44a, 0x10a, 0x44b, 0x10a,
+ 0x491, 0x10a, 0x456, 0x10a, 0x455, 0x10a, 0x45f, 0x109,
+ 0x4ab, 0x109, 0xa651, 0x109, 0x4b1, 0x102, 0x627, 0x102,
0x628, 0x102, 0x62c, 0x102, 0x62f, 0x102, 0x648, 0x102,
0x632, 0x102, 0x62d, 0x102, 0x637, 0x102, 0x64a, 0x102,
0x643, 0x102, 0x644, 0x102, 0x645, 0x102, 0x646, 0x102,
@@ -13645,7 +14599,7 @@ static const unsigned short uc_decomposition_map[] = {
0xd869, 0xde00
};
-static const unsigned short uc_ligature_trie[] = {
+static constexpr unsigned short uc_ligature_trie[] = {
// 0 - 0x3100
631, 631, 631, 631, 631, 631, 631, 631,
@@ -14070,12 +15024,12 @@ static const unsigned short uc_ligature_trie[] = {
#define GET_LIGATURE_INDEX(ucs4) \
(ucs4 < 0x3100 \
- ? (uc_ligature_trie[uc_ligature_trie[ucs4>>5] + (ucs4 & 0x1f)]) \
- : (ucs4 < 0x12000 \
- ? uc_ligature_trie[uc_ligature_trie[((ucs4 - 0x3100)>>8) + 0x188] + (ucs4 & 0xff)] \
- : 0xffff))
+ ? (uc_ligature_trie[uc_ligature_trie[ucs4 >> 5] + (ucs4 & 0x1f)]) \
+ : ucs4 < 0x12000 \
+ ? uc_ligature_trie[uc_ligature_trie[((ucs4 - 0x3100) >> 8) + 0x188] + (ucs4 & 0xff)] \
+ : 0xffff)
-static const unsigned short uc_ligature_map[] = {
+static constexpr unsigned short uc_ligature_map[] = {
0x54, 0x41, 0xc0, 0x45, 0xc8, 0x49, 0xcc, 0x4e,
0x1f8, 0x4f, 0xd2, 0x55, 0xd9, 0x57, 0x1e80, 0x59,
0x1ef2, 0x61, 0xe0, 0x65, 0xe8, 0x69, 0xec, 0x6e,
@@ -14325,14 +15279,13 @@ static const unsigned short uc_ligature_map[] = {
0xdd35, 0xd806, 0xdd38
};
-
struct NormalizationCorrection {
uint ucs4;
uint old_mapping;
int version;
};
-static const NormalizationCorrection uc_normalization_corrections[] = {
+static constexpr NormalizationCorrection uc_normalization_corrections[] = {
{ 0xf951, 0x96fb, 6 },
{ 0x2f868, 0x2136a, 7 },
{ 0x2f874, 0x5f33, 7 },
@@ -14344,6 +15297,6023 @@ static const NormalizationCorrection uc_normalization_corrections[] = {
enum { NumNormalizationCorrections = 6 };
enum { NormalizationCorrectionsVersionMax = 7 };
+static constexpr char16_t idnaMappingData[] = {
+ 0x31, 0x31, 0x65e5, 0x31, 0x31, 0x6708, 0x31, 0x31, 0x70b9, 0x31, 0x32, 0x65e5,
+ 0x31, 0x32, 0x6708, 0x31, 0x32, 0x70b9, 0x31, 0x33, 0x65e5, 0x31, 0x33, 0x70b9,
+ 0x31, 0x34, 0x65e5, 0x31, 0x34, 0x70b9, 0x31, 0x35, 0x65e5, 0x31, 0x35, 0x70b9,
+ 0x31, 0x36, 0x65e5, 0x31, 0x36, 0x70b9, 0x31, 0x37, 0x65e5, 0x31, 0x37, 0x70b9,
+ 0x31, 0x38, 0x65e5, 0x31, 0x38, 0x70b9, 0x31, 0x39, 0x65e5, 0x31, 0x39, 0x70b9,
+ 0x31, 0x2044, 0x36, 0x31, 0x2044, 0x35, 0x31, 0x2044, 0x34, 0x31, 0x2044, 0x33,
+ 0x31, 0x2044, 0x32, 0x35, 0x65e5, 0x62, 0x61, 0x72, 0x61, 0x64, 0x2215, 0x73,
+ 0x32, 0x2044, 0x35, 0x65, 0x72, 0x67, 0x61, 0x6c, 0x6d, 0x68, 0x7a, 0x70,
+ 0x74, 0x65, 0x6c, 0x6f, 0x67, 0x68, 0x7a, 0x6d, 0x69, 0x6c, 0x74, 0x68,
+ 0x7a, 0x5e9, 0x5bc, 0x5c1, 0x628, 0x62d, 0x64a, 0x62a, 0x62c, 0x645, 0x62a, 0x62c,
+ 0x64a, 0x62a, 0x62d, 0x645, 0x62a, 0x62e, 0x649, 0x62a, 0x645, 0x62c, 0x62e, 0x646,
+ 0x62d, 0x649, 0x222e, 0x222e, 0x222e, 0x3014, 0x6253, 0x3015, 0x30a4, 0x30f3, 0x30c1, 0x30ac,
+ 0x30f3, 0x30de, 0x30f3, 0x30b7, 0x30e7, 0x30f3, 0x30ec, 0x30f3, 0x30c8, 0x30b2, 0x30f3, 0xd834,
+ 0xddba, 0xd834, 0xdd65, 0xd834, 0xdd6f, 0xd834, 0xddba, 0xd834, 0xdd65, 0xd834, 0xdd6e, 0xd834,
+ 0xddb9, 0xd834, 0xdd65, 0xd834, 0xdd6f, 0xd834, 0xddb9, 0xd834, 0xdd65, 0xd834, 0xdd6e, 0xd834,
+ 0xdd58, 0xd834, 0xdd65, 0xd834, 0xdd72, 0xd834, 0xdd58, 0xd834, 0xdd65, 0xd834, 0xdd71, 0xd834,
+ 0xdd58, 0xd834, 0xdd65, 0xd834, 0xdd70, 0xd834, 0xdd58, 0xd834, 0xdd65, 0xd834, 0xdd6f, 0xd834,
+ 0xdd58, 0xd834, 0xdd65, 0xd834, 0xdd6e, 0x30ad, 0x30ed, 0x30e1, 0x30fc, 0x30c8, 0x30eb, 0x30fc,
+ 0x30d6, 0x30eb, 0x30df, 0x30af, 0x30ed, 0x30f3, 0x30d0, 0x30fc, 0x30ec, 0x30eb, 0x30b5, 0x30a4,
+ 0x30af, 0x30eb, 0x30bc, 0x30a4, 0x30ed, 0x30ad, 0x30ed, 0x30b0, 0x30e9, 0x30e0, 0x30c8, 0x30f3,
+ 0x30d4, 0x30a2, 0x30b9, 0x30c8, 0x30eb, 0x30d1, 0x30fc, 0x30bb, 0x30f3, 0x30c8, 0x30b5, 0x30f3,
+ 0x30c1, 0x30fc, 0x30e0, 0x30ad, 0x30ed, 0x30ef, 0x30c3, 0x30c8, 0x30a8, 0x30b9, 0x30af, 0x30fc,
+ 0x30c9, 0xd834, 0xdd57, 0xd834, 0xdd65, 0x682a, 0x5f0f, 0x4f1a, 0x793e, 0x30e1, 0x30ac, 0x30c8,
+ 0x30f3, 0x30d5, 0x30a3, 0x30fc, 0x30c8, 0x30ae, 0x30eb, 0x30c0, 0x30fc, 0x30b9, 0x30d5, 0x30e9,
+ 0x30f3, 0x30da, 0x30fc, 0x30b8, 0x30de, 0x30a4, 0x30eb, 0x30e6, 0x30a2, 0x30f3, 0x30da, 0x30a2,
+ 0x30eb, 0x30d5, 0x30a1, 0x30e9, 0x30c3, 0x30c9, 0x30d6, 0x30c3, 0x30b7, 0x30a7, 0x30eb, 0x30d8,
+ 0x30af, 0x30bf, 0x30fc, 0x30eb, 0x30df, 0x30ea, 0x30d0, 0x30fc, 0x30eb, 0x30d4, 0x30fc, 0x627,
+ 0x643, 0x628, 0x631, 0x6cc, 0x627, 0x644, 0x644, 0x647, 0x645, 0x62c, 0x64a, 0x646,
+ 0x62d, 0x645, 0x64a, 0x633, 0x645, 0x645, 0x635, 0x62d, 0x64a, 0x636, 0x62e, 0x645,
+ 0x639, 0x645, 0x649, 0x640, 0x64f, 0x651, 0x642, 0x645, 0x645, 0x644, 0x62c, 0x645,
+ 0x62d, 0x633, 0x62d, 0x62c, 0x634, 0x62d, 0x64a, 0x635, 0x645, 0x645, 0x637, 0x645,
+ 0x64a, 0x63a, 0x645, 0x649, 0x641, 0x645, 0x64a, 0x643, 0x645, 0x64a, 0x644, 0x62d,
+ 0x649, 0x646, 0x62c, 0x62d, 0x64a, 0x633, 0x62c, 0x649, 0x634, 0x62d, 0x645, 0x635,
+ 0x644, 0x6d2, 0x637, 0x645, 0x645, 0x63a, 0x645, 0x645, 0x641, 0x62e, 0x645, 0x643,
+ 0x645, 0x645, 0x644, 0x62d, 0x645, 0x649, 0x633, 0x645, 0x62d, 0x635, 0x62d, 0x62d,
+ 0x636, 0x62d, 0x64a, 0x639, 0x645, 0x645, 0x640, 0x64e, 0x651, 0x642, 0x645, 0x62d,
+ 0x64a, 0x646, 0x62d, 0x64a, 0x3014, 0x73, 0x3015, 0x3014, 0x6557, 0x3015, 0x30a6, 0x30a9,
+ 0x30f3, 0x30ae, 0x30cb, 0x30fc, 0x30bb, 0x30f3, 0x30c1, 0x30d4, 0x30af, 0x30eb, 0x30da, 0x30f3,
+ 0x30b9, 0x30dd, 0x30f3, 0x30c9, 0x30e4, 0x30fc, 0x30eb, 0x6b, 0x63, 0x61, 0x6c, 0x74,
+ 0x64, 0x6d, 0x33, 0x2044, 0x34, 0x2044, 0x35, 0x2044, 0x38, 0x6b, 0x68, 0x7a,
+ 0x70, 0x70, 0x6d, 0x70, 0x61, 0x2215, 0x6d, 0x6f, 0x6c, 0x76, 0x2215, 0x6d,
+ 0x2215, 0x73, 0x32, 0x2044, 0x33, 0x30, 0x65e5, 0x66, 0x61, 0x78, 0x69, 0x69,
+ 0x5e9, 0x5bc, 0x5c2, 0x628, 0x62e, 0x64a, 0x62a, 0x62c, 0x649, 0x62a, 0x62d, 0x62c,
+ 0x62a, 0x62e, 0x645, 0x62a, 0x62e, 0x64a, 0x62a, 0x645, 0x62d, 0x62a, 0x645, 0x64a,
+ 0x62a, 0x645, 0x649, 0x62a, 0x645, 0x62e, 0x645, 0x62c, 0x62d, 0x649, 0x633, 0x62c,
+ 0x62d, 0x634, 0x62c, 0x64a, 0x635, 0x644, 0x649, 0x637, 0x645, 0x62d, 0x62c, 0x64a,
+ 0x633, 0x645, 0x62c, 0x645, 0x649, 0x633, 0x62e, 0x64a, 0x634, 0x645, 0x645, 0x636,
+ 0x62d, 0x649, 0x639, 0x62c, 0x645, 0x63a, 0x645, 0x64a, 0x642, 0x644, 0x6d2, 0x644,
+ 0x62c, 0x62c, 0x644, 0x62d, 0x64a, 0x646, 0x62c, 0x645, 0x64a, 0x633, 0x62e, 0x649,
+ 0x634, 0x645, 0x62e, 0x64a, 0x646, 0x645, 0x64a, 0x62c, 0x64a, 0x62d, 0x64a, 0x645,
+ 0x64a, 0x645, 0x645, 0x64a, 0xfb2, 0xf71, 0xf80, 0x3014, 0x4e8c, 0x3015, 0x3014, 0x70b9,
+ 0x3015, 0x30aa, 0x30fc, 0x30e0, 0x30b3, 0x30eb, 0x30ca, 0x30d1, 0x30fc, 0x30c4, 0x30da, 0x30cb,
+ 0x30d2, 0x30dc, 0x30eb, 0x30c8, 0x30e4, 0x30fc, 0x30c9, 0x63, 0x2215, 0x6b, 0x67, 0x70,
+ 0x61, 0x6d, 0x6d, 0x32, 0x39, 0x65e5, 0x64, 0x6d, 0x32, 0x37, 0x65e5, 0x63,
+ 0x6d, 0x32, 0x36, 0x65e5, 0x32, 0x34, 0x70b9, 0x32, 0x34, 0x65e5, 0x32, 0x33,
+ 0x70b9, 0x32, 0x33, 0x65e5, 0x32, 0x32, 0x70b9, 0x32, 0x32, 0x65e5, 0x32, 0x31,
+ 0x70b9, 0x32, 0x31, 0x65e5, 0x32, 0x30, 0x70b9, 0x32, 0x30, 0x65e5, 0x31, 0x2044,
+ 0x39, 0x31, 0x2044, 0x38, 0x31, 0x2044, 0x37, 0x2044, 0x38, 0x6b, 0x6d, 0x32,
+ 0x38, 0x65e5, 0x63, 0x6d, 0x33, 0x31, 0x65e5, 0x66, 0x66, 0x69, 0x6b, 0x6d,
+ 0x33, 0x2044, 0x35, 0x2044, 0x36, 0x68, 0x70, 0x61, 0x6d, 0x6d, 0x33, 0x2044,
+ 0x38, 0x66, 0x66, 0x6c, 0x6b, 0x70, 0x61, 0x70, 0x70, 0x76, 0x69, 0x69,
+ 0x69, 0x631, 0x633, 0x648, 0x644, 0x645, 0x62d, 0x645, 0x62f, 0x635, 0x644, 0x639,
+ 0x645, 0x64a, 0x640, 0x650, 0x651, 0x642, 0x645, 0x64a, 0x644, 0x62c, 0x64a, 0x644,
+ 0x62e, 0x645, 0x646, 0x62c, 0x64a, 0x2035, 0x2035, 0x2035, 0x3014, 0x5b89, 0x3015, 0x30a2,
+ 0x30fc, 0x30eb, 0x30ac, 0x30ed, 0x30f3, 0x30b3, 0x30fc, 0x30dd, 0x30a4, 0x30f3, 0x30c8, 0x30b7,
+ 0x30ea, 0x30f3, 0x30b0, 0x30ad, 0x30e5, 0x30ea, 0x30fc, 0x30ab, 0x30e9, 0x30c3, 0x30c8, 0x30a4,
+ 0x30cb, 0x30f3, 0x30b0, 0x222b, 0x222b, 0x222b, 0x222b, 0x648, 0x633, 0x644, 0x645, 0x64a,
+ 0x646, 0x62c, 0x649, 0xfb3, 0xf71, 0xf80, 0x3014, 0x52dd, 0x3015, 0x3014, 0x76d7, 0x3015,
+ 0x30ab, 0x30a4, 0x30ea, 0x30c3, 0x30c8, 0x30eb, 0x30de, 0x30a4, 0x30af, 0x30ed, 0x30fc, 0x30cd,
+ 0x30ab, 0x30ed, 0x30ea, 0x30fc, 0x30a8, 0x30fc, 0x30ab, 0x30fc, 0x30a2, 0x30d1, 0x30fc, 0x30c8,
+ 0x2032, 0x2032, 0x2032, 0x2032, 0x639, 0x644, 0x64a, 0x647, 0x645, 0x645, 0x62e, 0x62c,
+ 0x646, 0x645, 0x649, 0x3014, 0x4e09, 0x3015, 0x3014, 0x672c, 0x3015, 0x30aa, 0x30f3, 0x30b9,
+ 0x30b1, 0x30fc, 0x30b9, 0x30ce, 0x30c3, 0x30c8, 0x30d8, 0x30eb, 0x30c4, 0x30db, 0x30fc, 0x30eb,
+ 0x30de, 0x30c3, 0x30cf, 0x30a4, 0x30c4, 0x30d9, 0x30fc, 0x30bf, 0x30db, 0x30fc, 0x30f3, 0x30de,
+ 0x30eb, 0x30af, 0x31, 0x2044, 0x31, 0x30, 0x70b9, 0x31, 0x30, 0x6708, 0x31, 0x30,
+ 0x65e5, 0x30, 0x2044, 0x33,
+};
+
+struct IdnaMapEntry {
+ // 21 bits suffice for any valid code-point (LastValidCodePoint = 0x10ffff)
+ unsigned codePoint : 24;
+ unsigned size : 8;
+ char16_t ucs[2]; // ucs[0] is offset if size > 2
+};
+static_assert(sizeof(IdnaMapEntry) == 8);
+
+static constexpr IdnaMapEntry idnaMap[] = {
+ { 0xaa, 1, { 0x61, 0 } },
+ { 0xb2, 1, { 0x32, 0 } },
+ { 0xb3, 1, { 0x33, 0 } },
+ { 0xb5, 1, { 0x3bc, 0 } },
+ { 0xb9, 1, { 0x31, 0 } },
+ { 0xba, 1, { 0x6f, 0 } },
+ { 0xbc, 3, { 66, 0 } },
+ { 0xbd, 3, { 72, 0 } },
+ { 0xbe, 3, { 470, 0 } },
+ { 0xc0, 1, { 0xe0, 0 } },
+ { 0xc1, 1, { 0xe1, 0 } },
+ { 0xc2, 1, { 0xe2, 0 } },
+ { 0xc3, 1, { 0xe3, 0 } },
+ { 0xc4, 1, { 0xe4, 0 } },
+ { 0xc5, 1, { 0xe5, 0 } },
+ { 0xc6, 1, { 0xe6, 0 } },
+ { 0xc7, 1, { 0xe7, 0 } },
+ { 0xc8, 1, { 0xe8, 0 } },
+ { 0xc9, 1, { 0xe9, 0 } },
+ { 0xca, 1, { 0xea, 0 } },
+ { 0xcb, 1, { 0xeb, 0 } },
+ { 0xcc, 1, { 0xec, 0 } },
+ { 0xcd, 1, { 0xed, 0 } },
+ { 0xce, 1, { 0xee, 0 } },
+ { 0xcf, 1, { 0xef, 0 } },
+ { 0xd0, 1, { 0xf0, 0 } },
+ { 0xd1, 1, { 0xf1, 0 } },
+ { 0xd2, 1, { 0xf2, 0 } },
+ { 0xd3, 1, { 0xf3, 0 } },
+ { 0xd4, 1, { 0xf4, 0 } },
+ { 0xd5, 1, { 0xf5, 0 } },
+ { 0xd6, 1, { 0xf6, 0 } },
+ { 0xd8, 1, { 0xf8, 0 } },
+ { 0xd9, 1, { 0xf9, 0 } },
+ { 0xda, 1, { 0xfa, 0 } },
+ { 0xdb, 1, { 0xfb, 0 } },
+ { 0xdc, 1, { 0xfc, 0 } },
+ { 0xdd, 1, { 0xfd, 0 } },
+ { 0xde, 1, { 0xfe, 0 } },
+ { 0xdf, 2, { 0x73, 0x73 } },
+ { 0x100, 1, { 0x101, 0 } },
+ { 0x102, 1, { 0x103, 0 } },
+ { 0x104, 1, { 0x105, 0 } },
+ { 0x106, 1, { 0x107, 0 } },
+ { 0x108, 1, { 0x109, 0 } },
+ { 0x10a, 1, { 0x10b, 0 } },
+ { 0x10c, 1, { 0x10d, 0 } },
+ { 0x10e, 1, { 0x10f, 0 } },
+ { 0x110, 1, { 0x111, 0 } },
+ { 0x112, 1, { 0x113, 0 } },
+ { 0x114, 1, { 0x115, 0 } },
+ { 0x116, 1, { 0x117, 0 } },
+ { 0x118, 1, { 0x119, 0 } },
+ { 0x11a, 1, { 0x11b, 0 } },
+ { 0x11c, 1, { 0x11d, 0 } },
+ { 0x11e, 1, { 0x11f, 0 } },
+ { 0x120, 1, { 0x121, 0 } },
+ { 0x122, 1, { 0x123, 0 } },
+ { 0x124, 1, { 0x125, 0 } },
+ { 0x126, 1, { 0x127, 0 } },
+ { 0x128, 1, { 0x129, 0 } },
+ { 0x12a, 1, { 0x12b, 0 } },
+ { 0x12c, 1, { 0x12d, 0 } },
+ { 0x12e, 1, { 0x12f, 0 } },
+ { 0x130, 2, { 0x69, 0x307 } },
+ { 0x132, 2, { 0x69, 0x6a } },
+ { 0x133, 2, { 0x69, 0x6a } },
+ { 0x134, 1, { 0x135, 0 } },
+ { 0x136, 1, { 0x137, 0 } },
+ { 0x139, 1, { 0x13a, 0 } },
+ { 0x13b, 1, { 0x13c, 0 } },
+ { 0x13d, 1, { 0x13e, 0 } },
+ { 0x13f, 2, { 0x6c, 0xb7 } },
+ { 0x140, 2, { 0x6c, 0xb7 } },
+ { 0x141, 1, { 0x142, 0 } },
+ { 0x143, 1, { 0x144, 0 } },
+ { 0x145, 1, { 0x146, 0 } },
+ { 0x147, 1, { 0x148, 0 } },
+ { 0x149, 2, { 0x2bc, 0x6e } },
+ { 0x14a, 1, { 0x14b, 0 } },
+ { 0x14c, 1, { 0x14d, 0 } },
+ { 0x14e, 1, { 0x14f, 0 } },
+ { 0x150, 1, { 0x151, 0 } },
+ { 0x152, 1, { 0x153, 0 } },
+ { 0x154, 1, { 0x155, 0 } },
+ { 0x156, 1, { 0x157, 0 } },
+ { 0x158, 1, { 0x159, 0 } },
+ { 0x15a, 1, { 0x15b, 0 } },
+ { 0x15c, 1, { 0x15d, 0 } },
+ { 0x15e, 1, { 0x15f, 0 } },
+ { 0x160, 1, { 0x161, 0 } },
+ { 0x162, 1, { 0x163, 0 } },
+ { 0x164, 1, { 0x165, 0 } },
+ { 0x166, 1, { 0x167, 0 } },
+ { 0x168, 1, { 0x169, 0 } },
+ { 0x16a, 1, { 0x16b, 0 } },
+ { 0x16c, 1, { 0x16d, 0 } },
+ { 0x16e, 1, { 0x16f, 0 } },
+ { 0x170, 1, { 0x171, 0 } },
+ { 0x172, 1, { 0x173, 0 } },
+ { 0x174, 1, { 0x175, 0 } },
+ { 0x176, 1, { 0x177, 0 } },
+ { 0x178, 1, { 0xff, 0 } },
+ { 0x179, 1, { 0x17a, 0 } },
+ { 0x17b, 1, { 0x17c, 0 } },
+ { 0x17d, 1, { 0x17e, 0 } },
+ { 0x17f, 1, { 0x73, 0 } },
+ { 0x181, 1, { 0x253, 0 } },
+ { 0x182, 1, { 0x183, 0 } },
+ { 0x184, 1, { 0x185, 0 } },
+ { 0x186, 1, { 0x254, 0 } },
+ { 0x187, 1, { 0x188, 0 } },
+ { 0x189, 1, { 0x256, 0 } },
+ { 0x18a, 1, { 0x257, 0 } },
+ { 0x18b, 1, { 0x18c, 0 } },
+ { 0x18e, 1, { 0x1dd, 0 } },
+ { 0x18f, 1, { 0x259, 0 } },
+ { 0x190, 1, { 0x25b, 0 } },
+ { 0x191, 1, { 0x192, 0 } },
+ { 0x193, 1, { 0x260, 0 } },
+ { 0x194, 1, { 0x263, 0 } },
+ { 0x196, 1, { 0x269, 0 } },
+ { 0x197, 1, { 0x268, 0 } },
+ { 0x198, 1, { 0x199, 0 } },
+ { 0x19c, 1, { 0x26f, 0 } },
+ { 0x19d, 1, { 0x272, 0 } },
+ { 0x19f, 1, { 0x275, 0 } },
+ { 0x1a0, 1, { 0x1a1, 0 } },
+ { 0x1a2, 1, { 0x1a3, 0 } },
+ { 0x1a4, 1, { 0x1a5, 0 } },
+ { 0x1a6, 1, { 0x280, 0 } },
+ { 0x1a7, 1, { 0x1a8, 0 } },
+ { 0x1a9, 1, { 0x283, 0 } },
+ { 0x1ac, 1, { 0x1ad, 0 } },
+ { 0x1ae, 1, { 0x288, 0 } },
+ { 0x1af, 1, { 0x1b0, 0 } },
+ { 0x1b1, 1, { 0x28a, 0 } },
+ { 0x1b2, 1, { 0x28b, 0 } },
+ { 0x1b3, 1, { 0x1b4, 0 } },
+ { 0x1b5, 1, { 0x1b6, 0 } },
+ { 0x1b7, 1, { 0x292, 0 } },
+ { 0x1b8, 1, { 0x1b9, 0 } },
+ { 0x1bc, 1, { 0x1bd, 0 } },
+ { 0x1c4, 2, { 0x64, 0x17e } },
+ { 0x1c5, 2, { 0x64, 0x17e } },
+ { 0x1c6, 2, { 0x64, 0x17e } },
+ { 0x1c7, 2, { 0x6c, 0x6a } },
+ { 0x1c8, 2, { 0x6c, 0x6a } },
+ { 0x1c9, 2, { 0x6c, 0x6a } },
+ { 0x1ca, 2, { 0x6e, 0x6a } },
+ { 0x1cb, 2, { 0x6e, 0x6a } },
+ { 0x1cc, 2, { 0x6e, 0x6a } },
+ { 0x1cd, 1, { 0x1ce, 0 } },
+ { 0x1cf, 1, { 0x1d0, 0 } },
+ { 0x1d1, 1, { 0x1d2, 0 } },
+ { 0x1d3, 1, { 0x1d4, 0 } },
+ { 0x1d5, 1, { 0x1d6, 0 } },
+ { 0x1d7, 1, { 0x1d8, 0 } },
+ { 0x1d9, 1, { 0x1da, 0 } },
+ { 0x1db, 1, { 0x1dc, 0 } },
+ { 0x1de, 1, { 0x1df, 0 } },
+ { 0x1e0, 1, { 0x1e1, 0 } },
+ { 0x1e2, 1, { 0x1e3, 0 } },
+ { 0x1e4, 1, { 0x1e5, 0 } },
+ { 0x1e6, 1, { 0x1e7, 0 } },
+ { 0x1e8, 1, { 0x1e9, 0 } },
+ { 0x1ea, 1, { 0x1eb, 0 } },
+ { 0x1ec, 1, { 0x1ed, 0 } },
+ { 0x1ee, 1, { 0x1ef, 0 } },
+ { 0x1f1, 2, { 0x64, 0x7a } },
+ { 0x1f2, 2, { 0x64, 0x7a } },
+ { 0x1f3, 2, { 0x64, 0x7a } },
+ { 0x1f4, 1, { 0x1f5, 0 } },
+ { 0x1f6, 1, { 0x195, 0 } },
+ { 0x1f7, 1, { 0x1bf, 0 } },
+ { 0x1f8, 1, { 0x1f9, 0 } },
+ { 0x1fa, 1, { 0x1fb, 0 } },
+ { 0x1fc, 1, { 0x1fd, 0 } },
+ { 0x1fe, 1, { 0x1ff, 0 } },
+ { 0x200, 1, { 0x201, 0 } },
+ { 0x202, 1, { 0x203, 0 } },
+ { 0x204, 1, { 0x205, 0 } },
+ { 0x206, 1, { 0x207, 0 } },
+ { 0x208, 1, { 0x209, 0 } },
+ { 0x20a, 1, { 0x20b, 0 } },
+ { 0x20c, 1, { 0x20d, 0 } },
+ { 0x20e, 1, { 0x20f, 0 } },
+ { 0x210, 1, { 0x211, 0 } },
+ { 0x212, 1, { 0x213, 0 } },
+ { 0x214, 1, { 0x215, 0 } },
+ { 0x216, 1, { 0x217, 0 } },
+ { 0x218, 1, { 0x219, 0 } },
+ { 0x21a, 1, { 0x21b, 0 } },
+ { 0x21c, 1, { 0x21d, 0 } },
+ { 0x21e, 1, { 0x21f, 0 } },
+ { 0x220, 1, { 0x19e, 0 } },
+ { 0x222, 1, { 0x223, 0 } },
+ { 0x224, 1, { 0x225, 0 } },
+ { 0x226, 1, { 0x227, 0 } },
+ { 0x228, 1, { 0x229, 0 } },
+ { 0x22a, 1, { 0x22b, 0 } },
+ { 0x22c, 1, { 0x22d, 0 } },
+ { 0x22e, 1, { 0x22f, 0 } },
+ { 0x230, 1, { 0x231, 0 } },
+ { 0x232, 1, { 0x233, 0 } },
+ { 0x23a, 1, { 0x2c65, 0 } },
+ { 0x23b, 1, { 0x23c, 0 } },
+ { 0x23d, 1, { 0x19a, 0 } },
+ { 0x23e, 1, { 0x2c66, 0 } },
+ { 0x241, 1, { 0x242, 0 } },
+ { 0x243, 1, { 0x180, 0 } },
+ { 0x244, 1, { 0x289, 0 } },
+ { 0x245, 1, { 0x28c, 0 } },
+ { 0x246, 1, { 0x247, 0 } },
+ { 0x248, 1, { 0x249, 0 } },
+ { 0x24a, 1, { 0x24b, 0 } },
+ { 0x24c, 1, { 0x24d, 0 } },
+ { 0x24e, 1, { 0x24f, 0 } },
+ { 0x2b0, 1, { 0x68, 0 } },
+ { 0x2b1, 1, { 0x266, 0 } },
+ { 0x2b2, 1, { 0x6a, 0 } },
+ { 0x2b3, 1, { 0x72, 0 } },
+ { 0x2b4, 1, { 0x279, 0 } },
+ { 0x2b5, 1, { 0x27b, 0 } },
+ { 0x2b6, 1, { 0x281, 0 } },
+ { 0x2b7, 1, { 0x77, 0 } },
+ { 0x2b8, 1, { 0x79, 0 } },
+ { 0x2e0, 1, { 0x263, 0 } },
+ { 0x2e1, 1, { 0x6c, 0 } },
+ { 0x2e2, 1, { 0x73, 0 } },
+ { 0x2e3, 1, { 0x78, 0 } },
+ { 0x2e4, 1, { 0x295, 0 } },
+ { 0x340, 1, { 0x300, 0 } },
+ { 0x341, 1, { 0x301, 0 } },
+ { 0x343, 1, { 0x313, 0 } },
+ { 0x344, 2, { 0x308, 0x301 } },
+ { 0x345, 1, { 0x3b9, 0 } },
+ { 0x370, 1, { 0x371, 0 } },
+ { 0x372, 1, { 0x373, 0 } },
+ { 0x374, 1, { 0x2b9, 0 } },
+ { 0x376, 1, { 0x377, 0 } },
+ { 0x37f, 1, { 0x3f3, 0 } },
+ { 0x386, 1, { 0x3ac, 0 } },
+ { 0x387, 1, { 0xb7, 0 } },
+ { 0x388, 1, { 0x3ad, 0 } },
+ { 0x389, 1, { 0x3ae, 0 } },
+ { 0x38a, 1, { 0x3af, 0 } },
+ { 0x38c, 1, { 0x3cc, 0 } },
+ { 0x38e, 1, { 0x3cd, 0 } },
+ { 0x38f, 1, { 0x3ce, 0 } },
+ { 0x391, 1, { 0x3b1, 0 } },
+ { 0x392, 1, { 0x3b2, 0 } },
+ { 0x393, 1, { 0x3b3, 0 } },
+ { 0x394, 1, { 0x3b4, 0 } },
+ { 0x395, 1, { 0x3b5, 0 } },
+ { 0x396, 1, { 0x3b6, 0 } },
+ { 0x397, 1, { 0x3b7, 0 } },
+ { 0x398, 1, { 0x3b8, 0 } },
+ { 0x399, 1, { 0x3b9, 0 } },
+ { 0x39a, 1, { 0x3ba, 0 } },
+ { 0x39b, 1, { 0x3bb, 0 } },
+ { 0x39c, 1, { 0x3bc, 0 } },
+ { 0x39d, 1, { 0x3bd, 0 } },
+ { 0x39e, 1, { 0x3be, 0 } },
+ { 0x39f, 1, { 0x3bf, 0 } },
+ { 0x3a0, 1, { 0x3c0, 0 } },
+ { 0x3a1, 1, { 0x3c1, 0 } },
+ { 0x3a3, 1, { 0x3c3, 0 } },
+ { 0x3a4, 1, { 0x3c4, 0 } },
+ { 0x3a5, 1, { 0x3c5, 0 } },
+ { 0x3a6, 1, { 0x3c6, 0 } },
+ { 0x3a7, 1, { 0x3c7, 0 } },
+ { 0x3a8, 1, { 0x3c8, 0 } },
+ { 0x3a9, 1, { 0x3c9, 0 } },
+ { 0x3aa, 1, { 0x3ca, 0 } },
+ { 0x3ab, 1, { 0x3cb, 0 } },
+ { 0x3c2, 1, { 0x3c3, 0 } },
+ { 0x3cf, 1, { 0x3d7, 0 } },
+ { 0x3d0, 1, { 0x3b2, 0 } },
+ { 0x3d1, 1, { 0x3b8, 0 } },
+ { 0x3d2, 1, { 0x3c5, 0 } },
+ { 0x3d3, 1, { 0x3cd, 0 } },
+ { 0x3d4, 1, { 0x3cb, 0 } },
+ { 0x3d5, 1, { 0x3c6, 0 } },
+ { 0x3d6, 1, { 0x3c0, 0 } },
+ { 0x3d8, 1, { 0x3d9, 0 } },
+ { 0x3da, 1, { 0x3db, 0 } },
+ { 0x3dc, 1, { 0x3dd, 0 } },
+ { 0x3de, 1, { 0x3df, 0 } },
+ { 0x3e0, 1, { 0x3e1, 0 } },
+ { 0x3e2, 1, { 0x3e3, 0 } },
+ { 0x3e4, 1, { 0x3e5, 0 } },
+ { 0x3e6, 1, { 0x3e7, 0 } },
+ { 0x3e8, 1, { 0x3e9, 0 } },
+ { 0x3ea, 1, { 0x3eb, 0 } },
+ { 0x3ec, 1, { 0x3ed, 0 } },
+ { 0x3ee, 1, { 0x3ef, 0 } },
+ { 0x3f0, 1, { 0x3ba, 0 } },
+ { 0x3f1, 1, { 0x3c1, 0 } },
+ { 0x3f2, 1, { 0x3c3, 0 } },
+ { 0x3f4, 1, { 0x3b8, 0 } },
+ { 0x3f5, 1, { 0x3b5, 0 } },
+ { 0x3f7, 1, { 0x3f8, 0 } },
+ { 0x3f9, 1, { 0x3c3, 0 } },
+ { 0x3fa, 1, { 0x3fb, 0 } },
+ { 0x3fd, 1, { 0x37b, 0 } },
+ { 0x3fe, 1, { 0x37c, 0 } },
+ { 0x3ff, 1, { 0x37d, 0 } },
+ { 0x400, 1, { 0x450, 0 } },
+ { 0x401, 1, { 0x451, 0 } },
+ { 0x402, 1, { 0x452, 0 } },
+ { 0x403, 1, { 0x453, 0 } },
+ { 0x404, 1, { 0x454, 0 } },
+ { 0x405, 1, { 0x455, 0 } },
+ { 0x406, 1, { 0x456, 0 } },
+ { 0x407, 1, { 0x457, 0 } },
+ { 0x408, 1, { 0x458, 0 } },
+ { 0x409, 1, { 0x459, 0 } },
+ { 0x40a, 1, { 0x45a, 0 } },
+ { 0x40b, 1, { 0x45b, 0 } },
+ { 0x40c, 1, { 0x45c, 0 } },
+ { 0x40d, 1, { 0x45d, 0 } },
+ { 0x40e, 1, { 0x45e, 0 } },
+ { 0x40f, 1, { 0x45f, 0 } },
+ { 0x410, 1, { 0x430, 0 } },
+ { 0x411, 1, { 0x431, 0 } },
+ { 0x412, 1, { 0x432, 0 } },
+ { 0x413, 1, { 0x433, 0 } },
+ { 0x414, 1, { 0x434, 0 } },
+ { 0x415, 1, { 0x435, 0 } },
+ { 0x416, 1, { 0x436, 0 } },
+ { 0x417, 1, { 0x437, 0 } },
+ { 0x418, 1, { 0x438, 0 } },
+ { 0x419, 1, { 0x439, 0 } },
+ { 0x41a, 1, { 0x43a, 0 } },
+ { 0x41b, 1, { 0x43b, 0 } },
+ { 0x41c, 1, { 0x43c, 0 } },
+ { 0x41d, 1, { 0x43d, 0 } },
+ { 0x41e, 1, { 0x43e, 0 } },
+ { 0x41f, 1, { 0x43f, 0 } },
+ { 0x420, 1, { 0x440, 0 } },
+ { 0x421, 1, { 0x441, 0 } },
+ { 0x422, 1, { 0x442, 0 } },
+ { 0x423, 1, { 0x443, 0 } },
+ { 0x424, 1, { 0x444, 0 } },
+ { 0x425, 1, { 0x445, 0 } },
+ { 0x426, 1, { 0x446, 0 } },
+ { 0x427, 1, { 0x447, 0 } },
+ { 0x428, 1, { 0x448, 0 } },
+ { 0x429, 1, { 0x449, 0 } },
+ { 0x42a, 1, { 0x44a, 0 } },
+ { 0x42b, 1, { 0x44b, 0 } },
+ { 0x42c, 1, { 0x44c, 0 } },
+ { 0x42d, 1, { 0x44d, 0 } },
+ { 0x42e, 1, { 0x44e, 0 } },
+ { 0x42f, 1, { 0x44f, 0 } },
+ { 0x460, 1, { 0x461, 0 } },
+ { 0x462, 1, { 0x463, 0 } },
+ { 0x464, 1, { 0x465, 0 } },
+ { 0x466, 1, { 0x467, 0 } },
+ { 0x468, 1, { 0x469, 0 } },
+ { 0x46a, 1, { 0x46b, 0 } },
+ { 0x46c, 1, { 0x46d, 0 } },
+ { 0x46e, 1, { 0x46f, 0 } },
+ { 0x470, 1, { 0x471, 0 } },
+ { 0x472, 1, { 0x473, 0 } },
+ { 0x474, 1, { 0x475, 0 } },
+ { 0x476, 1, { 0x477, 0 } },
+ { 0x478, 1, { 0x479, 0 } },
+ { 0x47a, 1, { 0x47b, 0 } },
+ { 0x47c, 1, { 0x47d, 0 } },
+ { 0x47e, 1, { 0x47f, 0 } },
+ { 0x480, 1, { 0x481, 0 } },
+ { 0x48a, 1, { 0x48b, 0 } },
+ { 0x48c, 1, { 0x48d, 0 } },
+ { 0x48e, 1, { 0x48f, 0 } },
+ { 0x490, 1, { 0x491, 0 } },
+ { 0x492, 1, { 0x493, 0 } },
+ { 0x494, 1, { 0x495, 0 } },
+ { 0x496, 1, { 0x497, 0 } },
+ { 0x498, 1, { 0x499, 0 } },
+ { 0x49a, 1, { 0x49b, 0 } },
+ { 0x49c, 1, { 0x49d, 0 } },
+ { 0x49e, 1, { 0x49f, 0 } },
+ { 0x4a0, 1, { 0x4a1, 0 } },
+ { 0x4a2, 1, { 0x4a3, 0 } },
+ { 0x4a4, 1, { 0x4a5, 0 } },
+ { 0x4a6, 1, { 0x4a7, 0 } },
+ { 0x4a8, 1, { 0x4a9, 0 } },
+ { 0x4aa, 1, { 0x4ab, 0 } },
+ { 0x4ac, 1, { 0x4ad, 0 } },
+ { 0x4ae, 1, { 0x4af, 0 } },
+ { 0x4b0, 1, { 0x4b1, 0 } },
+ { 0x4b2, 1, { 0x4b3, 0 } },
+ { 0x4b4, 1, { 0x4b5, 0 } },
+ { 0x4b6, 1, { 0x4b7, 0 } },
+ { 0x4b8, 1, { 0x4b9, 0 } },
+ { 0x4ba, 1, { 0x4bb, 0 } },
+ { 0x4bc, 1, { 0x4bd, 0 } },
+ { 0x4be, 1, { 0x4bf, 0 } },
+ { 0x4c1, 1, { 0x4c2, 0 } },
+ { 0x4c3, 1, { 0x4c4, 0 } },
+ { 0x4c5, 1, { 0x4c6, 0 } },
+ { 0x4c7, 1, { 0x4c8, 0 } },
+ { 0x4c9, 1, { 0x4ca, 0 } },
+ { 0x4cb, 1, { 0x4cc, 0 } },
+ { 0x4cd, 1, { 0x4ce, 0 } },
+ { 0x4d0, 1, { 0x4d1, 0 } },
+ { 0x4d2, 1, { 0x4d3, 0 } },
+ { 0x4d4, 1, { 0x4d5, 0 } },
+ { 0x4d6, 1, { 0x4d7, 0 } },
+ { 0x4d8, 1, { 0x4d9, 0 } },
+ { 0x4da, 1, { 0x4db, 0 } },
+ { 0x4dc, 1, { 0x4dd, 0 } },
+ { 0x4de, 1, { 0x4df, 0 } },
+ { 0x4e0, 1, { 0x4e1, 0 } },
+ { 0x4e2, 1, { 0x4e3, 0 } },
+ { 0x4e4, 1, { 0x4e5, 0 } },
+ { 0x4e6, 1, { 0x4e7, 0 } },
+ { 0x4e8, 1, { 0x4e9, 0 } },
+ { 0x4ea, 1, { 0x4eb, 0 } },
+ { 0x4ec, 1, { 0x4ed, 0 } },
+ { 0x4ee, 1, { 0x4ef, 0 } },
+ { 0x4f0, 1, { 0x4f1, 0 } },
+ { 0x4f2, 1, { 0x4f3, 0 } },
+ { 0x4f4, 1, { 0x4f5, 0 } },
+ { 0x4f6, 1, { 0x4f7, 0 } },
+ { 0x4f8, 1, { 0x4f9, 0 } },
+ { 0x4fa, 1, { 0x4fb, 0 } },
+ { 0x4fc, 1, { 0x4fd, 0 } },
+ { 0x4fe, 1, { 0x4ff, 0 } },
+ { 0x500, 1, { 0x501, 0 } },
+ { 0x502, 1, { 0x503, 0 } },
+ { 0x504, 1, { 0x505, 0 } },
+ { 0x506, 1, { 0x507, 0 } },
+ { 0x508, 1, { 0x509, 0 } },
+ { 0x50a, 1, { 0x50b, 0 } },
+ { 0x50c, 1, { 0x50d, 0 } },
+ { 0x50e, 1, { 0x50f, 0 } },
+ { 0x510, 1, { 0x511, 0 } },
+ { 0x512, 1, { 0x513, 0 } },
+ { 0x514, 1, { 0x515, 0 } },
+ { 0x516, 1, { 0x517, 0 } },
+ { 0x518, 1, { 0x519, 0 } },
+ { 0x51a, 1, { 0x51b, 0 } },
+ { 0x51c, 1, { 0x51d, 0 } },
+ { 0x51e, 1, { 0x51f, 0 } },
+ { 0x520, 1, { 0x521, 0 } },
+ { 0x522, 1, { 0x523, 0 } },
+ { 0x524, 1, { 0x525, 0 } },
+ { 0x526, 1, { 0x527, 0 } },
+ { 0x528, 1, { 0x529, 0 } },
+ { 0x52a, 1, { 0x52b, 0 } },
+ { 0x52c, 1, { 0x52d, 0 } },
+ { 0x52e, 1, { 0x52f, 0 } },
+ { 0x531, 1, { 0x561, 0 } },
+ { 0x532, 1, { 0x562, 0 } },
+ { 0x533, 1, { 0x563, 0 } },
+ { 0x534, 1, { 0x564, 0 } },
+ { 0x535, 1, { 0x565, 0 } },
+ { 0x536, 1, { 0x566, 0 } },
+ { 0x537, 1, { 0x567, 0 } },
+ { 0x538, 1, { 0x568, 0 } },
+ { 0x539, 1, { 0x569, 0 } },
+ { 0x53a, 1, { 0x56a, 0 } },
+ { 0x53b, 1, { 0x56b, 0 } },
+ { 0x53c, 1, { 0x56c, 0 } },
+ { 0x53d, 1, { 0x56d, 0 } },
+ { 0x53e, 1, { 0x56e, 0 } },
+ { 0x53f, 1, { 0x56f, 0 } },
+ { 0x540, 1, { 0x570, 0 } },
+ { 0x541, 1, { 0x571, 0 } },
+ { 0x542, 1, { 0x572, 0 } },
+ { 0x543, 1, { 0x573, 0 } },
+ { 0x544, 1, { 0x574, 0 } },
+ { 0x545, 1, { 0x575, 0 } },
+ { 0x546, 1, { 0x576, 0 } },
+ { 0x547, 1, { 0x577, 0 } },
+ { 0x548, 1, { 0x578, 0 } },
+ { 0x549, 1, { 0x579, 0 } },
+ { 0x54a, 1, { 0x57a, 0 } },
+ { 0x54b, 1, { 0x57b, 0 } },
+ { 0x54c, 1, { 0x57c, 0 } },
+ { 0x54d, 1, { 0x57d, 0 } },
+ { 0x54e, 1, { 0x57e, 0 } },
+ { 0x54f, 1, { 0x57f, 0 } },
+ { 0x550, 1, { 0x580, 0 } },
+ { 0x551, 1, { 0x581, 0 } },
+ { 0x552, 1, { 0x582, 0 } },
+ { 0x553, 1, { 0x583, 0 } },
+ { 0x554, 1, { 0x584, 0 } },
+ { 0x555, 1, { 0x585, 0 } },
+ { 0x556, 1, { 0x586, 0 } },
+ { 0x587, 2, { 0x565, 0x582 } },
+ { 0x675, 2, { 0x627, 0x674 } },
+ { 0x676, 2, { 0x648, 0x674 } },
+ { 0x677, 2, { 0x6c7, 0x674 } },
+ { 0x678, 2, { 0x64a, 0x674 } },
+ { 0x958, 2, { 0x915, 0x93c } },
+ { 0x959, 2, { 0x916, 0x93c } },
+ { 0x95a, 2, { 0x917, 0x93c } },
+ { 0x95b, 2, { 0x91c, 0x93c } },
+ { 0x95c, 2, { 0x921, 0x93c } },
+ { 0x95d, 2, { 0x922, 0x93c } },
+ { 0x95e, 2, { 0x92b, 0x93c } },
+ { 0x95f, 2, { 0x92f, 0x93c } },
+ { 0x9dc, 2, { 0x9a1, 0x9bc } },
+ { 0x9dd, 2, { 0x9a2, 0x9bc } },
+ { 0x9df, 2, { 0x9af, 0x9bc } },
+ { 0xa33, 2, { 0xa32, 0xa3c } },
+ { 0xa36, 2, { 0xa38, 0xa3c } },
+ { 0xa59, 2, { 0xa16, 0xa3c } },
+ { 0xa5a, 2, { 0xa17, 0xa3c } },
+ { 0xa5b, 2, { 0xa1c, 0xa3c } },
+ { 0xa5e, 2, { 0xa2b, 0xa3c } },
+ { 0xb5c, 2, { 0xb21, 0xb3c } },
+ { 0xb5d, 2, { 0xb22, 0xb3c } },
+ { 0xe33, 2, { 0xe4d, 0xe32 } },
+ { 0xeb3, 2, { 0xecd, 0xeb2 } },
+ { 0xedc, 2, { 0xeab, 0xe99 } },
+ { 0xedd, 2, { 0xeab, 0xea1 } },
+ { 0xf0c, 1, { 0xf0b, 0 } },
+ { 0xf43, 2, { 0xf42, 0xfb7 } },
+ { 0xf4d, 2, { 0xf4c, 0xfb7 } },
+ { 0xf52, 2, { 0xf51, 0xfb7 } },
+ { 0xf57, 2, { 0xf56, 0xfb7 } },
+ { 0xf5c, 2, { 0xf5b, 0xfb7 } },
+ { 0xf69, 2, { 0xf40, 0xfb5 } },
+ { 0xf73, 2, { 0xf71, 0xf72 } },
+ { 0xf75, 2, { 0xf71, 0xf74 } },
+ { 0xf76, 2, { 0xfb2, 0xf80 } },
+ { 0xf77, 3, { 604, 0 } },
+ { 0xf78, 2, { 0xfb3, 0xf80 } },
+ { 0xf79, 3, { 807, 0 } },
+ { 0xf81, 2, { 0xf71, 0xf80 } },
+ { 0xf93, 2, { 0xf92, 0xfb7 } },
+ { 0xf9d, 2, { 0xf9c, 0xfb7 } },
+ { 0xfa2, 2, { 0xfa1, 0xfb7 } },
+ { 0xfa7, 2, { 0xfa6, 0xfb7 } },
+ { 0xfac, 2, { 0xfab, 0xfb7 } },
+ { 0xfb9, 2, { 0xf90, 0xfb5 } },
+ { 0x10c7, 1, { 0x2d27, 0 } },
+ { 0x10cd, 1, { 0x2d2d, 0 } },
+ { 0x10fc, 1, { 0x10dc, 0 } },
+ { 0x13f8, 1, { 0x13f0, 0 } },
+ { 0x13f9, 1, { 0x13f1, 0 } },
+ { 0x13fa, 1, { 0x13f2, 0 } },
+ { 0x13fb, 1, { 0x13f3, 0 } },
+ { 0x13fc, 1, { 0x13f4, 0 } },
+ { 0x13fd, 1, { 0x13f5, 0 } },
+ { 0x1c80, 1, { 0x432, 0 } },
+ { 0x1c81, 1, { 0x434, 0 } },
+ { 0x1c82, 1, { 0x43e, 0 } },
+ { 0x1c83, 1, { 0x441, 0 } },
+ { 0x1c84, 1, { 0x442, 0 } },
+ { 0x1c85, 1, { 0x442, 0 } },
+ { 0x1c86, 1, { 0x44a, 0 } },
+ { 0x1c87, 1, { 0x463, 0 } },
+ { 0x1c88, 1, { 0xa64b, 0 } },
+ { 0x1c90, 1, { 0x10d0, 0 } },
+ { 0x1c91, 1, { 0x10d1, 0 } },
+ { 0x1c92, 1, { 0x10d2, 0 } },
+ { 0x1c93, 1, { 0x10d3, 0 } },
+ { 0x1c94, 1, { 0x10d4, 0 } },
+ { 0x1c95, 1, { 0x10d5, 0 } },
+ { 0x1c96, 1, { 0x10d6, 0 } },
+ { 0x1c97, 1, { 0x10d7, 0 } },
+ { 0x1c98, 1, { 0x10d8, 0 } },
+ { 0x1c99, 1, { 0x10d9, 0 } },
+ { 0x1c9a, 1, { 0x10da, 0 } },
+ { 0x1c9b, 1, { 0x10db, 0 } },
+ { 0x1c9c, 1, { 0x10dc, 0 } },
+ { 0x1c9d, 1, { 0x10dd, 0 } },
+ { 0x1c9e, 1, { 0x10de, 0 } },
+ { 0x1c9f, 1, { 0x10df, 0 } },
+ { 0x1ca0, 1, { 0x10e0, 0 } },
+ { 0x1ca1, 1, { 0x10e1, 0 } },
+ { 0x1ca2, 1, { 0x10e2, 0 } },
+ { 0x1ca3, 1, { 0x10e3, 0 } },
+ { 0x1ca4, 1, { 0x10e4, 0 } },
+ { 0x1ca5, 1, { 0x10e5, 0 } },
+ { 0x1ca6, 1, { 0x10e6, 0 } },
+ { 0x1ca7, 1, { 0x10e7, 0 } },
+ { 0x1ca8, 1, { 0x10e8, 0 } },
+ { 0x1ca9, 1, { 0x10e9, 0 } },
+ { 0x1caa, 1, { 0x10ea, 0 } },
+ { 0x1cab, 1, { 0x10eb, 0 } },
+ { 0x1cac, 1, { 0x10ec, 0 } },
+ { 0x1cad, 1, { 0x10ed, 0 } },
+ { 0x1cae, 1, { 0x10ee, 0 } },
+ { 0x1caf, 1, { 0x10ef, 0 } },
+ { 0x1cb0, 1, { 0x10f0, 0 } },
+ { 0x1cb1, 1, { 0x10f1, 0 } },
+ { 0x1cb2, 1, { 0x10f2, 0 } },
+ { 0x1cb3, 1, { 0x10f3, 0 } },
+ { 0x1cb4, 1, { 0x10f4, 0 } },
+ { 0x1cb5, 1, { 0x10f5, 0 } },
+ { 0x1cb6, 1, { 0x10f6, 0 } },
+ { 0x1cb7, 1, { 0x10f7, 0 } },
+ { 0x1cb8, 1, { 0x10f8, 0 } },
+ { 0x1cb9, 1, { 0x10f9, 0 } },
+ { 0x1cba, 1, { 0x10fa, 0 } },
+ { 0x1cbd, 1, { 0x10fd, 0 } },
+ { 0x1cbe, 1, { 0x10fe, 0 } },
+ { 0x1cbf, 1, { 0x10ff, 0 } },
+ { 0x1d2c, 1, { 0x61, 0 } },
+ { 0x1d2d, 1, { 0xe6, 0 } },
+ { 0x1d2e, 1, { 0x62, 0 } },
+ { 0x1d30, 1, { 0x64, 0 } },
+ { 0x1d31, 1, { 0x65, 0 } },
+ { 0x1d32, 1, { 0x1dd, 0 } },
+ { 0x1d33, 1, { 0x67, 0 } },
+ { 0x1d34, 1, { 0x68, 0 } },
+ { 0x1d35, 1, { 0x69, 0 } },
+ { 0x1d36, 1, { 0x6a, 0 } },
+ { 0x1d37, 1, { 0x6b, 0 } },
+ { 0x1d38, 1, { 0x6c, 0 } },
+ { 0x1d39, 1, { 0x6d, 0 } },
+ { 0x1d3a, 1, { 0x6e, 0 } },
+ { 0x1d3c, 1, { 0x6f, 0 } },
+ { 0x1d3d, 1, { 0x223, 0 } },
+ { 0x1d3e, 1, { 0x70, 0 } },
+ { 0x1d3f, 1, { 0x72, 0 } },
+ { 0x1d40, 1, { 0x74, 0 } },
+ { 0x1d41, 1, { 0x75, 0 } },
+ { 0x1d42, 1, { 0x77, 0 } },
+ { 0x1d43, 1, { 0x61, 0 } },
+ { 0x1d44, 1, { 0x250, 0 } },
+ { 0x1d45, 1, { 0x251, 0 } },
+ { 0x1d46, 1, { 0x1d02, 0 } },
+ { 0x1d47, 1, { 0x62, 0 } },
+ { 0x1d48, 1, { 0x64, 0 } },
+ { 0x1d49, 1, { 0x65, 0 } },
+ { 0x1d4a, 1, { 0x259, 0 } },
+ { 0x1d4b, 1, { 0x25b, 0 } },
+ { 0x1d4c, 1, { 0x25c, 0 } },
+ { 0x1d4d, 1, { 0x67, 0 } },
+ { 0x1d4f, 1, { 0x6b, 0 } },
+ { 0x1d50, 1, { 0x6d, 0 } },
+ { 0x1d51, 1, { 0x14b, 0 } },
+ { 0x1d52, 1, { 0x6f, 0 } },
+ { 0x1d53, 1, { 0x254, 0 } },
+ { 0x1d54, 1, { 0x1d16, 0 } },
+ { 0x1d55, 1, { 0x1d17, 0 } },
+ { 0x1d56, 1, { 0x70, 0 } },
+ { 0x1d57, 1, { 0x74, 0 } },
+ { 0x1d58, 1, { 0x75, 0 } },
+ { 0x1d59, 1, { 0x1d1d, 0 } },
+ { 0x1d5a, 1, { 0x26f, 0 } },
+ { 0x1d5b, 1, { 0x76, 0 } },
+ { 0x1d5c, 1, { 0x1d25, 0 } },
+ { 0x1d5d, 1, { 0x3b2, 0 } },
+ { 0x1d5e, 1, { 0x3b3, 0 } },
+ { 0x1d5f, 1, { 0x3b4, 0 } },
+ { 0x1d60, 1, { 0x3c6, 0 } },
+ { 0x1d61, 1, { 0x3c7, 0 } },
+ { 0x1d62, 1, { 0x69, 0 } },
+ { 0x1d63, 1, { 0x72, 0 } },
+ { 0x1d64, 1, { 0x75, 0 } },
+ { 0x1d65, 1, { 0x76, 0 } },
+ { 0x1d66, 1, { 0x3b2, 0 } },
+ { 0x1d67, 1, { 0x3b3, 0 } },
+ { 0x1d68, 1, { 0x3c1, 0 } },
+ { 0x1d69, 1, { 0x3c6, 0 } },
+ { 0x1d6a, 1, { 0x3c7, 0 } },
+ { 0x1d78, 1, { 0x43d, 0 } },
+ { 0x1d9b, 1, { 0x252, 0 } },
+ { 0x1d9c, 1, { 0x63, 0 } },
+ { 0x1d9d, 1, { 0x255, 0 } },
+ { 0x1d9e, 1, { 0xf0, 0 } },
+ { 0x1d9f, 1, { 0x25c, 0 } },
+ { 0x1da0, 1, { 0x66, 0 } },
+ { 0x1da1, 1, { 0x25f, 0 } },
+ { 0x1da2, 1, { 0x261, 0 } },
+ { 0x1da3, 1, { 0x265, 0 } },
+ { 0x1da4, 1, { 0x268, 0 } },
+ { 0x1da5, 1, { 0x269, 0 } },
+ { 0x1da6, 1, { 0x26a, 0 } },
+ { 0x1da7, 1, { 0x1d7b, 0 } },
+ { 0x1da8, 1, { 0x29d, 0 } },
+ { 0x1da9, 1, { 0x26d, 0 } },
+ { 0x1daa, 1, { 0x1d85, 0 } },
+ { 0x1dab, 1, { 0x29f, 0 } },
+ { 0x1dac, 1, { 0x271, 0 } },
+ { 0x1dad, 1, { 0x270, 0 } },
+ { 0x1dae, 1, { 0x272, 0 } },
+ { 0x1daf, 1, { 0x273, 0 } },
+ { 0x1db0, 1, { 0x274, 0 } },
+ { 0x1db1, 1, { 0x275, 0 } },
+ { 0x1db2, 1, { 0x278, 0 } },
+ { 0x1db3, 1, { 0x282, 0 } },
+ { 0x1db4, 1, { 0x283, 0 } },
+ { 0x1db5, 1, { 0x1ab, 0 } },
+ { 0x1db6, 1, { 0x289, 0 } },
+ { 0x1db7, 1, { 0x28a, 0 } },
+ { 0x1db8, 1, { 0x1d1c, 0 } },
+ { 0x1db9, 1, { 0x28b, 0 } },
+ { 0x1dba, 1, { 0x28c, 0 } },
+ { 0x1dbb, 1, { 0x7a, 0 } },
+ { 0x1dbc, 1, { 0x290, 0 } },
+ { 0x1dbd, 1, { 0x291, 0 } },
+ { 0x1dbe, 1, { 0x292, 0 } },
+ { 0x1dbf, 1, { 0x3b8, 0 } },
+ { 0x1e00, 1, { 0x1e01, 0 } },
+ { 0x1e02, 1, { 0x1e03, 0 } },
+ { 0x1e04, 1, { 0x1e05, 0 } },
+ { 0x1e06, 1, { 0x1e07, 0 } },
+ { 0x1e08, 1, { 0x1e09, 0 } },
+ { 0x1e0a, 1, { 0x1e0b, 0 } },
+ { 0x1e0c, 1, { 0x1e0d, 0 } },
+ { 0x1e0e, 1, { 0x1e0f, 0 } },
+ { 0x1e10, 1, { 0x1e11, 0 } },
+ { 0x1e12, 1, { 0x1e13, 0 } },
+ { 0x1e14, 1, { 0x1e15, 0 } },
+ { 0x1e16, 1, { 0x1e17, 0 } },
+ { 0x1e18, 1, { 0x1e19, 0 } },
+ { 0x1e1a, 1, { 0x1e1b, 0 } },
+ { 0x1e1c, 1, { 0x1e1d, 0 } },
+ { 0x1e1e, 1, { 0x1e1f, 0 } },
+ { 0x1e20, 1, { 0x1e21, 0 } },
+ { 0x1e22, 1, { 0x1e23, 0 } },
+ { 0x1e24, 1, { 0x1e25, 0 } },
+ { 0x1e26, 1, { 0x1e27, 0 } },
+ { 0x1e28, 1, { 0x1e29, 0 } },
+ { 0x1e2a, 1, { 0x1e2b, 0 } },
+ { 0x1e2c, 1, { 0x1e2d, 0 } },
+ { 0x1e2e, 1, { 0x1e2f, 0 } },
+ { 0x1e30, 1, { 0x1e31, 0 } },
+ { 0x1e32, 1, { 0x1e33, 0 } },
+ { 0x1e34, 1, { 0x1e35, 0 } },
+ { 0x1e36, 1, { 0x1e37, 0 } },
+ { 0x1e38, 1, { 0x1e39, 0 } },
+ { 0x1e3a, 1, { 0x1e3b, 0 } },
+ { 0x1e3c, 1, { 0x1e3d, 0 } },
+ { 0x1e3e, 1, { 0x1e3f, 0 } },
+ { 0x1e40, 1, { 0x1e41, 0 } },
+ { 0x1e42, 1, { 0x1e43, 0 } },
+ { 0x1e44, 1, { 0x1e45, 0 } },
+ { 0x1e46, 1, { 0x1e47, 0 } },
+ { 0x1e48, 1, { 0x1e49, 0 } },
+ { 0x1e4a, 1, { 0x1e4b, 0 } },
+ { 0x1e4c, 1, { 0x1e4d, 0 } },
+ { 0x1e4e, 1, { 0x1e4f, 0 } },
+ { 0x1e50, 1, { 0x1e51, 0 } },
+ { 0x1e52, 1, { 0x1e53, 0 } },
+ { 0x1e54, 1, { 0x1e55, 0 } },
+ { 0x1e56, 1, { 0x1e57, 0 } },
+ { 0x1e58, 1, { 0x1e59, 0 } },
+ { 0x1e5a, 1, { 0x1e5b, 0 } },
+ { 0x1e5c, 1, { 0x1e5d, 0 } },
+ { 0x1e5e, 1, { 0x1e5f, 0 } },
+ { 0x1e60, 1, { 0x1e61, 0 } },
+ { 0x1e62, 1, { 0x1e63, 0 } },
+ { 0x1e64, 1, { 0x1e65, 0 } },
+ { 0x1e66, 1, { 0x1e67, 0 } },
+ { 0x1e68, 1, { 0x1e69, 0 } },
+ { 0x1e6a, 1, { 0x1e6b, 0 } },
+ { 0x1e6c, 1, { 0x1e6d, 0 } },
+ { 0x1e6e, 1, { 0x1e6f, 0 } },
+ { 0x1e70, 1, { 0x1e71, 0 } },
+ { 0x1e72, 1, { 0x1e73, 0 } },
+ { 0x1e74, 1, { 0x1e75, 0 } },
+ { 0x1e76, 1, { 0x1e77, 0 } },
+ { 0x1e78, 1, { 0x1e79, 0 } },
+ { 0x1e7a, 1, { 0x1e7b, 0 } },
+ { 0x1e7c, 1, { 0x1e7d, 0 } },
+ { 0x1e7e, 1, { 0x1e7f, 0 } },
+ { 0x1e80, 1, { 0x1e81, 0 } },
+ { 0x1e82, 1, { 0x1e83, 0 } },
+ { 0x1e84, 1, { 0x1e85, 0 } },
+ { 0x1e86, 1, { 0x1e87, 0 } },
+ { 0x1e88, 1, { 0x1e89, 0 } },
+ { 0x1e8a, 1, { 0x1e8b, 0 } },
+ { 0x1e8c, 1, { 0x1e8d, 0 } },
+ { 0x1e8e, 1, { 0x1e8f, 0 } },
+ { 0x1e90, 1, { 0x1e91, 0 } },
+ { 0x1e92, 1, { 0x1e93, 0 } },
+ { 0x1e94, 1, { 0x1e95, 0 } },
+ { 0x1e9a, 2, { 0x61, 0x2be } },
+ { 0x1e9b, 1, { 0x1e61, 0 } },
+ { 0x1e9e, 1, { 0xdf, 0 } },
+ { 0x1ea0, 1, { 0x1ea1, 0 } },
+ { 0x1ea2, 1, { 0x1ea3, 0 } },
+ { 0x1ea4, 1, { 0x1ea5, 0 } },
+ { 0x1ea6, 1, { 0x1ea7, 0 } },
+ { 0x1ea8, 1, { 0x1ea9, 0 } },
+ { 0x1eaa, 1, { 0x1eab, 0 } },
+ { 0x1eac, 1, { 0x1ead, 0 } },
+ { 0x1eae, 1, { 0x1eaf, 0 } },
+ { 0x1eb0, 1, { 0x1eb1, 0 } },
+ { 0x1eb2, 1, { 0x1eb3, 0 } },
+ { 0x1eb4, 1, { 0x1eb5, 0 } },
+ { 0x1eb6, 1, { 0x1eb7, 0 } },
+ { 0x1eb8, 1, { 0x1eb9, 0 } },
+ { 0x1eba, 1, { 0x1ebb, 0 } },
+ { 0x1ebc, 1, { 0x1ebd, 0 } },
+ { 0x1ebe, 1, { 0x1ebf, 0 } },
+ { 0x1ec0, 1, { 0x1ec1, 0 } },
+ { 0x1ec2, 1, { 0x1ec3, 0 } },
+ { 0x1ec4, 1, { 0x1ec5, 0 } },
+ { 0x1ec6, 1, { 0x1ec7, 0 } },
+ { 0x1ec8, 1, { 0x1ec9, 0 } },
+ { 0x1eca, 1, { 0x1ecb, 0 } },
+ { 0x1ecc, 1, { 0x1ecd, 0 } },
+ { 0x1ece, 1, { 0x1ecf, 0 } },
+ { 0x1ed0, 1, { 0x1ed1, 0 } },
+ { 0x1ed2, 1, { 0x1ed3, 0 } },
+ { 0x1ed4, 1, { 0x1ed5, 0 } },
+ { 0x1ed6, 1, { 0x1ed7, 0 } },
+ { 0x1ed8, 1, { 0x1ed9, 0 } },
+ { 0x1eda, 1, { 0x1edb, 0 } },
+ { 0x1edc, 1, { 0x1edd, 0 } },
+ { 0x1ede, 1, { 0x1edf, 0 } },
+ { 0x1ee0, 1, { 0x1ee1, 0 } },
+ { 0x1ee2, 1, { 0x1ee3, 0 } },
+ { 0x1ee4, 1, { 0x1ee5, 0 } },
+ { 0x1ee6, 1, { 0x1ee7, 0 } },
+ { 0x1ee8, 1, { 0x1ee9, 0 } },
+ { 0x1eea, 1, { 0x1eeb, 0 } },
+ { 0x1eec, 1, { 0x1eed, 0 } },
+ { 0x1eee, 1, { 0x1eef, 0 } },
+ { 0x1ef0, 1, { 0x1ef1, 0 } },
+ { 0x1ef2, 1, { 0x1ef3, 0 } },
+ { 0x1ef4, 1, { 0x1ef5, 0 } },
+ { 0x1ef6, 1, { 0x1ef7, 0 } },
+ { 0x1ef8, 1, { 0x1ef9, 0 } },
+ { 0x1efa, 1, { 0x1efb, 0 } },
+ { 0x1efc, 1, { 0x1efd, 0 } },
+ { 0x1efe, 1, { 0x1eff, 0 } },
+ { 0x1f08, 1, { 0x1f00, 0 } },
+ { 0x1f09, 1, { 0x1f01, 0 } },
+ { 0x1f0a, 1, { 0x1f02, 0 } },
+ { 0x1f0b, 1, { 0x1f03, 0 } },
+ { 0x1f0c, 1, { 0x1f04, 0 } },
+ { 0x1f0d, 1, { 0x1f05, 0 } },
+ { 0x1f0e, 1, { 0x1f06, 0 } },
+ { 0x1f0f, 1, { 0x1f07, 0 } },
+ { 0x1f18, 1, { 0x1f10, 0 } },
+ { 0x1f19, 1, { 0x1f11, 0 } },
+ { 0x1f1a, 1, { 0x1f12, 0 } },
+ { 0x1f1b, 1, { 0x1f13, 0 } },
+ { 0x1f1c, 1, { 0x1f14, 0 } },
+ { 0x1f1d, 1, { 0x1f15, 0 } },
+ { 0x1f28, 1, { 0x1f20, 0 } },
+ { 0x1f29, 1, { 0x1f21, 0 } },
+ { 0x1f2a, 1, { 0x1f22, 0 } },
+ { 0x1f2b, 1, { 0x1f23, 0 } },
+ { 0x1f2c, 1, { 0x1f24, 0 } },
+ { 0x1f2d, 1, { 0x1f25, 0 } },
+ { 0x1f2e, 1, { 0x1f26, 0 } },
+ { 0x1f2f, 1, { 0x1f27, 0 } },
+ { 0x1f38, 1, { 0x1f30, 0 } },
+ { 0x1f39, 1, { 0x1f31, 0 } },
+ { 0x1f3a, 1, { 0x1f32, 0 } },
+ { 0x1f3b, 1, { 0x1f33, 0 } },
+ { 0x1f3c, 1, { 0x1f34, 0 } },
+ { 0x1f3d, 1, { 0x1f35, 0 } },
+ { 0x1f3e, 1, { 0x1f36, 0 } },
+ { 0x1f3f, 1, { 0x1f37, 0 } },
+ { 0x1f48, 1, { 0x1f40, 0 } },
+ { 0x1f49, 1, { 0x1f41, 0 } },
+ { 0x1f4a, 1, { 0x1f42, 0 } },
+ { 0x1f4b, 1, { 0x1f43, 0 } },
+ { 0x1f4c, 1, { 0x1f44, 0 } },
+ { 0x1f4d, 1, { 0x1f45, 0 } },
+ { 0x1f59, 1, { 0x1f51, 0 } },
+ { 0x1f5b, 1, { 0x1f53, 0 } },
+ { 0x1f5d, 1, { 0x1f55, 0 } },
+ { 0x1f5f, 1, { 0x1f57, 0 } },
+ { 0x1f68, 1, { 0x1f60, 0 } },
+ { 0x1f69, 1, { 0x1f61, 0 } },
+ { 0x1f6a, 1, { 0x1f62, 0 } },
+ { 0x1f6b, 1, { 0x1f63, 0 } },
+ { 0x1f6c, 1, { 0x1f64, 0 } },
+ { 0x1f6d, 1, { 0x1f65, 0 } },
+ { 0x1f6e, 1, { 0x1f66, 0 } },
+ { 0x1f6f, 1, { 0x1f67, 0 } },
+ { 0x1f71, 1, { 0x3ac, 0 } },
+ { 0x1f73, 1, { 0x3ad, 0 } },
+ { 0x1f75, 1, { 0x3ae, 0 } },
+ { 0x1f77, 1, { 0x3af, 0 } },
+ { 0x1f79, 1, { 0x3cc, 0 } },
+ { 0x1f7b, 1, { 0x3cd, 0 } },
+ { 0x1f7d, 1, { 0x3ce, 0 } },
+ { 0x1f80, 2, { 0x1f00, 0x3b9 } },
+ { 0x1f81, 2, { 0x1f01, 0x3b9 } },
+ { 0x1f82, 2, { 0x1f02, 0x3b9 } },
+ { 0x1f83, 2, { 0x1f03, 0x3b9 } },
+ { 0x1f84, 2, { 0x1f04, 0x3b9 } },
+ { 0x1f85, 2, { 0x1f05, 0x3b9 } },
+ { 0x1f86, 2, { 0x1f06, 0x3b9 } },
+ { 0x1f87, 2, { 0x1f07, 0x3b9 } },
+ { 0x1f88, 2, { 0x1f00, 0x3b9 } },
+ { 0x1f89, 2, { 0x1f01, 0x3b9 } },
+ { 0x1f8a, 2, { 0x1f02, 0x3b9 } },
+ { 0x1f8b, 2, { 0x1f03, 0x3b9 } },
+ { 0x1f8c, 2, { 0x1f04, 0x3b9 } },
+ { 0x1f8d, 2, { 0x1f05, 0x3b9 } },
+ { 0x1f8e, 2, { 0x1f06, 0x3b9 } },
+ { 0x1f8f, 2, { 0x1f07, 0x3b9 } },
+ { 0x1f90, 2, { 0x1f20, 0x3b9 } },
+ { 0x1f91, 2, { 0x1f21, 0x3b9 } },
+ { 0x1f92, 2, { 0x1f22, 0x3b9 } },
+ { 0x1f93, 2, { 0x1f23, 0x3b9 } },
+ { 0x1f94, 2, { 0x1f24, 0x3b9 } },
+ { 0x1f95, 2, { 0x1f25, 0x3b9 } },
+ { 0x1f96, 2, { 0x1f26, 0x3b9 } },
+ { 0x1f97, 2, { 0x1f27, 0x3b9 } },
+ { 0x1f98, 2, { 0x1f20, 0x3b9 } },
+ { 0x1f99, 2, { 0x1f21, 0x3b9 } },
+ { 0x1f9a, 2, { 0x1f22, 0x3b9 } },
+ { 0x1f9b, 2, { 0x1f23, 0x3b9 } },
+ { 0x1f9c, 2, { 0x1f24, 0x3b9 } },
+ { 0x1f9d, 2, { 0x1f25, 0x3b9 } },
+ { 0x1f9e, 2, { 0x1f26, 0x3b9 } },
+ { 0x1f9f, 2, { 0x1f27, 0x3b9 } },
+ { 0x1fa0, 2, { 0x1f60, 0x3b9 } },
+ { 0x1fa1, 2, { 0x1f61, 0x3b9 } },
+ { 0x1fa2, 2, { 0x1f62, 0x3b9 } },
+ { 0x1fa3, 2, { 0x1f63, 0x3b9 } },
+ { 0x1fa4, 2, { 0x1f64, 0x3b9 } },
+ { 0x1fa5, 2, { 0x1f65, 0x3b9 } },
+ { 0x1fa6, 2, { 0x1f66, 0x3b9 } },
+ { 0x1fa7, 2, { 0x1f67, 0x3b9 } },
+ { 0x1fa8, 2, { 0x1f60, 0x3b9 } },
+ { 0x1fa9, 2, { 0x1f61, 0x3b9 } },
+ { 0x1faa, 2, { 0x1f62, 0x3b9 } },
+ { 0x1fab, 2, { 0x1f63, 0x3b9 } },
+ { 0x1fac, 2, { 0x1f64, 0x3b9 } },
+ { 0x1fad, 2, { 0x1f65, 0x3b9 } },
+ { 0x1fae, 2, { 0x1f66, 0x3b9 } },
+ { 0x1faf, 2, { 0x1f67, 0x3b9 } },
+ { 0x1fb2, 2, { 0x1f70, 0x3b9 } },
+ { 0x1fb3, 2, { 0x3b1, 0x3b9 } },
+ { 0x1fb4, 2, { 0x3ac, 0x3b9 } },
+ { 0x1fb7, 2, { 0x1fb6, 0x3b9 } },
+ { 0x1fb8, 1, { 0x1fb0, 0 } },
+ { 0x1fb9, 1, { 0x1fb1, 0 } },
+ { 0x1fba, 1, { 0x1f70, 0 } },
+ { 0x1fbb, 1, { 0x3ac, 0 } },
+ { 0x1fbc, 2, { 0x3b1, 0x3b9 } },
+ { 0x1fbe, 1, { 0x3b9, 0 } },
+ { 0x1fc2, 2, { 0x1f74, 0x3b9 } },
+ { 0x1fc3, 2, { 0x3b7, 0x3b9 } },
+ { 0x1fc4, 2, { 0x3ae, 0x3b9 } },
+ { 0x1fc7, 2, { 0x1fc6, 0x3b9 } },
+ { 0x1fc8, 1, { 0x1f72, 0 } },
+ { 0x1fc9, 1, { 0x3ad, 0 } },
+ { 0x1fca, 1, { 0x1f74, 0 } },
+ { 0x1fcb, 1, { 0x3ae, 0 } },
+ { 0x1fcc, 2, { 0x3b7, 0x3b9 } },
+ { 0x1fd3, 1, { 0x390, 0 } },
+ { 0x1fd8, 1, { 0x1fd0, 0 } },
+ { 0x1fd9, 1, { 0x1fd1, 0 } },
+ { 0x1fda, 1, { 0x1f76, 0 } },
+ { 0x1fdb, 1, { 0x3af, 0 } },
+ { 0x1fe3, 1, { 0x3b0, 0 } },
+ { 0x1fe8, 1, { 0x1fe0, 0 } },
+ { 0x1fe9, 1, { 0x1fe1, 0 } },
+ { 0x1fea, 1, { 0x1f7a, 0 } },
+ { 0x1feb, 1, { 0x3cd, 0 } },
+ { 0x1fec, 1, { 0x1fe5, 0 } },
+ { 0x1ff2, 2, { 0x1f7c, 0x3b9 } },
+ { 0x1ff3, 2, { 0x3c9, 0x3b9 } },
+ { 0x1ff4, 2, { 0x3ce, 0x3b9 } },
+ { 0x1ff7, 2, { 0x1ff6, 0x3b9 } },
+ { 0x1ff8, 1, { 0x1f78, 0 } },
+ { 0x1ff9, 1, { 0x3cc, 0 } },
+ { 0x1ffa, 1, { 0x1f7c, 0 } },
+ { 0x1ffb, 1, { 0x3ce, 0 } },
+ { 0x1ffc, 2, { 0x3c9, 0x3b9 } },
+ { 0x2011, 1, { 0x2010, 0 } },
+ { 0x2033, 2, { 0x2032, 0x2032 } },
+ { 0x2034, 3, { 840, 0 } },
+ { 0x2036, 2, { 0x2035, 0x2035 } },
+ { 0x2037, 3, { 761, 0 } },
+ { 0x2057, 4, { 840, 0 } },
+ { 0x2070, 1, { 0x30, 0 } },
+ { 0x2071, 1, { 0x69, 0 } },
+ { 0x2074, 1, { 0x34, 0 } },
+ { 0x2075, 1, { 0x35, 0 } },
+ { 0x2076, 1, { 0x36, 0 } },
+ { 0x2077, 1, { 0x37, 0 } },
+ { 0x2078, 1, { 0x38, 0 } },
+ { 0x2079, 1, { 0x39, 0 } },
+ { 0x207b, 1, { 0x2212, 0 } },
+ { 0x207f, 1, { 0x6e, 0 } },
+ { 0x2080, 1, { 0x30, 0 } },
+ { 0x2081, 1, { 0x31, 0 } },
+ { 0x2082, 1, { 0x32, 0 } },
+ { 0x2083, 1, { 0x33, 0 } },
+ { 0x2084, 1, { 0x34, 0 } },
+ { 0x2085, 1, { 0x35, 0 } },
+ { 0x2086, 1, { 0x36, 0 } },
+ { 0x2087, 1, { 0x37, 0 } },
+ { 0x2088, 1, { 0x38, 0 } },
+ { 0x2089, 1, { 0x39, 0 } },
+ { 0x208b, 1, { 0x2212, 0 } },
+ { 0x2090, 1, { 0x61, 0 } },
+ { 0x2091, 1, { 0x65, 0 } },
+ { 0x2092, 1, { 0x6f, 0 } },
+ { 0x2093, 1, { 0x78, 0 } },
+ { 0x2094, 1, { 0x259, 0 } },
+ { 0x2095, 1, { 0x68, 0 } },
+ { 0x2096, 1, { 0x6b, 0 } },
+ { 0x2097, 1, { 0x6c, 0 } },
+ { 0x2098, 1, { 0x6d, 0 } },
+ { 0x2099, 1, { 0x6e, 0 } },
+ { 0x209a, 1, { 0x70, 0 } },
+ { 0x209b, 1, { 0x73, 0 } },
+ { 0x209c, 1, { 0x74, 0 } },
+ { 0x20a8, 2, { 0x72, 0x73 } },
+ { 0x2102, 1, { 0x63, 0 } },
+ { 0x2103, 2, { 0xb0, 0x63 } },
+ { 0x2107, 1, { 0x25b, 0 } },
+ { 0x2109, 2, { 0xb0, 0x66 } },
+ { 0x210a, 1, { 0x67, 0 } },
+ { 0x210b, 1, { 0x68, 0 } },
+ { 0x210c, 1, { 0x68, 0 } },
+ { 0x210d, 1, { 0x68, 0 } },
+ { 0x210e, 1, { 0x68, 0 } },
+ { 0x210f, 1, { 0x127, 0 } },
+ { 0x2110, 1, { 0x69, 0 } },
+ { 0x2111, 1, { 0x69, 0 } },
+ { 0x2112, 1, { 0x6c, 0 } },
+ { 0x2113, 1, { 0x6c, 0 } },
+ { 0x2115, 1, { 0x6e, 0 } },
+ { 0x2116, 2, { 0x6e, 0x6f } },
+ { 0x2119, 1, { 0x70, 0 } },
+ { 0x211a, 1, { 0x71, 0 } },
+ { 0x211b, 1, { 0x72, 0 } },
+ { 0x211c, 1, { 0x72, 0 } },
+ { 0x211d, 1, { 0x72, 0 } },
+ { 0x2120, 2, { 0x73, 0x6d } },
+ { 0x2121, 3, { 96, 0 } },
+ { 0x2122, 2, { 0x74, 0x6d } },
+ { 0x2124, 1, { 0x7a, 0 } },
+ { 0x2126, 1, { 0x3c9, 0 } },
+ { 0x2128, 1, { 0x7a, 0 } },
+ { 0x212a, 1, { 0x6b, 0 } },
+ { 0x212b, 1, { 0xe5, 0 } },
+ { 0x212c, 1, { 0x62, 0 } },
+ { 0x212d, 1, { 0x63, 0 } },
+ { 0x212f, 1, { 0x65, 0 } },
+ { 0x2130, 1, { 0x65, 0 } },
+ { 0x2131, 1, { 0x66, 0 } },
+ { 0x2133, 1, { 0x6d, 0 } },
+ { 0x2134, 1, { 0x6f, 0 } },
+ { 0x2135, 1, { 0x5d0, 0 } },
+ { 0x2136, 1, { 0x5d1, 0 } },
+ { 0x2137, 1, { 0x5d2, 0 } },
+ { 0x2138, 1, { 0x5d3, 0 } },
+ { 0x2139, 1, { 0x69, 0 } },
+ { 0x213b, 3, { 499, 0 } },
+ { 0x213c, 1, { 0x3c0, 0 } },
+ { 0x213d, 1, { 0x3b3, 0 } },
+ { 0x213e, 1, { 0x3b3, 0 } },
+ { 0x213f, 1, { 0x3c0, 0 } },
+ { 0x2140, 1, { 0x2211, 0 } },
+ { 0x2145, 1, { 0x64, 0 } },
+ { 0x2146, 1, { 0x64, 0 } },
+ { 0x2147, 1, { 0x65, 0 } },
+ { 0x2148, 1, { 0x69, 0 } },
+ { 0x2149, 1, { 0x6a, 0 } },
+ { 0x2150, 3, { 688, 0 } },
+ { 0x2151, 3, { 682, 0 } },
+ { 0x2152, 4, { 890, 0 } },
+ { 0x2153, 3, { 69, 0 } },
+ { 0x2154, 3, { 494, 0 } },
+ { 0x2155, 3, { 63, 0 } },
+ { 0x2156, 3, { 84, 0 } },
+ { 0x2157, 3, { 708, 0 } },
+ { 0x2158, 3, { 472, 0 } },
+ { 0x2159, 3, { 60, 0 } },
+ { 0x215a, 3, { 710, 0 } },
+ { 0x215b, 3, { 685, 0 } },
+ { 0x215c, 3, { 718, 0 } },
+ { 0x215d, 3, { 474, 0 } },
+ { 0x215e, 3, { 690, 0 } },
+ { 0x215f, 2, { 0x31, 0x2044 } },
+ { 0x2160, 1, { 0x69, 0 } },
+ { 0x2161, 2, { 0x69, 0x69 } },
+ { 0x2162, 3, { 730, 0 } },
+ { 0x2163, 2, { 0x69, 0x76 } },
+ { 0x2164, 1, { 0x76, 0 } },
+ { 0x2165, 2, { 0x76, 0x69 } },
+ { 0x2166, 3, { 729, 0 } },
+ { 0x2167, 4, { 729, 0 } },
+ { 0x2168, 2, { 0x69, 0x78 } },
+ { 0x2169, 1, { 0x78, 0 } },
+ { 0x216a, 2, { 0x78, 0x69 } },
+ { 0x216b, 3, { 501, 0 } },
+ { 0x216c, 1, { 0x6c, 0 } },
+ { 0x216d, 1, { 0x63, 0 } },
+ { 0x216e, 1, { 0x64, 0 } },
+ { 0x216f, 1, { 0x6d, 0 } },
+ { 0x2170, 1, { 0x69, 0 } },
+ { 0x2171, 2, { 0x69, 0x69 } },
+ { 0x2172, 3, { 730, 0 } },
+ { 0x2173, 2, { 0x69, 0x76 } },
+ { 0x2174, 1, { 0x76, 0 } },
+ { 0x2175, 2, { 0x76, 0x69 } },
+ { 0x2176, 3, { 729, 0 } },
+ { 0x2177, 4, { 729, 0 } },
+ { 0x2178, 2, { 0x69, 0x78 } },
+ { 0x2179, 1, { 0x78, 0 } },
+ { 0x217a, 2, { 0x78, 0x69 } },
+ { 0x217b, 3, { 501, 0 } },
+ { 0x217c, 1, { 0x6c, 0 } },
+ { 0x217d, 1, { 0x63, 0 } },
+ { 0x217e, 1, { 0x64, 0 } },
+ { 0x217f, 1, { 0x6d, 0 } },
+ { 0x2189, 3, { 901, 0 } },
+ { 0x222c, 2, { 0x222b, 0x222b } },
+ { 0x222d, 3, { 795, 0 } },
+ { 0x222f, 2, { 0x222e, 0x222e } },
+ { 0x2230, 3, { 134, 0 } },
+ { 0x2329, 1, { 0x3008, 0 } },
+ { 0x232a, 1, { 0x3009, 0 } },
+ { 0x2460, 1, { 0x31, 0 } },
+ { 0x2461, 1, { 0x32, 0 } },
+ { 0x2462, 1, { 0x33, 0 } },
+ { 0x2463, 1, { 0x34, 0 } },
+ { 0x2464, 1, { 0x35, 0 } },
+ { 0x2465, 1, { 0x36, 0 } },
+ { 0x2466, 1, { 0x37, 0 } },
+ { 0x2467, 1, { 0x38, 0 } },
+ { 0x2468, 1, { 0x39, 0 } },
+ { 0x2469, 2, { 0x31, 0x30 } },
+ { 0x246a, 2, { 0x31, 0x31 } },
+ { 0x246b, 2, { 0x31, 0x32 } },
+ { 0x246c, 2, { 0x31, 0x33 } },
+ { 0x246d, 2, { 0x31, 0x34 } },
+ { 0x246e, 2, { 0x31, 0x35 } },
+ { 0x246f, 2, { 0x31, 0x36 } },
+ { 0x2470, 2, { 0x31, 0x37 } },
+ { 0x2471, 2, { 0x31, 0x38 } },
+ { 0x2472, 2, { 0x31, 0x39 } },
+ { 0x2473, 2, { 0x32, 0x30 } },
+ { 0x24b6, 1, { 0x61, 0 } },
+ { 0x24b7, 1, { 0x62, 0 } },
+ { 0x24b8, 1, { 0x63, 0 } },
+ { 0x24b9, 1, { 0x64, 0 } },
+ { 0x24ba, 1, { 0x65, 0 } },
+ { 0x24bb, 1, { 0x66, 0 } },
+ { 0x24bc, 1, { 0x67, 0 } },
+ { 0x24bd, 1, { 0x68, 0 } },
+ { 0x24be, 1, { 0x69, 0 } },
+ { 0x24bf, 1, { 0x6a, 0 } },
+ { 0x24c0, 1, { 0x6b, 0 } },
+ { 0x24c1, 1, { 0x6c, 0 } },
+ { 0x24c2, 1, { 0x6d, 0 } },
+ { 0x24c3, 1, { 0x6e, 0 } },
+ { 0x24c4, 1, { 0x6f, 0 } },
+ { 0x24c5, 1, { 0x70, 0 } },
+ { 0x24c6, 1, { 0x71, 0 } },
+ { 0x24c7, 1, { 0x72, 0 } },
+ { 0x24c8, 1, { 0x73, 0 } },
+ { 0x24c9, 1, { 0x74, 0 } },
+ { 0x24ca, 1, { 0x75, 0 } },
+ { 0x24cb, 1, { 0x76, 0 } },
+ { 0x24cc, 1, { 0x77, 0 } },
+ { 0x24cd, 1, { 0x78, 0 } },
+ { 0x24ce, 1, { 0x79, 0 } },
+ { 0x24cf, 1, { 0x7a, 0 } },
+ { 0x24d0, 1, { 0x61, 0 } },
+ { 0x24d1, 1, { 0x62, 0 } },
+ { 0x24d2, 1, { 0x63, 0 } },
+ { 0x24d3, 1, { 0x64, 0 } },
+ { 0x24d4, 1, { 0x65, 0 } },
+ { 0x24d5, 1, { 0x66, 0 } },
+ { 0x24d6, 1, { 0x67, 0 } },
+ { 0x24d7, 1, { 0x68, 0 } },
+ { 0x24d8, 1, { 0x69, 0 } },
+ { 0x24d9, 1, { 0x6a, 0 } },
+ { 0x24da, 1, { 0x6b, 0 } },
+ { 0x24db, 1, { 0x6c, 0 } },
+ { 0x24dc, 1, { 0x6d, 0 } },
+ { 0x24dd, 1, { 0x6e, 0 } },
+ { 0x24de, 1, { 0x6f, 0 } },
+ { 0x24df, 1, { 0x70, 0 } },
+ { 0x24e0, 1, { 0x71, 0 } },
+ { 0x24e1, 1, { 0x72, 0 } },
+ { 0x24e2, 1, { 0x73, 0 } },
+ { 0x24e3, 1, { 0x74, 0 } },
+ { 0x24e4, 1, { 0x75, 0 } },
+ { 0x24e5, 1, { 0x76, 0 } },
+ { 0x24e6, 1, { 0x77, 0 } },
+ { 0x24e7, 1, { 0x78, 0 } },
+ { 0x24e8, 1, { 0x79, 0 } },
+ { 0x24e9, 1, { 0x7a, 0 } },
+ { 0x24ea, 1, { 0x30, 0 } },
+ { 0x2a0c, 4, { 795, 0 } },
+ { 0x2adc, 2, { 0x2add, 0x338 } },
+ { 0x2c00, 1, { 0x2c30, 0 } },
+ { 0x2c01, 1, { 0x2c31, 0 } },
+ { 0x2c02, 1, { 0x2c32, 0 } },
+ { 0x2c03, 1, { 0x2c33, 0 } },
+ { 0x2c04, 1, { 0x2c34, 0 } },
+ { 0x2c05, 1, { 0x2c35, 0 } },
+ { 0x2c06, 1, { 0x2c36, 0 } },
+ { 0x2c07, 1, { 0x2c37, 0 } },
+ { 0x2c08, 1, { 0x2c38, 0 } },
+ { 0x2c09, 1, { 0x2c39, 0 } },
+ { 0x2c0a, 1, { 0x2c3a, 0 } },
+ { 0x2c0b, 1, { 0x2c3b, 0 } },
+ { 0x2c0c, 1, { 0x2c3c, 0 } },
+ { 0x2c0d, 1, { 0x2c3d, 0 } },
+ { 0x2c0e, 1, { 0x2c3e, 0 } },
+ { 0x2c0f, 1, { 0x2c3f, 0 } },
+ { 0x2c10, 1, { 0x2c40, 0 } },
+ { 0x2c11, 1, { 0x2c41, 0 } },
+ { 0x2c12, 1, { 0x2c42, 0 } },
+ { 0x2c13, 1, { 0x2c43, 0 } },
+ { 0x2c14, 1, { 0x2c44, 0 } },
+ { 0x2c15, 1, { 0x2c45, 0 } },
+ { 0x2c16, 1, { 0x2c46, 0 } },
+ { 0x2c17, 1, { 0x2c47, 0 } },
+ { 0x2c18, 1, { 0x2c48, 0 } },
+ { 0x2c19, 1, { 0x2c49, 0 } },
+ { 0x2c1a, 1, { 0x2c4a, 0 } },
+ { 0x2c1b, 1, { 0x2c4b, 0 } },
+ { 0x2c1c, 1, { 0x2c4c, 0 } },
+ { 0x2c1d, 1, { 0x2c4d, 0 } },
+ { 0x2c1e, 1, { 0x2c4e, 0 } },
+ { 0x2c1f, 1, { 0x2c4f, 0 } },
+ { 0x2c20, 1, { 0x2c50, 0 } },
+ { 0x2c21, 1, { 0x2c51, 0 } },
+ { 0x2c22, 1, { 0x2c52, 0 } },
+ { 0x2c23, 1, { 0x2c53, 0 } },
+ { 0x2c24, 1, { 0x2c54, 0 } },
+ { 0x2c25, 1, { 0x2c55, 0 } },
+ { 0x2c26, 1, { 0x2c56, 0 } },
+ { 0x2c27, 1, { 0x2c57, 0 } },
+ { 0x2c28, 1, { 0x2c58, 0 } },
+ { 0x2c29, 1, { 0x2c59, 0 } },
+ { 0x2c2a, 1, { 0x2c5a, 0 } },
+ { 0x2c2b, 1, { 0x2c5b, 0 } },
+ { 0x2c2c, 1, { 0x2c5c, 0 } },
+ { 0x2c2d, 1, { 0x2c5d, 0 } },
+ { 0x2c2e, 1, { 0x2c5e, 0 } },
+ { 0x2c2f, 1, { 0x2c5f, 0 } },
+ { 0x2c60, 1, { 0x2c61, 0 } },
+ { 0x2c62, 1, { 0x26b, 0 } },
+ { 0x2c63, 1, { 0x1d7d, 0 } },
+ { 0x2c64, 1, { 0x27d, 0 } },
+ { 0x2c67, 1, { 0x2c68, 0 } },
+ { 0x2c69, 1, { 0x2c6a, 0 } },
+ { 0x2c6b, 1, { 0x2c6c, 0 } },
+ { 0x2c6d, 1, { 0x251, 0 } },
+ { 0x2c6e, 1, { 0x271, 0 } },
+ { 0x2c6f, 1, { 0x250, 0 } },
+ { 0x2c70, 1, { 0x252, 0 } },
+ { 0x2c72, 1, { 0x2c73, 0 } },
+ { 0x2c75, 1, { 0x2c76, 0 } },
+ { 0x2c7c, 1, { 0x6a, 0 } },
+ { 0x2c7d, 1, { 0x76, 0 } },
+ { 0x2c7e, 1, { 0x23f, 0 } },
+ { 0x2c7f, 1, { 0x240, 0 } },
+ { 0x2c80, 1, { 0x2c81, 0 } },
+ { 0x2c82, 1, { 0x2c83, 0 } },
+ { 0x2c84, 1, { 0x2c85, 0 } },
+ { 0x2c86, 1, { 0x2c87, 0 } },
+ { 0x2c88, 1, { 0x2c89, 0 } },
+ { 0x2c8a, 1, { 0x2c8b, 0 } },
+ { 0x2c8c, 1, { 0x2c8d, 0 } },
+ { 0x2c8e, 1, { 0x2c8f, 0 } },
+ { 0x2c90, 1, { 0x2c91, 0 } },
+ { 0x2c92, 1, { 0x2c93, 0 } },
+ { 0x2c94, 1, { 0x2c95, 0 } },
+ { 0x2c96, 1, { 0x2c97, 0 } },
+ { 0x2c98, 1, { 0x2c99, 0 } },
+ { 0x2c9a, 1, { 0x2c9b, 0 } },
+ { 0x2c9c, 1, { 0x2c9d, 0 } },
+ { 0x2c9e, 1, { 0x2c9f, 0 } },
+ { 0x2ca0, 1, { 0x2ca1, 0 } },
+ { 0x2ca2, 1, { 0x2ca3, 0 } },
+ { 0x2ca4, 1, { 0x2ca5, 0 } },
+ { 0x2ca6, 1, { 0x2ca7, 0 } },
+ { 0x2ca8, 1, { 0x2ca9, 0 } },
+ { 0x2caa, 1, { 0x2cab, 0 } },
+ { 0x2cac, 1, { 0x2cad, 0 } },
+ { 0x2cae, 1, { 0x2caf, 0 } },
+ { 0x2cb0, 1, { 0x2cb1, 0 } },
+ { 0x2cb2, 1, { 0x2cb3, 0 } },
+ { 0x2cb4, 1, { 0x2cb5, 0 } },
+ { 0x2cb6, 1, { 0x2cb7, 0 } },
+ { 0x2cb8, 1, { 0x2cb9, 0 } },
+ { 0x2cba, 1, { 0x2cbb, 0 } },
+ { 0x2cbc, 1, { 0x2cbd, 0 } },
+ { 0x2cbe, 1, { 0x2cbf, 0 } },
+ { 0x2cc0, 1, { 0x2cc1, 0 } },
+ { 0x2cc2, 1, { 0x2cc3, 0 } },
+ { 0x2cc4, 1, { 0x2cc5, 0 } },
+ { 0x2cc6, 1, { 0x2cc7, 0 } },
+ { 0x2cc8, 1, { 0x2cc9, 0 } },
+ { 0x2cca, 1, { 0x2ccb, 0 } },
+ { 0x2ccc, 1, { 0x2ccd, 0 } },
+ { 0x2cce, 1, { 0x2ccf, 0 } },
+ { 0x2cd0, 1, { 0x2cd1, 0 } },
+ { 0x2cd2, 1, { 0x2cd3, 0 } },
+ { 0x2cd4, 1, { 0x2cd5, 0 } },
+ { 0x2cd6, 1, { 0x2cd7, 0 } },
+ { 0x2cd8, 1, { 0x2cd9, 0 } },
+ { 0x2cda, 1, { 0x2cdb, 0 } },
+ { 0x2cdc, 1, { 0x2cdd, 0 } },
+ { 0x2cde, 1, { 0x2cdf, 0 } },
+ { 0x2ce0, 1, { 0x2ce1, 0 } },
+ { 0x2ce2, 1, { 0x2ce3, 0 } },
+ { 0x2ceb, 1, { 0x2cec, 0 } },
+ { 0x2ced, 1, { 0x2cee, 0 } },
+ { 0x2cf2, 1, { 0x2cf3, 0 } },
+ { 0x2d6f, 1, { 0x2d61, 0 } },
+ { 0x2e9f, 1, { 0x6bcd, 0 } },
+ { 0x2ef3, 1, { 0x9f9f, 0 } },
+ { 0x2f00, 1, { 0x4e00, 0 } },
+ { 0x2f01, 1, { 0x4e28, 0 } },
+ { 0x2f02, 1, { 0x4e36, 0 } },
+ { 0x2f03, 1, { 0x4e3f, 0 } },
+ { 0x2f04, 1, { 0x4e59, 0 } },
+ { 0x2f05, 1, { 0x4e85, 0 } },
+ { 0x2f06, 1, { 0x4e8c, 0 } },
+ { 0x2f07, 1, { 0x4ea0, 0 } },
+ { 0x2f08, 1, { 0x4eba, 0 } },
+ { 0x2f09, 1, { 0x513f, 0 } },
+ { 0x2f0a, 1, { 0x5165, 0 } },
+ { 0x2f0b, 1, { 0x516b, 0 } },
+ { 0x2f0c, 1, { 0x5182, 0 } },
+ { 0x2f0d, 1, { 0x5196, 0 } },
+ { 0x2f0e, 1, { 0x51ab, 0 } },
+ { 0x2f0f, 1, { 0x51e0, 0 } },
+ { 0x2f10, 1, { 0x51f5, 0 } },
+ { 0x2f11, 1, { 0x5200, 0 } },
+ { 0x2f12, 1, { 0x529b, 0 } },
+ { 0x2f13, 1, { 0x52f9, 0 } },
+ { 0x2f14, 1, { 0x5315, 0 } },
+ { 0x2f15, 1, { 0x531a, 0 } },
+ { 0x2f16, 1, { 0x5338, 0 } },
+ { 0x2f17, 1, { 0x5341, 0 } },
+ { 0x2f18, 1, { 0x535c, 0 } },
+ { 0x2f19, 1, { 0x5369, 0 } },
+ { 0x2f1a, 1, { 0x5382, 0 } },
+ { 0x2f1b, 1, { 0x53b6, 0 } },
+ { 0x2f1c, 1, { 0x53c8, 0 } },
+ { 0x2f1d, 1, { 0x53e3, 0 } },
+ { 0x2f1e, 1, { 0x56d7, 0 } },
+ { 0x2f1f, 1, { 0x571f, 0 } },
+ { 0x2f20, 1, { 0x58eb, 0 } },
+ { 0x2f21, 1, { 0x5902, 0 } },
+ { 0x2f22, 1, { 0x590a, 0 } },
+ { 0x2f23, 1, { 0x5915, 0 } },
+ { 0x2f24, 1, { 0x5927, 0 } },
+ { 0x2f25, 1, { 0x5973, 0 } },
+ { 0x2f26, 1, { 0x5b50, 0 } },
+ { 0x2f27, 1, { 0x5b80, 0 } },
+ { 0x2f28, 1, { 0x5bf8, 0 } },
+ { 0x2f29, 1, { 0x5c0f, 0 } },
+ { 0x2f2a, 1, { 0x5c22, 0 } },
+ { 0x2f2b, 1, { 0x5c38, 0 } },
+ { 0x2f2c, 1, { 0x5c6e, 0 } },
+ { 0x2f2d, 1, { 0x5c71, 0 } },
+ { 0x2f2e, 1, { 0x5ddb, 0 } },
+ { 0x2f2f, 1, { 0x5de5, 0 } },
+ { 0x2f30, 1, { 0x5df1, 0 } },
+ { 0x2f31, 1, { 0x5dfe, 0 } },
+ { 0x2f32, 1, { 0x5e72, 0 } },
+ { 0x2f33, 1, { 0x5e7a, 0 } },
+ { 0x2f34, 1, { 0x5e7f, 0 } },
+ { 0x2f35, 1, { 0x5ef4, 0 } },
+ { 0x2f36, 1, { 0x5efe, 0 } },
+ { 0x2f37, 1, { 0x5f0b, 0 } },
+ { 0x2f38, 1, { 0x5f13, 0 } },
+ { 0x2f39, 1, { 0x5f50, 0 } },
+ { 0x2f3a, 1, { 0x5f61, 0 } },
+ { 0x2f3b, 1, { 0x5f73, 0 } },
+ { 0x2f3c, 1, { 0x5fc3, 0 } },
+ { 0x2f3d, 1, { 0x6208, 0 } },
+ { 0x2f3e, 1, { 0x6236, 0 } },
+ { 0x2f3f, 1, { 0x624b, 0 } },
+ { 0x2f40, 1, { 0x652f, 0 } },
+ { 0x2f41, 1, { 0x6534, 0 } },
+ { 0x2f42, 1, { 0x6587, 0 } },
+ { 0x2f43, 1, { 0x6597, 0 } },
+ { 0x2f44, 1, { 0x65a4, 0 } },
+ { 0x2f45, 1, { 0x65b9, 0 } },
+ { 0x2f46, 1, { 0x65e0, 0 } },
+ { 0x2f47, 1, { 0x65e5, 0 } },
+ { 0x2f48, 1, { 0x66f0, 0 } },
+ { 0x2f49, 1, { 0x6708, 0 } },
+ { 0x2f4a, 1, { 0x6728, 0 } },
+ { 0x2f4b, 1, { 0x6b20, 0 } },
+ { 0x2f4c, 1, { 0x6b62, 0 } },
+ { 0x2f4d, 1, { 0x6b79, 0 } },
+ { 0x2f4e, 1, { 0x6bb3, 0 } },
+ { 0x2f4f, 1, { 0x6bcb, 0 } },
+ { 0x2f50, 1, { 0x6bd4, 0 } },
+ { 0x2f51, 1, { 0x6bdb, 0 } },
+ { 0x2f52, 1, { 0x6c0f, 0 } },
+ { 0x2f53, 1, { 0x6c14, 0 } },
+ { 0x2f54, 1, { 0x6c34, 0 } },
+ { 0x2f55, 1, { 0x706b, 0 } },
+ { 0x2f56, 1, { 0x722a, 0 } },
+ { 0x2f57, 1, { 0x7236, 0 } },
+ { 0x2f58, 1, { 0x723b, 0 } },
+ { 0x2f59, 1, { 0x723f, 0 } },
+ { 0x2f5a, 1, { 0x7247, 0 } },
+ { 0x2f5b, 1, { 0x7259, 0 } },
+ { 0x2f5c, 1, { 0x725b, 0 } },
+ { 0x2f5d, 1, { 0x72ac, 0 } },
+ { 0x2f5e, 1, { 0x7384, 0 } },
+ { 0x2f5f, 1, { 0x7389, 0 } },
+ { 0x2f60, 1, { 0x74dc, 0 } },
+ { 0x2f61, 1, { 0x74e6, 0 } },
+ { 0x2f62, 1, { 0x7518, 0 } },
+ { 0x2f63, 1, { 0x751f, 0 } },
+ { 0x2f64, 1, { 0x7528, 0 } },
+ { 0x2f65, 1, { 0x7530, 0 } },
+ { 0x2f66, 1, { 0x758b, 0 } },
+ { 0x2f67, 1, { 0x7592, 0 } },
+ { 0x2f68, 1, { 0x7676, 0 } },
+ { 0x2f69, 1, { 0x767d, 0 } },
+ { 0x2f6a, 1, { 0x76ae, 0 } },
+ { 0x2f6b, 1, { 0x76bf, 0 } },
+ { 0x2f6c, 1, { 0x76ee, 0 } },
+ { 0x2f6d, 1, { 0x77db, 0 } },
+ { 0x2f6e, 1, { 0x77e2, 0 } },
+ { 0x2f6f, 1, { 0x77f3, 0 } },
+ { 0x2f70, 1, { 0x793a, 0 } },
+ { 0x2f71, 1, { 0x79b8, 0 } },
+ { 0x2f72, 1, { 0x79be, 0 } },
+ { 0x2f73, 1, { 0x7a74, 0 } },
+ { 0x2f74, 1, { 0x7acb, 0 } },
+ { 0x2f75, 1, { 0x7af9, 0 } },
+ { 0x2f76, 1, { 0x7c73, 0 } },
+ { 0x2f77, 1, { 0x7cf8, 0 } },
+ { 0x2f78, 1, { 0x7f36, 0 } },
+ { 0x2f79, 1, { 0x7f51, 0 } },
+ { 0x2f7a, 1, { 0x7f8a, 0 } },
+ { 0x2f7b, 1, { 0x7fbd, 0 } },
+ { 0x2f7c, 1, { 0x8001, 0 } },
+ { 0x2f7d, 1, { 0x800c, 0 } },
+ { 0x2f7e, 1, { 0x8012, 0 } },
+ { 0x2f7f, 1, { 0x8033, 0 } },
+ { 0x2f80, 1, { 0x807f, 0 } },
+ { 0x2f81, 1, { 0x8089, 0 } },
+ { 0x2f82, 1, { 0x81e3, 0 } },
+ { 0x2f83, 1, { 0x81ea, 0 } },
+ { 0x2f84, 1, { 0x81f3, 0 } },
+ { 0x2f85, 1, { 0x81fc, 0 } },
+ { 0x2f86, 1, { 0x820c, 0 } },
+ { 0x2f87, 1, { 0x821b, 0 } },
+ { 0x2f88, 1, { 0x821f, 0 } },
+ { 0x2f89, 1, { 0x826e, 0 } },
+ { 0x2f8a, 1, { 0x8272, 0 } },
+ { 0x2f8b, 1, { 0x8278, 0 } },
+ { 0x2f8c, 1, { 0x864d, 0 } },
+ { 0x2f8d, 1, { 0x866b, 0 } },
+ { 0x2f8e, 1, { 0x8840, 0 } },
+ { 0x2f8f, 1, { 0x884c, 0 } },
+ { 0x2f90, 1, { 0x8863, 0 } },
+ { 0x2f91, 1, { 0x897e, 0 } },
+ { 0x2f92, 1, { 0x898b, 0 } },
+ { 0x2f93, 1, { 0x89d2, 0 } },
+ { 0x2f94, 1, { 0x8a00, 0 } },
+ { 0x2f95, 1, { 0x8c37, 0 } },
+ { 0x2f96, 1, { 0x8c46, 0 } },
+ { 0x2f97, 1, { 0x8c55, 0 } },
+ { 0x2f98, 1, { 0x8c78, 0 } },
+ { 0x2f99, 1, { 0x8c9d, 0 } },
+ { 0x2f9a, 1, { 0x8d64, 0 } },
+ { 0x2f9b, 1, { 0x8d70, 0 } },
+ { 0x2f9c, 1, { 0x8db3, 0 } },
+ { 0x2f9d, 1, { 0x8eab, 0 } },
+ { 0x2f9e, 1, { 0x8eca, 0 } },
+ { 0x2f9f, 1, { 0x8f9b, 0 } },
+ { 0x2fa0, 1, { 0x8fb0, 0 } },
+ { 0x2fa1, 1, { 0x8fb5, 0 } },
+ { 0x2fa2, 1, { 0x9091, 0 } },
+ { 0x2fa3, 1, { 0x9149, 0 } },
+ { 0x2fa4, 1, { 0x91c6, 0 } },
+ { 0x2fa5, 1, { 0x91cc, 0 } },
+ { 0x2fa6, 1, { 0x91d1, 0 } },
+ { 0x2fa7, 1, { 0x9577, 0 } },
+ { 0x2fa8, 1, { 0x9580, 0 } },
+ { 0x2fa9, 1, { 0x961c, 0 } },
+ { 0x2faa, 1, { 0x96b6, 0 } },
+ { 0x2fab, 1, { 0x96b9, 0 } },
+ { 0x2fac, 1, { 0x96e8, 0 } },
+ { 0x2fad, 1, { 0x9751, 0 } },
+ { 0x2fae, 1, { 0x975e, 0 } },
+ { 0x2faf, 1, { 0x9762, 0 } },
+ { 0x2fb0, 1, { 0x9769, 0 } },
+ { 0x2fb1, 1, { 0x97cb, 0 } },
+ { 0x2fb2, 1, { 0x97ed, 0 } },
+ { 0x2fb3, 1, { 0x97f3, 0 } },
+ { 0x2fb4, 1, { 0x9801, 0 } },
+ { 0x2fb5, 1, { 0x98a8, 0 } },
+ { 0x2fb6, 1, { 0x98db, 0 } },
+ { 0x2fb7, 1, { 0x98df, 0 } },
+ { 0x2fb8, 1, { 0x9996, 0 } },
+ { 0x2fb9, 1, { 0x9999, 0 } },
+ { 0x2fba, 1, { 0x99ac, 0 } },
+ { 0x2fbb, 1, { 0x9aa8, 0 } },
+ { 0x2fbc, 1, { 0x9ad8, 0 } },
+ { 0x2fbd, 1, { 0x9adf, 0 } },
+ { 0x2fbe, 1, { 0x9b25, 0 } },
+ { 0x2fbf, 1, { 0x9b2f, 0 } },
+ { 0x2fc0, 1, { 0x9b32, 0 } },
+ { 0x2fc1, 1, { 0x9b3c, 0 } },
+ { 0x2fc2, 1, { 0x9b5a, 0 } },
+ { 0x2fc3, 1, { 0x9ce5, 0 } },
+ { 0x2fc4, 1, { 0x9e75, 0 } },
+ { 0x2fc5, 1, { 0x9e7f, 0 } },
+ { 0x2fc6, 1, { 0x9ea5, 0 } },
+ { 0x2fc7, 1, { 0x9ebb, 0 } },
+ { 0x2fc8, 1, { 0x9ec3, 0 } },
+ { 0x2fc9, 1, { 0x9ecd, 0 } },
+ { 0x2fca, 1, { 0x9ed1, 0 } },
+ { 0x2fcb, 1, { 0x9ef9, 0 } },
+ { 0x2fcc, 1, { 0x9efd, 0 } },
+ { 0x2fcd, 1, { 0x9f0e, 0 } },
+ { 0x2fce, 1, { 0x9f13, 0 } },
+ { 0x2fcf, 1, { 0x9f20, 0 } },
+ { 0x2fd0, 1, { 0x9f3b, 0 } },
+ { 0x2fd1, 1, { 0x9f4a, 0 } },
+ { 0x2fd2, 1, { 0x9f52, 0 } },
+ { 0x2fd3, 1, { 0x9f8d, 0 } },
+ { 0x2fd4, 1, { 0x9f9c, 0 } },
+ { 0x2fd5, 1, { 0x9fa0, 0 } },
+ { 0x3002, 1, { 0x2e, 0 } },
+ { 0x3036, 1, { 0x3012, 0 } },
+ { 0x3038, 1, { 0x5341, 0 } },
+ { 0x3039, 1, { 0x5344, 0 } },
+ { 0x303a, 1, { 0x5345, 0 } },
+ { 0x309f, 2, { 0x3088, 0x308a } },
+ { 0x30ff, 2, { 0x30b3, 0x30c8 } },
+ { 0x3131, 1, { 0x1100, 0 } },
+ { 0x3132, 1, { 0x1101, 0 } },
+ { 0x3133, 1, { 0x11aa, 0 } },
+ { 0x3134, 1, { 0x1102, 0 } },
+ { 0x3135, 1, { 0x11ac, 0 } },
+ { 0x3136, 1, { 0x11ad, 0 } },
+ { 0x3137, 1, { 0x1103, 0 } },
+ { 0x3138, 1, { 0x1104, 0 } },
+ { 0x3139, 1, { 0x1105, 0 } },
+ { 0x313a, 1, { 0x11b0, 0 } },
+ { 0x313b, 1, { 0x11b1, 0 } },
+ { 0x313c, 1, { 0x11b2, 0 } },
+ { 0x313d, 1, { 0x11b3, 0 } },
+ { 0x313e, 1, { 0x11b4, 0 } },
+ { 0x313f, 1, { 0x11b5, 0 } },
+ { 0x3140, 1, { 0x111a, 0 } },
+ { 0x3141, 1, { 0x1106, 0 } },
+ { 0x3142, 1, { 0x1107, 0 } },
+ { 0x3143, 1, { 0x1108, 0 } },
+ { 0x3144, 1, { 0x1121, 0 } },
+ { 0x3145, 1, { 0x1109, 0 } },
+ { 0x3146, 1, { 0x110a, 0 } },
+ { 0x3147, 1, { 0x110b, 0 } },
+ { 0x3148, 1, { 0x110c, 0 } },
+ { 0x3149, 1, { 0x110d, 0 } },
+ { 0x314a, 1, { 0x110e, 0 } },
+ { 0x314b, 1, { 0x110f, 0 } },
+ { 0x314c, 1, { 0x1110, 0 } },
+ { 0x314d, 1, { 0x1111, 0 } },
+ { 0x314e, 1, { 0x1112, 0 } },
+ { 0x314f, 1, { 0x1161, 0 } },
+ { 0x3150, 1, { 0x1162, 0 } },
+ { 0x3151, 1, { 0x1163, 0 } },
+ { 0x3152, 1, { 0x1164, 0 } },
+ { 0x3153, 1, { 0x1165, 0 } },
+ { 0x3154, 1, { 0x1166, 0 } },
+ { 0x3155, 1, { 0x1167, 0 } },
+ { 0x3156, 1, { 0x1168, 0 } },
+ { 0x3157, 1, { 0x1169, 0 } },
+ { 0x3158, 1, { 0x116a, 0 } },
+ { 0x3159, 1, { 0x116b, 0 } },
+ { 0x315a, 1, { 0x116c, 0 } },
+ { 0x315b, 1, { 0x116d, 0 } },
+ { 0x315c, 1, { 0x116e, 0 } },
+ { 0x315d, 1, { 0x116f, 0 } },
+ { 0x315e, 1, { 0x1170, 0 } },
+ { 0x315f, 1, { 0x1171, 0 } },
+ { 0x3160, 1, { 0x1172, 0 } },
+ { 0x3161, 1, { 0x1173, 0 } },
+ { 0x3162, 1, { 0x1174, 0 } },
+ { 0x3163, 1, { 0x1175, 0 } },
+ { 0x3165, 1, { 0x1114, 0 } },
+ { 0x3166, 1, { 0x1115, 0 } },
+ { 0x3167, 1, { 0x11c7, 0 } },
+ { 0x3168, 1, { 0x11c8, 0 } },
+ { 0x3169, 1, { 0x11cc, 0 } },
+ { 0x316a, 1, { 0x11ce, 0 } },
+ { 0x316b, 1, { 0x11d3, 0 } },
+ { 0x316c, 1, { 0x11d7, 0 } },
+ { 0x316d, 1, { 0x11d9, 0 } },
+ { 0x316e, 1, { 0x111c, 0 } },
+ { 0x316f, 1, { 0x11dd, 0 } },
+ { 0x3170, 1, { 0x11df, 0 } },
+ { 0x3171, 1, { 0x111d, 0 } },
+ { 0x3172, 1, { 0x111e, 0 } },
+ { 0x3173, 1, { 0x1120, 0 } },
+ { 0x3174, 1, { 0x1122, 0 } },
+ { 0x3175, 1, { 0x1123, 0 } },
+ { 0x3176, 1, { 0x1127, 0 } },
+ { 0x3177, 1, { 0x1129, 0 } },
+ { 0x3178, 1, { 0x112b, 0 } },
+ { 0x3179, 1, { 0x112c, 0 } },
+ { 0x317a, 1, { 0x112d, 0 } },
+ { 0x317b, 1, { 0x112e, 0 } },
+ { 0x317c, 1, { 0x112f, 0 } },
+ { 0x317d, 1, { 0x1132, 0 } },
+ { 0x317e, 1, { 0x1136, 0 } },
+ { 0x317f, 1, { 0x1140, 0 } },
+ { 0x3180, 1, { 0x1147, 0 } },
+ { 0x3181, 1, { 0x114c, 0 } },
+ { 0x3182, 1, { 0x11f1, 0 } },
+ { 0x3183, 1, { 0x11f2, 0 } },
+ { 0x3184, 1, { 0x1157, 0 } },
+ { 0x3185, 1, { 0x1158, 0 } },
+ { 0x3186, 1, { 0x1159, 0 } },
+ { 0x3187, 1, { 0x1184, 0 } },
+ { 0x3188, 1, { 0x1185, 0 } },
+ { 0x3189, 1, { 0x1188, 0 } },
+ { 0x318a, 1, { 0x1191, 0 } },
+ { 0x318b, 1, { 0x1192, 0 } },
+ { 0x318c, 1, { 0x1194, 0 } },
+ { 0x318d, 1, { 0x119e, 0 } },
+ { 0x318e, 1, { 0x11a1, 0 } },
+ { 0x3192, 1, { 0x4e00, 0 } },
+ { 0x3193, 1, { 0x4e8c, 0 } },
+ { 0x3194, 1, { 0x4e09, 0 } },
+ { 0x3195, 1, { 0x56db, 0 } },
+ { 0x3196, 1, { 0x4e0a, 0 } },
+ { 0x3197, 1, { 0x4e2d, 0 } },
+ { 0x3198, 1, { 0x4e0b, 0 } },
+ { 0x3199, 1, { 0x7532, 0 } },
+ { 0x319a, 1, { 0x4e59, 0 } },
+ { 0x319b, 1, { 0x4e19, 0 } },
+ { 0x319c, 1, { 0x4e01, 0 } },
+ { 0x319d, 1, { 0x5929, 0 } },
+ { 0x319e, 1, { 0x5730, 0 } },
+ { 0x319f, 1, { 0x4eba, 0 } },
+ { 0x3244, 1, { 0x554f, 0 } },
+ { 0x3245, 1, { 0x5e7c, 0 } },
+ { 0x3246, 1, { 0x6587, 0 } },
+ { 0x3247, 1, { 0x7b8f, 0 } },
+ { 0x3250, 3, { 95, 0 } },
+ { 0x3251, 2, { 0x32, 0x31 } },
+ { 0x3252, 2, { 0x32, 0x32 } },
+ { 0x3253, 2, { 0x32, 0x33 } },
+ { 0x3254, 2, { 0x32, 0x34 } },
+ { 0x3255, 2, { 0x32, 0x35 } },
+ { 0x3256, 2, { 0x32, 0x36 } },
+ { 0x3257, 2, { 0x32, 0x37 } },
+ { 0x3258, 2, { 0x32, 0x38 } },
+ { 0x3259, 2, { 0x32, 0x39 } },
+ { 0x325a, 2, { 0x33, 0x30 } },
+ { 0x325b, 2, { 0x33, 0x31 } },
+ { 0x325c, 2, { 0x33, 0x32 } },
+ { 0x325d, 2, { 0x33, 0x33 } },
+ { 0x325e, 2, { 0x33, 0x34 } },
+ { 0x325f, 2, { 0x33, 0x35 } },
+ { 0x3260, 1, { 0x1100, 0 } },
+ { 0x3261, 1, { 0x1102, 0 } },
+ { 0x3262, 1, { 0x1103, 0 } },
+ { 0x3263, 1, { 0x1105, 0 } },
+ { 0x3264, 1, { 0x1106, 0 } },
+ { 0x3265, 1, { 0x1107, 0 } },
+ { 0x3266, 1, { 0x1109, 0 } },
+ { 0x3267, 1, { 0x110b, 0 } },
+ { 0x3268, 1, { 0x110c, 0 } },
+ { 0x3269, 1, { 0x110e, 0 } },
+ { 0x326a, 1, { 0x110f, 0 } },
+ { 0x326b, 1, { 0x1110, 0 } },
+ { 0x326c, 1, { 0x1111, 0 } },
+ { 0x326d, 1, { 0x1112, 0 } },
+ { 0x326e, 1, { 0xac00, 0 } },
+ { 0x326f, 1, { 0xb098, 0 } },
+ { 0x3270, 1, { 0xb2e4, 0 } },
+ { 0x3271, 1, { 0xb77c, 0 } },
+ { 0x3272, 1, { 0xb9c8, 0 } },
+ { 0x3273, 1, { 0xbc14, 0 } },
+ { 0x3274, 1, { 0xc0ac, 0 } },
+ { 0x3275, 1, { 0xc544, 0 } },
+ { 0x3276, 1, { 0xc790, 0 } },
+ { 0x3277, 1, { 0xcc28, 0 } },
+ { 0x3278, 1, { 0xce74, 0 } },
+ { 0x3279, 1, { 0xd0c0, 0 } },
+ { 0x327a, 1, { 0xd30c, 0 } },
+ { 0x327b, 1, { 0xd558, 0 } },
+ { 0x327c, 2, { 0xcc38, 0xace0 } },
+ { 0x327d, 2, { 0xc8fc, 0xc758 } },
+ { 0x327e, 1, { 0xc6b0, 0 } },
+ { 0x3280, 1, { 0x4e00, 0 } },
+ { 0x3281, 1, { 0x4e8c, 0 } },
+ { 0x3282, 1, { 0x4e09, 0 } },
+ { 0x3283, 1, { 0x56db, 0 } },
+ { 0x3284, 1, { 0x4e94, 0 } },
+ { 0x3285, 1, { 0x516d, 0 } },
+ { 0x3286, 1, { 0x4e03, 0 } },
+ { 0x3287, 1, { 0x516b, 0 } },
+ { 0x3288, 1, { 0x4e5d, 0 } },
+ { 0x3289, 1, { 0x5341, 0 } },
+ { 0x328a, 1, { 0x6708, 0 } },
+ { 0x328b, 1, { 0x706b, 0 } },
+ { 0x328c, 1, { 0x6c34, 0 } },
+ { 0x328d, 1, { 0x6728, 0 } },
+ { 0x328e, 1, { 0x91d1, 0 } },
+ { 0x328f, 1, { 0x571f, 0 } },
+ { 0x3290, 1, { 0x65e5, 0 } },
+ { 0x3291, 1, { 0x682a, 0 } },
+ { 0x3292, 1, { 0x6709, 0 } },
+ { 0x3293, 1, { 0x793e, 0 } },
+ { 0x3294, 1, { 0x540d, 0 } },
+ { 0x3295, 1, { 0x7279, 0 } },
+ { 0x3296, 1, { 0x8ca1, 0 } },
+ { 0x3297, 1, { 0x795d, 0 } },
+ { 0x3298, 1, { 0x52b4, 0 } },
+ { 0x3299, 1, { 0x79d8, 0 } },
+ { 0x329a, 1, { 0x7537, 0 } },
+ { 0x329b, 1, { 0x5973, 0 } },
+ { 0x329c, 1, { 0x9069, 0 } },
+ { 0x329d, 1, { 0x512a, 0 } },
+ { 0x329e, 1, { 0x5370, 0 } },
+ { 0x329f, 1, { 0x6ce8, 0 } },
+ { 0x32a0, 1, { 0x9805, 0 } },
+ { 0x32a1, 1, { 0x4f11, 0 } },
+ { 0x32a2, 1, { 0x5199, 0 } },
+ { 0x32a3, 1, { 0x6b63, 0 } },
+ { 0x32a4, 1, { 0x4e0a, 0 } },
+ { 0x32a5, 1, { 0x4e2d, 0 } },
+ { 0x32a6, 1, { 0x4e0b, 0 } },
+ { 0x32a7, 1, { 0x5de6, 0 } },
+ { 0x32a8, 1, { 0x53f3, 0 } },
+ { 0x32a9, 1, { 0x533b, 0 } },
+ { 0x32aa, 1, { 0x5b97, 0 } },
+ { 0x32ab, 1, { 0x5b66, 0 } },
+ { 0x32ac, 1, { 0x76e3, 0 } },
+ { 0x32ad, 1, { 0x4f01, 0 } },
+ { 0x32ae, 1, { 0x8cc7, 0 } },
+ { 0x32af, 1, { 0x5354, 0 } },
+ { 0x32b0, 1, { 0x591c, 0 } },
+ { 0x32b1, 2, { 0x33, 0x36 } },
+ { 0x32b2, 2, { 0x33, 0x37 } },
+ { 0x32b3, 2, { 0x33, 0x38 } },
+ { 0x32b4, 2, { 0x33, 0x39 } },
+ { 0x32b5, 2, { 0x34, 0x30 } },
+ { 0x32b6, 2, { 0x34, 0x31 } },
+ { 0x32b7, 2, { 0x34, 0x32 } },
+ { 0x32b8, 2, { 0x34, 0x33 } },
+ { 0x32b9, 2, { 0x34, 0x34 } },
+ { 0x32ba, 2, { 0x34, 0x35 } },
+ { 0x32bb, 2, { 0x34, 0x36 } },
+ { 0x32bc, 2, { 0x34, 0x37 } },
+ { 0x32bd, 2, { 0x34, 0x38 } },
+ { 0x32be, 2, { 0x34, 0x39 } },
+ { 0x32bf, 2, { 0x35, 0x30 } },
+ { 0x32c0, 2, { 0x31, 0x6708 } },
+ { 0x32c1, 2, { 0x32, 0x6708 } },
+ { 0x32c2, 2, { 0x33, 0x6708 } },
+ { 0x32c3, 2, { 0x34, 0x6708 } },
+ { 0x32c4, 2, { 0x35, 0x6708 } },
+ { 0x32c5, 2, { 0x36, 0x6708 } },
+ { 0x32c6, 2, { 0x37, 0x6708 } },
+ { 0x32c7, 2, { 0x38, 0x6708 } },
+ { 0x32c8, 2, { 0x39, 0x6708 } },
+ { 0x32c9, 3, { 895, 0 } },
+ { 0x32ca, 3, { 3, 0 } },
+ { 0x32cb, 3, { 12, 0 } },
+ { 0x32cc, 2, { 0x68, 0x67 } },
+ { 0x32cd, 3, { 87, 0 } },
+ { 0x32ce, 2, { 0x65, 0x76 } },
+ { 0x32cf, 3, { 466, 0 } },
+ { 0x32d0, 1, { 0x30a2, 0 } },
+ { 0x32d1, 1, { 0x30a4, 0 } },
+ { 0x32d2, 1, { 0x30a6, 0 } },
+ { 0x32d3, 1, { 0x30a8, 0 } },
+ { 0x32d4, 1, { 0x30aa, 0 } },
+ { 0x32d5, 1, { 0x30ab, 0 } },
+ { 0x32d6, 1, { 0x30ad, 0 } },
+ { 0x32d7, 1, { 0x30af, 0 } },
+ { 0x32d8, 1, { 0x30b1, 0 } },
+ { 0x32d9, 1, { 0x30b3, 0 } },
+ { 0x32da, 1, { 0x30b5, 0 } },
+ { 0x32db, 1, { 0x30b7, 0 } },
+ { 0x32dc, 1, { 0x30b9, 0 } },
+ { 0x32dd, 1, { 0x30bb, 0 } },
+ { 0x32de, 1, { 0x30bd, 0 } },
+ { 0x32df, 1, { 0x30bf, 0 } },
+ { 0x32e0, 1, { 0x30c1, 0 } },
+ { 0x32e1, 1, { 0x30c4, 0 } },
+ { 0x32e2, 1, { 0x30c6, 0 } },
+ { 0x32e3, 1, { 0x30c8, 0 } },
+ { 0x32e4, 1, { 0x30ca, 0 } },
+ { 0x32e5, 1, { 0x30cb, 0 } },
+ { 0x32e6, 1, { 0x30cc, 0 } },
+ { 0x32e7, 1, { 0x30cd, 0 } },
+ { 0x32e8, 1, { 0x30ce, 0 } },
+ { 0x32e9, 1, { 0x30cf, 0 } },
+ { 0x32ea, 1, { 0x30d2, 0 } },
+ { 0x32eb, 1, { 0x30d5, 0 } },
+ { 0x32ec, 1, { 0x30d8, 0 } },
+ { 0x32ed, 1, { 0x30db, 0 } },
+ { 0x32ee, 1, { 0x30de, 0 } },
+ { 0x32ef, 1, { 0x30df, 0 } },
+ { 0x32f0, 1, { 0x30e0, 0 } },
+ { 0x32f1, 1, { 0x30e1, 0 } },
+ { 0x32f2, 1, { 0x30e2, 0 } },
+ { 0x32f3, 1, { 0x30e4, 0 } },
+ { 0x32f4, 1, { 0x30e6, 0 } },
+ { 0x32f5, 1, { 0x30e8, 0 } },
+ { 0x32f6, 1, { 0x30e9, 0 } },
+ { 0x32f7, 1, { 0x30ea, 0 } },
+ { 0x32f8, 1, { 0x30eb, 0 } },
+ { 0x32f9, 1, { 0x30ec, 0 } },
+ { 0x32fa, 1, { 0x30ed, 0 } },
+ { 0x32fb, 1, { 0x30ef, 0 } },
+ { 0x32fc, 1, { 0x30f0, 0 } },
+ { 0x32fd, 1, { 0x30f1, 0 } },
+ { 0x32fe, 1, { 0x30f2, 0 } },
+ { 0x32ff, 2, { 0x4ee4, 0x548c } },
+ { 0x3300, 4, { 836, 0 } },
+ { 0x3301, 4, { 299, 0 } },
+ { 0x3302, 4, { 296, 0 } },
+ { 0x3303, 3, { 767, 0 } },
+ { 0x3304, 4, { 791, 0 } },
+ { 0x3305, 3, { 140, 0 } },
+ { 0x3306, 3, { 442, 0 } },
+ { 0x3307, 5, { 260, 0 } },
+ { 0x3308, 4, { 832, 0 } },
+ { 0x3309, 3, { 861, 0 } },
+ { 0x330a, 3, { 613, 0 } },
+ { 0x330b, 3, { 816, 0 } },
+ { 0x330c, 4, { 787, 0 } },
+ { 0x330d, 4, { 828, 0 } },
+ { 0x330e, 3, { 770, 0 } },
+ { 0x330f, 3, { 143, 0 } },
+ { 0x3310, 2, { 0x30ae, 0x30ac } },
+ { 0x3311, 3, { 445, 0 } },
+ { 0x3312, 4, { 783, 0 } },
+ { 0x3313, 4, { 281, 0 } },
+ { 0x3314, 2, { 0x30ad, 0x30ed } },
+ { 0x3315, 5, { 233, 0 } },
+ { 0x3316, 6, { 209, 0 } },
+ { 0x3317, 5, { 255, 0 } },
+ { 0x3318, 3, { 235, 0 } },
+ { 0x3319, 5, { 235, 0 } },
+ { 0x331a, 5, { 228, 0 } },
+ { 0x331b, 4, { 824, 0 } },
+ { 0x331c, 3, { 864, 0 } },
+ { 0x331d, 3, { 616, 0 } },
+ { 0x331e, 3, { 773, 0 } },
+ { 0x331f, 4, { 226, 0 } },
+ { 0x3320, 5, { 250, 0 } },
+ { 0x3321, 4, { 779, 0 } },
+ { 0x3322, 3, { 448, 0 } },
+ { 0x3323, 3, { 247, 0 } },
+ { 0x3324, 3, { 283, 0 } },
+ { 0x3325, 2, { 0x30c7, 0x30b7 } },
+ { 0x3326, 2, { 0x30c9, 0x30eb } },
+ { 0x3327, 2, { 0x30c8, 0x30f3 } },
+ { 0x3328, 2, { 0x30ca, 0x30ce } },
+ { 0x3329, 3, { 867, 0 } },
+ { 0x332a, 3, { 878, 0 } },
+ { 0x332b, 5, { 245, 0 } },
+ { 0x332c, 3, { 619, 0 } },
+ { 0x332d, 4, { 222, 0 } },
+ { 0x332e, 5, { 240, 0 } },
+ { 0x332f, 3, { 451, 0 } },
+ { 0x3330, 2, { 0x30d4, 0x30b3 } },
+ { 0x3331, 2, { 0x30d3, 0x30eb } },
+ { 0x3332, 5, { 301, 0 } },
+ { 0x3333, 4, { 277, 0 } },
+ { 0x3334, 5, { 306, 0 } },
+ { 0x3335, 3, { 286, 0 } },
+ { 0x3336, 5, { 311, 0 } },
+ { 0x3337, 2, { 0x30da, 0x30bd } },
+ { 0x3338, 3, { 622, 0 } },
+ { 0x3339, 3, { 870, 0 } },
+ { 0x333a, 3, { 454, 0 } },
+ { 0x333b, 3, { 289, 0 } },
+ { 0x333c, 3, { 881, 0 } },
+ { 0x333d, 4, { 775, 0 } },
+ { 0x333e, 3, { 625, 0 } },
+ { 0x333f, 2, { 0x30db, 0x30f3 } },
+ { 0x3340, 3, { 457, 0 } },
+ { 0x3341, 3, { 873, 0 } },
+ { 0x3342, 3, { 884, 0 } },
+ { 0x3343, 4, { 822, 0 } },
+ { 0x3344, 3, { 292, 0 } },
+ { 0x3345, 3, { 876, 0 } },
+ { 0x3346, 3, { 887, 0 } },
+ { 0x3347, 5, { 145, 0 } },
+ { 0x3348, 4, { 218, 0 } },
+ { 0x3349, 2, { 0x30df, 0x30ea } },
+ { 0x334a, 5, { 316, 0 } },
+ { 0x334b, 2, { 0x30e1, 0x30ac } },
+ { 0x334c, 4, { 273, 0 } },
+ { 0x334d, 4, { 211, 0 } },
+ { 0x334e, 3, { 628, 0 } },
+ { 0x334f, 3, { 460, 0 } },
+ { 0x3350, 3, { 295, 0 } },
+ { 0x3351, 4, { 818, 0 } },
+ { 0x3352, 2, { 0x30ea, 0x30e9 } },
+ { 0x3353, 3, { 320, 0 } },
+ { 0x3354, 4, { 214, 0 } },
+ { 0x3355, 2, { 0x30ec, 0x30e0 } },
+ { 0x3356, 5, { 150, 0 } },
+ { 0x3357, 3, { 257, 0 } },
+ { 0x3358, 2, { 0x30, 0x70b9 } },
+ { 0x3359, 2, { 0x31, 0x70b9 } },
+ { 0x335a, 2, { 0x32, 0x70b9 } },
+ { 0x335b, 2, { 0x33, 0x70b9 } },
+ { 0x335c, 2, { 0x34, 0x70b9 } },
+ { 0x335d, 2, { 0x35, 0x70b9 } },
+ { 0x335e, 2, { 0x36, 0x70b9 } },
+ { 0x335f, 2, { 0x37, 0x70b9 } },
+ { 0x3360, 2, { 0x38, 0x70b9 } },
+ { 0x3361, 2, { 0x39, 0x70b9 } },
+ { 0x3362, 3, { 892, 0 } },
+ { 0x3363, 3, { 6, 0 } },
+ { 0x3364, 3, { 15, 0 } },
+ { 0x3365, 3, { 21, 0 } },
+ { 0x3366, 3, { 27, 0 } },
+ { 0x3367, 3, { 33, 0 } },
+ { 0x3368, 3, { 39, 0 } },
+ { 0x3369, 3, { 45, 0 } },
+ { 0x336a, 3, { 51, 0 } },
+ { 0x336b, 3, { 57, 0 } },
+ { 0x336c, 3, { 676, 0 } },
+ { 0x336d, 3, { 670, 0 } },
+ { 0x336e, 3, { 664, 0 } },
+ { 0x336f, 3, { 658, 0 } },
+ { 0x3370, 3, { 652, 0 } },
+ { 0x3371, 3, { 713, 0 } },
+ { 0x3372, 2, { 0x64, 0x61 } },
+ { 0x3373, 2, { 0x61, 0x75 } },
+ { 0x3374, 3, { 77, 0 } },
+ { 0x3375, 2, { 0x6f, 0x76 } },
+ { 0x3376, 2, { 0x70, 0x63 } },
+ { 0x3377, 2, { 0x64, 0x6d } },
+ { 0x3378, 3, { 642, 0 } },
+ { 0x3379, 3, { 468, 0 } },
+ { 0x337a, 2, { 0x69, 0x75 } },
+ { 0x337b, 2, { 0x5e73, 0x6210 } },
+ { 0x337c, 2, { 0x662d, 0x548c } },
+ { 0x337d, 2, { 0x5927, 0x6b63 } },
+ { 0x337e, 2, { 0x660e, 0x6cbb } },
+ { 0x337f, 4, { 269, 0 } },
+ { 0x3380, 2, { 0x70, 0x61 } },
+ { 0x3381, 2, { 0x6e, 0x61 } },
+ { 0x3382, 2, { 0x3bc, 0x61 } },
+ { 0x3383, 2, { 0x6d, 0x61 } },
+ { 0x3384, 2, { 0x6b, 0x61 } },
+ { 0x3385, 2, { 0x6b, 0x62 } },
+ { 0x3386, 2, { 0x6d, 0x62 } },
+ { 0x3387, 2, { 0x67, 0x62 } },
+ { 0x3388, 3, { 464, 0 } },
+ { 0x3389, 4, { 463, 0 } },
+ { 0x338a, 2, { 0x70, 0x66 } },
+ { 0x338b, 2, { 0x6e, 0x66 } },
+ { 0x338c, 2, { 0x3bc, 0x66 } },
+ { 0x338d, 2, { 0x3bc, 0x67 } },
+ { 0x338e, 2, { 0x6d, 0x67 } },
+ { 0x338f, 2, { 0x6b, 0x67 } },
+ { 0x3390, 2, { 0x68, 0x7a } },
+ { 0x3391, 3, { 477, 0 } },
+ { 0x3392, 3, { 92, 0 } },
+ { 0x3393, 3, { 100, 0 } },
+ { 0x3394, 3, { 106, 0 } },
+ { 0x3395, 2, { 0x3bc, 0x6c } },
+ { 0x3396, 2, { 0x6d, 0x6c } },
+ { 0x3397, 2, { 0x64, 0x6c } },
+ { 0x3398, 2, { 0x6b, 0x6c } },
+ { 0x3399, 2, { 0x66, 0x6d } },
+ { 0x339a, 2, { 0x6e, 0x6d } },
+ { 0x339b, 2, { 0x3bc, 0x6d } },
+ { 0x339c, 2, { 0x6d, 0x6d } },
+ { 0x339d, 2, { 0x63, 0x6d } },
+ { 0x339e, 2, { 0x6b, 0x6d } },
+ { 0x339f, 3, { 637, 0 } },
+ { 0x33a0, 3, { 647, 0 } },
+ { 0x33a1, 2, { 0x6d, 0x32 } },
+ { 0x33a2, 3, { 693, 0 } },
+ { 0x33a3, 3, { 716, 0 } },
+ { 0x33a4, 3, { 698, 0 } },
+ { 0x33a5, 2, { 0x6d, 0x33 } },
+ { 0x33a6, 3, { 706, 0 } },
+ { 0x33a7, 3, { 491, 0 } },
+ { 0x33a8, 4, { 491, 0 } },
+ { 0x33a9, 2, { 0x70, 0x61 } },
+ { 0x33aa, 3, { 724, 0 } },
+ { 0x33ab, 3, { 482, 0 } },
+ { 0x33ac, 3, { 634, 0 } },
+ { 0x33ad, 3, { 79, 0 } },
+ { 0x33ae, 5, { 79, 0 } },
+ { 0x33af, 6, { 79, 0 } },
+ { 0x33b0, 2, { 0x70, 0x73 } },
+ { 0x33b1, 2, { 0x6e, 0x73 } },
+ { 0x33b2, 2, { 0x3bc, 0x73 } },
+ { 0x33b3, 2, { 0x6d, 0x73 } },
+ { 0x33b4, 2, { 0x70, 0x76 } },
+ { 0x33b5, 2, { 0x6e, 0x76 } },
+ { 0x33b6, 2, { 0x3bc, 0x76 } },
+ { 0x33b7, 2, { 0x6d, 0x76 } },
+ { 0x33b8, 2, { 0x6b, 0x76 } },
+ { 0x33b9, 2, { 0x6d, 0x76 } },
+ { 0x33ba, 2, { 0x70, 0x77 } },
+ { 0x33bb, 2, { 0x6e, 0x77 } },
+ { 0x33bc, 2, { 0x3bc, 0x77 } },
+ { 0x33bd, 2, { 0x6d, 0x77 } },
+ { 0x33be, 2, { 0x6b, 0x77 } },
+ { 0x33bf, 2, { 0x6d, 0x77 } },
+ { 0x33c0, 2, { 0x6b, 0x3c9 } },
+ { 0x33c1, 2, { 0x6d, 0x3c9 } },
+ { 0x33c3, 2, { 0x62, 0x71 } },
+ { 0x33c4, 2, { 0x63, 0x63 } },
+ { 0x33c5, 2, { 0x63, 0x64 } },
+ { 0x33c6, 4, { 631, 0 } },
+ { 0x33c8, 2, { 0x64, 0x62 } },
+ { 0x33c9, 2, { 0x67, 0x79 } },
+ { 0x33ca, 2, { 0x68, 0x61 } },
+ { 0x33cb, 2, { 0x68, 0x70 } },
+ { 0x33cc, 2, { 0x69, 0x6e } },
+ { 0x33cd, 2, { 0x6b, 0x6b } },
+ { 0x33ce, 2, { 0x6b, 0x6d } },
+ { 0x33cf, 2, { 0x6b, 0x74 } },
+ { 0x33d0, 2, { 0x6c, 0x6d } },
+ { 0x33d1, 2, { 0x6c, 0x6e } },
+ { 0x33d2, 3, { 98, 0 } },
+ { 0x33d3, 2, { 0x6c, 0x78 } },
+ { 0x33d4, 2, { 0x6d, 0x62 } },
+ { 0x33d5, 3, { 103, 0 } },
+ { 0x33d6, 3, { 486, 0 } },
+ { 0x33d7, 2, { 0x70, 0x68 } },
+ { 0x33d9, 3, { 480, 0 } },
+ { 0x33da, 2, { 0x70, 0x72 } },
+ { 0x33db, 2, { 0x73, 0x72 } },
+ { 0x33dc, 2, { 0x73, 0x76 } },
+ { 0x33dd, 2, { 0x77, 0x62 } },
+ { 0x33de, 3, { 489, 0 } },
+ { 0x33df, 3, { 484, 0 } },
+ { 0x33e0, 2, { 0x31, 0x65e5 } },
+ { 0x33e1, 2, { 0x32, 0x65e5 } },
+ { 0x33e2, 2, { 0x33, 0x65e5 } },
+ { 0x33e3, 2, { 0x34, 0x65e5 } },
+ { 0x33e4, 2, { 0x35, 0x65e5 } },
+ { 0x33e5, 2, { 0x36, 0x65e5 } },
+ { 0x33e6, 2, { 0x37, 0x65e5 } },
+ { 0x33e7, 2, { 0x38, 0x65e5 } },
+ { 0x33e8, 2, { 0x39, 0x65e5 } },
+ { 0x33e9, 3, { 898, 0 } },
+ { 0x33ea, 3, { 0, 0 } },
+ { 0x33eb, 3, { 9, 0 } },
+ { 0x33ec, 3, { 18, 0 } },
+ { 0x33ed, 3, { 24, 0 } },
+ { 0x33ee, 3, { 30, 0 } },
+ { 0x33ef, 3, { 36, 0 } },
+ { 0x33f0, 3, { 42, 0 } },
+ { 0x33f1, 3, { 48, 0 } },
+ { 0x33f2, 3, { 54, 0 } },
+ { 0x33f3, 3, { 679, 0 } },
+ { 0x33f4, 3, { 673, 0 } },
+ { 0x33f5, 3, { 667, 0 } },
+ { 0x33f6, 3, { 661, 0 } },
+ { 0x33f7, 3, { 655, 0 } },
+ { 0x33f8, 3, { 74, 0 } },
+ { 0x33f9, 3, { 649, 0 } },
+ { 0x33fa, 3, { 644, 0 } },
+ { 0x33fb, 3, { 695, 0 } },
+ { 0x33fc, 3, { 639, 0 } },
+ { 0x33fd, 3, { 496, 0 } },
+ { 0x33fe, 3, { 700, 0 } },
+ { 0x33ff, 3, { 89, 0 } },
+ { 0xa640, 1, { 0xa641, 0 } },
+ { 0xa642, 1, { 0xa643, 0 } },
+ { 0xa644, 1, { 0xa645, 0 } },
+ { 0xa646, 1, { 0xa647, 0 } },
+ { 0xa648, 1, { 0xa649, 0 } },
+ { 0xa64a, 1, { 0xa64b, 0 } },
+ { 0xa64c, 1, { 0xa64d, 0 } },
+ { 0xa64e, 1, { 0xa64f, 0 } },
+ { 0xa650, 1, { 0xa651, 0 } },
+ { 0xa652, 1, { 0xa653, 0 } },
+ { 0xa654, 1, { 0xa655, 0 } },
+ { 0xa656, 1, { 0xa657, 0 } },
+ { 0xa658, 1, { 0xa659, 0 } },
+ { 0xa65a, 1, { 0xa65b, 0 } },
+ { 0xa65c, 1, { 0xa65d, 0 } },
+ { 0xa65e, 1, { 0xa65f, 0 } },
+ { 0xa660, 1, { 0xa661, 0 } },
+ { 0xa662, 1, { 0xa663, 0 } },
+ { 0xa664, 1, { 0xa665, 0 } },
+ { 0xa666, 1, { 0xa667, 0 } },
+ { 0xa668, 1, { 0xa669, 0 } },
+ { 0xa66a, 1, { 0xa66b, 0 } },
+ { 0xa66c, 1, { 0xa66d, 0 } },
+ { 0xa680, 1, { 0xa681, 0 } },
+ { 0xa682, 1, { 0xa683, 0 } },
+ { 0xa684, 1, { 0xa685, 0 } },
+ { 0xa686, 1, { 0xa687, 0 } },
+ { 0xa688, 1, { 0xa689, 0 } },
+ { 0xa68a, 1, { 0xa68b, 0 } },
+ { 0xa68c, 1, { 0xa68d, 0 } },
+ { 0xa68e, 1, { 0xa68f, 0 } },
+ { 0xa690, 1, { 0xa691, 0 } },
+ { 0xa692, 1, { 0xa693, 0 } },
+ { 0xa694, 1, { 0xa695, 0 } },
+ { 0xa696, 1, { 0xa697, 0 } },
+ { 0xa698, 1, { 0xa699, 0 } },
+ { 0xa69a, 1, { 0xa69b, 0 } },
+ { 0xa69c, 1, { 0x44a, 0 } },
+ { 0xa69d, 1, { 0x44c, 0 } },
+ { 0xa722, 1, { 0xa723, 0 } },
+ { 0xa724, 1, { 0xa725, 0 } },
+ { 0xa726, 1, { 0xa727, 0 } },
+ { 0xa728, 1, { 0xa729, 0 } },
+ { 0xa72a, 1, { 0xa72b, 0 } },
+ { 0xa72c, 1, { 0xa72d, 0 } },
+ { 0xa72e, 1, { 0xa72f, 0 } },
+ { 0xa732, 1, { 0xa733, 0 } },
+ { 0xa734, 1, { 0xa735, 0 } },
+ { 0xa736, 1, { 0xa737, 0 } },
+ { 0xa738, 1, { 0xa739, 0 } },
+ { 0xa73a, 1, { 0xa73b, 0 } },
+ { 0xa73c, 1, { 0xa73d, 0 } },
+ { 0xa73e, 1, { 0xa73f, 0 } },
+ { 0xa740, 1, { 0xa741, 0 } },
+ { 0xa742, 1, { 0xa743, 0 } },
+ { 0xa744, 1, { 0xa745, 0 } },
+ { 0xa746, 1, { 0xa747, 0 } },
+ { 0xa748, 1, { 0xa749, 0 } },
+ { 0xa74a, 1, { 0xa74b, 0 } },
+ { 0xa74c, 1, { 0xa74d, 0 } },
+ { 0xa74e, 1, { 0xa74f, 0 } },
+ { 0xa750, 1, { 0xa751, 0 } },
+ { 0xa752, 1, { 0xa753, 0 } },
+ { 0xa754, 1, { 0xa755, 0 } },
+ { 0xa756, 1, { 0xa757, 0 } },
+ { 0xa758, 1, { 0xa759, 0 } },
+ { 0xa75a, 1, { 0xa75b, 0 } },
+ { 0xa75c, 1, { 0xa75d, 0 } },
+ { 0xa75e, 1, { 0xa75f, 0 } },
+ { 0xa760, 1, { 0xa761, 0 } },
+ { 0xa762, 1, { 0xa763, 0 } },
+ { 0xa764, 1, { 0xa765, 0 } },
+ { 0xa766, 1, { 0xa767, 0 } },
+ { 0xa768, 1, { 0xa769, 0 } },
+ { 0xa76a, 1, { 0xa76b, 0 } },
+ { 0xa76c, 1, { 0xa76d, 0 } },
+ { 0xa76e, 1, { 0xa76f, 0 } },
+ { 0xa770, 1, { 0xa76f, 0 } },
+ { 0xa779, 1, { 0xa77a, 0 } },
+ { 0xa77b, 1, { 0xa77c, 0 } },
+ { 0xa77d, 1, { 0x1d79, 0 } },
+ { 0xa77e, 1, { 0xa77f, 0 } },
+ { 0xa780, 1, { 0xa781, 0 } },
+ { 0xa782, 1, { 0xa783, 0 } },
+ { 0xa784, 1, { 0xa785, 0 } },
+ { 0xa786, 1, { 0xa787, 0 } },
+ { 0xa78b, 1, { 0xa78c, 0 } },
+ { 0xa78d, 1, { 0x265, 0 } },
+ { 0xa790, 1, { 0xa791, 0 } },
+ { 0xa792, 1, { 0xa793, 0 } },
+ { 0xa796, 1, { 0xa797, 0 } },
+ { 0xa798, 1, { 0xa799, 0 } },
+ { 0xa79a, 1, { 0xa79b, 0 } },
+ { 0xa79c, 1, { 0xa79d, 0 } },
+ { 0xa79e, 1, { 0xa79f, 0 } },
+ { 0xa7a0, 1, { 0xa7a1, 0 } },
+ { 0xa7a2, 1, { 0xa7a3, 0 } },
+ { 0xa7a4, 1, { 0xa7a5, 0 } },
+ { 0xa7a6, 1, { 0xa7a7, 0 } },
+ { 0xa7a8, 1, { 0xa7a9, 0 } },
+ { 0xa7aa, 1, { 0x266, 0 } },
+ { 0xa7ab, 1, { 0x25c, 0 } },
+ { 0xa7ac, 1, { 0x261, 0 } },
+ { 0xa7ad, 1, { 0x26c, 0 } },
+ { 0xa7ae, 1, { 0x26a, 0 } },
+ { 0xa7b0, 1, { 0x29e, 0 } },
+ { 0xa7b1, 1, { 0x287, 0 } },
+ { 0xa7b2, 1, { 0x29d, 0 } },
+ { 0xa7b3, 1, { 0xab53, 0 } },
+ { 0xa7b4, 1, { 0xa7b5, 0 } },
+ { 0xa7b6, 1, { 0xa7b7, 0 } },
+ { 0xa7b8, 1, { 0xa7b9, 0 } },
+ { 0xa7ba, 1, { 0xa7bb, 0 } },
+ { 0xa7bc, 1, { 0xa7bd, 0 } },
+ { 0xa7be, 1, { 0xa7bf, 0 } },
+ { 0xa7c0, 1, { 0xa7c1, 0 } },
+ { 0xa7c2, 1, { 0xa7c3, 0 } },
+ { 0xa7c4, 1, { 0xa794, 0 } },
+ { 0xa7c5, 1, { 0x282, 0 } },
+ { 0xa7c6, 1, { 0x1d8e, 0 } },
+ { 0xa7c7, 1, { 0xa7c8, 0 } },
+ { 0xa7c9, 1, { 0xa7ca, 0 } },
+ { 0xa7d0, 1, { 0xa7d1, 0 } },
+ { 0xa7d6, 1, { 0xa7d7, 0 } },
+ { 0xa7d8, 1, { 0xa7d9, 0 } },
+ { 0xa7f2, 1, { 0x63, 0 } },
+ { 0xa7f3, 1, { 0x66, 0 } },
+ { 0xa7f4, 1, { 0x71, 0 } },
+ { 0xa7f5, 1, { 0xa7f6, 0 } },
+ { 0xa7f8, 1, { 0x127, 0 } },
+ { 0xa7f9, 1, { 0x153, 0 } },
+ { 0xab5c, 1, { 0xa727, 0 } },
+ { 0xab5d, 1, { 0xab37, 0 } },
+ { 0xab5e, 1, { 0x26b, 0 } },
+ { 0xab5f, 1, { 0xab52, 0 } },
+ { 0xab69, 1, { 0x28d, 0 } },
+ { 0xab70, 1, { 0x13a0, 0 } },
+ { 0xab71, 1, { 0x13a1, 0 } },
+ { 0xab72, 1, { 0x13a2, 0 } },
+ { 0xab73, 1, { 0x13a3, 0 } },
+ { 0xab74, 1, { 0x13a4, 0 } },
+ { 0xab75, 1, { 0x13a5, 0 } },
+ { 0xab76, 1, { 0x13a6, 0 } },
+ { 0xab77, 1, { 0x13a7, 0 } },
+ { 0xab78, 1, { 0x13a8, 0 } },
+ { 0xab79, 1, { 0x13a9, 0 } },
+ { 0xab7a, 1, { 0x13aa, 0 } },
+ { 0xab7b, 1, { 0x13ab, 0 } },
+ { 0xab7c, 1, { 0x13ac, 0 } },
+ { 0xab7d, 1, { 0x13ad, 0 } },
+ { 0xab7e, 1, { 0x13ae, 0 } },
+ { 0xab7f, 1, { 0x13af, 0 } },
+ { 0xab80, 1, { 0x13b0, 0 } },
+ { 0xab81, 1, { 0x13b1, 0 } },
+ { 0xab82, 1, { 0x13b2, 0 } },
+ { 0xab83, 1, { 0x13b3, 0 } },
+ { 0xab84, 1, { 0x13b4, 0 } },
+ { 0xab85, 1, { 0x13b5, 0 } },
+ { 0xab86, 1, { 0x13b6, 0 } },
+ { 0xab87, 1, { 0x13b7, 0 } },
+ { 0xab88, 1, { 0x13b8, 0 } },
+ { 0xab89, 1, { 0x13b9, 0 } },
+ { 0xab8a, 1, { 0x13ba, 0 } },
+ { 0xab8b, 1, { 0x13bb, 0 } },
+ { 0xab8c, 1, { 0x13bc, 0 } },
+ { 0xab8d, 1, { 0x13bd, 0 } },
+ { 0xab8e, 1, { 0x13be, 0 } },
+ { 0xab8f, 1, { 0x13bf, 0 } },
+ { 0xab90, 1, { 0x13c0, 0 } },
+ { 0xab91, 1, { 0x13c1, 0 } },
+ { 0xab92, 1, { 0x13c2, 0 } },
+ { 0xab93, 1, { 0x13c3, 0 } },
+ { 0xab94, 1, { 0x13c4, 0 } },
+ { 0xab95, 1, { 0x13c5, 0 } },
+ { 0xab96, 1, { 0x13c6, 0 } },
+ { 0xab97, 1, { 0x13c7, 0 } },
+ { 0xab98, 1, { 0x13c8, 0 } },
+ { 0xab99, 1, { 0x13c9, 0 } },
+ { 0xab9a, 1, { 0x13ca, 0 } },
+ { 0xab9b, 1, { 0x13cb, 0 } },
+ { 0xab9c, 1, { 0x13cc, 0 } },
+ { 0xab9d, 1, { 0x13cd, 0 } },
+ { 0xab9e, 1, { 0x13ce, 0 } },
+ { 0xab9f, 1, { 0x13cf, 0 } },
+ { 0xaba0, 1, { 0x13d0, 0 } },
+ { 0xaba1, 1, { 0x13d1, 0 } },
+ { 0xaba2, 1, { 0x13d2, 0 } },
+ { 0xaba3, 1, { 0x13d3, 0 } },
+ { 0xaba4, 1, { 0x13d4, 0 } },
+ { 0xaba5, 1, { 0x13d5, 0 } },
+ { 0xaba6, 1, { 0x13d6, 0 } },
+ { 0xaba7, 1, { 0x13d7, 0 } },
+ { 0xaba8, 1, { 0x13d8, 0 } },
+ { 0xaba9, 1, { 0x13d9, 0 } },
+ { 0xabaa, 1, { 0x13da, 0 } },
+ { 0xabab, 1, { 0x13db, 0 } },
+ { 0xabac, 1, { 0x13dc, 0 } },
+ { 0xabad, 1, { 0x13dd, 0 } },
+ { 0xabae, 1, { 0x13de, 0 } },
+ { 0xabaf, 1, { 0x13df, 0 } },
+ { 0xabb0, 1, { 0x13e0, 0 } },
+ { 0xabb1, 1, { 0x13e1, 0 } },
+ { 0xabb2, 1, { 0x13e2, 0 } },
+ { 0xabb3, 1, { 0x13e3, 0 } },
+ { 0xabb4, 1, { 0x13e4, 0 } },
+ { 0xabb5, 1, { 0x13e5, 0 } },
+ { 0xabb6, 1, { 0x13e6, 0 } },
+ { 0xabb7, 1, { 0x13e7, 0 } },
+ { 0xabb8, 1, { 0x13e8, 0 } },
+ { 0xabb9, 1, { 0x13e9, 0 } },
+ { 0xabba, 1, { 0x13ea, 0 } },
+ { 0xabbb, 1, { 0x13eb, 0 } },
+ { 0xabbc, 1, { 0x13ec, 0 } },
+ { 0xabbd, 1, { 0x13ed, 0 } },
+ { 0xabbe, 1, { 0x13ee, 0 } },
+ { 0xabbf, 1, { 0x13ef, 0 } },
+ { 0xf900, 1, { 0x8c48, 0 } },
+ { 0xf901, 1, { 0x66f4, 0 } },
+ { 0xf902, 1, { 0x8eca, 0 } },
+ { 0xf903, 1, { 0x8cc8, 0 } },
+ { 0xf904, 1, { 0x6ed1, 0 } },
+ { 0xf905, 1, { 0x4e32, 0 } },
+ { 0xf906, 1, { 0x53e5, 0 } },
+ { 0xf907, 1, { 0x9f9c, 0 } },
+ { 0xf908, 1, { 0x9f9c, 0 } },
+ { 0xf909, 1, { 0x5951, 0 } },
+ { 0xf90a, 1, { 0x91d1, 0 } },
+ { 0xf90b, 1, { 0x5587, 0 } },
+ { 0xf90c, 1, { 0x5948, 0 } },
+ { 0xf90d, 1, { 0x61f6, 0 } },
+ { 0xf90e, 1, { 0x7669, 0 } },
+ { 0xf90f, 1, { 0x7f85, 0 } },
+ { 0xf910, 1, { 0x863f, 0 } },
+ { 0xf911, 1, { 0x87ba, 0 } },
+ { 0xf912, 1, { 0x88f8, 0 } },
+ { 0xf913, 1, { 0x908f, 0 } },
+ { 0xf914, 1, { 0x6a02, 0 } },
+ { 0xf915, 1, { 0x6d1b, 0 } },
+ { 0xf916, 1, { 0x70d9, 0 } },
+ { 0xf917, 1, { 0x73de, 0 } },
+ { 0xf918, 1, { 0x843d, 0 } },
+ { 0xf919, 1, { 0x916a, 0 } },
+ { 0xf91a, 1, { 0x99f1, 0 } },
+ { 0xf91b, 1, { 0x4e82, 0 } },
+ { 0xf91c, 1, { 0x5375, 0 } },
+ { 0xf91d, 1, { 0x6b04, 0 } },
+ { 0xf91e, 1, { 0x721b, 0 } },
+ { 0xf91f, 1, { 0x862d, 0 } },
+ { 0xf920, 1, { 0x9e1e, 0 } },
+ { 0xf921, 1, { 0x5d50, 0 } },
+ { 0xf922, 1, { 0x6feb, 0 } },
+ { 0xf923, 1, { 0x85cd, 0 } },
+ { 0xf924, 1, { 0x8964, 0 } },
+ { 0xf925, 1, { 0x62c9, 0 } },
+ { 0xf926, 1, { 0x81d8, 0 } },
+ { 0xf927, 1, { 0x881f, 0 } },
+ { 0xf928, 1, { 0x5eca, 0 } },
+ { 0xf929, 1, { 0x6717, 0 } },
+ { 0xf92a, 1, { 0x6d6a, 0 } },
+ { 0xf92b, 1, { 0x72fc, 0 } },
+ { 0xf92c, 1, { 0x90ce, 0 } },
+ { 0xf92d, 1, { 0x4f86, 0 } },
+ { 0xf92e, 1, { 0x51b7, 0 } },
+ { 0xf92f, 1, { 0x52de, 0 } },
+ { 0xf930, 1, { 0x64c4, 0 } },
+ { 0xf931, 1, { 0x6ad3, 0 } },
+ { 0xf932, 1, { 0x7210, 0 } },
+ { 0xf933, 1, { 0x76e7, 0 } },
+ { 0xf934, 1, { 0x8001, 0 } },
+ { 0xf935, 1, { 0x8606, 0 } },
+ { 0xf936, 1, { 0x865c, 0 } },
+ { 0xf937, 1, { 0x8def, 0 } },
+ { 0xf938, 1, { 0x9732, 0 } },
+ { 0xf939, 1, { 0x9b6f, 0 } },
+ { 0xf93a, 1, { 0x9dfa, 0 } },
+ { 0xf93b, 1, { 0x788c, 0 } },
+ { 0xf93c, 1, { 0x797f, 0 } },
+ { 0xf93d, 1, { 0x7da0, 0 } },
+ { 0xf93e, 1, { 0x83c9, 0 } },
+ { 0xf93f, 1, { 0x9304, 0 } },
+ { 0xf940, 1, { 0x9e7f, 0 } },
+ { 0xf941, 1, { 0x8ad6, 0 } },
+ { 0xf942, 1, { 0x58df, 0 } },
+ { 0xf943, 1, { 0x5f04, 0 } },
+ { 0xf944, 1, { 0x7c60, 0 } },
+ { 0xf945, 1, { 0x807e, 0 } },
+ { 0xf946, 1, { 0x7262, 0 } },
+ { 0xf947, 1, { 0x78ca, 0 } },
+ { 0xf948, 1, { 0x8cc2, 0 } },
+ { 0xf949, 1, { 0x96f7, 0 } },
+ { 0xf94a, 1, { 0x58d8, 0 } },
+ { 0xf94b, 1, { 0x5c62, 0 } },
+ { 0xf94c, 1, { 0x6a13, 0 } },
+ { 0xf94d, 1, { 0x6dda, 0 } },
+ { 0xf94e, 1, { 0x6f0f, 0 } },
+ { 0xf94f, 1, { 0x7d2f, 0 } },
+ { 0xf950, 1, { 0x7e37, 0 } },
+ { 0xf951, 1, { 0x964b, 0 } },
+ { 0xf952, 1, { 0x52d2, 0 } },
+ { 0xf953, 1, { 0x808b, 0 } },
+ { 0xf954, 1, { 0x51dc, 0 } },
+ { 0xf955, 1, { 0x51cc, 0 } },
+ { 0xf956, 1, { 0x7a1c, 0 } },
+ { 0xf957, 1, { 0x7dbe, 0 } },
+ { 0xf958, 1, { 0x83f1, 0 } },
+ { 0xf959, 1, { 0x9675, 0 } },
+ { 0xf95a, 1, { 0x8b80, 0 } },
+ { 0xf95b, 1, { 0x62cf, 0 } },
+ { 0xf95c, 1, { 0x6a02, 0 } },
+ { 0xf95d, 1, { 0x8afe, 0 } },
+ { 0xf95e, 1, { 0x4e39, 0 } },
+ { 0xf95f, 1, { 0x5be7, 0 } },
+ { 0xf960, 1, { 0x6012, 0 } },
+ { 0xf961, 1, { 0x7387, 0 } },
+ { 0xf962, 1, { 0x7570, 0 } },
+ { 0xf963, 1, { 0x5317, 0 } },
+ { 0xf964, 1, { 0x78fb, 0 } },
+ { 0xf965, 1, { 0x4fbf, 0 } },
+ { 0xf966, 1, { 0x5fa9, 0 } },
+ { 0xf967, 1, { 0x4e0d, 0 } },
+ { 0xf968, 1, { 0x6ccc, 0 } },
+ { 0xf969, 1, { 0x6578, 0 } },
+ { 0xf96a, 1, { 0x7d22, 0 } },
+ { 0xf96b, 1, { 0x53c3, 0 } },
+ { 0xf96c, 1, { 0x585e, 0 } },
+ { 0xf96d, 1, { 0x7701, 0 } },
+ { 0xf96e, 1, { 0x8449, 0 } },
+ { 0xf96f, 1, { 0x8aaa, 0 } },
+ { 0xf970, 1, { 0x6bba, 0 } },
+ { 0xf971, 1, { 0x8fb0, 0 } },
+ { 0xf972, 1, { 0x6c88, 0 } },
+ { 0xf973, 1, { 0x62fe, 0 } },
+ { 0xf974, 1, { 0x82e5, 0 } },
+ { 0xf975, 1, { 0x63a0, 0 } },
+ { 0xf976, 1, { 0x7565, 0 } },
+ { 0xf977, 1, { 0x4eae, 0 } },
+ { 0xf978, 1, { 0x5169, 0 } },
+ { 0xf979, 1, { 0x51c9, 0 } },
+ { 0xf97a, 1, { 0x6881, 0 } },
+ { 0xf97b, 1, { 0x7ce7, 0 } },
+ { 0xf97c, 1, { 0x826f, 0 } },
+ { 0xf97d, 1, { 0x8ad2, 0 } },
+ { 0xf97e, 1, { 0x91cf, 0 } },
+ { 0xf97f, 1, { 0x52f5, 0 } },
+ { 0xf980, 1, { 0x5442, 0 } },
+ { 0xf981, 1, { 0x5973, 0 } },
+ { 0xf982, 1, { 0x5eec, 0 } },
+ { 0xf983, 1, { 0x65c5, 0 } },
+ { 0xf984, 1, { 0x6ffe, 0 } },
+ { 0xf985, 1, { 0x792a, 0 } },
+ { 0xf986, 1, { 0x95ad, 0 } },
+ { 0xf987, 1, { 0x9a6a, 0 } },
+ { 0xf988, 1, { 0x9e97, 0 } },
+ { 0xf989, 1, { 0x9ece, 0 } },
+ { 0xf98a, 1, { 0x529b, 0 } },
+ { 0xf98b, 1, { 0x66c6, 0 } },
+ { 0xf98c, 1, { 0x6b77, 0 } },
+ { 0xf98d, 1, { 0x8f62, 0 } },
+ { 0xf98e, 1, { 0x5e74, 0 } },
+ { 0xf98f, 1, { 0x6190, 0 } },
+ { 0xf990, 1, { 0x6200, 0 } },
+ { 0xf991, 1, { 0x649a, 0 } },
+ { 0xf992, 1, { 0x6f23, 0 } },
+ { 0xf993, 1, { 0x7149, 0 } },
+ { 0xf994, 1, { 0x7489, 0 } },
+ { 0xf995, 1, { 0x79ca, 0 } },
+ { 0xf996, 1, { 0x7df4, 0 } },
+ { 0xf997, 1, { 0x806f, 0 } },
+ { 0xf998, 1, { 0x8f26, 0 } },
+ { 0xf999, 1, { 0x84ee, 0 } },
+ { 0xf99a, 1, { 0x9023, 0 } },
+ { 0xf99b, 1, { 0x934a, 0 } },
+ { 0xf99c, 1, { 0x5217, 0 } },
+ { 0xf99d, 1, { 0x52a3, 0 } },
+ { 0xf99e, 1, { 0x54bd, 0 } },
+ { 0xf99f, 1, { 0x70c8, 0 } },
+ { 0xf9a0, 1, { 0x88c2, 0 } },
+ { 0xf9a1, 1, { 0x8aaa, 0 } },
+ { 0xf9a2, 1, { 0x5ec9, 0 } },
+ { 0xf9a3, 1, { 0x5ff5, 0 } },
+ { 0xf9a4, 1, { 0x637b, 0 } },
+ { 0xf9a5, 1, { 0x6bae, 0 } },
+ { 0xf9a6, 1, { 0x7c3e, 0 } },
+ { 0xf9a7, 1, { 0x7375, 0 } },
+ { 0xf9a8, 1, { 0x4ee4, 0 } },
+ { 0xf9a9, 1, { 0x56f9, 0 } },
+ { 0xf9aa, 1, { 0x5be7, 0 } },
+ { 0xf9ab, 1, { 0x5dba, 0 } },
+ { 0xf9ac, 1, { 0x601c, 0 } },
+ { 0xf9ad, 1, { 0x73b2, 0 } },
+ { 0xf9ae, 1, { 0x7469, 0 } },
+ { 0xf9af, 1, { 0x7f9a, 0 } },
+ { 0xf9b0, 1, { 0x8046, 0 } },
+ { 0xf9b1, 1, { 0x9234, 0 } },
+ { 0xf9b2, 1, { 0x96f6, 0 } },
+ { 0xf9b3, 1, { 0x9748, 0 } },
+ { 0xf9b4, 1, { 0x9818, 0 } },
+ { 0xf9b5, 1, { 0x4f8b, 0 } },
+ { 0xf9b6, 1, { 0x79ae, 0 } },
+ { 0xf9b7, 1, { 0x91b4, 0 } },
+ { 0xf9b8, 1, { 0x96b8, 0 } },
+ { 0xf9b9, 1, { 0x60e1, 0 } },
+ { 0xf9ba, 1, { 0x4e86, 0 } },
+ { 0xf9bb, 1, { 0x50da, 0 } },
+ { 0xf9bc, 1, { 0x5bee, 0 } },
+ { 0xf9bd, 1, { 0x5c3f, 0 } },
+ { 0xf9be, 1, { 0x6599, 0 } },
+ { 0xf9bf, 1, { 0x6a02, 0 } },
+ { 0xf9c0, 1, { 0x71ce, 0 } },
+ { 0xf9c1, 1, { 0x7642, 0 } },
+ { 0xf9c2, 1, { 0x84fc, 0 } },
+ { 0xf9c3, 1, { 0x907c, 0 } },
+ { 0xf9c4, 1, { 0x9f8d, 0 } },
+ { 0xf9c5, 1, { 0x6688, 0 } },
+ { 0xf9c6, 1, { 0x962e, 0 } },
+ { 0xf9c7, 1, { 0x5289, 0 } },
+ { 0xf9c8, 1, { 0x677b, 0 } },
+ { 0xf9c9, 1, { 0x67f3, 0 } },
+ { 0xf9ca, 1, { 0x6d41, 0 } },
+ { 0xf9cb, 1, { 0x6e9c, 0 } },
+ { 0xf9cc, 1, { 0x7409, 0 } },
+ { 0xf9cd, 1, { 0x7559, 0 } },
+ { 0xf9ce, 1, { 0x786b, 0 } },
+ { 0xf9cf, 1, { 0x7d10, 0 } },
+ { 0xf9d0, 1, { 0x985e, 0 } },
+ { 0xf9d1, 1, { 0x516d, 0 } },
+ { 0xf9d2, 1, { 0x622e, 0 } },
+ { 0xf9d3, 1, { 0x9678, 0 } },
+ { 0xf9d4, 1, { 0x502b, 0 } },
+ { 0xf9d5, 1, { 0x5d19, 0 } },
+ { 0xf9d6, 1, { 0x6dea, 0 } },
+ { 0xf9d7, 1, { 0x8f2a, 0 } },
+ { 0xf9d8, 1, { 0x5f8b, 0 } },
+ { 0xf9d9, 1, { 0x6144, 0 } },
+ { 0xf9da, 1, { 0x6817, 0 } },
+ { 0xf9db, 1, { 0x7387, 0 } },
+ { 0xf9dc, 1, { 0x9686, 0 } },
+ { 0xf9dd, 1, { 0x5229, 0 } },
+ { 0xf9de, 1, { 0x540f, 0 } },
+ { 0xf9df, 1, { 0x5c65, 0 } },
+ { 0xf9e0, 1, { 0x6613, 0 } },
+ { 0xf9e1, 1, { 0x674e, 0 } },
+ { 0xf9e2, 1, { 0x68a8, 0 } },
+ { 0xf9e3, 1, { 0x6ce5, 0 } },
+ { 0xf9e4, 1, { 0x7406, 0 } },
+ { 0xf9e5, 1, { 0x75e2, 0 } },
+ { 0xf9e6, 1, { 0x7f79, 0 } },
+ { 0xf9e7, 1, { 0x88cf, 0 } },
+ { 0xf9e8, 1, { 0x88e1, 0 } },
+ { 0xf9e9, 1, { 0x91cc, 0 } },
+ { 0xf9ea, 1, { 0x96e2, 0 } },
+ { 0xf9eb, 1, { 0x533f, 0 } },
+ { 0xf9ec, 1, { 0x6eba, 0 } },
+ { 0xf9ed, 1, { 0x541d, 0 } },
+ { 0xf9ee, 1, { 0x71d0, 0 } },
+ { 0xf9ef, 1, { 0x7498, 0 } },
+ { 0xf9f0, 1, { 0x85fa, 0 } },
+ { 0xf9f1, 1, { 0x96a3, 0 } },
+ { 0xf9f2, 1, { 0x9c57, 0 } },
+ { 0xf9f3, 1, { 0x9e9f, 0 } },
+ { 0xf9f4, 1, { 0x6797, 0 } },
+ { 0xf9f5, 1, { 0x6dcb, 0 } },
+ { 0xf9f6, 1, { 0x81e8, 0 } },
+ { 0xf9f7, 1, { 0x7acb, 0 } },
+ { 0xf9f8, 1, { 0x7b20, 0 } },
+ { 0xf9f9, 1, { 0x7c92, 0 } },
+ { 0xf9fa, 1, { 0x72c0, 0 } },
+ { 0xf9fb, 1, { 0x7099, 0 } },
+ { 0xf9fc, 1, { 0x8b58, 0 } },
+ { 0xf9fd, 1, { 0x4ec0, 0 } },
+ { 0xf9fe, 1, { 0x8336, 0 } },
+ { 0xf9ff, 1, { 0x523a, 0 } },
+ { 0xfa00, 1, { 0x5207, 0 } },
+ { 0xfa01, 1, { 0x5ea6, 0 } },
+ { 0xfa02, 1, { 0x62d3, 0 } },
+ { 0xfa03, 1, { 0x7cd6, 0 } },
+ { 0xfa04, 1, { 0x5b85, 0 } },
+ { 0xfa05, 1, { 0x6d1e, 0 } },
+ { 0xfa06, 1, { 0x66b4, 0 } },
+ { 0xfa07, 1, { 0x8f3b, 0 } },
+ { 0xfa08, 1, { 0x884c, 0 } },
+ { 0xfa09, 1, { 0x964d, 0 } },
+ { 0xfa0a, 1, { 0x898b, 0 } },
+ { 0xfa0b, 1, { 0x5ed3, 0 } },
+ { 0xfa0c, 1, { 0x5140, 0 } },
+ { 0xfa0d, 1, { 0x55c0, 0 } },
+ { 0xfa10, 1, { 0x585a, 0 } },
+ { 0xfa12, 1, { 0x6674, 0 } },
+ { 0xfa15, 1, { 0x51de, 0 } },
+ { 0xfa16, 1, { 0x732a, 0 } },
+ { 0xfa17, 1, { 0x76ca, 0 } },
+ { 0xfa18, 1, { 0x793c, 0 } },
+ { 0xfa19, 1, { 0x795e, 0 } },
+ { 0xfa1a, 1, { 0x7965, 0 } },
+ { 0xfa1b, 1, { 0x798f, 0 } },
+ { 0xfa1c, 1, { 0x9756, 0 } },
+ { 0xfa1d, 1, { 0x7cbe, 0 } },
+ { 0xfa1e, 1, { 0x7fbd, 0 } },
+ { 0xfa20, 1, { 0x8612, 0 } },
+ { 0xfa22, 1, { 0x8af8, 0 } },
+ { 0xfa25, 1, { 0x9038, 0 } },
+ { 0xfa26, 1, { 0x90fd, 0 } },
+ { 0xfa2a, 1, { 0x98ef, 0 } },
+ { 0xfa2b, 1, { 0x98fc, 0 } },
+ { 0xfa2c, 1, { 0x9928, 0 } },
+ { 0xfa2d, 1, { 0x9db4, 0 } },
+ { 0xfa2e, 1, { 0x90de, 0 } },
+ { 0xfa2f, 1, { 0x96b7, 0 } },
+ { 0xfa30, 1, { 0x4fae, 0 } },
+ { 0xfa31, 1, { 0x50e7, 0 } },
+ { 0xfa32, 1, { 0x514d, 0 } },
+ { 0xfa33, 1, { 0x52c9, 0 } },
+ { 0xfa34, 1, { 0x52e4, 0 } },
+ { 0xfa35, 1, { 0x5351, 0 } },
+ { 0xfa36, 1, { 0x559d, 0 } },
+ { 0xfa37, 1, { 0x5606, 0 } },
+ { 0xfa38, 1, { 0x5668, 0 } },
+ { 0xfa39, 1, { 0x5840, 0 } },
+ { 0xfa3a, 1, { 0x58a8, 0 } },
+ { 0xfa3b, 1, { 0x5c64, 0 } },
+ { 0xfa3c, 1, { 0x5c6e, 0 } },
+ { 0xfa3d, 1, { 0x6094, 0 } },
+ { 0xfa3e, 1, { 0x6168, 0 } },
+ { 0xfa3f, 1, { 0x618e, 0 } },
+ { 0xfa40, 1, { 0x61f2, 0 } },
+ { 0xfa41, 1, { 0x654f, 0 } },
+ { 0xfa42, 1, { 0x65e2, 0 } },
+ { 0xfa43, 1, { 0x6691, 0 } },
+ { 0xfa44, 1, { 0x6885, 0 } },
+ { 0xfa45, 1, { 0x6d77, 0 } },
+ { 0xfa46, 1, { 0x6e1a, 0 } },
+ { 0xfa47, 1, { 0x6f22, 0 } },
+ { 0xfa48, 1, { 0x716e, 0 } },
+ { 0xfa49, 1, { 0x722b, 0 } },
+ { 0xfa4a, 1, { 0x7422, 0 } },
+ { 0xfa4b, 1, { 0x7891, 0 } },
+ { 0xfa4c, 1, { 0x793e, 0 } },
+ { 0xfa4d, 1, { 0x7949, 0 } },
+ { 0xfa4e, 1, { 0x7948, 0 } },
+ { 0xfa4f, 1, { 0x7950, 0 } },
+ { 0xfa50, 1, { 0x7956, 0 } },
+ { 0xfa51, 1, { 0x795d, 0 } },
+ { 0xfa52, 1, { 0x798d, 0 } },
+ { 0xfa53, 1, { 0x798e, 0 } },
+ { 0xfa54, 1, { 0x7a40, 0 } },
+ { 0xfa55, 1, { 0x7a81, 0 } },
+ { 0xfa56, 1, { 0x7bc0, 0 } },
+ { 0xfa57, 1, { 0x7df4, 0 } },
+ { 0xfa58, 1, { 0x7e09, 0 } },
+ { 0xfa59, 1, { 0x7e41, 0 } },
+ { 0xfa5a, 1, { 0x7f72, 0 } },
+ { 0xfa5b, 1, { 0x8005, 0 } },
+ { 0xfa5c, 1, { 0x81ed, 0 } },
+ { 0xfa5d, 1, { 0x8279, 0 } },
+ { 0xfa5e, 1, { 0x8279, 0 } },
+ { 0xfa5f, 1, { 0x8457, 0 } },
+ { 0xfa60, 1, { 0x8910, 0 } },
+ { 0xfa61, 1, { 0x8996, 0 } },
+ { 0xfa62, 1, { 0x8b01, 0 } },
+ { 0xfa63, 1, { 0x8b39, 0 } },
+ { 0xfa64, 1, { 0x8cd3, 0 } },
+ { 0xfa65, 1, { 0x8d08, 0 } },
+ { 0xfa66, 1, { 0x8fb6, 0 } },
+ { 0xfa67, 1, { 0x9038, 0 } },
+ { 0xfa68, 1, { 0x96e3, 0 } },
+ { 0xfa69, 1, { 0x97ff, 0 } },
+ { 0xfa6a, 1, { 0x983b, 0 } },
+ { 0xfa6b, 1, { 0x6075, 0 } },
+ { 0xfa6c, 2, { 0xd850, 0xdeee } },
+ { 0xfa6d, 1, { 0x8218, 0 } },
+ { 0xfa70, 1, { 0x4e26, 0 } },
+ { 0xfa71, 1, { 0x51b5, 0 } },
+ { 0xfa72, 1, { 0x5168, 0 } },
+ { 0xfa73, 1, { 0x4f80, 0 } },
+ { 0xfa74, 1, { 0x5145, 0 } },
+ { 0xfa75, 1, { 0x5180, 0 } },
+ { 0xfa76, 1, { 0x52c7, 0 } },
+ { 0xfa77, 1, { 0x52fa, 0 } },
+ { 0xfa78, 1, { 0x559d, 0 } },
+ { 0xfa79, 1, { 0x5555, 0 } },
+ { 0xfa7a, 1, { 0x5599, 0 } },
+ { 0xfa7b, 1, { 0x55e2, 0 } },
+ { 0xfa7c, 1, { 0x585a, 0 } },
+ { 0xfa7d, 1, { 0x58b3, 0 } },
+ { 0xfa7e, 1, { 0x5944, 0 } },
+ { 0xfa7f, 1, { 0x5954, 0 } },
+ { 0xfa80, 1, { 0x5a62, 0 } },
+ { 0xfa81, 1, { 0x5b28, 0 } },
+ { 0xfa82, 1, { 0x5ed2, 0 } },
+ { 0xfa83, 1, { 0x5ed9, 0 } },
+ { 0xfa84, 1, { 0x5f69, 0 } },
+ { 0xfa85, 1, { 0x5fad, 0 } },
+ { 0xfa86, 1, { 0x60d8, 0 } },
+ { 0xfa87, 1, { 0x614e, 0 } },
+ { 0xfa88, 1, { 0x6108, 0 } },
+ { 0xfa89, 1, { 0x618e, 0 } },
+ { 0xfa8a, 1, { 0x6160, 0 } },
+ { 0xfa8b, 1, { 0x61f2, 0 } },
+ { 0xfa8c, 1, { 0x6234, 0 } },
+ { 0xfa8d, 1, { 0x63c4, 0 } },
+ { 0xfa8e, 1, { 0x641c, 0 } },
+ { 0xfa8f, 1, { 0x6452, 0 } },
+ { 0xfa90, 1, { 0x6556, 0 } },
+ { 0xfa91, 1, { 0x6674, 0 } },
+ { 0xfa92, 1, { 0x6717, 0 } },
+ { 0xfa93, 1, { 0x671b, 0 } },
+ { 0xfa94, 1, { 0x6756, 0 } },
+ { 0xfa95, 1, { 0x6b79, 0 } },
+ { 0xfa96, 1, { 0x6bba, 0 } },
+ { 0xfa97, 1, { 0x6d41, 0 } },
+ { 0xfa98, 1, { 0x6edb, 0 } },
+ { 0xfa99, 1, { 0x6ecb, 0 } },
+ { 0xfa9a, 1, { 0x6f22, 0 } },
+ { 0xfa9b, 1, { 0x701e, 0 } },
+ { 0xfa9c, 1, { 0x716e, 0 } },
+ { 0xfa9d, 1, { 0x77a7, 0 } },
+ { 0xfa9e, 1, { 0x7235, 0 } },
+ { 0xfa9f, 1, { 0x72af, 0 } },
+ { 0xfaa0, 1, { 0x732a, 0 } },
+ { 0xfaa1, 1, { 0x7471, 0 } },
+ { 0xfaa2, 1, { 0x7506, 0 } },
+ { 0xfaa3, 1, { 0x753b, 0 } },
+ { 0xfaa4, 1, { 0x761d, 0 } },
+ { 0xfaa5, 1, { 0x761f, 0 } },
+ { 0xfaa6, 1, { 0x76ca, 0 } },
+ { 0xfaa7, 1, { 0x76db, 0 } },
+ { 0xfaa8, 1, { 0x76f4, 0 } },
+ { 0xfaa9, 1, { 0x774a, 0 } },
+ { 0xfaaa, 1, { 0x7740, 0 } },
+ { 0xfaab, 1, { 0x78cc, 0 } },
+ { 0xfaac, 1, { 0x7ab1, 0 } },
+ { 0xfaad, 1, { 0x7bc0, 0 } },
+ { 0xfaae, 1, { 0x7c7b, 0 } },
+ { 0xfaaf, 1, { 0x7d5b, 0 } },
+ { 0xfab0, 1, { 0x7df4, 0 } },
+ { 0xfab1, 1, { 0x7f3e, 0 } },
+ { 0xfab2, 1, { 0x8005, 0 } },
+ { 0xfab3, 1, { 0x8352, 0 } },
+ { 0xfab4, 1, { 0x83ef, 0 } },
+ { 0xfab5, 1, { 0x8779, 0 } },
+ { 0xfab6, 1, { 0x8941, 0 } },
+ { 0xfab7, 1, { 0x8986, 0 } },
+ { 0xfab8, 1, { 0x8996, 0 } },
+ { 0xfab9, 1, { 0x8abf, 0 } },
+ { 0xfaba, 1, { 0x8af8, 0 } },
+ { 0xfabb, 1, { 0x8acb, 0 } },
+ { 0xfabc, 1, { 0x8b01, 0 } },
+ { 0xfabd, 1, { 0x8afe, 0 } },
+ { 0xfabe, 1, { 0x8aed, 0 } },
+ { 0xfabf, 1, { 0x8b39, 0 } },
+ { 0xfac0, 1, { 0x8b8a, 0 } },
+ { 0xfac1, 1, { 0x8d08, 0 } },
+ { 0xfac2, 1, { 0x8f38, 0 } },
+ { 0xfac3, 1, { 0x9072, 0 } },
+ { 0xfac4, 1, { 0x9199, 0 } },
+ { 0xfac5, 1, { 0x9276, 0 } },
+ { 0xfac6, 1, { 0x967c, 0 } },
+ { 0xfac7, 1, { 0x96e3, 0 } },
+ { 0xfac8, 1, { 0x9756, 0 } },
+ { 0xfac9, 1, { 0x97db, 0 } },
+ { 0xfaca, 1, { 0x97ff, 0 } },
+ { 0xfacb, 1, { 0x980b, 0 } },
+ { 0xfacc, 1, { 0x983b, 0 } },
+ { 0xfacd, 1, { 0x9b12, 0 } },
+ { 0xface, 1, { 0x9f9c, 0 } },
+ { 0xfacf, 2, { 0xd84a, 0xdc4a } },
+ { 0xfad0, 2, { 0xd84a, 0xdc44 } },
+ { 0xfad1, 2, { 0xd84c, 0xdfd5 } },
+ { 0xfad2, 1, { 0x3b9d, 0 } },
+ { 0xfad3, 1, { 0x4018, 0 } },
+ { 0xfad4, 1, { 0x4039, 0 } },
+ { 0xfad5, 2, { 0xd854, 0xde49 } },
+ { 0xfad6, 2, { 0xd857, 0xdcd0 } },
+ { 0xfad7, 2, { 0xd85f, 0xded3 } },
+ { 0xfad8, 1, { 0x9f43, 0 } },
+ { 0xfad9, 1, { 0x9f8e, 0 } },
+ { 0xfb00, 2, { 0x66, 0x66 } },
+ { 0xfb01, 2, { 0x66, 0x69 } },
+ { 0xfb02, 2, { 0x66, 0x6c } },
+ { 0xfb03, 3, { 703, 0 } },
+ { 0xfb04, 3, { 721, 0 } },
+ { 0xfb05, 2, { 0x73, 0x74 } },
+ { 0xfb06, 2, { 0x73, 0x74 } },
+ { 0xfb13, 2, { 0x574, 0x576 } },
+ { 0xfb14, 2, { 0x574, 0x565 } },
+ { 0xfb15, 2, { 0x574, 0x56b } },
+ { 0xfb16, 2, { 0x57e, 0x576 } },
+ { 0xfb17, 2, { 0x574, 0x56d } },
+ { 0xfb1d, 2, { 0x5d9, 0x5b4 } },
+ { 0xfb1f, 2, { 0x5f2, 0x5b7 } },
+ { 0xfb20, 1, { 0x5e2, 0 } },
+ { 0xfb21, 1, { 0x5d0, 0 } },
+ { 0xfb22, 1, { 0x5d3, 0 } },
+ { 0xfb23, 1, { 0x5d4, 0 } },
+ { 0xfb24, 1, { 0x5db, 0 } },
+ { 0xfb25, 1, { 0x5dc, 0 } },
+ { 0xfb26, 1, { 0x5dd, 0 } },
+ { 0xfb27, 1, { 0x5e8, 0 } },
+ { 0xfb28, 1, { 0x5ea, 0 } },
+ { 0xfb2a, 2, { 0x5e9, 0x5c1 } },
+ { 0xfb2b, 2, { 0x5e9, 0x5c2 } },
+ { 0xfb2c, 3, { 109, 0 } },
+ { 0xfb2d, 3, { 504, 0 } },
+ { 0xfb2e, 2, { 0x5d0, 0x5b7 } },
+ { 0xfb2f, 2, { 0x5d0, 0x5b8 } },
+ { 0xfb30, 2, { 0x5d0, 0x5bc } },
+ { 0xfb31, 2, { 0x5d1, 0x5bc } },
+ { 0xfb32, 2, { 0x5d2, 0x5bc } },
+ { 0xfb33, 2, { 0x5d3, 0x5bc } },
+ { 0xfb34, 2, { 0x5d4, 0x5bc } },
+ { 0xfb35, 2, { 0x5d5, 0x5bc } },
+ { 0xfb36, 2, { 0x5d6, 0x5bc } },
+ { 0xfb38, 2, { 0x5d8, 0x5bc } },
+ { 0xfb39, 2, { 0x5d9, 0x5bc } },
+ { 0xfb3a, 2, { 0x5da, 0x5bc } },
+ { 0xfb3b, 2, { 0x5db, 0x5bc } },
+ { 0xfb3c, 2, { 0x5dc, 0x5bc } },
+ { 0xfb3e, 2, { 0x5de, 0x5bc } },
+ { 0xfb40, 2, { 0x5e0, 0x5bc } },
+ { 0xfb41, 2, { 0x5e1, 0x5bc } },
+ { 0xfb43, 2, { 0x5e3, 0x5bc } },
+ { 0xfb44, 2, { 0x5e4, 0x5bc } },
+ { 0xfb46, 2, { 0x5e6, 0x5bc } },
+ { 0xfb47, 2, { 0x5e7, 0x5bc } },
+ { 0xfb48, 2, { 0x5e8, 0x5bc } },
+ { 0xfb49, 2, { 0x5e9, 0x5bc } },
+ { 0xfb4a, 2, { 0x5ea, 0x5bc } },
+ { 0xfb4b, 2, { 0x5d5, 0x5b9 } },
+ { 0xfb4c, 2, { 0x5d1, 0x5bf } },
+ { 0xfb4d, 2, { 0x5db, 0x5bf } },
+ { 0xfb4e, 2, { 0x5e4, 0x5bf } },
+ { 0xfb4f, 2, { 0x5d0, 0x5dc } },
+ { 0xfb50, 1, { 0x671, 0 } },
+ { 0xfb51, 1, { 0x671, 0 } },
+ { 0xfb52, 1, { 0x67b, 0 } },
+ { 0xfb53, 1, { 0x67b, 0 } },
+ { 0xfb54, 1, { 0x67b, 0 } },
+ { 0xfb55, 1, { 0x67b, 0 } },
+ { 0xfb56, 1, { 0x67e, 0 } },
+ { 0xfb57, 1, { 0x67e, 0 } },
+ { 0xfb58, 1, { 0x67e, 0 } },
+ { 0xfb59, 1, { 0x67e, 0 } },
+ { 0xfb5a, 1, { 0x680, 0 } },
+ { 0xfb5b, 1, { 0x680, 0 } },
+ { 0xfb5c, 1, { 0x680, 0 } },
+ { 0xfb5d, 1, { 0x680, 0 } },
+ { 0xfb5e, 1, { 0x67a, 0 } },
+ { 0xfb5f, 1, { 0x67a, 0 } },
+ { 0xfb60, 1, { 0x67a, 0 } },
+ { 0xfb61, 1, { 0x67a, 0 } },
+ { 0xfb62, 1, { 0x67f, 0 } },
+ { 0xfb63, 1, { 0x67f, 0 } },
+ { 0xfb64, 1, { 0x67f, 0 } },
+ { 0xfb65, 1, { 0x67f, 0 } },
+ { 0xfb66, 1, { 0x679, 0 } },
+ { 0xfb67, 1, { 0x679, 0 } },
+ { 0xfb68, 1, { 0x679, 0 } },
+ { 0xfb69, 1, { 0x679, 0 } },
+ { 0xfb6a, 1, { 0x6a4, 0 } },
+ { 0xfb6b, 1, { 0x6a4, 0 } },
+ { 0xfb6c, 1, { 0x6a4, 0 } },
+ { 0xfb6d, 1, { 0x6a4, 0 } },
+ { 0xfb6e, 1, { 0x6a6, 0 } },
+ { 0xfb6f, 1, { 0x6a6, 0 } },
+ { 0xfb70, 1, { 0x6a6, 0 } },
+ { 0xfb71, 1, { 0x6a6, 0 } },
+ { 0xfb72, 1, { 0x684, 0 } },
+ { 0xfb73, 1, { 0x684, 0 } },
+ { 0xfb74, 1, { 0x684, 0 } },
+ { 0xfb75, 1, { 0x684, 0 } },
+ { 0xfb76, 1, { 0x683, 0 } },
+ { 0xfb77, 1, { 0x683, 0 } },
+ { 0xfb78, 1, { 0x683, 0 } },
+ { 0xfb79, 1, { 0x683, 0 } },
+ { 0xfb7a, 1, { 0x686, 0 } },
+ { 0xfb7b, 1, { 0x686, 0 } },
+ { 0xfb7c, 1, { 0x686, 0 } },
+ { 0xfb7d, 1, { 0x686, 0 } },
+ { 0xfb7e, 1, { 0x687, 0 } },
+ { 0xfb7f, 1, { 0x687, 0 } },
+ { 0xfb80, 1, { 0x687, 0 } },
+ { 0xfb81, 1, { 0x687, 0 } },
+ { 0xfb82, 1, { 0x68d, 0 } },
+ { 0xfb83, 1, { 0x68d, 0 } },
+ { 0xfb84, 1, { 0x68c, 0 } },
+ { 0xfb85, 1, { 0x68c, 0 } },
+ { 0xfb86, 1, { 0x68e, 0 } },
+ { 0xfb87, 1, { 0x68e, 0 } },
+ { 0xfb88, 1, { 0x688, 0 } },
+ { 0xfb89, 1, { 0x688, 0 } },
+ { 0xfb8a, 1, { 0x698, 0 } },
+ { 0xfb8b, 1, { 0x698, 0 } },
+ { 0xfb8c, 1, { 0x691, 0 } },
+ { 0xfb8d, 1, { 0x691, 0 } },
+ { 0xfb8e, 1, { 0x6a9, 0 } },
+ { 0xfb8f, 1, { 0x6a9, 0 } },
+ { 0xfb90, 1, { 0x6a9, 0 } },
+ { 0xfb91, 1, { 0x6a9, 0 } },
+ { 0xfb92, 1, { 0x6af, 0 } },
+ { 0xfb93, 1, { 0x6af, 0 } },
+ { 0xfb94, 1, { 0x6af, 0 } },
+ { 0xfb95, 1, { 0x6af, 0 } },
+ { 0xfb96, 1, { 0x6b3, 0 } },
+ { 0xfb97, 1, { 0x6b3, 0 } },
+ { 0xfb98, 1, { 0x6b3, 0 } },
+ { 0xfb99, 1, { 0x6b3, 0 } },
+ { 0xfb9a, 1, { 0x6b1, 0 } },
+ { 0xfb9b, 1, { 0x6b1, 0 } },
+ { 0xfb9c, 1, { 0x6b1, 0 } },
+ { 0xfb9d, 1, { 0x6b1, 0 } },
+ { 0xfb9e, 1, { 0x6ba, 0 } },
+ { 0xfb9f, 1, { 0x6ba, 0 } },
+ { 0xfba0, 1, { 0x6bb, 0 } },
+ { 0xfba1, 1, { 0x6bb, 0 } },
+ { 0xfba2, 1, { 0x6bb, 0 } },
+ { 0xfba3, 1, { 0x6bb, 0 } },
+ { 0xfba4, 1, { 0x6c0, 0 } },
+ { 0xfba5, 1, { 0x6c0, 0 } },
+ { 0xfba6, 1, { 0x6c1, 0 } },
+ { 0xfba7, 1, { 0x6c1, 0 } },
+ { 0xfba8, 1, { 0x6c1, 0 } },
+ { 0xfba9, 1, { 0x6c1, 0 } },
+ { 0xfbaa, 1, { 0x6be, 0 } },
+ { 0xfbab, 1, { 0x6be, 0 } },
+ { 0xfbac, 1, { 0x6be, 0 } },
+ { 0xfbad, 1, { 0x6be, 0 } },
+ { 0xfbae, 1, { 0x6d2, 0 } },
+ { 0xfbaf, 1, { 0x6d2, 0 } },
+ { 0xfbb0, 1, { 0x6d3, 0 } },
+ { 0xfbb1, 1, { 0x6d3, 0 } },
+ { 0xfbd3, 1, { 0x6ad, 0 } },
+ { 0xfbd4, 1, { 0x6ad, 0 } },
+ { 0xfbd5, 1, { 0x6ad, 0 } },
+ { 0xfbd6, 1, { 0x6ad, 0 } },
+ { 0xfbd7, 1, { 0x6c7, 0 } },
+ { 0xfbd8, 1, { 0x6c7, 0 } },
+ { 0xfbd9, 1, { 0x6c6, 0 } },
+ { 0xfbda, 1, { 0x6c6, 0 } },
+ { 0xfbdb, 1, { 0x6c8, 0 } },
+ { 0xfbdc, 1, { 0x6c8, 0 } },
+ { 0xfbdd, 2, { 0x6c7, 0x674 } },
+ { 0xfbde, 1, { 0x6cb, 0 } },
+ { 0xfbdf, 1, { 0x6cb, 0 } },
+ { 0xfbe0, 1, { 0x6c5, 0 } },
+ { 0xfbe1, 1, { 0x6c5, 0 } },
+ { 0xfbe2, 1, { 0x6c9, 0 } },
+ { 0xfbe3, 1, { 0x6c9, 0 } },
+ { 0xfbe4, 1, { 0x6d0, 0 } },
+ { 0xfbe5, 1, { 0x6d0, 0 } },
+ { 0xfbe6, 1, { 0x6d0, 0 } },
+ { 0xfbe7, 1, { 0x6d0, 0 } },
+ { 0xfbe8, 1, { 0x649, 0 } },
+ { 0xfbe9, 1, { 0x649, 0 } },
+ { 0xfbea, 2, { 0x626, 0x627 } },
+ { 0xfbeb, 2, { 0x626, 0x627 } },
+ { 0xfbec, 2, { 0x626, 0x6d5 } },
+ { 0xfbed, 2, { 0x626, 0x6d5 } },
+ { 0xfbee, 2, { 0x626, 0x648 } },
+ { 0xfbef, 2, { 0x626, 0x648 } },
+ { 0xfbf0, 2, { 0x626, 0x6c7 } },
+ { 0xfbf1, 2, { 0x626, 0x6c7 } },
+ { 0xfbf2, 2, { 0x626, 0x6c6 } },
+ { 0xfbf3, 2, { 0x626, 0x6c6 } },
+ { 0xfbf4, 2, { 0x626, 0x6c8 } },
+ { 0xfbf5, 2, { 0x626, 0x6c8 } },
+ { 0xfbf6, 2, { 0x626, 0x6d0 } },
+ { 0xfbf7, 2, { 0x626, 0x6d0 } },
+ { 0xfbf8, 2, { 0x626, 0x6d0 } },
+ { 0xfbf9, 2, { 0x626, 0x649 } },
+ { 0xfbfa, 2, { 0x626, 0x649 } },
+ { 0xfbfb, 2, { 0x626, 0x649 } },
+ { 0xfbfc, 1, { 0x6cc, 0 } },
+ { 0xfbfd, 1, { 0x6cc, 0 } },
+ { 0xfbfe, 1, { 0x6cc, 0 } },
+ { 0xfbff, 1, { 0x6cc, 0 } },
+ { 0xfc00, 2, { 0x626, 0x62c } },
+ { 0xfc01, 2, { 0x626, 0x62d } },
+ { 0xfc02, 2, { 0x626, 0x645 } },
+ { 0xfc03, 2, { 0x626, 0x649 } },
+ { 0xfc04, 2, { 0x626, 0x64a } },
+ { 0xfc05, 2, { 0x628, 0x62c } },
+ { 0xfc06, 2, { 0x628, 0x62d } },
+ { 0xfc07, 2, { 0x628, 0x62e } },
+ { 0xfc08, 2, { 0x628, 0x645 } },
+ { 0xfc09, 2, { 0x628, 0x649 } },
+ { 0xfc0a, 2, { 0x628, 0x64a } },
+ { 0xfc0b, 2, { 0x62a, 0x62c } },
+ { 0xfc0c, 2, { 0x62a, 0x62d } },
+ { 0xfc0d, 2, { 0x62a, 0x62e } },
+ { 0xfc0e, 2, { 0x62a, 0x645 } },
+ { 0xfc0f, 2, { 0x62a, 0x649 } },
+ { 0xfc10, 2, { 0x62a, 0x64a } },
+ { 0xfc11, 2, { 0x62b, 0x62c } },
+ { 0xfc12, 2, { 0x62b, 0x645 } },
+ { 0xfc13, 2, { 0x62b, 0x649 } },
+ { 0xfc14, 2, { 0x62b, 0x64a } },
+ { 0xfc15, 2, { 0x62c, 0x62d } },
+ { 0xfc16, 2, { 0x62c, 0x645 } },
+ { 0xfc17, 2, { 0x62d, 0x62c } },
+ { 0xfc18, 2, { 0x62d, 0x645 } },
+ { 0xfc19, 2, { 0x62e, 0x62c } },
+ { 0xfc1a, 2, { 0x62e, 0x62d } },
+ { 0xfc1b, 2, { 0x62e, 0x645 } },
+ { 0xfc1c, 2, { 0x633, 0x62c } },
+ { 0xfc1d, 2, { 0x633, 0x62d } },
+ { 0xfc1e, 2, { 0x633, 0x62e } },
+ { 0xfc1f, 2, { 0x633, 0x645 } },
+ { 0xfc20, 2, { 0x635, 0x62d } },
+ { 0xfc21, 2, { 0x635, 0x645 } },
+ { 0xfc22, 2, { 0x636, 0x62c } },
+ { 0xfc23, 2, { 0x636, 0x62d } },
+ { 0xfc24, 2, { 0x636, 0x62e } },
+ { 0xfc25, 2, { 0x636, 0x645 } },
+ { 0xfc26, 2, { 0x637, 0x62d } },
+ { 0xfc27, 2, { 0x637, 0x645 } },
+ { 0xfc28, 2, { 0x638, 0x645 } },
+ { 0xfc29, 2, { 0x639, 0x62c } },
+ { 0xfc2a, 2, { 0x639, 0x645 } },
+ { 0xfc2b, 2, { 0x63a, 0x62c } },
+ { 0xfc2c, 2, { 0x63a, 0x645 } },
+ { 0xfc2d, 2, { 0x641, 0x62c } },
+ { 0xfc2e, 2, { 0x641, 0x62d } },
+ { 0xfc2f, 2, { 0x641, 0x62e } },
+ { 0xfc30, 2, { 0x641, 0x645 } },
+ { 0xfc31, 2, { 0x641, 0x649 } },
+ { 0xfc32, 2, { 0x641, 0x64a } },
+ { 0xfc33, 2, { 0x642, 0x62d } },
+ { 0xfc34, 2, { 0x642, 0x645 } },
+ { 0xfc35, 2, { 0x642, 0x649 } },
+ { 0xfc36, 2, { 0x642, 0x64a } },
+ { 0xfc37, 2, { 0x643, 0x627 } },
+ { 0xfc38, 2, { 0x643, 0x62c } },
+ { 0xfc39, 2, { 0x643, 0x62d } },
+ { 0xfc3a, 2, { 0x643, 0x62e } },
+ { 0xfc3b, 2, { 0x643, 0x644 } },
+ { 0xfc3c, 2, { 0x643, 0x645 } },
+ { 0xfc3d, 2, { 0x643, 0x649 } },
+ { 0xfc3e, 2, { 0x643, 0x64a } },
+ { 0xfc3f, 2, { 0x644, 0x62c } },
+ { 0xfc40, 2, { 0x644, 0x62d } },
+ { 0xfc41, 2, { 0x644, 0x62e } },
+ { 0xfc42, 2, { 0x644, 0x645 } },
+ { 0xfc43, 2, { 0x644, 0x649 } },
+ { 0xfc44, 2, { 0x644, 0x64a } },
+ { 0xfc45, 2, { 0x645, 0x62c } },
+ { 0xfc46, 2, { 0x645, 0x62d } },
+ { 0xfc47, 2, { 0x645, 0x62e } },
+ { 0xfc48, 2, { 0x645, 0x645 } },
+ { 0xfc49, 2, { 0x645, 0x649 } },
+ { 0xfc4a, 2, { 0x645, 0x64a } },
+ { 0xfc4b, 2, { 0x646, 0x62c } },
+ { 0xfc4c, 2, { 0x646, 0x62d } },
+ { 0xfc4d, 2, { 0x646, 0x62e } },
+ { 0xfc4e, 2, { 0x646, 0x645 } },
+ { 0xfc4f, 2, { 0x646, 0x649 } },
+ { 0xfc50, 2, { 0x646, 0x64a } },
+ { 0xfc51, 2, { 0x647, 0x62c } },
+ { 0xfc52, 2, { 0x647, 0x645 } },
+ { 0xfc53, 2, { 0x647, 0x649 } },
+ { 0xfc54, 2, { 0x647, 0x64a } },
+ { 0xfc55, 2, { 0x64a, 0x62c } },
+ { 0xfc56, 2, { 0x64a, 0x62d } },
+ { 0xfc57, 2, { 0x64a, 0x62e } },
+ { 0xfc58, 2, { 0x64a, 0x645 } },
+ { 0xfc59, 2, { 0x64a, 0x649 } },
+ { 0xfc5a, 2, { 0x64a, 0x64a } },
+ { 0xfc5b, 2, { 0x630, 0x670 } },
+ { 0xfc5c, 2, { 0x631, 0x670 } },
+ { 0xfc5d, 2, { 0x649, 0x670 } },
+ { 0xfc64, 2, { 0x626, 0x631 } },
+ { 0xfc65, 2, { 0x626, 0x632 } },
+ { 0xfc66, 2, { 0x626, 0x645 } },
+ { 0xfc67, 2, { 0x626, 0x646 } },
+ { 0xfc68, 2, { 0x626, 0x649 } },
+ { 0xfc69, 2, { 0x626, 0x64a } },
+ { 0xfc6a, 2, { 0x628, 0x631 } },
+ { 0xfc6b, 2, { 0x628, 0x632 } },
+ { 0xfc6c, 2, { 0x628, 0x645 } },
+ { 0xfc6d, 2, { 0x628, 0x646 } },
+ { 0xfc6e, 2, { 0x628, 0x649 } },
+ { 0xfc6f, 2, { 0x628, 0x64a } },
+ { 0xfc70, 2, { 0x62a, 0x631 } },
+ { 0xfc71, 2, { 0x62a, 0x632 } },
+ { 0xfc72, 2, { 0x62a, 0x645 } },
+ { 0xfc73, 2, { 0x62a, 0x646 } },
+ { 0xfc74, 2, { 0x62a, 0x649 } },
+ { 0xfc75, 2, { 0x62a, 0x64a } },
+ { 0xfc76, 2, { 0x62b, 0x631 } },
+ { 0xfc77, 2, { 0x62b, 0x632 } },
+ { 0xfc78, 2, { 0x62b, 0x645 } },
+ { 0xfc79, 2, { 0x62b, 0x646 } },
+ { 0xfc7a, 2, { 0x62b, 0x649 } },
+ { 0xfc7b, 2, { 0x62b, 0x64a } },
+ { 0xfc7c, 2, { 0x641, 0x649 } },
+ { 0xfc7d, 2, { 0x641, 0x64a } },
+ { 0xfc7e, 2, { 0x642, 0x649 } },
+ { 0xfc7f, 2, { 0x642, 0x64a } },
+ { 0xfc80, 2, { 0x643, 0x627 } },
+ { 0xfc81, 2, { 0x643, 0x644 } },
+ { 0xfc82, 2, { 0x643, 0x645 } },
+ { 0xfc83, 2, { 0x643, 0x649 } },
+ { 0xfc84, 2, { 0x643, 0x64a } },
+ { 0xfc85, 2, { 0x644, 0x645 } },
+ { 0xfc86, 2, { 0x644, 0x649 } },
+ { 0xfc87, 2, { 0x644, 0x64a } },
+ { 0xfc88, 2, { 0x645, 0x627 } },
+ { 0xfc89, 2, { 0x645, 0x645 } },
+ { 0xfc8a, 2, { 0x646, 0x631 } },
+ { 0xfc8b, 2, { 0x646, 0x632 } },
+ { 0xfc8c, 2, { 0x646, 0x645 } },
+ { 0xfc8d, 2, { 0x646, 0x646 } },
+ { 0xfc8e, 2, { 0x646, 0x649 } },
+ { 0xfc8f, 2, { 0x646, 0x64a } },
+ { 0xfc90, 2, { 0x649, 0x670 } },
+ { 0xfc91, 2, { 0x64a, 0x631 } },
+ { 0xfc92, 2, { 0x64a, 0x632 } },
+ { 0xfc93, 2, { 0x64a, 0x645 } },
+ { 0xfc94, 2, { 0x64a, 0x646 } },
+ { 0xfc95, 2, { 0x64a, 0x649 } },
+ { 0xfc96, 2, { 0x64a, 0x64a } },
+ { 0xfc97, 2, { 0x626, 0x62c } },
+ { 0xfc98, 2, { 0x626, 0x62d } },
+ { 0xfc99, 2, { 0x626, 0x62e } },
+ { 0xfc9a, 2, { 0x626, 0x645 } },
+ { 0xfc9b, 2, { 0x626, 0x647 } },
+ { 0xfc9c, 2, { 0x628, 0x62c } },
+ { 0xfc9d, 2, { 0x628, 0x62d } },
+ { 0xfc9e, 2, { 0x628, 0x62e } },
+ { 0xfc9f, 2, { 0x628, 0x645 } },
+ { 0xfca0, 2, { 0x628, 0x647 } },
+ { 0xfca1, 2, { 0x62a, 0x62c } },
+ { 0xfca2, 2, { 0x62a, 0x62d } },
+ { 0xfca3, 2, { 0x62a, 0x62e } },
+ { 0xfca4, 2, { 0x62a, 0x645 } },
+ { 0xfca5, 2, { 0x62a, 0x647 } },
+ { 0xfca6, 2, { 0x62b, 0x645 } },
+ { 0xfca7, 2, { 0x62c, 0x62d } },
+ { 0xfca8, 2, { 0x62c, 0x645 } },
+ { 0xfca9, 2, { 0x62d, 0x62c } },
+ { 0xfcaa, 2, { 0x62d, 0x645 } },
+ { 0xfcab, 2, { 0x62e, 0x62c } },
+ { 0xfcac, 2, { 0x62e, 0x645 } },
+ { 0xfcad, 2, { 0x633, 0x62c } },
+ { 0xfcae, 2, { 0x633, 0x62d } },
+ { 0xfcaf, 2, { 0x633, 0x62e } },
+ { 0xfcb0, 2, { 0x633, 0x645 } },
+ { 0xfcb1, 2, { 0x635, 0x62d } },
+ { 0xfcb2, 2, { 0x635, 0x62e } },
+ { 0xfcb3, 2, { 0x635, 0x645 } },
+ { 0xfcb4, 2, { 0x636, 0x62c } },
+ { 0xfcb5, 2, { 0x636, 0x62d } },
+ { 0xfcb6, 2, { 0x636, 0x62e } },
+ { 0xfcb7, 2, { 0x636, 0x645 } },
+ { 0xfcb8, 2, { 0x637, 0x62d } },
+ { 0xfcb9, 2, { 0x638, 0x645 } },
+ { 0xfcba, 2, { 0x639, 0x62c } },
+ { 0xfcbb, 2, { 0x639, 0x645 } },
+ { 0xfcbc, 2, { 0x63a, 0x62c } },
+ { 0xfcbd, 2, { 0x63a, 0x645 } },
+ { 0xfcbe, 2, { 0x641, 0x62c } },
+ { 0xfcbf, 2, { 0x641, 0x62d } },
+ { 0xfcc0, 2, { 0x641, 0x62e } },
+ { 0xfcc1, 2, { 0x641, 0x645 } },
+ { 0xfcc2, 2, { 0x642, 0x62d } },
+ { 0xfcc3, 2, { 0x642, 0x645 } },
+ { 0xfcc4, 2, { 0x643, 0x62c } },
+ { 0xfcc5, 2, { 0x643, 0x62d } },
+ { 0xfcc6, 2, { 0x643, 0x62e } },
+ { 0xfcc7, 2, { 0x643, 0x644 } },
+ { 0xfcc8, 2, { 0x643, 0x645 } },
+ { 0xfcc9, 2, { 0x644, 0x62c } },
+ { 0xfcca, 2, { 0x644, 0x62d } },
+ { 0xfccb, 2, { 0x644, 0x62e } },
+ { 0xfccc, 2, { 0x644, 0x645 } },
+ { 0xfccd, 2, { 0x644, 0x647 } },
+ { 0xfcce, 2, { 0x645, 0x62c } },
+ { 0xfccf, 2, { 0x645, 0x62d } },
+ { 0xfcd0, 2, { 0x645, 0x62e } },
+ { 0xfcd1, 2, { 0x645, 0x645 } },
+ { 0xfcd2, 2, { 0x646, 0x62c } },
+ { 0xfcd3, 2, { 0x646, 0x62d } },
+ { 0xfcd4, 2, { 0x646, 0x62e } },
+ { 0xfcd5, 2, { 0x646, 0x645 } },
+ { 0xfcd6, 2, { 0x646, 0x647 } },
+ { 0xfcd7, 2, { 0x647, 0x62c } },
+ { 0xfcd8, 2, { 0x647, 0x645 } },
+ { 0xfcd9, 2, { 0x647, 0x670 } },
+ { 0xfcda, 2, { 0x64a, 0x62c } },
+ { 0xfcdb, 2, { 0x64a, 0x62d } },
+ { 0xfcdc, 2, { 0x64a, 0x62e } },
+ { 0xfcdd, 2, { 0x64a, 0x645 } },
+ { 0xfcde, 2, { 0x64a, 0x647 } },
+ { 0xfcdf, 2, { 0x626, 0x645 } },
+ { 0xfce0, 2, { 0x626, 0x647 } },
+ { 0xfce1, 2, { 0x628, 0x645 } },
+ { 0xfce2, 2, { 0x628, 0x647 } },
+ { 0xfce3, 2, { 0x62a, 0x645 } },
+ { 0xfce4, 2, { 0x62a, 0x647 } },
+ { 0xfce5, 2, { 0x62b, 0x645 } },
+ { 0xfce6, 2, { 0x62b, 0x647 } },
+ { 0xfce7, 2, { 0x633, 0x645 } },
+ { 0xfce8, 2, { 0x633, 0x647 } },
+ { 0xfce9, 2, { 0x634, 0x645 } },
+ { 0xfcea, 2, { 0x634, 0x647 } },
+ { 0xfceb, 2, { 0x643, 0x644 } },
+ { 0xfcec, 2, { 0x643, 0x645 } },
+ { 0xfced, 2, { 0x644, 0x645 } },
+ { 0xfcee, 2, { 0x646, 0x645 } },
+ { 0xfcef, 2, { 0x646, 0x647 } },
+ { 0xfcf0, 2, { 0x64a, 0x645 } },
+ { 0xfcf1, 2, { 0x64a, 0x647 } },
+ { 0xfcf2, 3, { 426, 0 } },
+ { 0xfcf3, 3, { 351, 0 } },
+ { 0xfcf4, 3, { 746, 0 } },
+ { 0xfcf5, 2, { 0x637, 0x649 } },
+ { 0xfcf6, 2, { 0x637, 0x64a } },
+ { 0xfcf7, 2, { 0x639, 0x649 } },
+ { 0xfcf8, 2, { 0x639, 0x64a } },
+ { 0xfcf9, 2, { 0x63a, 0x649 } },
+ { 0xfcfa, 2, { 0x63a, 0x64a } },
+ { 0xfcfb, 2, { 0x633, 0x649 } },
+ { 0xfcfc, 2, { 0x633, 0x64a } },
+ { 0xfcfd, 2, { 0x634, 0x649 } },
+ { 0xfcfe, 2, { 0x634, 0x64a } },
+ { 0xfcff, 2, { 0x62d, 0x649 } },
+ { 0xfd00, 2, { 0x62d, 0x64a } },
+ { 0xfd01, 2, { 0x62c, 0x649 } },
+ { 0xfd02, 2, { 0x62c, 0x64a } },
+ { 0xfd03, 2, { 0x62e, 0x649 } },
+ { 0xfd04, 2, { 0x62e, 0x64a } },
+ { 0xfd05, 2, { 0x635, 0x649 } },
+ { 0xfd06, 2, { 0x635, 0x64a } },
+ { 0xfd07, 2, { 0x636, 0x649 } },
+ { 0xfd08, 2, { 0x636, 0x64a } },
+ { 0xfd09, 2, { 0x634, 0x62c } },
+ { 0xfd0a, 2, { 0x634, 0x62d } },
+ { 0xfd0b, 2, { 0x634, 0x62e } },
+ { 0xfd0c, 2, { 0x634, 0x645 } },
+ { 0xfd0d, 2, { 0x634, 0x631 } },
+ { 0xfd0e, 2, { 0x633, 0x631 } },
+ { 0xfd0f, 2, { 0x635, 0x631 } },
+ { 0xfd10, 2, { 0x636, 0x631 } },
+ { 0xfd11, 2, { 0x637, 0x649 } },
+ { 0xfd12, 2, { 0x637, 0x64a } },
+ { 0xfd13, 2, { 0x639, 0x649 } },
+ { 0xfd14, 2, { 0x639, 0x64a } },
+ { 0xfd15, 2, { 0x63a, 0x649 } },
+ { 0xfd16, 2, { 0x63a, 0x64a } },
+ { 0xfd17, 2, { 0x633, 0x649 } },
+ { 0xfd18, 2, { 0x633, 0x64a } },
+ { 0xfd19, 2, { 0x634, 0x649 } },
+ { 0xfd1a, 2, { 0x634, 0x64a } },
+ { 0xfd1b, 2, { 0x62d, 0x649 } },
+ { 0xfd1c, 2, { 0x62d, 0x64a } },
+ { 0xfd1d, 2, { 0x62c, 0x649 } },
+ { 0xfd1e, 2, { 0x62c, 0x64a } },
+ { 0xfd1f, 2, { 0x62e, 0x649 } },
+ { 0xfd20, 2, { 0x62e, 0x64a } },
+ { 0xfd21, 2, { 0x635, 0x649 } },
+ { 0xfd22, 2, { 0x635, 0x64a } },
+ { 0xfd23, 2, { 0x636, 0x649 } },
+ { 0xfd24, 2, { 0x636, 0x64a } },
+ { 0xfd25, 2, { 0x634, 0x62c } },
+ { 0xfd26, 2, { 0x634, 0x62d } },
+ { 0xfd27, 2, { 0x634, 0x62e } },
+ { 0xfd28, 2, { 0x634, 0x645 } },
+ { 0xfd29, 2, { 0x634, 0x631 } },
+ { 0xfd2a, 2, { 0x633, 0x631 } },
+ { 0xfd2b, 2, { 0x635, 0x631 } },
+ { 0xfd2c, 2, { 0x636, 0x631 } },
+ { 0xfd2d, 2, { 0x634, 0x62c } },
+ { 0xfd2e, 2, { 0x634, 0x62d } },
+ { 0xfd2f, 2, { 0x634, 0x62e } },
+ { 0xfd30, 2, { 0x634, 0x645 } },
+ { 0xfd31, 2, { 0x633, 0x647 } },
+ { 0xfd32, 2, { 0x634, 0x647 } },
+ { 0xfd33, 2, { 0x637, 0x645 } },
+ { 0xfd34, 2, { 0x633, 0x62c } },
+ { 0xfd35, 2, { 0x633, 0x62d } },
+ { 0xfd36, 2, { 0x633, 0x62e } },
+ { 0xfd37, 2, { 0x634, 0x62c } },
+ { 0xfd38, 2, { 0x634, 0x62d } },
+ { 0xfd39, 2, { 0x634, 0x62e } },
+ { 0xfd3a, 2, { 0x637, 0x645 } },
+ { 0xfd3b, 2, { 0x638, 0x645 } },
+ { 0xfd3c, 2, { 0x627, 0x64b } },
+ { 0xfd3d, 2, { 0x627, 0x64b } },
+ { 0xfd50, 3, { 115, 0 } },
+ { 0xfd51, 3, { 513, 0 } },
+ { 0xfd52, 3, { 513, 0 } },
+ { 0xfd53, 3, { 121, 0 } },
+ { 0xfd54, 3, { 516, 0 } },
+ { 0xfd55, 3, { 127, 0 } },
+ { 0xfd56, 3, { 522, 0 } },
+ { 0xfd57, 3, { 531, 0 } },
+ { 0xfd58, 3, { 358, 0 } },
+ { 0xfd59, 3, { 358, 0 } },
+ { 0xfd5a, 3, { 336, 0 } },
+ { 0xfd5b, 3, { 411, 0 } },
+ { 0xfd5c, 3, { 361, 0 } },
+ { 0xfd5d, 3, { 538, 0 } },
+ { 0xfd5e, 3, { 389, 0 } },
+ { 0xfd5f, 3, { 414, 0 } },
+ { 0xfd60, 3, { 414, 0 } },
+ { 0xfd61, 3, { 552, 0 } },
+ { 0xfd62, 3, { 339, 0 } },
+ { 0xfd63, 3, { 339, 0 } },
+ { 0xfd64, 3, { 417, 0 } },
+ { 0xfd65, 3, { 417, 0 } },
+ { 0xfd66, 3, { 367, 0 } },
+ { 0xfd67, 3, { 392, 0 } },
+ { 0xfd68, 3, { 392, 0 } },
+ { 0xfd69, 3, { 541, 0 } },
+ { 0xfd6a, 3, { 588, 0 } },
+ { 0xfd6b, 3, { 588, 0 } },
+ { 0xfd6c, 3, { 560, 0 } },
+ { 0xfd6d, 3, { 560, 0 } },
+ { 0xfd6e, 3, { 563, 0 } },
+ { 0xfd6f, 3, { 345, 0 } },
+ { 0xfd70, 3, { 345, 0 } },
+ { 0xfd71, 3, { 547, 0 } },
+ { 0xfd72, 3, { 547, 0 } },
+ { 0xfd73, 3, { 398, 0 } },
+ { 0xfd74, 3, { 370, 0 } },
+ { 0xfd75, 3, { 566, 0 } },
+ { 0xfd76, 3, { 423, 0 } },
+ { 0xfd77, 3, { 423, 0 } },
+ { 0xfd78, 3, { 348, 0 } },
+ { 0xfd79, 3, { 401, 0 } },
+ { 0xfd7a, 3, { 569, 0 } },
+ { 0xfd7b, 3, { 373, 0 } },
+ { 0xfd7c, 3, { 404, 0 } },
+ { 0xfd7d, 3, { 404, 0 } },
+ { 0xfd7e, 3, { 429, 0 } },
+ { 0xfd7f, 3, { 354, 0 } },
+ { 0xfd80, 3, { 410, 0 } },
+ { 0xfd81, 3, { 578, 0 } },
+ { 0xfd82, 3, { 382, 0 } },
+ { 0xfd83, 3, { 575, 0 } },
+ { 0xfd84, 3, { 575, 0 } },
+ { 0xfd85, 3, { 755, 0 } },
+ { 0xfd86, 3, { 755, 0 } },
+ { 0xfd87, 3, { 736, 0 } },
+ { 0xfd88, 3, { 736, 0 } },
+ { 0xfd89, 3, { 548, 0 } },
+ { 0xfd8a, 3, { 737, 0 } },
+ { 0xfd8b, 3, { 430, 0 } },
+ { 0xfd8c, 3, { 534, 0 } },
+ { 0xfd8d, 3, { 553, 0 } },
+ { 0xfd8e, 3, { 849, 0 } },
+ { 0xfd8f, 3, { 532, 0 } },
+ { 0xfd92, 3, { 128, 0 } },
+ { 0xfd93, 3, { 331, 0 } },
+ { 0xfd94, 3, { 847, 0 } },
+ { 0xfd95, 3, { 335, 0 } },
+ { 0xfd96, 3, { 131, 0 } },
+ { 0xfd97, 3, { 581, 0 } },
+ { 0xfd98, 3, { 581, 0 } },
+ { 0xfd99, 3, { 804, 0 } },
+ { 0xfd9a, 3, { 592, 0 } },
+ { 0xfd9b, 3, { 852, 0 } },
+ { 0xfd9c, 3, { 600, 0 } },
+ { 0xfd9d, 3, { 600, 0 } },
+ { 0xfd9e, 3, { 507, 0 } },
+ { 0xfd9f, 3, { 118, 0 } },
+ { 0xfda0, 3, { 510, 0 } },
+ { 0xfda1, 3, { 519, 0 } },
+ { 0xfda2, 3, { 124, 0 } },
+ { 0xfda3, 3, { 525, 0 } },
+ { 0xfda4, 3, { 528, 0 } },
+ { 0xfda5, 3, { 582, 0 } },
+ { 0xfda6, 3, { 535, 0 } },
+ { 0xfda7, 3, { 554, 0 } },
+ { 0xfda8, 3, { 585, 0 } },
+ { 0xfda9, 3, { 342, 0 } },
+ { 0xfdaa, 3, { 364, 0 } },
+ { 0xfdab, 3, { 420, 0 } },
+ { 0xfdac, 3, { 752, 0 } },
+ { 0xfdad, 3, { 801, 0 } },
+ { 0xfdae, 3, { 596, 0 } },
+ { 0xfdaf, 3, { 594, 0 } },
+ { 0xfdb0, 3, { 598, 0 } },
+ { 0xfdb1, 3, { 601, 0 } },
+ { 0xfdb2, 3, { 749, 0 } },
+ { 0xfdb3, 3, { 433, 0 } },
+ { 0xfdb4, 3, { 429, 0 } },
+ { 0xfdb5, 3, { 410, 0 } },
+ { 0xfdb6, 3, { 743, 0 } },
+ { 0xfdb7, 3, { 379, 0 } },
+ { 0xfdb8, 3, { 385, 0 } },
+ { 0xfdb9, 3, { 589, 0 } },
+ { 0xfdba, 3, { 357, 0 } },
+ { 0xfdbb, 3, { 407, 0 } },
+ { 0xfdbc, 3, { 357, 0 } },
+ { 0xfdbd, 3, { 385, 0 } },
+ { 0xfdbe, 3, { 386, 0 } },
+ { 0xfdbf, 3, { 549, 0 } },
+ { 0xfdc0, 3, { 332, 0 } },
+ { 0xfdc1, 3, { 376, 0 } },
+ { 0xfdc2, 3, { 112, 0 } },
+ { 0xfdc3, 3, { 407, 0 } },
+ { 0xfdc4, 3, { 566, 0 } },
+ { 0xfdc5, 3, { 367, 0 } },
+ { 0xfdc6, 3, { 557, 0 } },
+ { 0xfdc7, 3, { 758, 0 } },
+ { 0xfdf0, 3, { 395, 0 } },
+ { 0xfdf1, 3, { 572, 0 } },
+ { 0xfdf2, 4, { 328, 0 } },
+ { 0xfdf3, 4, { 323, 0 } },
+ { 0xfdf4, 4, { 737, 0 } },
+ { 0xfdf5, 4, { 741, 0 } },
+ { 0xfdf6, 4, { 733, 0 } },
+ { 0xfdf7, 4, { 844, 0 } },
+ { 0xfdf8, 4, { 799, 0 } },
+ { 0xfdf9, 3, { 544, 0 } },
+ { 0xfdfc, 4, { 326, 0 } },
+ { 0xfe11, 1, { 0x3001, 0 } },
+ { 0xfe17, 1, { 0x3016, 0 } },
+ { 0xfe18, 1, { 0x3017, 0 } },
+ { 0xfe31, 1, { 0x2014, 0 } },
+ { 0xfe32, 1, { 0x2013, 0 } },
+ { 0xfe33, 1, { 0x5f, 0 } },
+ { 0xfe34, 1, { 0x5f, 0 } },
+ { 0xfe39, 1, { 0x3014, 0 } },
+ { 0xfe3a, 1, { 0x3015, 0 } },
+ { 0xfe3b, 1, { 0x3010, 0 } },
+ { 0xfe3c, 1, { 0x3011, 0 } },
+ { 0xfe3d, 1, { 0x300a, 0 } },
+ { 0xfe3e, 1, { 0x300b, 0 } },
+ { 0xfe3f, 1, { 0x3008, 0 } },
+ { 0xfe40, 1, { 0x3009, 0 } },
+ { 0xfe41, 1, { 0x300c, 0 } },
+ { 0xfe42, 1, { 0x300d, 0 } },
+ { 0xfe43, 1, { 0x300e, 0 } },
+ { 0xfe44, 1, { 0x300f, 0 } },
+ { 0xfe4d, 1, { 0x5f, 0 } },
+ { 0xfe4e, 1, { 0x5f, 0 } },
+ { 0xfe4f, 1, { 0x5f, 0 } },
+ { 0xfe51, 1, { 0x3001, 0 } },
+ { 0xfe58, 1, { 0x2014, 0 } },
+ { 0xfe5d, 1, { 0x3014, 0 } },
+ { 0xfe5e, 1, { 0x3015, 0 } },
+ { 0xfe63, 1, { 0x2d, 0 } },
+ { 0xfe71, 2, { 0x640, 0x64b } },
+ { 0xfe77, 2, { 0x640, 0x64e } },
+ { 0xfe79, 2, { 0x640, 0x64f } },
+ { 0xfe7b, 2, { 0x640, 0x650 } },
+ { 0xfe7d, 2, { 0x640, 0x651 } },
+ { 0xfe7f, 2, { 0x640, 0x652 } },
+ { 0xfe80, 1, { 0x621, 0 } },
+ { 0xfe81, 1, { 0x622, 0 } },
+ { 0xfe82, 1, { 0x622, 0 } },
+ { 0xfe83, 1, { 0x623, 0 } },
+ { 0xfe84, 1, { 0x623, 0 } },
+ { 0xfe85, 1, { 0x624, 0 } },
+ { 0xfe86, 1, { 0x624, 0 } },
+ { 0xfe87, 1, { 0x625, 0 } },
+ { 0xfe88, 1, { 0x625, 0 } },
+ { 0xfe89, 1, { 0x626, 0 } },
+ { 0xfe8a, 1, { 0x626, 0 } },
+ { 0xfe8b, 1, { 0x626, 0 } },
+ { 0xfe8c, 1, { 0x626, 0 } },
+ { 0xfe8d, 1, { 0x627, 0 } },
+ { 0xfe8e, 1, { 0x627, 0 } },
+ { 0xfe8f, 1, { 0x628, 0 } },
+ { 0xfe90, 1, { 0x628, 0 } },
+ { 0xfe91, 1, { 0x628, 0 } },
+ { 0xfe92, 1, { 0x628, 0 } },
+ { 0xfe93, 1, { 0x629, 0 } },
+ { 0xfe94, 1, { 0x629, 0 } },
+ { 0xfe95, 1, { 0x62a, 0 } },
+ { 0xfe96, 1, { 0x62a, 0 } },
+ { 0xfe97, 1, { 0x62a, 0 } },
+ { 0xfe98, 1, { 0x62a, 0 } },
+ { 0xfe99, 1, { 0x62b, 0 } },
+ { 0xfe9a, 1, { 0x62b, 0 } },
+ { 0xfe9b, 1, { 0x62b, 0 } },
+ { 0xfe9c, 1, { 0x62b, 0 } },
+ { 0xfe9d, 1, { 0x62c, 0 } },
+ { 0xfe9e, 1, { 0x62c, 0 } },
+ { 0xfe9f, 1, { 0x62c, 0 } },
+ { 0xfea0, 1, { 0x62c, 0 } },
+ { 0xfea1, 1, { 0x62d, 0 } },
+ { 0xfea2, 1, { 0x62d, 0 } },
+ { 0xfea3, 1, { 0x62d, 0 } },
+ { 0xfea4, 1, { 0x62d, 0 } },
+ { 0xfea5, 1, { 0x62e, 0 } },
+ { 0xfea6, 1, { 0x62e, 0 } },
+ { 0xfea7, 1, { 0x62e, 0 } },
+ { 0xfea8, 1, { 0x62e, 0 } },
+ { 0xfea9, 1, { 0x62f, 0 } },
+ { 0xfeaa, 1, { 0x62f, 0 } },
+ { 0xfeab, 1, { 0x630, 0 } },
+ { 0xfeac, 1, { 0x630, 0 } },
+ { 0xfead, 1, { 0x631, 0 } },
+ { 0xfeae, 1, { 0x631, 0 } },
+ { 0xfeaf, 1, { 0x632, 0 } },
+ { 0xfeb0, 1, { 0x632, 0 } },
+ { 0xfeb1, 1, { 0x633, 0 } },
+ { 0xfeb2, 1, { 0x633, 0 } },
+ { 0xfeb3, 1, { 0x633, 0 } },
+ { 0xfeb4, 1, { 0x633, 0 } },
+ { 0xfeb5, 1, { 0x634, 0 } },
+ { 0xfeb6, 1, { 0x634, 0 } },
+ { 0xfeb7, 1, { 0x634, 0 } },
+ { 0xfeb8, 1, { 0x634, 0 } },
+ { 0xfeb9, 1, { 0x635, 0 } },
+ { 0xfeba, 1, { 0x635, 0 } },
+ { 0xfebb, 1, { 0x635, 0 } },
+ { 0xfebc, 1, { 0x635, 0 } },
+ { 0xfebd, 1, { 0x636, 0 } },
+ { 0xfebe, 1, { 0x636, 0 } },
+ { 0xfebf, 1, { 0x636, 0 } },
+ { 0xfec0, 1, { 0x636, 0 } },
+ { 0xfec1, 1, { 0x637, 0 } },
+ { 0xfec2, 1, { 0x637, 0 } },
+ { 0xfec3, 1, { 0x637, 0 } },
+ { 0xfec4, 1, { 0x637, 0 } },
+ { 0xfec5, 1, { 0x638, 0 } },
+ { 0xfec6, 1, { 0x638, 0 } },
+ { 0xfec7, 1, { 0x638, 0 } },
+ { 0xfec8, 1, { 0x638, 0 } },
+ { 0xfec9, 1, { 0x639, 0 } },
+ { 0xfeca, 1, { 0x639, 0 } },
+ { 0xfecb, 1, { 0x639, 0 } },
+ { 0xfecc, 1, { 0x639, 0 } },
+ { 0xfecd, 1, { 0x63a, 0 } },
+ { 0xfece, 1, { 0x63a, 0 } },
+ { 0xfecf, 1, { 0x63a, 0 } },
+ { 0xfed0, 1, { 0x63a, 0 } },
+ { 0xfed1, 1, { 0x641, 0 } },
+ { 0xfed2, 1, { 0x641, 0 } },
+ { 0xfed3, 1, { 0x641, 0 } },
+ { 0xfed4, 1, { 0x641, 0 } },
+ { 0xfed5, 1, { 0x642, 0 } },
+ { 0xfed6, 1, { 0x642, 0 } },
+ { 0xfed7, 1, { 0x642, 0 } },
+ { 0xfed8, 1, { 0x642, 0 } },
+ { 0xfed9, 1, { 0x643, 0 } },
+ { 0xfeda, 1, { 0x643, 0 } },
+ { 0xfedb, 1, { 0x643, 0 } },
+ { 0xfedc, 1, { 0x643, 0 } },
+ { 0xfedd, 1, { 0x644, 0 } },
+ { 0xfede, 1, { 0x644, 0 } },
+ { 0xfedf, 1, { 0x644, 0 } },
+ { 0xfee0, 1, { 0x644, 0 } },
+ { 0xfee1, 1, { 0x645, 0 } },
+ { 0xfee2, 1, { 0x645, 0 } },
+ { 0xfee3, 1, { 0x645, 0 } },
+ { 0xfee4, 1, { 0x645, 0 } },
+ { 0xfee5, 1, { 0x646, 0 } },
+ { 0xfee6, 1, { 0x646, 0 } },
+ { 0xfee7, 1, { 0x646, 0 } },
+ { 0xfee8, 1, { 0x646, 0 } },
+ { 0xfee9, 1, { 0x647, 0 } },
+ { 0xfeea, 1, { 0x647, 0 } },
+ { 0xfeeb, 1, { 0x647, 0 } },
+ { 0xfeec, 1, { 0x647, 0 } },
+ { 0xfeed, 1, { 0x648, 0 } },
+ { 0xfeee, 1, { 0x648, 0 } },
+ { 0xfeef, 1, { 0x649, 0 } },
+ { 0xfef0, 1, { 0x649, 0 } },
+ { 0xfef1, 1, { 0x64a, 0 } },
+ { 0xfef2, 1, { 0x64a, 0 } },
+ { 0xfef3, 1, { 0x64a, 0 } },
+ { 0xfef4, 1, { 0x64a, 0 } },
+ { 0xfef5, 2, { 0x644, 0x622 } },
+ { 0xfef6, 2, { 0x644, 0x622 } },
+ { 0xfef7, 2, { 0x644, 0x623 } },
+ { 0xfef8, 2, { 0x644, 0x623 } },
+ { 0xfef9, 2, { 0x644, 0x625 } },
+ { 0xfefa, 2, { 0x644, 0x625 } },
+ { 0xfefb, 2, { 0x644, 0x627 } },
+ { 0xfefc, 2, { 0x644, 0x627 } },
+ { 0xff0d, 1, { 0x2d, 0 } },
+ { 0xff0e, 1, { 0x2e, 0 } },
+ { 0xff10, 1, { 0x30, 0 } },
+ { 0xff11, 1, { 0x31, 0 } },
+ { 0xff12, 1, { 0x32, 0 } },
+ { 0xff13, 1, { 0x33, 0 } },
+ { 0xff14, 1, { 0x34, 0 } },
+ { 0xff15, 1, { 0x35, 0 } },
+ { 0xff16, 1, { 0x36, 0 } },
+ { 0xff17, 1, { 0x37, 0 } },
+ { 0xff18, 1, { 0x38, 0 } },
+ { 0xff19, 1, { 0x39, 0 } },
+ { 0xff21, 1, { 0x61, 0 } },
+ { 0xff22, 1, { 0x62, 0 } },
+ { 0xff23, 1, { 0x63, 0 } },
+ { 0xff24, 1, { 0x64, 0 } },
+ { 0xff25, 1, { 0x65, 0 } },
+ { 0xff26, 1, { 0x66, 0 } },
+ { 0xff27, 1, { 0x67, 0 } },
+ { 0xff28, 1, { 0x68, 0 } },
+ { 0xff29, 1, { 0x69, 0 } },
+ { 0xff2a, 1, { 0x6a, 0 } },
+ { 0xff2b, 1, { 0x6b, 0 } },
+ { 0xff2c, 1, { 0x6c, 0 } },
+ { 0xff2d, 1, { 0x6d, 0 } },
+ { 0xff2e, 1, { 0x6e, 0 } },
+ { 0xff2f, 1, { 0x6f, 0 } },
+ { 0xff30, 1, { 0x70, 0 } },
+ { 0xff31, 1, { 0x71, 0 } },
+ { 0xff32, 1, { 0x72, 0 } },
+ { 0xff33, 1, { 0x73, 0 } },
+ { 0xff34, 1, { 0x74, 0 } },
+ { 0xff35, 1, { 0x75, 0 } },
+ { 0xff36, 1, { 0x76, 0 } },
+ { 0xff37, 1, { 0x77, 0 } },
+ { 0xff38, 1, { 0x78, 0 } },
+ { 0xff39, 1, { 0x79, 0 } },
+ { 0xff3a, 1, { 0x7a, 0 } },
+ { 0xff3f, 1, { 0x5f, 0 } },
+ { 0xff41, 1, { 0x61, 0 } },
+ { 0xff42, 1, { 0x62, 0 } },
+ { 0xff43, 1, { 0x63, 0 } },
+ { 0xff44, 1, { 0x64, 0 } },
+ { 0xff45, 1, { 0x65, 0 } },
+ { 0xff46, 1, { 0x66, 0 } },
+ { 0xff47, 1, { 0x67, 0 } },
+ { 0xff48, 1, { 0x68, 0 } },
+ { 0xff49, 1, { 0x69, 0 } },
+ { 0xff4a, 1, { 0x6a, 0 } },
+ { 0xff4b, 1, { 0x6b, 0 } },
+ { 0xff4c, 1, { 0x6c, 0 } },
+ { 0xff4d, 1, { 0x6d, 0 } },
+ { 0xff4e, 1, { 0x6e, 0 } },
+ { 0xff4f, 1, { 0x6f, 0 } },
+ { 0xff50, 1, { 0x70, 0 } },
+ { 0xff51, 1, { 0x71, 0 } },
+ { 0xff52, 1, { 0x72, 0 } },
+ { 0xff53, 1, { 0x73, 0 } },
+ { 0xff54, 1, { 0x74, 0 } },
+ { 0xff55, 1, { 0x75, 0 } },
+ { 0xff56, 1, { 0x76, 0 } },
+ { 0xff57, 1, { 0x77, 0 } },
+ { 0xff58, 1, { 0x78, 0 } },
+ { 0xff59, 1, { 0x79, 0 } },
+ { 0xff5a, 1, { 0x7a, 0 } },
+ { 0xff5f, 1, { 0x2985, 0 } },
+ { 0xff60, 1, { 0x2986, 0 } },
+ { 0xff61, 1, { 0x2e, 0 } },
+ { 0xff62, 1, { 0x300c, 0 } },
+ { 0xff63, 1, { 0x300d, 0 } },
+ { 0xff64, 1, { 0x3001, 0 } },
+ { 0xff65, 1, { 0x30fb, 0 } },
+ { 0xff66, 1, { 0x30f2, 0 } },
+ { 0xff67, 1, { 0x30a1, 0 } },
+ { 0xff68, 1, { 0x30a3, 0 } },
+ { 0xff69, 1, { 0x30a5, 0 } },
+ { 0xff6a, 1, { 0x30a7, 0 } },
+ { 0xff6b, 1, { 0x30a9, 0 } },
+ { 0xff6c, 1, { 0x30e3, 0 } },
+ { 0xff6d, 1, { 0x30e5, 0 } },
+ { 0xff6e, 1, { 0x30e7, 0 } },
+ { 0xff6f, 1, { 0x30c3, 0 } },
+ { 0xff70, 1, { 0x30fc, 0 } },
+ { 0xff71, 1, { 0x30a2, 0 } },
+ { 0xff72, 1, { 0x30a4, 0 } },
+ { 0xff73, 1, { 0x30a6, 0 } },
+ { 0xff74, 1, { 0x30a8, 0 } },
+ { 0xff75, 1, { 0x30aa, 0 } },
+ { 0xff76, 1, { 0x30ab, 0 } },
+ { 0xff77, 1, { 0x30ad, 0 } },
+ { 0xff78, 1, { 0x30af, 0 } },
+ { 0xff79, 1, { 0x30b1, 0 } },
+ { 0xff7a, 1, { 0x30b3, 0 } },
+ { 0xff7b, 1, { 0x30b5, 0 } },
+ { 0xff7c, 1, { 0x30b7, 0 } },
+ { 0xff7d, 1, { 0x30b9, 0 } },
+ { 0xff7e, 1, { 0x30bb, 0 } },
+ { 0xff7f, 1, { 0x30bd, 0 } },
+ { 0xff80, 1, { 0x30bf, 0 } },
+ { 0xff81, 1, { 0x30c1, 0 } },
+ { 0xff82, 1, { 0x30c4, 0 } },
+ { 0xff83, 1, { 0x30c6, 0 } },
+ { 0xff84, 1, { 0x30c8, 0 } },
+ { 0xff85, 1, { 0x30ca, 0 } },
+ { 0xff86, 1, { 0x30cb, 0 } },
+ { 0xff87, 1, { 0x30cc, 0 } },
+ { 0xff88, 1, { 0x30cd, 0 } },
+ { 0xff89, 1, { 0x30ce, 0 } },
+ { 0xff8a, 1, { 0x30cf, 0 } },
+ { 0xff8b, 1, { 0x30d2, 0 } },
+ { 0xff8c, 1, { 0x30d5, 0 } },
+ { 0xff8d, 1, { 0x30d8, 0 } },
+ { 0xff8e, 1, { 0x30db, 0 } },
+ { 0xff8f, 1, { 0x30de, 0 } },
+ { 0xff90, 1, { 0x30df, 0 } },
+ { 0xff91, 1, { 0x30e0, 0 } },
+ { 0xff92, 1, { 0x30e1, 0 } },
+ { 0xff93, 1, { 0x30e2, 0 } },
+ { 0xff94, 1, { 0x30e4, 0 } },
+ { 0xff95, 1, { 0x30e6, 0 } },
+ { 0xff96, 1, { 0x30e8, 0 } },
+ { 0xff97, 1, { 0x30e9, 0 } },
+ { 0xff98, 1, { 0x30ea, 0 } },
+ { 0xff99, 1, { 0x30eb, 0 } },
+ { 0xff9a, 1, { 0x30ec, 0 } },
+ { 0xff9b, 1, { 0x30ed, 0 } },
+ { 0xff9c, 1, { 0x30ef, 0 } },
+ { 0xff9d, 1, { 0x30f3, 0 } },
+ { 0xff9e, 1, { 0x3099, 0 } },
+ { 0xff9f, 1, { 0x309a, 0 } },
+ { 0xffa1, 1, { 0x1100, 0 } },
+ { 0xffa2, 1, { 0x1101, 0 } },
+ { 0xffa3, 1, { 0x11aa, 0 } },
+ { 0xffa4, 1, { 0x1102, 0 } },
+ { 0xffa5, 1, { 0x11ac, 0 } },
+ { 0xffa6, 1, { 0x11ad, 0 } },
+ { 0xffa7, 1, { 0x1103, 0 } },
+ { 0xffa8, 1, { 0x1104, 0 } },
+ { 0xffa9, 1, { 0x1105, 0 } },
+ { 0xffaa, 1, { 0x11b0, 0 } },
+ { 0xffab, 1, { 0x11b1, 0 } },
+ { 0xffac, 1, { 0x11b2, 0 } },
+ { 0xffad, 1, { 0x11b3, 0 } },
+ { 0xffae, 1, { 0x11b4, 0 } },
+ { 0xffaf, 1, { 0x11b5, 0 } },
+ { 0xffb0, 1, { 0x111a, 0 } },
+ { 0xffb1, 1, { 0x1106, 0 } },
+ { 0xffb2, 1, { 0x1107, 0 } },
+ { 0xffb3, 1, { 0x1108, 0 } },
+ { 0xffb4, 1, { 0x1121, 0 } },
+ { 0xffb5, 1, { 0x1109, 0 } },
+ { 0xffb6, 1, { 0x110a, 0 } },
+ { 0xffb7, 1, { 0x110b, 0 } },
+ { 0xffb8, 1, { 0x110c, 0 } },
+ { 0xffb9, 1, { 0x110d, 0 } },
+ { 0xffba, 1, { 0x110e, 0 } },
+ { 0xffbb, 1, { 0x110f, 0 } },
+ { 0xffbc, 1, { 0x1110, 0 } },
+ { 0xffbd, 1, { 0x1111, 0 } },
+ { 0xffbe, 1, { 0x1112, 0 } },
+ { 0xffc2, 1, { 0x1161, 0 } },
+ { 0xffc3, 1, { 0x1162, 0 } },
+ { 0xffc4, 1, { 0x1163, 0 } },
+ { 0xffc5, 1, { 0x1164, 0 } },
+ { 0xffc6, 1, { 0x1165, 0 } },
+ { 0xffc7, 1, { 0x1166, 0 } },
+ { 0xffca, 1, { 0x1167, 0 } },
+ { 0xffcb, 1, { 0x1168, 0 } },
+ { 0xffcc, 1, { 0x1169, 0 } },
+ { 0xffcd, 1, { 0x116a, 0 } },
+ { 0xffce, 1, { 0x116b, 0 } },
+ { 0xffcf, 1, { 0x116c, 0 } },
+ { 0xffd2, 1, { 0x116d, 0 } },
+ { 0xffd3, 1, { 0x116e, 0 } },
+ { 0xffd4, 1, { 0x116f, 0 } },
+ { 0xffd5, 1, { 0x1170, 0 } },
+ { 0xffd6, 1, { 0x1171, 0 } },
+ { 0xffd7, 1, { 0x1172, 0 } },
+ { 0xffda, 1, { 0x1173, 0 } },
+ { 0xffdb, 1, { 0x1174, 0 } },
+ { 0xffdc, 1, { 0x1175, 0 } },
+ { 0xffe0, 1, { 0xa2, 0 } },
+ { 0xffe1, 1, { 0xa3, 0 } },
+ { 0xffe2, 1, { 0xac, 0 } },
+ { 0xffe4, 1, { 0xa6, 0 } },
+ { 0xffe5, 1, { 0xa5, 0 } },
+ { 0xffe6, 1, { 0x20a9, 0 } },
+ { 0xffe8, 1, { 0x2502, 0 } },
+ { 0xffe9, 1, { 0x2190, 0 } },
+ { 0xffea, 1, { 0x2191, 0 } },
+ { 0xffeb, 1, { 0x2192, 0 } },
+ { 0xffec, 1, { 0x2193, 0 } },
+ { 0xffed, 1, { 0x25a0, 0 } },
+ { 0xffee, 1, { 0x25cb, 0 } },
+ { 0x10400, 2, { 0xd801, 0xdc28 } },
+ { 0x10401, 2, { 0xd801, 0xdc29 } },
+ { 0x10402, 2, { 0xd801, 0xdc2a } },
+ { 0x10403, 2, { 0xd801, 0xdc2b } },
+ { 0x10404, 2, { 0xd801, 0xdc2c } },
+ { 0x10405, 2, { 0xd801, 0xdc2d } },
+ { 0x10406, 2, { 0xd801, 0xdc2e } },
+ { 0x10407, 2, { 0xd801, 0xdc2f } },
+ { 0x10408, 2, { 0xd801, 0xdc30 } },
+ { 0x10409, 2, { 0xd801, 0xdc31 } },
+ { 0x1040a, 2, { 0xd801, 0xdc32 } },
+ { 0x1040b, 2, { 0xd801, 0xdc33 } },
+ { 0x1040c, 2, { 0xd801, 0xdc34 } },
+ { 0x1040d, 2, { 0xd801, 0xdc35 } },
+ { 0x1040e, 2, { 0xd801, 0xdc36 } },
+ { 0x1040f, 2, { 0xd801, 0xdc37 } },
+ { 0x10410, 2, { 0xd801, 0xdc38 } },
+ { 0x10411, 2, { 0xd801, 0xdc39 } },
+ { 0x10412, 2, { 0xd801, 0xdc3a } },
+ { 0x10413, 2, { 0xd801, 0xdc3b } },
+ { 0x10414, 2, { 0xd801, 0xdc3c } },
+ { 0x10415, 2, { 0xd801, 0xdc3d } },
+ { 0x10416, 2, { 0xd801, 0xdc3e } },
+ { 0x10417, 2, { 0xd801, 0xdc3f } },
+ { 0x10418, 2, { 0xd801, 0xdc40 } },
+ { 0x10419, 2, { 0xd801, 0xdc41 } },
+ { 0x1041a, 2, { 0xd801, 0xdc42 } },
+ { 0x1041b, 2, { 0xd801, 0xdc43 } },
+ { 0x1041c, 2, { 0xd801, 0xdc44 } },
+ { 0x1041d, 2, { 0xd801, 0xdc45 } },
+ { 0x1041e, 2, { 0xd801, 0xdc46 } },
+ { 0x1041f, 2, { 0xd801, 0xdc47 } },
+ { 0x10420, 2, { 0xd801, 0xdc48 } },
+ { 0x10421, 2, { 0xd801, 0xdc49 } },
+ { 0x10422, 2, { 0xd801, 0xdc4a } },
+ { 0x10423, 2, { 0xd801, 0xdc4b } },
+ { 0x10424, 2, { 0xd801, 0xdc4c } },
+ { 0x10425, 2, { 0xd801, 0xdc4d } },
+ { 0x10426, 2, { 0xd801, 0xdc4e } },
+ { 0x10427, 2, { 0xd801, 0xdc4f } },
+ { 0x104b0, 2, { 0xd801, 0xdcd8 } },
+ { 0x104b1, 2, { 0xd801, 0xdcd9 } },
+ { 0x104b2, 2, { 0xd801, 0xdcda } },
+ { 0x104b3, 2, { 0xd801, 0xdcdb } },
+ { 0x104b4, 2, { 0xd801, 0xdcdc } },
+ { 0x104b5, 2, { 0xd801, 0xdcdd } },
+ { 0x104b6, 2, { 0xd801, 0xdcde } },
+ { 0x104b7, 2, { 0xd801, 0xdcdf } },
+ { 0x104b8, 2, { 0xd801, 0xdce0 } },
+ { 0x104b9, 2, { 0xd801, 0xdce1 } },
+ { 0x104ba, 2, { 0xd801, 0xdce2 } },
+ { 0x104bb, 2, { 0xd801, 0xdce3 } },
+ { 0x104bc, 2, { 0xd801, 0xdce4 } },
+ { 0x104bd, 2, { 0xd801, 0xdce5 } },
+ { 0x104be, 2, { 0xd801, 0xdce6 } },
+ { 0x104bf, 2, { 0xd801, 0xdce7 } },
+ { 0x104c0, 2, { 0xd801, 0xdce8 } },
+ { 0x104c1, 2, { 0xd801, 0xdce9 } },
+ { 0x104c2, 2, { 0xd801, 0xdcea } },
+ { 0x104c3, 2, { 0xd801, 0xdceb } },
+ { 0x104c4, 2, { 0xd801, 0xdcec } },
+ { 0x104c5, 2, { 0xd801, 0xdced } },
+ { 0x104c6, 2, { 0xd801, 0xdcee } },
+ { 0x104c7, 2, { 0xd801, 0xdcef } },
+ { 0x104c8, 2, { 0xd801, 0xdcf0 } },
+ { 0x104c9, 2, { 0xd801, 0xdcf1 } },
+ { 0x104ca, 2, { 0xd801, 0xdcf2 } },
+ { 0x104cb, 2, { 0xd801, 0xdcf3 } },
+ { 0x104cc, 2, { 0xd801, 0xdcf4 } },
+ { 0x104cd, 2, { 0xd801, 0xdcf5 } },
+ { 0x104ce, 2, { 0xd801, 0xdcf6 } },
+ { 0x104cf, 2, { 0xd801, 0xdcf7 } },
+ { 0x104d0, 2, { 0xd801, 0xdcf8 } },
+ { 0x104d1, 2, { 0xd801, 0xdcf9 } },
+ { 0x104d2, 2, { 0xd801, 0xdcfa } },
+ { 0x104d3, 2, { 0xd801, 0xdcfb } },
+ { 0x10570, 2, { 0xd801, 0xdd97 } },
+ { 0x10571, 2, { 0xd801, 0xdd98 } },
+ { 0x10572, 2, { 0xd801, 0xdd99 } },
+ { 0x10573, 2, { 0xd801, 0xdd9a } },
+ { 0x10574, 2, { 0xd801, 0xdd9b } },
+ { 0x10575, 2, { 0xd801, 0xdd9c } },
+ { 0x10576, 2, { 0xd801, 0xdd9d } },
+ { 0x10577, 2, { 0xd801, 0xdd9e } },
+ { 0x10578, 2, { 0xd801, 0xdd9f } },
+ { 0x10579, 2, { 0xd801, 0xdda0 } },
+ { 0x1057a, 2, { 0xd801, 0xdda1 } },
+ { 0x1057c, 2, { 0xd801, 0xdda3 } },
+ { 0x1057d, 2, { 0xd801, 0xdda4 } },
+ { 0x1057e, 2, { 0xd801, 0xdda5 } },
+ { 0x1057f, 2, { 0xd801, 0xdda6 } },
+ { 0x10580, 2, { 0xd801, 0xdda7 } },
+ { 0x10581, 2, { 0xd801, 0xdda8 } },
+ { 0x10582, 2, { 0xd801, 0xdda9 } },
+ { 0x10583, 2, { 0xd801, 0xddaa } },
+ { 0x10584, 2, { 0xd801, 0xddab } },
+ { 0x10585, 2, { 0xd801, 0xddac } },
+ { 0x10586, 2, { 0xd801, 0xddad } },
+ { 0x10587, 2, { 0xd801, 0xddae } },
+ { 0x10588, 2, { 0xd801, 0xddaf } },
+ { 0x10589, 2, { 0xd801, 0xddb0 } },
+ { 0x1058a, 2, { 0xd801, 0xddb1 } },
+ { 0x1058c, 2, { 0xd801, 0xddb3 } },
+ { 0x1058d, 2, { 0xd801, 0xddb4 } },
+ { 0x1058e, 2, { 0xd801, 0xddb5 } },
+ { 0x1058f, 2, { 0xd801, 0xddb6 } },
+ { 0x10590, 2, { 0xd801, 0xddb7 } },
+ { 0x10591, 2, { 0xd801, 0xddb8 } },
+ { 0x10592, 2, { 0xd801, 0xddb9 } },
+ { 0x10594, 2, { 0xd801, 0xddbb } },
+ { 0x10595, 2, { 0xd801, 0xddbc } },
+ { 0x10781, 1, { 0x2d0, 0 } },
+ { 0x10782, 1, { 0x2d1, 0 } },
+ { 0x10783, 1, { 0xe6, 0 } },
+ { 0x10784, 1, { 0x299, 0 } },
+ { 0x10785, 1, { 0x253, 0 } },
+ { 0x10787, 1, { 0x2a3, 0 } },
+ { 0x10788, 1, { 0xab66, 0 } },
+ { 0x10789, 1, { 0x2a5, 0 } },
+ { 0x1078a, 1, { 0x2a4, 0 } },
+ { 0x1078b, 1, { 0x256, 0 } },
+ { 0x1078c, 1, { 0x257, 0 } },
+ { 0x1078d, 1, { 0x1d91, 0 } },
+ { 0x1078e, 1, { 0x258, 0 } },
+ { 0x1078f, 1, { 0x25e, 0 } },
+ { 0x10790, 1, { 0x2a9, 0 } },
+ { 0x10791, 1, { 0x264, 0 } },
+ { 0x10792, 1, { 0x262, 0 } },
+ { 0x10793, 1, { 0x260, 0 } },
+ { 0x10794, 1, { 0x29b, 0 } },
+ { 0x10795, 1, { 0x127, 0 } },
+ { 0x10796, 1, { 0x29c, 0 } },
+ { 0x10797, 1, { 0x267, 0 } },
+ { 0x10798, 1, { 0x284, 0 } },
+ { 0x10799, 1, { 0x2aa, 0 } },
+ { 0x1079a, 1, { 0x2ab, 0 } },
+ { 0x1079b, 1, { 0x26c, 0 } },
+ { 0x1079c, 2, { 0xd837, 0xdf04 } },
+ { 0x1079d, 1, { 0xa78e, 0 } },
+ { 0x1079e, 1, { 0x26e, 0 } },
+ { 0x1079f, 2, { 0xd837, 0xdf05 } },
+ { 0x107a0, 1, { 0x28e, 0 } },
+ { 0x107a1, 2, { 0xd837, 0xdf06 } },
+ { 0x107a2, 1, { 0xf8, 0 } },
+ { 0x107a3, 1, { 0x276, 0 } },
+ { 0x107a4, 1, { 0x277, 0 } },
+ { 0x107a5, 1, { 0x71, 0 } },
+ { 0x107a6, 1, { 0x27a, 0 } },
+ { 0x107a7, 2, { 0xd837, 0xdf08 } },
+ { 0x107a8, 1, { 0x27d, 0 } },
+ { 0x107a9, 1, { 0x27e, 0 } },
+ { 0x107aa, 1, { 0x280, 0 } },
+ { 0x107ab, 1, { 0x2a8, 0 } },
+ { 0x107ac, 1, { 0x2a6, 0 } },
+ { 0x107ad, 1, { 0xab67, 0 } },
+ { 0x107ae, 1, { 0x2a7, 0 } },
+ { 0x107af, 1, { 0x288, 0 } },
+ { 0x107b0, 1, { 0x2c71, 0 } },
+ { 0x107b2, 1, { 0x28f, 0 } },
+ { 0x107b3, 1, { 0x2a1, 0 } },
+ { 0x107b4, 1, { 0x2a2, 0 } },
+ { 0x107b5, 1, { 0x298, 0 } },
+ { 0x107b6, 1, { 0x1c0, 0 } },
+ { 0x107b7, 1, { 0x1c1, 0 } },
+ { 0x107b8, 1, { 0x1c2, 0 } },
+ { 0x107b9, 2, { 0xd837, 0xdf0a } },
+ { 0x107ba, 2, { 0xd837, 0xdf1e } },
+ { 0x10c80, 2, { 0xd803, 0xdcc0 } },
+ { 0x10c81, 2, { 0xd803, 0xdcc1 } },
+ { 0x10c82, 2, { 0xd803, 0xdcc2 } },
+ { 0x10c83, 2, { 0xd803, 0xdcc3 } },
+ { 0x10c84, 2, { 0xd803, 0xdcc4 } },
+ { 0x10c85, 2, { 0xd803, 0xdcc5 } },
+ { 0x10c86, 2, { 0xd803, 0xdcc6 } },
+ { 0x10c87, 2, { 0xd803, 0xdcc7 } },
+ { 0x10c88, 2, { 0xd803, 0xdcc8 } },
+ { 0x10c89, 2, { 0xd803, 0xdcc9 } },
+ { 0x10c8a, 2, { 0xd803, 0xdcca } },
+ { 0x10c8b, 2, { 0xd803, 0xdccb } },
+ { 0x10c8c, 2, { 0xd803, 0xdccc } },
+ { 0x10c8d, 2, { 0xd803, 0xdccd } },
+ { 0x10c8e, 2, { 0xd803, 0xdcce } },
+ { 0x10c8f, 2, { 0xd803, 0xdccf } },
+ { 0x10c90, 2, { 0xd803, 0xdcd0 } },
+ { 0x10c91, 2, { 0xd803, 0xdcd1 } },
+ { 0x10c92, 2, { 0xd803, 0xdcd2 } },
+ { 0x10c93, 2, { 0xd803, 0xdcd3 } },
+ { 0x10c94, 2, { 0xd803, 0xdcd4 } },
+ { 0x10c95, 2, { 0xd803, 0xdcd5 } },
+ { 0x10c96, 2, { 0xd803, 0xdcd6 } },
+ { 0x10c97, 2, { 0xd803, 0xdcd7 } },
+ { 0x10c98, 2, { 0xd803, 0xdcd8 } },
+ { 0x10c99, 2, { 0xd803, 0xdcd9 } },
+ { 0x10c9a, 2, { 0xd803, 0xdcda } },
+ { 0x10c9b, 2, { 0xd803, 0xdcdb } },
+ { 0x10c9c, 2, { 0xd803, 0xdcdc } },
+ { 0x10c9d, 2, { 0xd803, 0xdcdd } },
+ { 0x10c9e, 2, { 0xd803, 0xdcde } },
+ { 0x10c9f, 2, { 0xd803, 0xdcdf } },
+ { 0x10ca0, 2, { 0xd803, 0xdce0 } },
+ { 0x10ca1, 2, { 0xd803, 0xdce1 } },
+ { 0x10ca2, 2, { 0xd803, 0xdce2 } },
+ { 0x10ca3, 2, { 0xd803, 0xdce3 } },
+ { 0x10ca4, 2, { 0xd803, 0xdce4 } },
+ { 0x10ca5, 2, { 0xd803, 0xdce5 } },
+ { 0x10ca6, 2, { 0xd803, 0xdce6 } },
+ { 0x10ca7, 2, { 0xd803, 0xdce7 } },
+ { 0x10ca8, 2, { 0xd803, 0xdce8 } },
+ { 0x10ca9, 2, { 0xd803, 0xdce9 } },
+ { 0x10caa, 2, { 0xd803, 0xdcea } },
+ { 0x10cab, 2, { 0xd803, 0xdceb } },
+ { 0x10cac, 2, { 0xd803, 0xdcec } },
+ { 0x10cad, 2, { 0xd803, 0xdced } },
+ { 0x10cae, 2, { 0xd803, 0xdcee } },
+ { 0x10caf, 2, { 0xd803, 0xdcef } },
+ { 0x10cb0, 2, { 0xd803, 0xdcf0 } },
+ { 0x10cb1, 2, { 0xd803, 0xdcf1 } },
+ { 0x10cb2, 2, { 0xd803, 0xdcf2 } },
+ { 0x118a0, 2, { 0xd806, 0xdcc0 } },
+ { 0x118a1, 2, { 0xd806, 0xdcc1 } },
+ { 0x118a2, 2, { 0xd806, 0xdcc2 } },
+ { 0x118a3, 2, { 0xd806, 0xdcc3 } },
+ { 0x118a4, 2, { 0xd806, 0xdcc4 } },
+ { 0x118a5, 2, { 0xd806, 0xdcc5 } },
+ { 0x118a6, 2, { 0xd806, 0xdcc6 } },
+ { 0x118a7, 2, { 0xd806, 0xdcc7 } },
+ { 0x118a8, 2, { 0xd806, 0xdcc8 } },
+ { 0x118a9, 2, { 0xd806, 0xdcc9 } },
+ { 0x118aa, 2, { 0xd806, 0xdcca } },
+ { 0x118ab, 2, { 0xd806, 0xdccb } },
+ { 0x118ac, 2, { 0xd806, 0xdccc } },
+ { 0x118ad, 2, { 0xd806, 0xdccd } },
+ { 0x118ae, 2, { 0xd806, 0xdcce } },
+ { 0x118af, 2, { 0xd806, 0xdccf } },
+ { 0x118b0, 2, { 0xd806, 0xdcd0 } },
+ { 0x118b1, 2, { 0xd806, 0xdcd1 } },
+ { 0x118b2, 2, { 0xd806, 0xdcd2 } },
+ { 0x118b3, 2, { 0xd806, 0xdcd3 } },
+ { 0x118b4, 2, { 0xd806, 0xdcd4 } },
+ { 0x118b5, 2, { 0xd806, 0xdcd5 } },
+ { 0x118b6, 2, { 0xd806, 0xdcd6 } },
+ { 0x118b7, 2, { 0xd806, 0xdcd7 } },
+ { 0x118b8, 2, { 0xd806, 0xdcd8 } },
+ { 0x118b9, 2, { 0xd806, 0xdcd9 } },
+ { 0x118ba, 2, { 0xd806, 0xdcda } },
+ { 0x118bb, 2, { 0xd806, 0xdcdb } },
+ { 0x118bc, 2, { 0xd806, 0xdcdc } },
+ { 0x118bd, 2, { 0xd806, 0xdcdd } },
+ { 0x118be, 2, { 0xd806, 0xdcde } },
+ { 0x118bf, 2, { 0xd806, 0xdcdf } },
+ { 0x16e40, 2, { 0xd81b, 0xde60 } },
+ { 0x16e41, 2, { 0xd81b, 0xde61 } },
+ { 0x16e42, 2, { 0xd81b, 0xde62 } },
+ { 0x16e43, 2, { 0xd81b, 0xde63 } },
+ { 0x16e44, 2, { 0xd81b, 0xde64 } },
+ { 0x16e45, 2, { 0xd81b, 0xde65 } },
+ { 0x16e46, 2, { 0xd81b, 0xde66 } },
+ { 0x16e47, 2, { 0xd81b, 0xde67 } },
+ { 0x16e48, 2, { 0xd81b, 0xde68 } },
+ { 0x16e49, 2, { 0xd81b, 0xde69 } },
+ { 0x16e4a, 2, { 0xd81b, 0xde6a } },
+ { 0x16e4b, 2, { 0xd81b, 0xde6b } },
+ { 0x16e4c, 2, { 0xd81b, 0xde6c } },
+ { 0x16e4d, 2, { 0xd81b, 0xde6d } },
+ { 0x16e4e, 2, { 0xd81b, 0xde6e } },
+ { 0x16e4f, 2, { 0xd81b, 0xde6f } },
+ { 0x16e50, 2, { 0xd81b, 0xde70 } },
+ { 0x16e51, 2, { 0xd81b, 0xde71 } },
+ { 0x16e52, 2, { 0xd81b, 0xde72 } },
+ { 0x16e53, 2, { 0xd81b, 0xde73 } },
+ { 0x16e54, 2, { 0xd81b, 0xde74 } },
+ { 0x16e55, 2, { 0xd81b, 0xde75 } },
+ { 0x16e56, 2, { 0xd81b, 0xde76 } },
+ { 0x16e57, 2, { 0xd81b, 0xde77 } },
+ { 0x16e58, 2, { 0xd81b, 0xde78 } },
+ { 0x16e59, 2, { 0xd81b, 0xde79 } },
+ { 0x16e5a, 2, { 0xd81b, 0xde7a } },
+ { 0x16e5b, 2, { 0xd81b, 0xde7b } },
+ { 0x16e5c, 2, { 0xd81b, 0xde7c } },
+ { 0x16e5d, 2, { 0xd81b, 0xde7d } },
+ { 0x16e5e, 2, { 0xd81b, 0xde7e } },
+ { 0x16e5f, 2, { 0xd81b, 0xde7f } },
+ { 0x1d15e, 4, { 265, 0 } },
+ { 0x1d15f, 4, { 179, 0 } },
+ { 0x1d160, 6, { 203, 0 } },
+ { 0x1d161, 6, { 197, 0 } },
+ { 0x1d162, 6, { 191, 0 } },
+ { 0x1d163, 6, { 185, 0 } },
+ { 0x1d164, 6, { 179, 0 } },
+ { 0x1d1bb, 4, { 167, 0 } },
+ { 0x1d1bc, 4, { 155, 0 } },
+ { 0x1d1bd, 6, { 173, 0 } },
+ { 0x1d1be, 6, { 161, 0 } },
+ { 0x1d1bf, 6, { 167, 0 } },
+ { 0x1d1c0, 6, { 155, 0 } },
+ { 0x1d400, 1, { 0x61, 0 } },
+ { 0x1d401, 1, { 0x62, 0 } },
+ { 0x1d402, 1, { 0x63, 0 } },
+ { 0x1d403, 1, { 0x64, 0 } },
+ { 0x1d404, 1, { 0x65, 0 } },
+ { 0x1d405, 1, { 0x66, 0 } },
+ { 0x1d406, 1, { 0x67, 0 } },
+ { 0x1d407, 1, { 0x68, 0 } },
+ { 0x1d408, 1, { 0x69, 0 } },
+ { 0x1d409, 1, { 0x6a, 0 } },
+ { 0x1d40a, 1, { 0x6b, 0 } },
+ { 0x1d40b, 1, { 0x6c, 0 } },
+ { 0x1d40c, 1, { 0x6d, 0 } },
+ { 0x1d40d, 1, { 0x6e, 0 } },
+ { 0x1d40e, 1, { 0x6f, 0 } },
+ { 0x1d40f, 1, { 0x70, 0 } },
+ { 0x1d410, 1, { 0x71, 0 } },
+ { 0x1d411, 1, { 0x72, 0 } },
+ { 0x1d412, 1, { 0x73, 0 } },
+ { 0x1d413, 1, { 0x74, 0 } },
+ { 0x1d414, 1, { 0x75, 0 } },
+ { 0x1d415, 1, { 0x76, 0 } },
+ { 0x1d416, 1, { 0x77, 0 } },
+ { 0x1d417, 1, { 0x78, 0 } },
+ { 0x1d418, 1, { 0x79, 0 } },
+ { 0x1d419, 1, { 0x7a, 0 } },
+ { 0x1d41a, 1, { 0x61, 0 } },
+ { 0x1d41b, 1, { 0x62, 0 } },
+ { 0x1d41c, 1, { 0x63, 0 } },
+ { 0x1d41d, 1, { 0x64, 0 } },
+ { 0x1d41e, 1, { 0x65, 0 } },
+ { 0x1d41f, 1, { 0x66, 0 } },
+ { 0x1d420, 1, { 0x67, 0 } },
+ { 0x1d421, 1, { 0x68, 0 } },
+ { 0x1d422, 1, { 0x69, 0 } },
+ { 0x1d423, 1, { 0x6a, 0 } },
+ { 0x1d424, 1, { 0x6b, 0 } },
+ { 0x1d425, 1, { 0x6c, 0 } },
+ { 0x1d426, 1, { 0x6d, 0 } },
+ { 0x1d427, 1, { 0x6e, 0 } },
+ { 0x1d428, 1, { 0x6f, 0 } },
+ { 0x1d429, 1, { 0x70, 0 } },
+ { 0x1d42a, 1, { 0x71, 0 } },
+ { 0x1d42b, 1, { 0x72, 0 } },
+ { 0x1d42c, 1, { 0x73, 0 } },
+ { 0x1d42d, 1, { 0x74, 0 } },
+ { 0x1d42e, 1, { 0x75, 0 } },
+ { 0x1d42f, 1, { 0x76, 0 } },
+ { 0x1d430, 1, { 0x77, 0 } },
+ { 0x1d431, 1, { 0x78, 0 } },
+ { 0x1d432, 1, { 0x79, 0 } },
+ { 0x1d433, 1, { 0x7a, 0 } },
+ { 0x1d434, 1, { 0x61, 0 } },
+ { 0x1d435, 1, { 0x62, 0 } },
+ { 0x1d436, 1, { 0x63, 0 } },
+ { 0x1d437, 1, { 0x64, 0 } },
+ { 0x1d438, 1, { 0x65, 0 } },
+ { 0x1d439, 1, { 0x66, 0 } },
+ { 0x1d43a, 1, { 0x67, 0 } },
+ { 0x1d43b, 1, { 0x68, 0 } },
+ { 0x1d43c, 1, { 0x69, 0 } },
+ { 0x1d43d, 1, { 0x6a, 0 } },
+ { 0x1d43e, 1, { 0x6b, 0 } },
+ { 0x1d43f, 1, { 0x6c, 0 } },
+ { 0x1d440, 1, { 0x6d, 0 } },
+ { 0x1d441, 1, { 0x6e, 0 } },
+ { 0x1d442, 1, { 0x6f, 0 } },
+ { 0x1d443, 1, { 0x70, 0 } },
+ { 0x1d444, 1, { 0x71, 0 } },
+ { 0x1d445, 1, { 0x72, 0 } },
+ { 0x1d446, 1, { 0x73, 0 } },
+ { 0x1d447, 1, { 0x74, 0 } },
+ { 0x1d448, 1, { 0x75, 0 } },
+ { 0x1d449, 1, { 0x76, 0 } },
+ { 0x1d44a, 1, { 0x77, 0 } },
+ { 0x1d44b, 1, { 0x78, 0 } },
+ { 0x1d44c, 1, { 0x79, 0 } },
+ { 0x1d44d, 1, { 0x7a, 0 } },
+ { 0x1d44e, 1, { 0x61, 0 } },
+ { 0x1d44f, 1, { 0x62, 0 } },
+ { 0x1d450, 1, { 0x63, 0 } },
+ { 0x1d451, 1, { 0x64, 0 } },
+ { 0x1d452, 1, { 0x65, 0 } },
+ { 0x1d453, 1, { 0x66, 0 } },
+ { 0x1d454, 1, { 0x67, 0 } },
+ { 0x1d456, 1, { 0x69, 0 } },
+ { 0x1d457, 1, { 0x6a, 0 } },
+ { 0x1d458, 1, { 0x6b, 0 } },
+ { 0x1d459, 1, { 0x6c, 0 } },
+ { 0x1d45a, 1, { 0x6d, 0 } },
+ { 0x1d45b, 1, { 0x6e, 0 } },
+ { 0x1d45c, 1, { 0x6f, 0 } },
+ { 0x1d45d, 1, { 0x70, 0 } },
+ { 0x1d45e, 1, { 0x71, 0 } },
+ { 0x1d45f, 1, { 0x72, 0 } },
+ { 0x1d460, 1, { 0x73, 0 } },
+ { 0x1d461, 1, { 0x74, 0 } },
+ { 0x1d462, 1, { 0x75, 0 } },
+ { 0x1d463, 1, { 0x76, 0 } },
+ { 0x1d464, 1, { 0x77, 0 } },
+ { 0x1d465, 1, { 0x78, 0 } },
+ { 0x1d466, 1, { 0x79, 0 } },
+ { 0x1d467, 1, { 0x7a, 0 } },
+ { 0x1d468, 1, { 0x61, 0 } },
+ { 0x1d469, 1, { 0x62, 0 } },
+ { 0x1d46a, 1, { 0x63, 0 } },
+ { 0x1d46b, 1, { 0x64, 0 } },
+ { 0x1d46c, 1, { 0x65, 0 } },
+ { 0x1d46d, 1, { 0x66, 0 } },
+ { 0x1d46e, 1, { 0x67, 0 } },
+ { 0x1d46f, 1, { 0x68, 0 } },
+ { 0x1d470, 1, { 0x69, 0 } },
+ { 0x1d471, 1, { 0x6a, 0 } },
+ { 0x1d472, 1, { 0x6b, 0 } },
+ { 0x1d473, 1, { 0x6c, 0 } },
+ { 0x1d474, 1, { 0x6d, 0 } },
+ { 0x1d475, 1, { 0x6e, 0 } },
+ { 0x1d476, 1, { 0x6f, 0 } },
+ { 0x1d477, 1, { 0x70, 0 } },
+ { 0x1d478, 1, { 0x71, 0 } },
+ { 0x1d479, 1, { 0x72, 0 } },
+ { 0x1d47a, 1, { 0x73, 0 } },
+ { 0x1d47b, 1, { 0x74, 0 } },
+ { 0x1d47c, 1, { 0x75, 0 } },
+ { 0x1d47d, 1, { 0x76, 0 } },
+ { 0x1d47e, 1, { 0x77, 0 } },
+ { 0x1d47f, 1, { 0x78, 0 } },
+ { 0x1d480, 1, { 0x79, 0 } },
+ { 0x1d481, 1, { 0x7a, 0 } },
+ { 0x1d482, 1, { 0x61, 0 } },
+ { 0x1d483, 1, { 0x62, 0 } },
+ { 0x1d484, 1, { 0x63, 0 } },
+ { 0x1d485, 1, { 0x64, 0 } },
+ { 0x1d486, 1, { 0x65, 0 } },
+ { 0x1d487, 1, { 0x66, 0 } },
+ { 0x1d488, 1, { 0x67, 0 } },
+ { 0x1d489, 1, { 0x68, 0 } },
+ { 0x1d48a, 1, { 0x69, 0 } },
+ { 0x1d48b, 1, { 0x6a, 0 } },
+ { 0x1d48c, 1, { 0x6b, 0 } },
+ { 0x1d48d, 1, { 0x6c, 0 } },
+ { 0x1d48e, 1, { 0x6d, 0 } },
+ { 0x1d48f, 1, { 0x6e, 0 } },
+ { 0x1d490, 1, { 0x6f, 0 } },
+ { 0x1d491, 1, { 0x70, 0 } },
+ { 0x1d492, 1, { 0x71, 0 } },
+ { 0x1d493, 1, { 0x72, 0 } },
+ { 0x1d494, 1, { 0x73, 0 } },
+ { 0x1d495, 1, { 0x74, 0 } },
+ { 0x1d496, 1, { 0x75, 0 } },
+ { 0x1d497, 1, { 0x76, 0 } },
+ { 0x1d498, 1, { 0x77, 0 } },
+ { 0x1d499, 1, { 0x78, 0 } },
+ { 0x1d49a, 1, { 0x79, 0 } },
+ { 0x1d49b, 1, { 0x7a, 0 } },
+ { 0x1d49c, 1, { 0x61, 0 } },
+ { 0x1d49e, 1, { 0x63, 0 } },
+ { 0x1d49f, 1, { 0x64, 0 } },
+ { 0x1d4a2, 1, { 0x67, 0 } },
+ { 0x1d4a5, 1, { 0x6a, 0 } },
+ { 0x1d4a6, 1, { 0x6b, 0 } },
+ { 0x1d4a9, 1, { 0x6e, 0 } },
+ { 0x1d4aa, 1, { 0x6f, 0 } },
+ { 0x1d4ab, 1, { 0x70, 0 } },
+ { 0x1d4ac, 1, { 0x71, 0 } },
+ { 0x1d4ae, 1, { 0x73, 0 } },
+ { 0x1d4af, 1, { 0x74, 0 } },
+ { 0x1d4b0, 1, { 0x75, 0 } },
+ { 0x1d4b1, 1, { 0x76, 0 } },
+ { 0x1d4b2, 1, { 0x77, 0 } },
+ { 0x1d4b3, 1, { 0x78, 0 } },
+ { 0x1d4b4, 1, { 0x79, 0 } },
+ { 0x1d4b5, 1, { 0x7a, 0 } },
+ { 0x1d4b6, 1, { 0x61, 0 } },
+ { 0x1d4b7, 1, { 0x62, 0 } },
+ { 0x1d4b8, 1, { 0x63, 0 } },
+ { 0x1d4b9, 1, { 0x64, 0 } },
+ { 0x1d4bb, 1, { 0x66, 0 } },
+ { 0x1d4bd, 1, { 0x68, 0 } },
+ { 0x1d4be, 1, { 0x69, 0 } },
+ { 0x1d4bf, 1, { 0x6a, 0 } },
+ { 0x1d4c0, 1, { 0x6b, 0 } },
+ { 0x1d4c1, 1, { 0x6c, 0 } },
+ { 0x1d4c2, 1, { 0x6d, 0 } },
+ { 0x1d4c3, 1, { 0x6e, 0 } },
+ { 0x1d4c5, 1, { 0x70, 0 } },
+ { 0x1d4c6, 1, { 0x71, 0 } },
+ { 0x1d4c7, 1, { 0x72, 0 } },
+ { 0x1d4c8, 1, { 0x73, 0 } },
+ { 0x1d4c9, 1, { 0x74, 0 } },
+ { 0x1d4ca, 1, { 0x75, 0 } },
+ { 0x1d4cb, 1, { 0x76, 0 } },
+ { 0x1d4cc, 1, { 0x77, 0 } },
+ { 0x1d4cd, 1, { 0x78, 0 } },
+ { 0x1d4ce, 1, { 0x79, 0 } },
+ { 0x1d4cf, 1, { 0x7a, 0 } },
+ { 0x1d4d0, 1, { 0x61, 0 } },
+ { 0x1d4d1, 1, { 0x62, 0 } },
+ { 0x1d4d2, 1, { 0x63, 0 } },
+ { 0x1d4d3, 1, { 0x64, 0 } },
+ { 0x1d4d4, 1, { 0x65, 0 } },
+ { 0x1d4d5, 1, { 0x66, 0 } },
+ { 0x1d4d6, 1, { 0x67, 0 } },
+ { 0x1d4d7, 1, { 0x68, 0 } },
+ { 0x1d4d8, 1, { 0x69, 0 } },
+ { 0x1d4d9, 1, { 0x6a, 0 } },
+ { 0x1d4da, 1, { 0x6b, 0 } },
+ { 0x1d4db, 1, { 0x6c, 0 } },
+ { 0x1d4dc, 1, { 0x6d, 0 } },
+ { 0x1d4dd, 1, { 0x6e, 0 } },
+ { 0x1d4de, 1, { 0x6f, 0 } },
+ { 0x1d4df, 1, { 0x70, 0 } },
+ { 0x1d4e0, 1, { 0x71, 0 } },
+ { 0x1d4e1, 1, { 0x72, 0 } },
+ { 0x1d4e2, 1, { 0x73, 0 } },
+ { 0x1d4e3, 1, { 0x74, 0 } },
+ { 0x1d4e4, 1, { 0x75, 0 } },
+ { 0x1d4e5, 1, { 0x76, 0 } },
+ { 0x1d4e6, 1, { 0x77, 0 } },
+ { 0x1d4e7, 1, { 0x78, 0 } },
+ { 0x1d4e8, 1, { 0x79, 0 } },
+ { 0x1d4e9, 1, { 0x7a, 0 } },
+ { 0x1d4ea, 1, { 0x61, 0 } },
+ { 0x1d4eb, 1, { 0x62, 0 } },
+ { 0x1d4ec, 1, { 0x63, 0 } },
+ { 0x1d4ed, 1, { 0x64, 0 } },
+ { 0x1d4ee, 1, { 0x65, 0 } },
+ { 0x1d4ef, 1, { 0x66, 0 } },
+ { 0x1d4f0, 1, { 0x67, 0 } },
+ { 0x1d4f1, 1, { 0x68, 0 } },
+ { 0x1d4f2, 1, { 0x69, 0 } },
+ { 0x1d4f3, 1, { 0x6a, 0 } },
+ { 0x1d4f4, 1, { 0x6b, 0 } },
+ { 0x1d4f5, 1, { 0x6c, 0 } },
+ { 0x1d4f6, 1, { 0x6d, 0 } },
+ { 0x1d4f7, 1, { 0x6e, 0 } },
+ { 0x1d4f8, 1, { 0x6f, 0 } },
+ { 0x1d4f9, 1, { 0x70, 0 } },
+ { 0x1d4fa, 1, { 0x71, 0 } },
+ { 0x1d4fb, 1, { 0x72, 0 } },
+ { 0x1d4fc, 1, { 0x73, 0 } },
+ { 0x1d4fd, 1, { 0x74, 0 } },
+ { 0x1d4fe, 1, { 0x75, 0 } },
+ { 0x1d4ff, 1, { 0x76, 0 } },
+ { 0x1d500, 1, { 0x77, 0 } },
+ { 0x1d501, 1, { 0x78, 0 } },
+ { 0x1d502, 1, { 0x79, 0 } },
+ { 0x1d503, 1, { 0x7a, 0 } },
+ { 0x1d504, 1, { 0x61, 0 } },
+ { 0x1d505, 1, { 0x62, 0 } },
+ { 0x1d507, 1, { 0x64, 0 } },
+ { 0x1d508, 1, { 0x65, 0 } },
+ { 0x1d509, 1, { 0x66, 0 } },
+ { 0x1d50a, 1, { 0x67, 0 } },
+ { 0x1d50d, 1, { 0x6a, 0 } },
+ { 0x1d50e, 1, { 0x6b, 0 } },
+ { 0x1d50f, 1, { 0x6c, 0 } },
+ { 0x1d510, 1, { 0x6d, 0 } },
+ { 0x1d511, 1, { 0x6e, 0 } },
+ { 0x1d512, 1, { 0x6f, 0 } },
+ { 0x1d513, 1, { 0x70, 0 } },
+ { 0x1d514, 1, { 0x71, 0 } },
+ { 0x1d516, 1, { 0x73, 0 } },
+ { 0x1d517, 1, { 0x74, 0 } },
+ { 0x1d518, 1, { 0x75, 0 } },
+ { 0x1d519, 1, { 0x76, 0 } },
+ { 0x1d51a, 1, { 0x77, 0 } },
+ { 0x1d51b, 1, { 0x78, 0 } },
+ { 0x1d51c, 1, { 0x79, 0 } },
+ { 0x1d51e, 1, { 0x61, 0 } },
+ { 0x1d51f, 1, { 0x62, 0 } },
+ { 0x1d520, 1, { 0x63, 0 } },
+ { 0x1d521, 1, { 0x64, 0 } },
+ { 0x1d522, 1, { 0x65, 0 } },
+ { 0x1d523, 1, { 0x66, 0 } },
+ { 0x1d524, 1, { 0x67, 0 } },
+ { 0x1d525, 1, { 0x68, 0 } },
+ { 0x1d526, 1, { 0x69, 0 } },
+ { 0x1d527, 1, { 0x6a, 0 } },
+ { 0x1d528, 1, { 0x6b, 0 } },
+ { 0x1d529, 1, { 0x6c, 0 } },
+ { 0x1d52a, 1, { 0x6d, 0 } },
+ { 0x1d52b, 1, { 0x6e, 0 } },
+ { 0x1d52c, 1, { 0x6f, 0 } },
+ { 0x1d52d, 1, { 0x70, 0 } },
+ { 0x1d52e, 1, { 0x71, 0 } },
+ { 0x1d52f, 1, { 0x72, 0 } },
+ { 0x1d530, 1, { 0x73, 0 } },
+ { 0x1d531, 1, { 0x74, 0 } },
+ { 0x1d532, 1, { 0x75, 0 } },
+ { 0x1d533, 1, { 0x76, 0 } },
+ { 0x1d534, 1, { 0x77, 0 } },
+ { 0x1d535, 1, { 0x78, 0 } },
+ { 0x1d536, 1, { 0x79, 0 } },
+ { 0x1d537, 1, { 0x7a, 0 } },
+ { 0x1d538, 1, { 0x61, 0 } },
+ { 0x1d539, 1, { 0x62, 0 } },
+ { 0x1d53b, 1, { 0x64, 0 } },
+ { 0x1d53c, 1, { 0x65, 0 } },
+ { 0x1d53d, 1, { 0x66, 0 } },
+ { 0x1d53e, 1, { 0x67, 0 } },
+ { 0x1d540, 1, { 0x69, 0 } },
+ { 0x1d541, 1, { 0x6a, 0 } },
+ { 0x1d542, 1, { 0x6b, 0 } },
+ { 0x1d543, 1, { 0x6c, 0 } },
+ { 0x1d544, 1, { 0x6d, 0 } },
+ { 0x1d546, 1, { 0x6f, 0 } },
+ { 0x1d54a, 1, { 0x73, 0 } },
+ { 0x1d54b, 1, { 0x74, 0 } },
+ { 0x1d54c, 1, { 0x75, 0 } },
+ { 0x1d54d, 1, { 0x76, 0 } },
+ { 0x1d54e, 1, { 0x77, 0 } },
+ { 0x1d54f, 1, { 0x78, 0 } },
+ { 0x1d550, 1, { 0x79, 0 } },
+ { 0x1d552, 1, { 0x61, 0 } },
+ { 0x1d553, 1, { 0x62, 0 } },
+ { 0x1d554, 1, { 0x63, 0 } },
+ { 0x1d555, 1, { 0x64, 0 } },
+ { 0x1d556, 1, { 0x65, 0 } },
+ { 0x1d557, 1, { 0x66, 0 } },
+ { 0x1d558, 1, { 0x67, 0 } },
+ { 0x1d559, 1, { 0x68, 0 } },
+ { 0x1d55a, 1, { 0x69, 0 } },
+ { 0x1d55b, 1, { 0x6a, 0 } },
+ { 0x1d55c, 1, { 0x6b, 0 } },
+ { 0x1d55d, 1, { 0x6c, 0 } },
+ { 0x1d55e, 1, { 0x6d, 0 } },
+ { 0x1d55f, 1, { 0x6e, 0 } },
+ { 0x1d560, 1, { 0x6f, 0 } },
+ { 0x1d561, 1, { 0x70, 0 } },
+ { 0x1d562, 1, { 0x71, 0 } },
+ { 0x1d563, 1, { 0x72, 0 } },
+ { 0x1d564, 1, { 0x73, 0 } },
+ { 0x1d565, 1, { 0x74, 0 } },
+ { 0x1d566, 1, { 0x75, 0 } },
+ { 0x1d567, 1, { 0x76, 0 } },
+ { 0x1d568, 1, { 0x77, 0 } },
+ { 0x1d569, 1, { 0x78, 0 } },
+ { 0x1d56a, 1, { 0x79, 0 } },
+ { 0x1d56b, 1, { 0x7a, 0 } },
+ { 0x1d56c, 1, { 0x61, 0 } },
+ { 0x1d56d, 1, { 0x62, 0 } },
+ { 0x1d56e, 1, { 0x63, 0 } },
+ { 0x1d56f, 1, { 0x64, 0 } },
+ { 0x1d570, 1, { 0x65, 0 } },
+ { 0x1d571, 1, { 0x66, 0 } },
+ { 0x1d572, 1, { 0x67, 0 } },
+ { 0x1d573, 1, { 0x68, 0 } },
+ { 0x1d574, 1, { 0x69, 0 } },
+ { 0x1d575, 1, { 0x6a, 0 } },
+ { 0x1d576, 1, { 0x6b, 0 } },
+ { 0x1d577, 1, { 0x6c, 0 } },
+ { 0x1d578, 1, { 0x6d, 0 } },
+ { 0x1d579, 1, { 0x6e, 0 } },
+ { 0x1d57a, 1, { 0x6f, 0 } },
+ { 0x1d57b, 1, { 0x70, 0 } },
+ { 0x1d57c, 1, { 0x71, 0 } },
+ { 0x1d57d, 1, { 0x72, 0 } },
+ { 0x1d57e, 1, { 0x73, 0 } },
+ { 0x1d57f, 1, { 0x74, 0 } },
+ { 0x1d580, 1, { 0x75, 0 } },
+ { 0x1d581, 1, { 0x76, 0 } },
+ { 0x1d582, 1, { 0x77, 0 } },
+ { 0x1d583, 1, { 0x78, 0 } },
+ { 0x1d584, 1, { 0x79, 0 } },
+ { 0x1d585, 1, { 0x7a, 0 } },
+ { 0x1d586, 1, { 0x61, 0 } },
+ { 0x1d587, 1, { 0x62, 0 } },
+ { 0x1d588, 1, { 0x63, 0 } },
+ { 0x1d589, 1, { 0x64, 0 } },
+ { 0x1d58a, 1, { 0x65, 0 } },
+ { 0x1d58b, 1, { 0x66, 0 } },
+ { 0x1d58c, 1, { 0x67, 0 } },
+ { 0x1d58d, 1, { 0x68, 0 } },
+ { 0x1d58e, 1, { 0x69, 0 } },
+ { 0x1d58f, 1, { 0x6a, 0 } },
+ { 0x1d590, 1, { 0x6b, 0 } },
+ { 0x1d591, 1, { 0x6c, 0 } },
+ { 0x1d592, 1, { 0x6d, 0 } },
+ { 0x1d593, 1, { 0x6e, 0 } },
+ { 0x1d594, 1, { 0x6f, 0 } },
+ { 0x1d595, 1, { 0x70, 0 } },
+ { 0x1d596, 1, { 0x71, 0 } },
+ { 0x1d597, 1, { 0x72, 0 } },
+ { 0x1d598, 1, { 0x73, 0 } },
+ { 0x1d599, 1, { 0x74, 0 } },
+ { 0x1d59a, 1, { 0x75, 0 } },
+ { 0x1d59b, 1, { 0x76, 0 } },
+ { 0x1d59c, 1, { 0x77, 0 } },
+ { 0x1d59d, 1, { 0x78, 0 } },
+ { 0x1d59e, 1, { 0x79, 0 } },
+ { 0x1d59f, 1, { 0x7a, 0 } },
+ { 0x1d5a0, 1, { 0x61, 0 } },
+ { 0x1d5a1, 1, { 0x62, 0 } },
+ { 0x1d5a2, 1, { 0x63, 0 } },
+ { 0x1d5a3, 1, { 0x64, 0 } },
+ { 0x1d5a4, 1, { 0x65, 0 } },
+ { 0x1d5a5, 1, { 0x66, 0 } },
+ { 0x1d5a6, 1, { 0x67, 0 } },
+ { 0x1d5a7, 1, { 0x68, 0 } },
+ { 0x1d5a8, 1, { 0x69, 0 } },
+ { 0x1d5a9, 1, { 0x6a, 0 } },
+ { 0x1d5aa, 1, { 0x6b, 0 } },
+ { 0x1d5ab, 1, { 0x6c, 0 } },
+ { 0x1d5ac, 1, { 0x6d, 0 } },
+ { 0x1d5ad, 1, { 0x6e, 0 } },
+ { 0x1d5ae, 1, { 0x6f, 0 } },
+ { 0x1d5af, 1, { 0x70, 0 } },
+ { 0x1d5b0, 1, { 0x71, 0 } },
+ { 0x1d5b1, 1, { 0x72, 0 } },
+ { 0x1d5b2, 1, { 0x73, 0 } },
+ { 0x1d5b3, 1, { 0x74, 0 } },
+ { 0x1d5b4, 1, { 0x75, 0 } },
+ { 0x1d5b5, 1, { 0x76, 0 } },
+ { 0x1d5b6, 1, { 0x77, 0 } },
+ { 0x1d5b7, 1, { 0x78, 0 } },
+ { 0x1d5b8, 1, { 0x79, 0 } },
+ { 0x1d5b9, 1, { 0x7a, 0 } },
+ { 0x1d5ba, 1, { 0x61, 0 } },
+ { 0x1d5bb, 1, { 0x62, 0 } },
+ { 0x1d5bc, 1, { 0x63, 0 } },
+ { 0x1d5bd, 1, { 0x64, 0 } },
+ { 0x1d5be, 1, { 0x65, 0 } },
+ { 0x1d5bf, 1, { 0x66, 0 } },
+ { 0x1d5c0, 1, { 0x67, 0 } },
+ { 0x1d5c1, 1, { 0x68, 0 } },
+ { 0x1d5c2, 1, { 0x69, 0 } },
+ { 0x1d5c3, 1, { 0x6a, 0 } },
+ { 0x1d5c4, 1, { 0x6b, 0 } },
+ { 0x1d5c5, 1, { 0x6c, 0 } },
+ { 0x1d5c6, 1, { 0x6d, 0 } },
+ { 0x1d5c7, 1, { 0x6e, 0 } },
+ { 0x1d5c8, 1, { 0x6f, 0 } },
+ { 0x1d5c9, 1, { 0x70, 0 } },
+ { 0x1d5ca, 1, { 0x71, 0 } },
+ { 0x1d5cb, 1, { 0x72, 0 } },
+ { 0x1d5cc, 1, { 0x73, 0 } },
+ { 0x1d5cd, 1, { 0x74, 0 } },
+ { 0x1d5ce, 1, { 0x75, 0 } },
+ { 0x1d5cf, 1, { 0x76, 0 } },
+ { 0x1d5d0, 1, { 0x77, 0 } },
+ { 0x1d5d1, 1, { 0x78, 0 } },
+ { 0x1d5d2, 1, { 0x79, 0 } },
+ { 0x1d5d3, 1, { 0x7a, 0 } },
+ { 0x1d5d4, 1, { 0x61, 0 } },
+ { 0x1d5d5, 1, { 0x62, 0 } },
+ { 0x1d5d6, 1, { 0x63, 0 } },
+ { 0x1d5d7, 1, { 0x64, 0 } },
+ { 0x1d5d8, 1, { 0x65, 0 } },
+ { 0x1d5d9, 1, { 0x66, 0 } },
+ { 0x1d5da, 1, { 0x67, 0 } },
+ { 0x1d5db, 1, { 0x68, 0 } },
+ { 0x1d5dc, 1, { 0x69, 0 } },
+ { 0x1d5dd, 1, { 0x6a, 0 } },
+ { 0x1d5de, 1, { 0x6b, 0 } },
+ { 0x1d5df, 1, { 0x6c, 0 } },
+ { 0x1d5e0, 1, { 0x6d, 0 } },
+ { 0x1d5e1, 1, { 0x6e, 0 } },
+ { 0x1d5e2, 1, { 0x6f, 0 } },
+ { 0x1d5e3, 1, { 0x70, 0 } },
+ { 0x1d5e4, 1, { 0x71, 0 } },
+ { 0x1d5e5, 1, { 0x72, 0 } },
+ { 0x1d5e6, 1, { 0x73, 0 } },
+ { 0x1d5e7, 1, { 0x74, 0 } },
+ { 0x1d5e8, 1, { 0x75, 0 } },
+ { 0x1d5e9, 1, { 0x76, 0 } },
+ { 0x1d5ea, 1, { 0x77, 0 } },
+ { 0x1d5eb, 1, { 0x78, 0 } },
+ { 0x1d5ec, 1, { 0x79, 0 } },
+ { 0x1d5ed, 1, { 0x7a, 0 } },
+ { 0x1d5ee, 1, { 0x61, 0 } },
+ { 0x1d5ef, 1, { 0x62, 0 } },
+ { 0x1d5f0, 1, { 0x63, 0 } },
+ { 0x1d5f1, 1, { 0x64, 0 } },
+ { 0x1d5f2, 1, { 0x65, 0 } },
+ { 0x1d5f3, 1, { 0x66, 0 } },
+ { 0x1d5f4, 1, { 0x67, 0 } },
+ { 0x1d5f5, 1, { 0x68, 0 } },
+ { 0x1d5f6, 1, { 0x69, 0 } },
+ { 0x1d5f7, 1, { 0x6a, 0 } },
+ { 0x1d5f8, 1, { 0x6b, 0 } },
+ { 0x1d5f9, 1, { 0x6c, 0 } },
+ { 0x1d5fa, 1, { 0x6d, 0 } },
+ { 0x1d5fb, 1, { 0x6e, 0 } },
+ { 0x1d5fc, 1, { 0x6f, 0 } },
+ { 0x1d5fd, 1, { 0x70, 0 } },
+ { 0x1d5fe, 1, { 0x71, 0 } },
+ { 0x1d5ff, 1, { 0x72, 0 } },
+ { 0x1d600, 1, { 0x73, 0 } },
+ { 0x1d601, 1, { 0x74, 0 } },
+ { 0x1d602, 1, { 0x75, 0 } },
+ { 0x1d603, 1, { 0x76, 0 } },
+ { 0x1d604, 1, { 0x77, 0 } },
+ { 0x1d605, 1, { 0x78, 0 } },
+ { 0x1d606, 1, { 0x79, 0 } },
+ { 0x1d607, 1, { 0x7a, 0 } },
+ { 0x1d608, 1, { 0x61, 0 } },
+ { 0x1d609, 1, { 0x62, 0 } },
+ { 0x1d60a, 1, { 0x63, 0 } },
+ { 0x1d60b, 1, { 0x64, 0 } },
+ { 0x1d60c, 1, { 0x65, 0 } },
+ { 0x1d60d, 1, { 0x66, 0 } },
+ { 0x1d60e, 1, { 0x67, 0 } },
+ { 0x1d60f, 1, { 0x68, 0 } },
+ { 0x1d610, 1, { 0x69, 0 } },
+ { 0x1d611, 1, { 0x6a, 0 } },
+ { 0x1d612, 1, { 0x6b, 0 } },
+ { 0x1d613, 1, { 0x6c, 0 } },
+ { 0x1d614, 1, { 0x6d, 0 } },
+ { 0x1d615, 1, { 0x6e, 0 } },
+ { 0x1d616, 1, { 0x6f, 0 } },
+ { 0x1d617, 1, { 0x70, 0 } },
+ { 0x1d618, 1, { 0x71, 0 } },
+ { 0x1d619, 1, { 0x72, 0 } },
+ { 0x1d61a, 1, { 0x73, 0 } },
+ { 0x1d61b, 1, { 0x74, 0 } },
+ { 0x1d61c, 1, { 0x75, 0 } },
+ { 0x1d61d, 1, { 0x76, 0 } },
+ { 0x1d61e, 1, { 0x77, 0 } },
+ { 0x1d61f, 1, { 0x78, 0 } },
+ { 0x1d620, 1, { 0x79, 0 } },
+ { 0x1d621, 1, { 0x7a, 0 } },
+ { 0x1d622, 1, { 0x61, 0 } },
+ { 0x1d623, 1, { 0x62, 0 } },
+ { 0x1d624, 1, { 0x63, 0 } },
+ { 0x1d625, 1, { 0x64, 0 } },
+ { 0x1d626, 1, { 0x65, 0 } },
+ { 0x1d627, 1, { 0x66, 0 } },
+ { 0x1d628, 1, { 0x67, 0 } },
+ { 0x1d629, 1, { 0x68, 0 } },
+ { 0x1d62a, 1, { 0x69, 0 } },
+ { 0x1d62b, 1, { 0x6a, 0 } },
+ { 0x1d62c, 1, { 0x6b, 0 } },
+ { 0x1d62d, 1, { 0x6c, 0 } },
+ { 0x1d62e, 1, { 0x6d, 0 } },
+ { 0x1d62f, 1, { 0x6e, 0 } },
+ { 0x1d630, 1, { 0x6f, 0 } },
+ { 0x1d631, 1, { 0x70, 0 } },
+ { 0x1d632, 1, { 0x71, 0 } },
+ { 0x1d633, 1, { 0x72, 0 } },
+ { 0x1d634, 1, { 0x73, 0 } },
+ { 0x1d635, 1, { 0x74, 0 } },
+ { 0x1d636, 1, { 0x75, 0 } },
+ { 0x1d637, 1, { 0x76, 0 } },
+ { 0x1d638, 1, { 0x77, 0 } },
+ { 0x1d639, 1, { 0x78, 0 } },
+ { 0x1d63a, 1, { 0x79, 0 } },
+ { 0x1d63b, 1, { 0x7a, 0 } },
+ { 0x1d63c, 1, { 0x61, 0 } },
+ { 0x1d63d, 1, { 0x62, 0 } },
+ { 0x1d63e, 1, { 0x63, 0 } },
+ { 0x1d63f, 1, { 0x64, 0 } },
+ { 0x1d640, 1, { 0x65, 0 } },
+ { 0x1d641, 1, { 0x66, 0 } },
+ { 0x1d642, 1, { 0x67, 0 } },
+ { 0x1d643, 1, { 0x68, 0 } },
+ { 0x1d644, 1, { 0x69, 0 } },
+ { 0x1d645, 1, { 0x6a, 0 } },
+ { 0x1d646, 1, { 0x6b, 0 } },
+ { 0x1d647, 1, { 0x6c, 0 } },
+ { 0x1d648, 1, { 0x6d, 0 } },
+ { 0x1d649, 1, { 0x6e, 0 } },
+ { 0x1d64a, 1, { 0x6f, 0 } },
+ { 0x1d64b, 1, { 0x70, 0 } },
+ { 0x1d64c, 1, { 0x71, 0 } },
+ { 0x1d64d, 1, { 0x72, 0 } },
+ { 0x1d64e, 1, { 0x73, 0 } },
+ { 0x1d64f, 1, { 0x74, 0 } },
+ { 0x1d650, 1, { 0x75, 0 } },
+ { 0x1d651, 1, { 0x76, 0 } },
+ { 0x1d652, 1, { 0x77, 0 } },
+ { 0x1d653, 1, { 0x78, 0 } },
+ { 0x1d654, 1, { 0x79, 0 } },
+ { 0x1d655, 1, { 0x7a, 0 } },
+ { 0x1d656, 1, { 0x61, 0 } },
+ { 0x1d657, 1, { 0x62, 0 } },
+ { 0x1d658, 1, { 0x63, 0 } },
+ { 0x1d659, 1, { 0x64, 0 } },
+ { 0x1d65a, 1, { 0x65, 0 } },
+ { 0x1d65b, 1, { 0x66, 0 } },
+ { 0x1d65c, 1, { 0x67, 0 } },
+ { 0x1d65d, 1, { 0x68, 0 } },
+ { 0x1d65e, 1, { 0x69, 0 } },
+ { 0x1d65f, 1, { 0x6a, 0 } },
+ { 0x1d660, 1, { 0x6b, 0 } },
+ { 0x1d661, 1, { 0x6c, 0 } },
+ { 0x1d662, 1, { 0x6d, 0 } },
+ { 0x1d663, 1, { 0x6e, 0 } },
+ { 0x1d664, 1, { 0x6f, 0 } },
+ { 0x1d665, 1, { 0x70, 0 } },
+ { 0x1d666, 1, { 0x71, 0 } },
+ { 0x1d667, 1, { 0x72, 0 } },
+ { 0x1d668, 1, { 0x73, 0 } },
+ { 0x1d669, 1, { 0x74, 0 } },
+ { 0x1d66a, 1, { 0x75, 0 } },
+ { 0x1d66b, 1, { 0x76, 0 } },
+ { 0x1d66c, 1, { 0x77, 0 } },
+ { 0x1d66d, 1, { 0x78, 0 } },
+ { 0x1d66e, 1, { 0x79, 0 } },
+ { 0x1d66f, 1, { 0x7a, 0 } },
+ { 0x1d670, 1, { 0x61, 0 } },
+ { 0x1d671, 1, { 0x62, 0 } },
+ { 0x1d672, 1, { 0x63, 0 } },
+ { 0x1d673, 1, { 0x64, 0 } },
+ { 0x1d674, 1, { 0x65, 0 } },
+ { 0x1d675, 1, { 0x66, 0 } },
+ { 0x1d676, 1, { 0x67, 0 } },
+ { 0x1d677, 1, { 0x68, 0 } },
+ { 0x1d678, 1, { 0x69, 0 } },
+ { 0x1d679, 1, { 0x6a, 0 } },
+ { 0x1d67a, 1, { 0x6b, 0 } },
+ { 0x1d67b, 1, { 0x6c, 0 } },
+ { 0x1d67c, 1, { 0x6d, 0 } },
+ { 0x1d67d, 1, { 0x6e, 0 } },
+ { 0x1d67e, 1, { 0x6f, 0 } },
+ { 0x1d67f, 1, { 0x70, 0 } },
+ { 0x1d680, 1, { 0x71, 0 } },
+ { 0x1d681, 1, { 0x72, 0 } },
+ { 0x1d682, 1, { 0x73, 0 } },
+ { 0x1d683, 1, { 0x74, 0 } },
+ { 0x1d684, 1, { 0x75, 0 } },
+ { 0x1d685, 1, { 0x76, 0 } },
+ { 0x1d686, 1, { 0x77, 0 } },
+ { 0x1d687, 1, { 0x78, 0 } },
+ { 0x1d688, 1, { 0x79, 0 } },
+ { 0x1d689, 1, { 0x7a, 0 } },
+ { 0x1d68a, 1, { 0x61, 0 } },
+ { 0x1d68b, 1, { 0x62, 0 } },
+ { 0x1d68c, 1, { 0x63, 0 } },
+ { 0x1d68d, 1, { 0x64, 0 } },
+ { 0x1d68e, 1, { 0x65, 0 } },
+ { 0x1d68f, 1, { 0x66, 0 } },
+ { 0x1d690, 1, { 0x67, 0 } },
+ { 0x1d691, 1, { 0x68, 0 } },
+ { 0x1d692, 1, { 0x69, 0 } },
+ { 0x1d693, 1, { 0x6a, 0 } },
+ { 0x1d694, 1, { 0x6b, 0 } },
+ { 0x1d695, 1, { 0x6c, 0 } },
+ { 0x1d696, 1, { 0x6d, 0 } },
+ { 0x1d697, 1, { 0x6e, 0 } },
+ { 0x1d698, 1, { 0x6f, 0 } },
+ { 0x1d699, 1, { 0x70, 0 } },
+ { 0x1d69a, 1, { 0x71, 0 } },
+ { 0x1d69b, 1, { 0x72, 0 } },
+ { 0x1d69c, 1, { 0x73, 0 } },
+ { 0x1d69d, 1, { 0x74, 0 } },
+ { 0x1d69e, 1, { 0x75, 0 } },
+ { 0x1d69f, 1, { 0x76, 0 } },
+ { 0x1d6a0, 1, { 0x77, 0 } },
+ { 0x1d6a1, 1, { 0x78, 0 } },
+ { 0x1d6a2, 1, { 0x79, 0 } },
+ { 0x1d6a3, 1, { 0x7a, 0 } },
+ { 0x1d6a4, 1, { 0x131, 0 } },
+ { 0x1d6a5, 1, { 0x237, 0 } },
+ { 0x1d6a8, 1, { 0x3b1, 0 } },
+ { 0x1d6a9, 1, { 0x3b2, 0 } },
+ { 0x1d6aa, 1, { 0x3b3, 0 } },
+ { 0x1d6ab, 1, { 0x3b4, 0 } },
+ { 0x1d6ac, 1, { 0x3b5, 0 } },
+ { 0x1d6ad, 1, { 0x3b6, 0 } },
+ { 0x1d6ae, 1, { 0x3b7, 0 } },
+ { 0x1d6af, 1, { 0x3b8, 0 } },
+ { 0x1d6b0, 1, { 0x3b9, 0 } },
+ { 0x1d6b1, 1, { 0x3ba, 0 } },
+ { 0x1d6b2, 1, { 0x3bb, 0 } },
+ { 0x1d6b3, 1, { 0x3bc, 0 } },
+ { 0x1d6b4, 1, { 0x3bd, 0 } },
+ { 0x1d6b5, 1, { 0x3be, 0 } },
+ { 0x1d6b6, 1, { 0x3bf, 0 } },
+ { 0x1d6b7, 1, { 0x3c0, 0 } },
+ { 0x1d6b8, 1, { 0x3c1, 0 } },
+ { 0x1d6b9, 1, { 0x3b8, 0 } },
+ { 0x1d6ba, 1, { 0x3c3, 0 } },
+ { 0x1d6bb, 1, { 0x3c4, 0 } },
+ { 0x1d6bc, 1, { 0x3c5, 0 } },
+ { 0x1d6bd, 1, { 0x3c6, 0 } },
+ { 0x1d6be, 1, { 0x3c7, 0 } },
+ { 0x1d6bf, 1, { 0x3c8, 0 } },
+ { 0x1d6c0, 1, { 0x3c9, 0 } },
+ { 0x1d6c1, 1, { 0x2207, 0 } },
+ { 0x1d6c2, 1, { 0x3b1, 0 } },
+ { 0x1d6c3, 1, { 0x3b2, 0 } },
+ { 0x1d6c4, 1, { 0x3b3, 0 } },
+ { 0x1d6c5, 1, { 0x3b4, 0 } },
+ { 0x1d6c6, 1, { 0x3b5, 0 } },
+ { 0x1d6c7, 1, { 0x3b6, 0 } },
+ { 0x1d6c8, 1, { 0x3b7, 0 } },
+ { 0x1d6c9, 1, { 0x3b8, 0 } },
+ { 0x1d6ca, 1, { 0x3b9, 0 } },
+ { 0x1d6cb, 1, { 0x3ba, 0 } },
+ { 0x1d6cc, 1, { 0x3bb, 0 } },
+ { 0x1d6cd, 1, { 0x3bc, 0 } },
+ { 0x1d6ce, 1, { 0x3bd, 0 } },
+ { 0x1d6cf, 1, { 0x3be, 0 } },
+ { 0x1d6d0, 1, { 0x3bf, 0 } },
+ { 0x1d6d1, 1, { 0x3c0, 0 } },
+ { 0x1d6d2, 1, { 0x3c1, 0 } },
+ { 0x1d6d3, 1, { 0x3c3, 0 } },
+ { 0x1d6d4, 1, { 0x3c3, 0 } },
+ { 0x1d6d5, 1, { 0x3c4, 0 } },
+ { 0x1d6d6, 1, { 0x3c5, 0 } },
+ { 0x1d6d7, 1, { 0x3c6, 0 } },
+ { 0x1d6d8, 1, { 0x3c7, 0 } },
+ { 0x1d6d9, 1, { 0x3c8, 0 } },
+ { 0x1d6da, 1, { 0x3c9, 0 } },
+ { 0x1d6db, 1, { 0x2202, 0 } },
+ { 0x1d6dc, 1, { 0x3b5, 0 } },
+ { 0x1d6dd, 1, { 0x3b8, 0 } },
+ { 0x1d6de, 1, { 0x3ba, 0 } },
+ { 0x1d6df, 1, { 0x3c6, 0 } },
+ { 0x1d6e0, 1, { 0x3c1, 0 } },
+ { 0x1d6e1, 1, { 0x3c0, 0 } },
+ { 0x1d6e2, 1, { 0x3b1, 0 } },
+ { 0x1d6e3, 1, { 0x3b2, 0 } },
+ { 0x1d6e4, 1, { 0x3b3, 0 } },
+ { 0x1d6e5, 1, { 0x3b4, 0 } },
+ { 0x1d6e6, 1, { 0x3b5, 0 } },
+ { 0x1d6e7, 1, { 0x3b6, 0 } },
+ { 0x1d6e8, 1, { 0x3b7, 0 } },
+ { 0x1d6e9, 1, { 0x3b8, 0 } },
+ { 0x1d6ea, 1, { 0x3b9, 0 } },
+ { 0x1d6eb, 1, { 0x3ba, 0 } },
+ { 0x1d6ec, 1, { 0x3bb, 0 } },
+ { 0x1d6ed, 1, { 0x3bc, 0 } },
+ { 0x1d6ee, 1, { 0x3bd, 0 } },
+ { 0x1d6ef, 1, { 0x3be, 0 } },
+ { 0x1d6f0, 1, { 0x3bf, 0 } },
+ { 0x1d6f1, 1, { 0x3c0, 0 } },
+ { 0x1d6f2, 1, { 0x3c1, 0 } },
+ { 0x1d6f3, 1, { 0x3b8, 0 } },
+ { 0x1d6f4, 1, { 0x3c3, 0 } },
+ { 0x1d6f5, 1, { 0x3c4, 0 } },
+ { 0x1d6f6, 1, { 0x3c5, 0 } },
+ { 0x1d6f7, 1, { 0x3c6, 0 } },
+ { 0x1d6f8, 1, { 0x3c7, 0 } },
+ { 0x1d6f9, 1, { 0x3c8, 0 } },
+ { 0x1d6fa, 1, { 0x3c9, 0 } },
+ { 0x1d6fb, 1, { 0x2207, 0 } },
+ { 0x1d6fc, 1, { 0x3b1, 0 } },
+ { 0x1d6fd, 1, { 0x3b2, 0 } },
+ { 0x1d6fe, 1, { 0x3b3, 0 } },
+ { 0x1d6ff, 1, { 0x3b4, 0 } },
+ { 0x1d700, 1, { 0x3b5, 0 } },
+ { 0x1d701, 1, { 0x3b6, 0 } },
+ { 0x1d702, 1, { 0x3b7, 0 } },
+ { 0x1d703, 1, { 0x3b8, 0 } },
+ { 0x1d704, 1, { 0x3b9, 0 } },
+ { 0x1d705, 1, { 0x3ba, 0 } },
+ { 0x1d706, 1, { 0x3bb, 0 } },
+ { 0x1d707, 1, { 0x3bc, 0 } },
+ { 0x1d708, 1, { 0x3bd, 0 } },
+ { 0x1d709, 1, { 0x3be, 0 } },
+ { 0x1d70a, 1, { 0x3bf, 0 } },
+ { 0x1d70b, 1, { 0x3c0, 0 } },
+ { 0x1d70c, 1, { 0x3c1, 0 } },
+ { 0x1d70d, 1, { 0x3c3, 0 } },
+ { 0x1d70e, 1, { 0x3c3, 0 } },
+ { 0x1d70f, 1, { 0x3c4, 0 } },
+ { 0x1d710, 1, { 0x3c5, 0 } },
+ { 0x1d711, 1, { 0x3c6, 0 } },
+ { 0x1d712, 1, { 0x3c7, 0 } },
+ { 0x1d713, 1, { 0x3c8, 0 } },
+ { 0x1d714, 1, { 0x3c9, 0 } },
+ { 0x1d715, 1, { 0x2202, 0 } },
+ { 0x1d716, 1, { 0x3b5, 0 } },
+ { 0x1d717, 1, { 0x3b8, 0 } },
+ { 0x1d718, 1, { 0x3ba, 0 } },
+ { 0x1d719, 1, { 0x3c6, 0 } },
+ { 0x1d71a, 1, { 0x3c1, 0 } },
+ { 0x1d71b, 1, { 0x3c0, 0 } },
+ { 0x1d71c, 1, { 0x3b1, 0 } },
+ { 0x1d71d, 1, { 0x3b2, 0 } },
+ { 0x1d71e, 1, { 0x3b3, 0 } },
+ { 0x1d71f, 1, { 0x3b4, 0 } },
+ { 0x1d720, 1, { 0x3b5, 0 } },
+ { 0x1d721, 1, { 0x3b6, 0 } },
+ { 0x1d722, 1, { 0x3b7, 0 } },
+ { 0x1d723, 1, { 0x3b8, 0 } },
+ { 0x1d724, 1, { 0x3b9, 0 } },
+ { 0x1d725, 1, { 0x3ba, 0 } },
+ { 0x1d726, 1, { 0x3bb, 0 } },
+ { 0x1d727, 1, { 0x3bc, 0 } },
+ { 0x1d728, 1, { 0x3bd, 0 } },
+ { 0x1d729, 1, { 0x3be, 0 } },
+ { 0x1d72a, 1, { 0x3bf, 0 } },
+ { 0x1d72b, 1, { 0x3c0, 0 } },
+ { 0x1d72c, 1, { 0x3c1, 0 } },
+ { 0x1d72d, 1, { 0x3b8, 0 } },
+ { 0x1d72e, 1, { 0x3c3, 0 } },
+ { 0x1d72f, 1, { 0x3c4, 0 } },
+ { 0x1d730, 1, { 0x3c5, 0 } },
+ { 0x1d731, 1, { 0x3c6, 0 } },
+ { 0x1d732, 1, { 0x3c7, 0 } },
+ { 0x1d733, 1, { 0x3c8, 0 } },
+ { 0x1d734, 1, { 0x3c9, 0 } },
+ { 0x1d735, 1, { 0x2207, 0 } },
+ { 0x1d736, 1, { 0x3b1, 0 } },
+ { 0x1d737, 1, { 0x3b2, 0 } },
+ { 0x1d738, 1, { 0x3b3, 0 } },
+ { 0x1d739, 1, { 0x3b4, 0 } },
+ { 0x1d73a, 1, { 0x3b5, 0 } },
+ { 0x1d73b, 1, { 0x3b6, 0 } },
+ { 0x1d73c, 1, { 0x3b7, 0 } },
+ { 0x1d73d, 1, { 0x3b8, 0 } },
+ { 0x1d73e, 1, { 0x3b9, 0 } },
+ { 0x1d73f, 1, { 0x3ba, 0 } },
+ { 0x1d740, 1, { 0x3bb, 0 } },
+ { 0x1d741, 1, { 0x3bc, 0 } },
+ { 0x1d742, 1, { 0x3bd, 0 } },
+ { 0x1d743, 1, { 0x3be, 0 } },
+ { 0x1d744, 1, { 0x3bf, 0 } },
+ { 0x1d745, 1, { 0x3c0, 0 } },
+ { 0x1d746, 1, { 0x3c1, 0 } },
+ { 0x1d747, 1, { 0x3c3, 0 } },
+ { 0x1d748, 1, { 0x3c3, 0 } },
+ { 0x1d749, 1, { 0x3c4, 0 } },
+ { 0x1d74a, 1, { 0x3c5, 0 } },
+ { 0x1d74b, 1, { 0x3c6, 0 } },
+ { 0x1d74c, 1, { 0x3c7, 0 } },
+ { 0x1d74d, 1, { 0x3c8, 0 } },
+ { 0x1d74e, 1, { 0x3c9, 0 } },
+ { 0x1d74f, 1, { 0x2202, 0 } },
+ { 0x1d750, 1, { 0x3b5, 0 } },
+ { 0x1d751, 1, { 0x3b8, 0 } },
+ { 0x1d752, 1, { 0x3ba, 0 } },
+ { 0x1d753, 1, { 0x3c6, 0 } },
+ { 0x1d754, 1, { 0x3c1, 0 } },
+ { 0x1d755, 1, { 0x3c0, 0 } },
+ { 0x1d756, 1, { 0x3b1, 0 } },
+ { 0x1d757, 1, { 0x3b2, 0 } },
+ { 0x1d758, 1, { 0x3b3, 0 } },
+ { 0x1d759, 1, { 0x3b4, 0 } },
+ { 0x1d75a, 1, { 0x3b5, 0 } },
+ { 0x1d75b, 1, { 0x3b6, 0 } },
+ { 0x1d75c, 1, { 0x3b7, 0 } },
+ { 0x1d75d, 1, { 0x3b8, 0 } },
+ { 0x1d75e, 1, { 0x3b9, 0 } },
+ { 0x1d75f, 1, { 0x3ba, 0 } },
+ { 0x1d760, 1, { 0x3bb, 0 } },
+ { 0x1d761, 1, { 0x3bc, 0 } },
+ { 0x1d762, 1, { 0x3bd, 0 } },
+ { 0x1d763, 1, { 0x3be, 0 } },
+ { 0x1d764, 1, { 0x3bf, 0 } },
+ { 0x1d765, 1, { 0x3c0, 0 } },
+ { 0x1d766, 1, { 0x3c1, 0 } },
+ { 0x1d767, 1, { 0x3b8, 0 } },
+ { 0x1d768, 1, { 0x3c3, 0 } },
+ { 0x1d769, 1, { 0x3c4, 0 } },
+ { 0x1d76a, 1, { 0x3c5, 0 } },
+ { 0x1d76b, 1, { 0x3c6, 0 } },
+ { 0x1d76c, 1, { 0x3c7, 0 } },
+ { 0x1d76d, 1, { 0x3c8, 0 } },
+ { 0x1d76e, 1, { 0x3c9, 0 } },
+ { 0x1d76f, 1, { 0x2207, 0 } },
+ { 0x1d770, 1, { 0x3b1, 0 } },
+ { 0x1d771, 1, { 0x3b2, 0 } },
+ { 0x1d772, 1, { 0x3b3, 0 } },
+ { 0x1d773, 1, { 0x3b4, 0 } },
+ { 0x1d774, 1, { 0x3b5, 0 } },
+ { 0x1d775, 1, { 0x3b6, 0 } },
+ { 0x1d776, 1, { 0x3b7, 0 } },
+ { 0x1d777, 1, { 0x3b8, 0 } },
+ { 0x1d778, 1, { 0x3b9, 0 } },
+ { 0x1d779, 1, { 0x3ba, 0 } },
+ { 0x1d77a, 1, { 0x3bb, 0 } },
+ { 0x1d77b, 1, { 0x3bc, 0 } },
+ { 0x1d77c, 1, { 0x3bd, 0 } },
+ { 0x1d77d, 1, { 0x3be, 0 } },
+ { 0x1d77e, 1, { 0x3bf, 0 } },
+ { 0x1d77f, 1, { 0x3c0, 0 } },
+ { 0x1d780, 1, { 0x3c1, 0 } },
+ { 0x1d781, 1, { 0x3c3, 0 } },
+ { 0x1d782, 1, { 0x3c3, 0 } },
+ { 0x1d783, 1, { 0x3c4, 0 } },
+ { 0x1d784, 1, { 0x3c5, 0 } },
+ { 0x1d785, 1, { 0x3c6, 0 } },
+ { 0x1d786, 1, { 0x3c7, 0 } },
+ { 0x1d787, 1, { 0x3c8, 0 } },
+ { 0x1d788, 1, { 0x3c9, 0 } },
+ { 0x1d789, 1, { 0x2202, 0 } },
+ { 0x1d78a, 1, { 0x3b5, 0 } },
+ { 0x1d78b, 1, { 0x3b8, 0 } },
+ { 0x1d78c, 1, { 0x3ba, 0 } },
+ { 0x1d78d, 1, { 0x3c6, 0 } },
+ { 0x1d78e, 1, { 0x3c1, 0 } },
+ { 0x1d78f, 1, { 0x3c0, 0 } },
+ { 0x1d790, 1, { 0x3b1, 0 } },
+ { 0x1d791, 1, { 0x3b2, 0 } },
+ { 0x1d792, 1, { 0x3b3, 0 } },
+ { 0x1d793, 1, { 0x3b4, 0 } },
+ { 0x1d794, 1, { 0x3b5, 0 } },
+ { 0x1d795, 1, { 0x3b6, 0 } },
+ { 0x1d796, 1, { 0x3b7, 0 } },
+ { 0x1d797, 1, { 0x3b8, 0 } },
+ { 0x1d798, 1, { 0x3b9, 0 } },
+ { 0x1d799, 1, { 0x3ba, 0 } },
+ { 0x1d79a, 1, { 0x3bb, 0 } },
+ { 0x1d79b, 1, { 0x3bc, 0 } },
+ { 0x1d79c, 1, { 0x3bd, 0 } },
+ { 0x1d79d, 1, { 0x3be, 0 } },
+ { 0x1d79e, 1, { 0x3bf, 0 } },
+ { 0x1d79f, 1, { 0x3c0, 0 } },
+ { 0x1d7a0, 1, { 0x3c1, 0 } },
+ { 0x1d7a1, 1, { 0x3b8, 0 } },
+ { 0x1d7a2, 1, { 0x3c3, 0 } },
+ { 0x1d7a3, 1, { 0x3c4, 0 } },
+ { 0x1d7a4, 1, { 0x3c5, 0 } },
+ { 0x1d7a5, 1, { 0x3c6, 0 } },
+ { 0x1d7a6, 1, { 0x3c7, 0 } },
+ { 0x1d7a7, 1, { 0x3c8, 0 } },
+ { 0x1d7a8, 1, { 0x3c9, 0 } },
+ { 0x1d7a9, 1, { 0x2207, 0 } },
+ { 0x1d7aa, 1, { 0x3b1, 0 } },
+ { 0x1d7ab, 1, { 0x3b2, 0 } },
+ { 0x1d7ac, 1, { 0x3b3, 0 } },
+ { 0x1d7ad, 1, { 0x3b4, 0 } },
+ { 0x1d7ae, 1, { 0x3b5, 0 } },
+ { 0x1d7af, 1, { 0x3b6, 0 } },
+ { 0x1d7b0, 1, { 0x3b7, 0 } },
+ { 0x1d7b1, 1, { 0x3b8, 0 } },
+ { 0x1d7b2, 1, { 0x3b9, 0 } },
+ { 0x1d7b3, 1, { 0x3ba, 0 } },
+ { 0x1d7b4, 1, { 0x3bb, 0 } },
+ { 0x1d7b5, 1, { 0x3bc, 0 } },
+ { 0x1d7b6, 1, { 0x3bd, 0 } },
+ { 0x1d7b7, 1, { 0x3be, 0 } },
+ { 0x1d7b8, 1, { 0x3bf, 0 } },
+ { 0x1d7b9, 1, { 0x3c0, 0 } },
+ { 0x1d7ba, 1, { 0x3c1, 0 } },
+ { 0x1d7bb, 1, { 0x3c3, 0 } },
+ { 0x1d7bc, 1, { 0x3c3, 0 } },
+ { 0x1d7bd, 1, { 0x3c4, 0 } },
+ { 0x1d7be, 1, { 0x3c5, 0 } },
+ { 0x1d7bf, 1, { 0x3c6, 0 } },
+ { 0x1d7c0, 1, { 0x3c7, 0 } },
+ { 0x1d7c1, 1, { 0x3c8, 0 } },
+ { 0x1d7c2, 1, { 0x3c9, 0 } },
+ { 0x1d7c3, 1, { 0x2202, 0 } },
+ { 0x1d7c4, 1, { 0x3b5, 0 } },
+ { 0x1d7c5, 1, { 0x3b8, 0 } },
+ { 0x1d7c6, 1, { 0x3ba, 0 } },
+ { 0x1d7c7, 1, { 0x3c6, 0 } },
+ { 0x1d7c8, 1, { 0x3c1, 0 } },
+ { 0x1d7c9, 1, { 0x3c0, 0 } },
+ { 0x1d7ca, 1, { 0x3dd, 0 } },
+ { 0x1d7cb, 1, { 0x3dd, 0 } },
+ { 0x1d7ce, 1, { 0x30, 0 } },
+ { 0x1d7cf, 1, { 0x31, 0 } },
+ { 0x1d7d0, 1, { 0x32, 0 } },
+ { 0x1d7d1, 1, { 0x33, 0 } },
+ { 0x1d7d2, 1, { 0x34, 0 } },
+ { 0x1d7d3, 1, { 0x35, 0 } },
+ { 0x1d7d4, 1, { 0x36, 0 } },
+ { 0x1d7d5, 1, { 0x37, 0 } },
+ { 0x1d7d6, 1, { 0x38, 0 } },
+ { 0x1d7d7, 1, { 0x39, 0 } },
+ { 0x1d7d8, 1, { 0x30, 0 } },
+ { 0x1d7d9, 1, { 0x31, 0 } },
+ { 0x1d7da, 1, { 0x32, 0 } },
+ { 0x1d7db, 1, { 0x33, 0 } },
+ { 0x1d7dc, 1, { 0x34, 0 } },
+ { 0x1d7dd, 1, { 0x35, 0 } },
+ { 0x1d7de, 1, { 0x36, 0 } },
+ { 0x1d7df, 1, { 0x37, 0 } },
+ { 0x1d7e0, 1, { 0x38, 0 } },
+ { 0x1d7e1, 1, { 0x39, 0 } },
+ { 0x1d7e2, 1, { 0x30, 0 } },
+ { 0x1d7e3, 1, { 0x31, 0 } },
+ { 0x1d7e4, 1, { 0x32, 0 } },
+ { 0x1d7e5, 1, { 0x33, 0 } },
+ { 0x1d7e6, 1, { 0x34, 0 } },
+ { 0x1d7e7, 1, { 0x35, 0 } },
+ { 0x1d7e8, 1, { 0x36, 0 } },
+ { 0x1d7e9, 1, { 0x37, 0 } },
+ { 0x1d7ea, 1, { 0x38, 0 } },
+ { 0x1d7eb, 1, { 0x39, 0 } },
+ { 0x1d7ec, 1, { 0x30, 0 } },
+ { 0x1d7ed, 1, { 0x31, 0 } },
+ { 0x1d7ee, 1, { 0x32, 0 } },
+ { 0x1d7ef, 1, { 0x33, 0 } },
+ { 0x1d7f0, 1, { 0x34, 0 } },
+ { 0x1d7f1, 1, { 0x35, 0 } },
+ { 0x1d7f2, 1, { 0x36, 0 } },
+ { 0x1d7f3, 1, { 0x37, 0 } },
+ { 0x1d7f4, 1, { 0x38, 0 } },
+ { 0x1d7f5, 1, { 0x39, 0 } },
+ { 0x1d7f6, 1, { 0x30, 0 } },
+ { 0x1d7f7, 1, { 0x31, 0 } },
+ { 0x1d7f8, 1, { 0x32, 0 } },
+ { 0x1d7f9, 1, { 0x33, 0 } },
+ { 0x1d7fa, 1, { 0x34, 0 } },
+ { 0x1d7fb, 1, { 0x35, 0 } },
+ { 0x1d7fc, 1, { 0x36, 0 } },
+ { 0x1d7fd, 1, { 0x37, 0 } },
+ { 0x1d7fe, 1, { 0x38, 0 } },
+ { 0x1d7ff, 1, { 0x39, 0 } },
+ { 0x1e030, 1, { 0x430, 0 } },
+ { 0x1e031, 1, { 0x431, 0 } },
+ { 0x1e032, 1, { 0x432, 0 } },
+ { 0x1e033, 1, { 0x433, 0 } },
+ { 0x1e034, 1, { 0x434, 0 } },
+ { 0x1e035, 1, { 0x435, 0 } },
+ { 0x1e036, 1, { 0x436, 0 } },
+ { 0x1e037, 1, { 0x437, 0 } },
+ { 0x1e038, 1, { 0x438, 0 } },
+ { 0x1e039, 1, { 0x43a, 0 } },
+ { 0x1e03a, 1, { 0x43b, 0 } },
+ { 0x1e03b, 1, { 0x43c, 0 } },
+ { 0x1e03c, 1, { 0x43e, 0 } },
+ { 0x1e03d, 1, { 0x43f, 0 } },
+ { 0x1e03e, 1, { 0x440, 0 } },
+ { 0x1e03f, 1, { 0x441, 0 } },
+ { 0x1e040, 1, { 0x442, 0 } },
+ { 0x1e041, 1, { 0x443, 0 } },
+ { 0x1e042, 1, { 0x444, 0 } },
+ { 0x1e043, 1, { 0x445, 0 } },
+ { 0x1e044, 1, { 0x446, 0 } },
+ { 0x1e045, 1, { 0x447, 0 } },
+ { 0x1e046, 1, { 0x448, 0 } },
+ { 0x1e047, 1, { 0x44b, 0 } },
+ { 0x1e048, 1, { 0x44d, 0 } },
+ { 0x1e049, 1, { 0x44e, 0 } },
+ { 0x1e04a, 1, { 0xa689, 0 } },
+ { 0x1e04b, 1, { 0x4d9, 0 } },
+ { 0x1e04c, 1, { 0x456, 0 } },
+ { 0x1e04d, 1, { 0x458, 0 } },
+ { 0x1e04e, 1, { 0x4e9, 0 } },
+ { 0x1e04f, 1, { 0x4af, 0 } },
+ { 0x1e050, 1, { 0x4cf, 0 } },
+ { 0x1e051, 1, { 0x430, 0 } },
+ { 0x1e052, 1, { 0x431, 0 } },
+ { 0x1e053, 1, { 0x432, 0 } },
+ { 0x1e054, 1, { 0x433, 0 } },
+ { 0x1e055, 1, { 0x434, 0 } },
+ { 0x1e056, 1, { 0x435, 0 } },
+ { 0x1e057, 1, { 0x436, 0 } },
+ { 0x1e058, 1, { 0x437, 0 } },
+ { 0x1e059, 1, { 0x438, 0 } },
+ { 0x1e05a, 1, { 0x43a, 0 } },
+ { 0x1e05b, 1, { 0x43b, 0 } },
+ { 0x1e05c, 1, { 0x43e, 0 } },
+ { 0x1e05d, 1, { 0x43f, 0 } },
+ { 0x1e05e, 1, { 0x441, 0 } },
+ { 0x1e05f, 1, { 0x443, 0 } },
+ { 0x1e060, 1, { 0x444, 0 } },
+ { 0x1e061, 1, { 0x445, 0 } },
+ { 0x1e062, 1, { 0x446, 0 } },
+ { 0x1e063, 1, { 0x447, 0 } },
+ { 0x1e064, 1, { 0x448, 0 } },
+ { 0x1e065, 1, { 0x44a, 0 } },
+ { 0x1e066, 1, { 0x44b, 0 } },
+ { 0x1e067, 1, { 0x491, 0 } },
+ { 0x1e068, 1, { 0x456, 0 } },
+ { 0x1e069, 1, { 0x455, 0 } },
+ { 0x1e06a, 1, { 0x45f, 0 } },
+ { 0x1e06b, 1, { 0x4ab, 0 } },
+ { 0x1e06c, 1, { 0xa651, 0 } },
+ { 0x1e06d, 1, { 0x4b1, 0 } },
+ { 0x1e900, 2, { 0xd83a, 0xdd22 } },
+ { 0x1e901, 2, { 0xd83a, 0xdd23 } },
+ { 0x1e902, 2, { 0xd83a, 0xdd24 } },
+ { 0x1e903, 2, { 0xd83a, 0xdd25 } },
+ { 0x1e904, 2, { 0xd83a, 0xdd26 } },
+ { 0x1e905, 2, { 0xd83a, 0xdd27 } },
+ { 0x1e906, 2, { 0xd83a, 0xdd28 } },
+ { 0x1e907, 2, { 0xd83a, 0xdd29 } },
+ { 0x1e908, 2, { 0xd83a, 0xdd2a } },
+ { 0x1e909, 2, { 0xd83a, 0xdd2b } },
+ { 0x1e90a, 2, { 0xd83a, 0xdd2c } },
+ { 0x1e90b, 2, { 0xd83a, 0xdd2d } },
+ { 0x1e90c, 2, { 0xd83a, 0xdd2e } },
+ { 0x1e90d, 2, { 0xd83a, 0xdd2f } },
+ { 0x1e90e, 2, { 0xd83a, 0xdd30 } },
+ { 0x1e90f, 2, { 0xd83a, 0xdd31 } },
+ { 0x1e910, 2, { 0xd83a, 0xdd32 } },
+ { 0x1e911, 2, { 0xd83a, 0xdd33 } },
+ { 0x1e912, 2, { 0xd83a, 0xdd34 } },
+ { 0x1e913, 2, { 0xd83a, 0xdd35 } },
+ { 0x1e914, 2, { 0xd83a, 0xdd36 } },
+ { 0x1e915, 2, { 0xd83a, 0xdd37 } },
+ { 0x1e916, 2, { 0xd83a, 0xdd38 } },
+ { 0x1e917, 2, { 0xd83a, 0xdd39 } },
+ { 0x1e918, 2, { 0xd83a, 0xdd3a } },
+ { 0x1e919, 2, { 0xd83a, 0xdd3b } },
+ { 0x1e91a, 2, { 0xd83a, 0xdd3c } },
+ { 0x1e91b, 2, { 0xd83a, 0xdd3d } },
+ { 0x1e91c, 2, { 0xd83a, 0xdd3e } },
+ { 0x1e91d, 2, { 0xd83a, 0xdd3f } },
+ { 0x1e91e, 2, { 0xd83a, 0xdd40 } },
+ { 0x1e91f, 2, { 0xd83a, 0xdd41 } },
+ { 0x1e920, 2, { 0xd83a, 0xdd42 } },
+ { 0x1e921, 2, { 0xd83a, 0xdd43 } },
+ { 0x1ee00, 1, { 0x627, 0 } },
+ { 0x1ee01, 1, { 0x628, 0 } },
+ { 0x1ee02, 1, { 0x62c, 0 } },
+ { 0x1ee03, 1, { 0x62f, 0 } },
+ { 0x1ee05, 1, { 0x648, 0 } },
+ { 0x1ee06, 1, { 0x632, 0 } },
+ { 0x1ee07, 1, { 0x62d, 0 } },
+ { 0x1ee08, 1, { 0x637, 0 } },
+ { 0x1ee09, 1, { 0x64a, 0 } },
+ { 0x1ee0a, 1, { 0x643, 0 } },
+ { 0x1ee0b, 1, { 0x644, 0 } },
+ { 0x1ee0c, 1, { 0x645, 0 } },
+ { 0x1ee0d, 1, { 0x646, 0 } },
+ { 0x1ee0e, 1, { 0x633, 0 } },
+ { 0x1ee0f, 1, { 0x639, 0 } },
+ { 0x1ee10, 1, { 0x641, 0 } },
+ { 0x1ee11, 1, { 0x635, 0 } },
+ { 0x1ee12, 1, { 0x642, 0 } },
+ { 0x1ee13, 1, { 0x631, 0 } },
+ { 0x1ee14, 1, { 0x634, 0 } },
+ { 0x1ee15, 1, { 0x62a, 0 } },
+ { 0x1ee16, 1, { 0x62b, 0 } },
+ { 0x1ee17, 1, { 0x62e, 0 } },
+ { 0x1ee18, 1, { 0x630, 0 } },
+ { 0x1ee19, 1, { 0x636, 0 } },
+ { 0x1ee1a, 1, { 0x638, 0 } },
+ { 0x1ee1b, 1, { 0x63a, 0 } },
+ { 0x1ee1c, 1, { 0x66e, 0 } },
+ { 0x1ee1d, 1, { 0x6ba, 0 } },
+ { 0x1ee1e, 1, { 0x6a1, 0 } },
+ { 0x1ee1f, 1, { 0x66f, 0 } },
+ { 0x1ee21, 1, { 0x628, 0 } },
+ { 0x1ee22, 1, { 0x62c, 0 } },
+ { 0x1ee24, 1, { 0x647, 0 } },
+ { 0x1ee27, 1, { 0x62d, 0 } },
+ { 0x1ee29, 1, { 0x64a, 0 } },
+ { 0x1ee2a, 1, { 0x643, 0 } },
+ { 0x1ee2b, 1, { 0x644, 0 } },
+ { 0x1ee2c, 1, { 0x645, 0 } },
+ { 0x1ee2d, 1, { 0x646, 0 } },
+ { 0x1ee2e, 1, { 0x633, 0 } },
+ { 0x1ee2f, 1, { 0x639, 0 } },
+ { 0x1ee30, 1, { 0x641, 0 } },
+ { 0x1ee31, 1, { 0x635, 0 } },
+ { 0x1ee32, 1, { 0x642, 0 } },
+ { 0x1ee34, 1, { 0x634, 0 } },
+ { 0x1ee35, 1, { 0x62a, 0 } },
+ { 0x1ee36, 1, { 0x62b, 0 } },
+ { 0x1ee37, 1, { 0x62e, 0 } },
+ { 0x1ee39, 1, { 0x636, 0 } },
+ { 0x1ee3b, 1, { 0x63a, 0 } },
+ { 0x1ee42, 1, { 0x62c, 0 } },
+ { 0x1ee47, 1, { 0x62d, 0 } },
+ { 0x1ee49, 1, { 0x64a, 0 } },
+ { 0x1ee4b, 1, { 0x644, 0 } },
+ { 0x1ee4d, 1, { 0x646, 0 } },
+ { 0x1ee4e, 1, { 0x633, 0 } },
+ { 0x1ee4f, 1, { 0x639, 0 } },
+ { 0x1ee51, 1, { 0x635, 0 } },
+ { 0x1ee52, 1, { 0x642, 0 } },
+ { 0x1ee54, 1, { 0x634, 0 } },
+ { 0x1ee57, 1, { 0x62e, 0 } },
+ { 0x1ee59, 1, { 0x636, 0 } },
+ { 0x1ee5b, 1, { 0x63a, 0 } },
+ { 0x1ee5d, 1, { 0x6ba, 0 } },
+ { 0x1ee5f, 1, { 0x66f, 0 } },
+ { 0x1ee61, 1, { 0x628, 0 } },
+ { 0x1ee62, 1, { 0x62c, 0 } },
+ { 0x1ee64, 1, { 0x647, 0 } },
+ { 0x1ee67, 1, { 0x62d, 0 } },
+ { 0x1ee68, 1, { 0x637, 0 } },
+ { 0x1ee69, 1, { 0x64a, 0 } },
+ { 0x1ee6a, 1, { 0x643, 0 } },
+ { 0x1ee6c, 1, { 0x645, 0 } },
+ { 0x1ee6d, 1, { 0x646, 0 } },
+ { 0x1ee6e, 1, { 0x633, 0 } },
+ { 0x1ee6f, 1, { 0x639, 0 } },
+ { 0x1ee70, 1, { 0x641, 0 } },
+ { 0x1ee71, 1, { 0x635, 0 } },
+ { 0x1ee72, 1, { 0x642, 0 } },
+ { 0x1ee74, 1, { 0x634, 0 } },
+ { 0x1ee75, 1, { 0x62a, 0 } },
+ { 0x1ee76, 1, { 0x62b, 0 } },
+ { 0x1ee77, 1, { 0x62e, 0 } },
+ { 0x1ee79, 1, { 0x636, 0 } },
+ { 0x1ee7a, 1, { 0x638, 0 } },
+ { 0x1ee7b, 1, { 0x63a, 0 } },
+ { 0x1ee7c, 1, { 0x66e, 0 } },
+ { 0x1ee7e, 1, { 0x6a1, 0 } },
+ { 0x1ee80, 1, { 0x627, 0 } },
+ { 0x1ee81, 1, { 0x628, 0 } },
+ { 0x1ee82, 1, { 0x62c, 0 } },
+ { 0x1ee83, 1, { 0x62f, 0 } },
+ { 0x1ee84, 1, { 0x647, 0 } },
+ { 0x1ee85, 1, { 0x648, 0 } },
+ { 0x1ee86, 1, { 0x632, 0 } },
+ { 0x1ee87, 1, { 0x62d, 0 } },
+ { 0x1ee88, 1, { 0x637, 0 } },
+ { 0x1ee89, 1, { 0x64a, 0 } },
+ { 0x1ee8b, 1, { 0x644, 0 } },
+ { 0x1ee8c, 1, { 0x645, 0 } },
+ { 0x1ee8d, 1, { 0x646, 0 } },
+ { 0x1ee8e, 1, { 0x633, 0 } },
+ { 0x1ee8f, 1, { 0x639, 0 } },
+ { 0x1ee90, 1, { 0x641, 0 } },
+ { 0x1ee91, 1, { 0x635, 0 } },
+ { 0x1ee92, 1, { 0x642, 0 } },
+ { 0x1ee93, 1, { 0x631, 0 } },
+ { 0x1ee94, 1, { 0x634, 0 } },
+ { 0x1ee95, 1, { 0x62a, 0 } },
+ { 0x1ee96, 1, { 0x62b, 0 } },
+ { 0x1ee97, 1, { 0x62e, 0 } },
+ { 0x1ee98, 1, { 0x630, 0 } },
+ { 0x1ee99, 1, { 0x636, 0 } },
+ { 0x1ee9a, 1, { 0x638, 0 } },
+ { 0x1ee9b, 1, { 0x63a, 0 } },
+ { 0x1eea1, 1, { 0x628, 0 } },
+ { 0x1eea2, 1, { 0x62c, 0 } },
+ { 0x1eea3, 1, { 0x62f, 0 } },
+ { 0x1eea5, 1, { 0x648, 0 } },
+ { 0x1eea6, 1, { 0x632, 0 } },
+ { 0x1eea7, 1, { 0x62d, 0 } },
+ { 0x1eea8, 1, { 0x637, 0 } },
+ { 0x1eea9, 1, { 0x64a, 0 } },
+ { 0x1eeab, 1, { 0x644, 0 } },
+ { 0x1eeac, 1, { 0x645, 0 } },
+ { 0x1eead, 1, { 0x646, 0 } },
+ { 0x1eeae, 1, { 0x633, 0 } },
+ { 0x1eeaf, 1, { 0x639, 0 } },
+ { 0x1eeb0, 1, { 0x641, 0 } },
+ { 0x1eeb1, 1, { 0x635, 0 } },
+ { 0x1eeb2, 1, { 0x642, 0 } },
+ { 0x1eeb3, 1, { 0x631, 0 } },
+ { 0x1eeb4, 1, { 0x634, 0 } },
+ { 0x1eeb5, 1, { 0x62a, 0 } },
+ { 0x1eeb6, 1, { 0x62b, 0 } },
+ { 0x1eeb7, 1, { 0x62e, 0 } },
+ { 0x1eeb8, 1, { 0x630, 0 } },
+ { 0x1eeb9, 1, { 0x636, 0 } },
+ { 0x1eeba, 1, { 0x638, 0 } },
+ { 0x1eebb, 1, { 0x63a, 0 } },
+ { 0x1f12a, 3, { 436, 0 } },
+ { 0x1f12b, 1, { 0x63, 0 } },
+ { 0x1f12c, 1, { 0x72, 0 } },
+ { 0x1f12d, 2, { 0x63, 0x64 } },
+ { 0x1f12e, 2, { 0x77, 0x7a } },
+ { 0x1f130, 1, { 0x61, 0 } },
+ { 0x1f131, 1, { 0x62, 0 } },
+ { 0x1f132, 1, { 0x63, 0 } },
+ { 0x1f133, 1, { 0x64, 0 } },
+ { 0x1f134, 1, { 0x65, 0 } },
+ { 0x1f135, 1, { 0x66, 0 } },
+ { 0x1f136, 1, { 0x67, 0 } },
+ { 0x1f137, 1, { 0x68, 0 } },
+ { 0x1f138, 1, { 0x69, 0 } },
+ { 0x1f139, 1, { 0x6a, 0 } },
+ { 0x1f13a, 1, { 0x6b, 0 } },
+ { 0x1f13b, 1, { 0x6c, 0 } },
+ { 0x1f13c, 1, { 0x6d, 0 } },
+ { 0x1f13d, 1, { 0x6e, 0 } },
+ { 0x1f13e, 1, { 0x6f, 0 } },
+ { 0x1f13f, 1, { 0x70, 0 } },
+ { 0x1f140, 1, { 0x71, 0 } },
+ { 0x1f141, 1, { 0x72, 0 } },
+ { 0x1f142, 1, { 0x73, 0 } },
+ { 0x1f143, 1, { 0x74, 0 } },
+ { 0x1f144, 1, { 0x75, 0 } },
+ { 0x1f145, 1, { 0x76, 0 } },
+ { 0x1f146, 1, { 0x77, 0 } },
+ { 0x1f147, 1, { 0x78, 0 } },
+ { 0x1f148, 1, { 0x79, 0 } },
+ { 0x1f149, 1, { 0x7a, 0 } },
+ { 0x1f14a, 2, { 0x68, 0x76 } },
+ { 0x1f14b, 2, { 0x6d, 0x76 } },
+ { 0x1f14c, 2, { 0x73, 0x64 } },
+ { 0x1f14d, 2, { 0x73, 0x73 } },
+ { 0x1f14e, 3, { 727, 0 } },
+ { 0x1f14f, 2, { 0x77, 0x63 } },
+ { 0x1f16a, 2, { 0x6d, 0x63 } },
+ { 0x1f16b, 2, { 0x6d, 0x64 } },
+ { 0x1f16c, 2, { 0x6d, 0x72 } },
+ { 0x1f190, 2, { 0x64, 0x6a } },
+ { 0x1f200, 2, { 0x307b, 0x304b } },
+ { 0x1f201, 2, { 0x30b3, 0x30b3 } },
+ { 0x1f202, 1, { 0x30b5, 0 } },
+ { 0x1f210, 1, { 0x624b, 0 } },
+ { 0x1f211, 1, { 0x5b57, 0 } },
+ { 0x1f212, 1, { 0x53cc, 0 } },
+ { 0x1f213, 1, { 0x30c7, 0 } },
+ { 0x1f214, 1, { 0x4e8c, 0 } },
+ { 0x1f215, 1, { 0x591a, 0 } },
+ { 0x1f216, 1, { 0x89e3, 0 } },
+ { 0x1f217, 1, { 0x5929, 0 } },
+ { 0x1f218, 1, { 0x4ea4, 0 } },
+ { 0x1f219, 1, { 0x6620, 0 } },
+ { 0x1f21a, 1, { 0x7121, 0 } },
+ { 0x1f21b, 1, { 0x6599, 0 } },
+ { 0x1f21c, 1, { 0x524d, 0 } },
+ { 0x1f21d, 1, { 0x5f8c, 0 } },
+ { 0x1f21e, 1, { 0x518d, 0 } },
+ { 0x1f21f, 1, { 0x65b0, 0 } },
+ { 0x1f220, 1, { 0x521d, 0 } },
+ { 0x1f221, 1, { 0x7d42, 0 } },
+ { 0x1f222, 1, { 0x751f, 0 } },
+ { 0x1f223, 1, { 0x8ca9, 0 } },
+ { 0x1f224, 1, { 0x58f0, 0 } },
+ { 0x1f225, 1, { 0x5439, 0 } },
+ { 0x1f226, 1, { 0x6f14, 0 } },
+ { 0x1f227, 1, { 0x6295, 0 } },
+ { 0x1f228, 1, { 0x6355, 0 } },
+ { 0x1f229, 1, { 0x4e00, 0 } },
+ { 0x1f22a, 1, { 0x4e09, 0 } },
+ { 0x1f22b, 1, { 0x904a, 0 } },
+ { 0x1f22c, 1, { 0x5de6, 0 } },
+ { 0x1f22d, 1, { 0x4e2d, 0 } },
+ { 0x1f22e, 1, { 0x53f3, 0 } },
+ { 0x1f22f, 1, { 0x6307, 0 } },
+ { 0x1f230, 1, { 0x8d70, 0 } },
+ { 0x1f231, 1, { 0x6253, 0 } },
+ { 0x1f232, 1, { 0x7981, 0 } },
+ { 0x1f233, 1, { 0x7a7a, 0 } },
+ { 0x1f234, 1, { 0x5408, 0 } },
+ { 0x1f235, 1, { 0x6e80, 0 } },
+ { 0x1f236, 1, { 0x6709, 0 } },
+ { 0x1f237, 1, { 0x6708, 0 } },
+ { 0x1f238, 1, { 0x7533, 0 } },
+ { 0x1f239, 1, { 0x5272, 0 } },
+ { 0x1f23a, 1, { 0x55b6, 0 } },
+ { 0x1f23b, 1, { 0x914d, 0 } },
+ { 0x1f240, 3, { 858, 0 } },
+ { 0x1f241, 3, { 855, 0 } },
+ { 0x1f242, 3, { 607, 0 } },
+ { 0x1f243, 3, { 764, 0 } },
+ { 0x1f244, 3, { 610, 0 } },
+ { 0x1f245, 3, { 137, 0 } },
+ { 0x1f246, 3, { 813, 0 } },
+ { 0x1f247, 3, { 810, 0 } },
+ { 0x1f248, 3, { 439, 0 } },
+ { 0x1f250, 1, { 0x5f97, 0 } },
+ { 0x1f251, 1, { 0x53ef, 0 } },
+ { 0x1fbf0, 1, { 0x30, 0 } },
+ { 0x1fbf1, 1, { 0x31, 0 } },
+ { 0x1fbf2, 1, { 0x32, 0 } },
+ { 0x1fbf3, 1, { 0x33, 0 } },
+ { 0x1fbf4, 1, { 0x34, 0 } },
+ { 0x1fbf5, 1, { 0x35, 0 } },
+ { 0x1fbf6, 1, { 0x36, 0 } },
+ { 0x1fbf7, 1, { 0x37, 0 } },
+ { 0x1fbf8, 1, { 0x38, 0 } },
+ { 0x1fbf9, 1, { 0x39, 0 } },
+ { 0x2f800, 1, { 0x4e3d, 0 } },
+ { 0x2f801, 1, { 0x4e38, 0 } },
+ { 0x2f802, 1, { 0x4e41, 0 } },
+ { 0x2f803, 2, { 0xd840, 0xdd22 } },
+ { 0x2f804, 1, { 0x4f60, 0 } },
+ { 0x2f805, 1, { 0x4fae, 0 } },
+ { 0x2f806, 1, { 0x4fbb, 0 } },
+ { 0x2f807, 1, { 0x5002, 0 } },
+ { 0x2f808, 1, { 0x507a, 0 } },
+ { 0x2f809, 1, { 0x5099, 0 } },
+ { 0x2f80a, 1, { 0x50e7, 0 } },
+ { 0x2f80b, 1, { 0x50cf, 0 } },
+ { 0x2f80c, 1, { 0x349e, 0 } },
+ { 0x2f80d, 2, { 0xd841, 0xde3a } },
+ { 0x2f80e, 1, { 0x514d, 0 } },
+ { 0x2f80f, 1, { 0x5154, 0 } },
+ { 0x2f810, 1, { 0x5164, 0 } },
+ { 0x2f811, 1, { 0x5177, 0 } },
+ { 0x2f812, 2, { 0xd841, 0xdd1c } },
+ { 0x2f813, 1, { 0x34b9, 0 } },
+ { 0x2f814, 1, { 0x5167, 0 } },
+ { 0x2f815, 1, { 0x518d, 0 } },
+ { 0x2f816, 2, { 0xd841, 0xdd4b } },
+ { 0x2f817, 1, { 0x5197, 0 } },
+ { 0x2f818, 1, { 0x51a4, 0 } },
+ { 0x2f819, 1, { 0x4ecc, 0 } },
+ { 0x2f81a, 1, { 0x51ac, 0 } },
+ { 0x2f81b, 1, { 0x51b5, 0 } },
+ { 0x2f81c, 2, { 0xd864, 0xdddf } },
+ { 0x2f81d, 1, { 0x51f5, 0 } },
+ { 0x2f81e, 1, { 0x5203, 0 } },
+ { 0x2f81f, 1, { 0x34df, 0 } },
+ { 0x2f820, 1, { 0x523b, 0 } },
+ { 0x2f821, 1, { 0x5246, 0 } },
+ { 0x2f822, 1, { 0x5272, 0 } },
+ { 0x2f823, 1, { 0x5277, 0 } },
+ { 0x2f824, 1, { 0x3515, 0 } },
+ { 0x2f825, 1, { 0x52c7, 0 } },
+ { 0x2f826, 1, { 0x52c9, 0 } },
+ { 0x2f827, 1, { 0x52e4, 0 } },
+ { 0x2f828, 1, { 0x52fa, 0 } },
+ { 0x2f829, 1, { 0x5305, 0 } },
+ { 0x2f82a, 1, { 0x5306, 0 } },
+ { 0x2f82b, 1, { 0x5317, 0 } },
+ { 0x2f82c, 1, { 0x5349, 0 } },
+ { 0x2f82d, 1, { 0x5351, 0 } },
+ { 0x2f82e, 1, { 0x535a, 0 } },
+ { 0x2f82f, 1, { 0x5373, 0 } },
+ { 0x2f830, 1, { 0x537d, 0 } },
+ { 0x2f831, 1, { 0x537f, 0 } },
+ { 0x2f832, 1, { 0x537f, 0 } },
+ { 0x2f833, 1, { 0x537f, 0 } },
+ { 0x2f834, 2, { 0xd842, 0xde2c } },
+ { 0x2f835, 1, { 0x7070, 0 } },
+ { 0x2f836, 1, { 0x53ca, 0 } },
+ { 0x2f837, 1, { 0x53df, 0 } },
+ { 0x2f838, 2, { 0xd842, 0xdf63 } },
+ { 0x2f839, 1, { 0x53eb, 0 } },
+ { 0x2f83a, 1, { 0x53f1, 0 } },
+ { 0x2f83b, 1, { 0x5406, 0 } },
+ { 0x2f83c, 1, { 0x549e, 0 } },
+ { 0x2f83d, 1, { 0x5438, 0 } },
+ { 0x2f83e, 1, { 0x5448, 0 } },
+ { 0x2f83f, 1, { 0x5468, 0 } },
+ { 0x2f840, 1, { 0x54a2, 0 } },
+ { 0x2f841, 1, { 0x54f6, 0 } },
+ { 0x2f842, 1, { 0x5510, 0 } },
+ { 0x2f843, 1, { 0x5553, 0 } },
+ { 0x2f844, 1, { 0x5563, 0 } },
+ { 0x2f845, 1, { 0x5584, 0 } },
+ { 0x2f846, 1, { 0x5584, 0 } },
+ { 0x2f847, 1, { 0x5599, 0 } },
+ { 0x2f848, 1, { 0x55ab, 0 } },
+ { 0x2f849, 1, { 0x55b3, 0 } },
+ { 0x2f84a, 1, { 0x55c2, 0 } },
+ { 0x2f84b, 1, { 0x5716, 0 } },
+ { 0x2f84c, 1, { 0x5606, 0 } },
+ { 0x2f84d, 1, { 0x5717, 0 } },
+ { 0x2f84e, 1, { 0x5651, 0 } },
+ { 0x2f84f, 1, { 0x5674, 0 } },
+ { 0x2f850, 1, { 0x5207, 0 } },
+ { 0x2f851, 1, { 0x58ee, 0 } },
+ { 0x2f852, 1, { 0x57ce, 0 } },
+ { 0x2f853, 1, { 0x57f4, 0 } },
+ { 0x2f854, 1, { 0x580d, 0 } },
+ { 0x2f855, 1, { 0x578b, 0 } },
+ { 0x2f856, 1, { 0x5832, 0 } },
+ { 0x2f857, 1, { 0x5831, 0 } },
+ { 0x2f858, 1, { 0x58ac, 0 } },
+ { 0x2f859, 2, { 0xd845, 0xdce4 } },
+ { 0x2f85a, 1, { 0x58f2, 0 } },
+ { 0x2f85b, 1, { 0x58f7, 0 } },
+ { 0x2f85c, 1, { 0x5906, 0 } },
+ { 0x2f85d, 1, { 0x591a, 0 } },
+ { 0x2f85e, 1, { 0x5922, 0 } },
+ { 0x2f85f, 1, { 0x5962, 0 } },
+ { 0x2f860, 2, { 0xd845, 0xdea8 } },
+ { 0x2f861, 2, { 0xd845, 0xdeea } },
+ { 0x2f862, 1, { 0x59ec, 0 } },
+ { 0x2f863, 1, { 0x5a1b, 0 } },
+ { 0x2f864, 1, { 0x5a27, 0 } },
+ { 0x2f865, 1, { 0x59d8, 0 } },
+ { 0x2f866, 1, { 0x5a66, 0 } },
+ { 0x2f867, 1, { 0x36ee, 0 } },
+ { 0x2f869, 1, { 0x5b08, 0 } },
+ { 0x2f86a, 1, { 0x5b3e, 0 } },
+ { 0x2f86b, 1, { 0x5b3e, 0 } },
+ { 0x2f86c, 2, { 0xd846, 0xddc8 } },
+ { 0x2f86d, 1, { 0x5bc3, 0 } },
+ { 0x2f86e, 1, { 0x5bd8, 0 } },
+ { 0x2f86f, 1, { 0x5be7, 0 } },
+ { 0x2f870, 1, { 0x5bf3, 0 } },
+ { 0x2f871, 2, { 0xd846, 0xdf18 } },
+ { 0x2f872, 1, { 0x5bff, 0 } },
+ { 0x2f873, 1, { 0x5c06, 0 } },
+ { 0x2f875, 1, { 0x5c22, 0 } },
+ { 0x2f876, 1, { 0x3781, 0 } },
+ { 0x2f877, 1, { 0x5c60, 0 } },
+ { 0x2f878, 1, { 0x5c6e, 0 } },
+ { 0x2f879, 1, { 0x5cc0, 0 } },
+ { 0x2f87a, 1, { 0x5c8d, 0 } },
+ { 0x2f87b, 2, { 0xd847, 0xdde4 } },
+ { 0x2f87c, 1, { 0x5d43, 0 } },
+ { 0x2f87d, 2, { 0xd847, 0xdde6 } },
+ { 0x2f87e, 1, { 0x5d6e, 0 } },
+ { 0x2f87f, 1, { 0x5d6b, 0 } },
+ { 0x2f880, 1, { 0x5d7c, 0 } },
+ { 0x2f881, 1, { 0x5de1, 0 } },
+ { 0x2f882, 1, { 0x5de2, 0 } },
+ { 0x2f883, 1, { 0x382f, 0 } },
+ { 0x2f884, 1, { 0x5dfd, 0 } },
+ { 0x2f885, 1, { 0x5e28, 0 } },
+ { 0x2f886, 1, { 0x5e3d, 0 } },
+ { 0x2f887, 1, { 0x5e69, 0 } },
+ { 0x2f888, 1, { 0x3862, 0 } },
+ { 0x2f889, 2, { 0xd848, 0xdd83 } },
+ { 0x2f88a, 1, { 0x387c, 0 } },
+ { 0x2f88b, 1, { 0x5eb0, 0 } },
+ { 0x2f88c, 1, { 0x5eb3, 0 } },
+ { 0x2f88d, 1, { 0x5eb6, 0 } },
+ { 0x2f88e, 1, { 0x5eca, 0 } },
+ { 0x2f88f, 2, { 0xd868, 0xdf92 } },
+ { 0x2f890, 1, { 0x5efe, 0 } },
+ { 0x2f891, 2, { 0xd848, 0xdf31 } },
+ { 0x2f892, 2, { 0xd848, 0xdf31 } },
+ { 0x2f893, 1, { 0x8201, 0 } },
+ { 0x2f894, 1, { 0x5f22, 0 } },
+ { 0x2f895, 1, { 0x5f22, 0 } },
+ { 0x2f896, 1, { 0x38c7, 0 } },
+ { 0x2f897, 2, { 0xd84c, 0xdeb8 } },
+ { 0x2f898, 2, { 0xd858, 0xddda } },
+ { 0x2f899, 1, { 0x5f62, 0 } },
+ { 0x2f89a, 1, { 0x5f6b, 0 } },
+ { 0x2f89b, 1, { 0x38e3, 0 } },
+ { 0x2f89c, 1, { 0x5f9a, 0 } },
+ { 0x2f89d, 1, { 0x5fcd, 0 } },
+ { 0x2f89e, 1, { 0x5fd7, 0 } },
+ { 0x2f89f, 1, { 0x5ff9, 0 } },
+ { 0x2f8a0, 1, { 0x6081, 0 } },
+ { 0x2f8a1, 1, { 0x393a, 0 } },
+ { 0x2f8a2, 1, { 0x391c, 0 } },
+ { 0x2f8a3, 1, { 0x6094, 0 } },
+ { 0x2f8a4, 2, { 0xd849, 0xded4 } },
+ { 0x2f8a5, 1, { 0x60c7, 0 } },
+ { 0x2f8a6, 1, { 0x6148, 0 } },
+ { 0x2f8a7, 1, { 0x614c, 0 } },
+ { 0x2f8a8, 1, { 0x614e, 0 } },
+ { 0x2f8a9, 1, { 0x614c, 0 } },
+ { 0x2f8aa, 1, { 0x617a, 0 } },
+ { 0x2f8ab, 1, { 0x618e, 0 } },
+ { 0x2f8ac, 1, { 0x61b2, 0 } },
+ { 0x2f8ad, 1, { 0x61a4, 0 } },
+ { 0x2f8ae, 1, { 0x61af, 0 } },
+ { 0x2f8af, 1, { 0x61de, 0 } },
+ { 0x2f8b0, 1, { 0x61f2, 0 } },
+ { 0x2f8b1, 1, { 0x61f6, 0 } },
+ { 0x2f8b2, 1, { 0x6210, 0 } },
+ { 0x2f8b3, 1, { 0x621b, 0 } },
+ { 0x2f8b4, 1, { 0x625d, 0 } },
+ { 0x2f8b5, 1, { 0x62b1, 0 } },
+ { 0x2f8b6, 1, { 0x62d4, 0 } },
+ { 0x2f8b7, 1, { 0x6350, 0 } },
+ { 0x2f8b8, 2, { 0xd84a, 0xdf0c } },
+ { 0x2f8b9, 1, { 0x633d, 0 } },
+ { 0x2f8ba, 1, { 0x62fc, 0 } },
+ { 0x2f8bb, 1, { 0x6368, 0 } },
+ { 0x2f8bc, 1, { 0x6383, 0 } },
+ { 0x2f8bd, 1, { 0x63e4, 0 } },
+ { 0x2f8be, 2, { 0xd84a, 0xdff1 } },
+ { 0x2f8bf, 1, { 0x6422, 0 } },
+ { 0x2f8c0, 1, { 0x63c5, 0 } },
+ { 0x2f8c1, 1, { 0x63a9, 0 } },
+ { 0x2f8c2, 1, { 0x3a2e, 0 } },
+ { 0x2f8c3, 1, { 0x6469, 0 } },
+ { 0x2f8c4, 1, { 0x647e, 0 } },
+ { 0x2f8c5, 1, { 0x649d, 0 } },
+ { 0x2f8c6, 1, { 0x6477, 0 } },
+ { 0x2f8c7, 1, { 0x3a6c, 0 } },
+ { 0x2f8c8, 1, { 0x654f, 0 } },
+ { 0x2f8c9, 1, { 0x656c, 0 } },
+ { 0x2f8ca, 2, { 0xd84c, 0xdc0a } },
+ { 0x2f8cb, 1, { 0x65e3, 0 } },
+ { 0x2f8cc, 1, { 0x66f8, 0 } },
+ { 0x2f8cd, 1, { 0x6649, 0 } },
+ { 0x2f8ce, 1, { 0x3b19, 0 } },
+ { 0x2f8cf, 1, { 0x6691, 0 } },
+ { 0x2f8d0, 1, { 0x3b08, 0 } },
+ { 0x2f8d1, 1, { 0x3ae4, 0 } },
+ { 0x2f8d2, 1, { 0x5192, 0 } },
+ { 0x2f8d3, 1, { 0x5195, 0 } },
+ { 0x2f8d4, 1, { 0x6700, 0 } },
+ { 0x2f8d5, 1, { 0x669c, 0 } },
+ { 0x2f8d6, 1, { 0x80ad, 0 } },
+ { 0x2f8d7, 1, { 0x43d9, 0 } },
+ { 0x2f8d8, 1, { 0x6717, 0 } },
+ { 0x2f8d9, 1, { 0x671b, 0 } },
+ { 0x2f8da, 1, { 0x6721, 0 } },
+ { 0x2f8db, 1, { 0x675e, 0 } },
+ { 0x2f8dc, 1, { 0x6753, 0 } },
+ { 0x2f8dd, 2, { 0xd84c, 0xdfc3 } },
+ { 0x2f8de, 1, { 0x3b49, 0 } },
+ { 0x2f8df, 1, { 0x67fa, 0 } },
+ { 0x2f8e0, 1, { 0x6785, 0 } },
+ { 0x2f8e1, 1, { 0x6852, 0 } },
+ { 0x2f8e2, 1, { 0x6885, 0 } },
+ { 0x2f8e3, 2, { 0xd84d, 0xdc6d } },
+ { 0x2f8e4, 1, { 0x688e, 0 } },
+ { 0x2f8e5, 1, { 0x681f, 0 } },
+ { 0x2f8e6, 1, { 0x6914, 0 } },
+ { 0x2f8e7, 1, { 0x3b9d, 0 } },
+ { 0x2f8e8, 1, { 0x6942, 0 } },
+ { 0x2f8e9, 1, { 0x69a3, 0 } },
+ { 0x2f8ea, 1, { 0x69ea, 0 } },
+ { 0x2f8eb, 1, { 0x6aa8, 0 } },
+ { 0x2f8ec, 2, { 0xd84d, 0xdea3 } },
+ { 0x2f8ed, 1, { 0x6adb, 0 } },
+ { 0x2f8ee, 1, { 0x3c18, 0 } },
+ { 0x2f8ef, 1, { 0x6b21, 0 } },
+ { 0x2f8f0, 2, { 0xd84e, 0xdca7 } },
+ { 0x2f8f1, 1, { 0x6b54, 0 } },
+ { 0x2f8f2, 1, { 0x3c4e, 0 } },
+ { 0x2f8f3, 1, { 0x6b72, 0 } },
+ { 0x2f8f4, 1, { 0x6b9f, 0 } },
+ { 0x2f8f5, 1, { 0x6bba, 0 } },
+ { 0x2f8f6, 1, { 0x6bbb, 0 } },
+ { 0x2f8f7, 2, { 0xd84e, 0xde8d } },
+ { 0x2f8f8, 2, { 0xd847, 0xdd0b } },
+ { 0x2f8f9, 2, { 0xd84e, 0xdefa } },
+ { 0x2f8fa, 1, { 0x6c4e, 0 } },
+ { 0x2f8fb, 2, { 0xd84f, 0xdcbc } },
+ { 0x2f8fc, 1, { 0x6cbf, 0 } },
+ { 0x2f8fd, 1, { 0x6ccd, 0 } },
+ { 0x2f8fe, 1, { 0x6c67, 0 } },
+ { 0x2f8ff, 1, { 0x6d16, 0 } },
+ { 0x2f900, 1, { 0x6d3e, 0 } },
+ { 0x2f901, 1, { 0x6d77, 0 } },
+ { 0x2f902, 1, { 0x6d41, 0 } },
+ { 0x2f903, 1, { 0x6d69, 0 } },
+ { 0x2f904, 1, { 0x6d78, 0 } },
+ { 0x2f905, 1, { 0x6d85, 0 } },
+ { 0x2f906, 2, { 0xd84f, 0xdd1e } },
+ { 0x2f907, 1, { 0x6d34, 0 } },
+ { 0x2f908, 1, { 0x6e2f, 0 } },
+ { 0x2f909, 1, { 0x6e6e, 0 } },
+ { 0x2f90a, 1, { 0x3d33, 0 } },
+ { 0x2f90b, 1, { 0x6ecb, 0 } },
+ { 0x2f90c, 1, { 0x6ec7, 0 } },
+ { 0x2f90d, 2, { 0xd84f, 0xded1 } },
+ { 0x2f90e, 1, { 0x6df9, 0 } },
+ { 0x2f90f, 1, { 0x6f6e, 0 } },
+ { 0x2f910, 2, { 0xd84f, 0xdf5e } },
+ { 0x2f911, 2, { 0xd84f, 0xdf8e } },
+ { 0x2f912, 1, { 0x6fc6, 0 } },
+ { 0x2f913, 1, { 0x7039, 0 } },
+ { 0x2f914, 1, { 0x701e, 0 } },
+ { 0x2f915, 1, { 0x701b, 0 } },
+ { 0x2f916, 1, { 0x3d96, 0 } },
+ { 0x2f917, 1, { 0x704a, 0 } },
+ { 0x2f918, 1, { 0x707d, 0 } },
+ { 0x2f919, 1, { 0x7077, 0 } },
+ { 0x2f91a, 1, { 0x70ad, 0 } },
+ { 0x2f91b, 2, { 0xd841, 0xdd25 } },
+ { 0x2f91c, 1, { 0x7145, 0 } },
+ { 0x2f91d, 2, { 0xd850, 0xde63 } },
+ { 0x2f91e, 1, { 0x719c, 0 } },
+ { 0x2f920, 1, { 0x7228, 0 } },
+ { 0x2f921, 1, { 0x7235, 0 } },
+ { 0x2f922, 1, { 0x7250, 0 } },
+ { 0x2f923, 2, { 0xd851, 0xde08 } },
+ { 0x2f924, 1, { 0x7280, 0 } },
+ { 0x2f925, 1, { 0x7295, 0 } },
+ { 0x2f926, 2, { 0xd851, 0xdf35 } },
+ { 0x2f927, 2, { 0xd852, 0xdc14 } },
+ { 0x2f928, 1, { 0x737a, 0 } },
+ { 0x2f929, 1, { 0x738b, 0 } },
+ { 0x2f92a, 1, { 0x3eac, 0 } },
+ { 0x2f92b, 1, { 0x73a5, 0 } },
+ { 0x2f92c, 1, { 0x3eb8, 0 } },
+ { 0x2f92d, 1, { 0x3eb8, 0 } },
+ { 0x2f92e, 1, { 0x7447, 0 } },
+ { 0x2f92f, 1, { 0x745c, 0 } },
+ { 0x2f930, 1, { 0x7471, 0 } },
+ { 0x2f931, 1, { 0x7485, 0 } },
+ { 0x2f932, 1, { 0x74ca, 0 } },
+ { 0x2f933, 1, { 0x3f1b, 0 } },
+ { 0x2f934, 1, { 0x7524, 0 } },
+ { 0x2f935, 2, { 0xd853, 0xdc36 } },
+ { 0x2f936, 1, { 0x753e, 0 } },
+ { 0x2f937, 2, { 0xd853, 0xdc92 } },
+ { 0x2f938, 1, { 0x7570, 0 } },
+ { 0x2f939, 2, { 0xd848, 0xdd9f } },
+ { 0x2f93a, 1, { 0x7610, 0 } },
+ { 0x2f93b, 2, { 0xd853, 0xdfa1 } },
+ { 0x2f93c, 2, { 0xd853, 0xdfb8 } },
+ { 0x2f93d, 2, { 0xd854, 0xdc44 } },
+ { 0x2f93e, 1, { 0x3ffc, 0 } },
+ { 0x2f93f, 1, { 0x4008, 0 } },
+ { 0x2f940, 1, { 0x76f4, 0 } },
+ { 0x2f941, 2, { 0xd854, 0xdcf3 } },
+ { 0x2f942, 2, { 0xd854, 0xdcf2 } },
+ { 0x2f943, 2, { 0xd854, 0xdd19 } },
+ { 0x2f944, 2, { 0xd854, 0xdd33 } },
+ { 0x2f945, 1, { 0x771e, 0 } },
+ { 0x2f946, 1, { 0x771f, 0 } },
+ { 0x2f947, 1, { 0x771f, 0 } },
+ { 0x2f948, 1, { 0x774a, 0 } },
+ { 0x2f949, 1, { 0x4039, 0 } },
+ { 0x2f94a, 1, { 0x778b, 0 } },
+ { 0x2f94b, 1, { 0x4046, 0 } },
+ { 0x2f94c, 1, { 0x4096, 0 } },
+ { 0x2f94d, 2, { 0xd855, 0xdc1d } },
+ { 0x2f94e, 1, { 0x784e, 0 } },
+ { 0x2f94f, 1, { 0x788c, 0 } },
+ { 0x2f950, 1, { 0x78cc, 0 } },
+ { 0x2f951, 1, { 0x40e3, 0 } },
+ { 0x2f952, 2, { 0xd855, 0xde26 } },
+ { 0x2f953, 1, { 0x7956, 0 } },
+ { 0x2f954, 2, { 0xd855, 0xde9a } },
+ { 0x2f955, 2, { 0xd855, 0xdec5 } },
+ { 0x2f956, 1, { 0x798f, 0 } },
+ { 0x2f957, 1, { 0x79eb, 0 } },
+ { 0x2f958, 1, { 0x412f, 0 } },
+ { 0x2f959, 1, { 0x7a40, 0 } },
+ { 0x2f95a, 1, { 0x7a4a, 0 } },
+ { 0x2f95b, 1, { 0x7a4f, 0 } },
+ { 0x2f95c, 2, { 0xd856, 0xdd7c } },
+ { 0x2f95d, 2, { 0xd856, 0xdea7 } },
+ { 0x2f95e, 2, { 0xd856, 0xdea7 } },
+ { 0x2f960, 1, { 0x4202, 0 } },
+ { 0x2f961, 2, { 0xd856, 0xdfab } },
+ { 0x2f962, 1, { 0x7bc6, 0 } },
+ { 0x2f963, 1, { 0x7bc9, 0 } },
+ { 0x2f964, 1, { 0x4227, 0 } },
+ { 0x2f965, 2, { 0xd857, 0xdc80 } },
+ { 0x2f966, 1, { 0x7cd2, 0 } },
+ { 0x2f967, 1, { 0x42a0, 0 } },
+ { 0x2f968, 1, { 0x7ce8, 0 } },
+ { 0x2f969, 1, { 0x7ce3, 0 } },
+ { 0x2f96a, 1, { 0x7d00, 0 } },
+ { 0x2f96b, 2, { 0xd857, 0xdf86 } },
+ { 0x2f96c, 1, { 0x7d63, 0 } },
+ { 0x2f96d, 1, { 0x4301, 0 } },
+ { 0x2f96e, 1, { 0x7dc7, 0 } },
+ { 0x2f96f, 1, { 0x7e02, 0 } },
+ { 0x2f970, 1, { 0x7e45, 0 } },
+ { 0x2f971, 1, { 0x4334, 0 } },
+ { 0x2f972, 2, { 0xd858, 0xde28 } },
+ { 0x2f973, 2, { 0xd858, 0xde47 } },
+ { 0x2f974, 1, { 0x4359, 0 } },
+ { 0x2f975, 2, { 0xd858, 0xded9 } },
+ { 0x2f976, 1, { 0x7f7a, 0 } },
+ { 0x2f977, 2, { 0xd858, 0xdf3e } },
+ { 0x2f978, 1, { 0x7f95, 0 } },
+ { 0x2f979, 1, { 0x7ffa, 0 } },
+ { 0x2f97a, 1, { 0x8005, 0 } },
+ { 0x2f97b, 2, { 0xd859, 0xdcda } },
+ { 0x2f97c, 2, { 0xd859, 0xdd23 } },
+ { 0x2f97d, 1, { 0x8060, 0 } },
+ { 0x2f97e, 2, { 0xd859, 0xdda8 } },
+ { 0x2f97f, 1, { 0x8070, 0 } },
+ { 0x2f980, 2, { 0xd84c, 0xdf5f } },
+ { 0x2f981, 1, { 0x43d5, 0 } },
+ { 0x2f982, 1, { 0x80b2, 0 } },
+ { 0x2f983, 1, { 0x8103, 0 } },
+ { 0x2f984, 1, { 0x440b, 0 } },
+ { 0x2f985, 1, { 0x813e, 0 } },
+ { 0x2f986, 1, { 0x5ab5, 0 } },
+ { 0x2f987, 2, { 0xd859, 0xdfa7 } },
+ { 0x2f988, 2, { 0xd859, 0xdfb5 } },
+ { 0x2f989, 2, { 0xd84c, 0xdf93 } },
+ { 0x2f98a, 2, { 0xd84c, 0xdf9c } },
+ { 0x2f98b, 1, { 0x8201, 0 } },
+ { 0x2f98c, 1, { 0x8204, 0 } },
+ { 0x2f98d, 1, { 0x8f9e, 0 } },
+ { 0x2f98e, 1, { 0x446b, 0 } },
+ { 0x2f98f, 1, { 0x8291, 0 } },
+ { 0x2f990, 1, { 0x828b, 0 } },
+ { 0x2f991, 1, { 0x829d, 0 } },
+ { 0x2f992, 1, { 0x52b3, 0 } },
+ { 0x2f993, 1, { 0x82b1, 0 } },
+ { 0x2f994, 1, { 0x82b3, 0 } },
+ { 0x2f995, 1, { 0x82bd, 0 } },
+ { 0x2f996, 1, { 0x82e6, 0 } },
+ { 0x2f997, 2, { 0xd85a, 0xdf3c } },
+ { 0x2f998, 1, { 0x82e5, 0 } },
+ { 0x2f999, 1, { 0x831d, 0 } },
+ { 0x2f99a, 1, { 0x8363, 0 } },
+ { 0x2f99b, 1, { 0x83ad, 0 } },
+ { 0x2f99c, 1, { 0x8323, 0 } },
+ { 0x2f99d, 1, { 0x83bd, 0 } },
+ { 0x2f99e, 1, { 0x83e7, 0 } },
+ { 0x2f99f, 1, { 0x8457, 0 } },
+ { 0x2f9a0, 1, { 0x8353, 0 } },
+ { 0x2f9a1, 1, { 0x83ca, 0 } },
+ { 0x2f9a2, 1, { 0x83cc, 0 } },
+ { 0x2f9a3, 1, { 0x83dc, 0 } },
+ { 0x2f9a4, 2, { 0xd85b, 0xdc36 } },
+ { 0x2f9a5, 2, { 0xd85b, 0xdd6b } },
+ { 0x2f9a6, 2, { 0xd85b, 0xdcd5 } },
+ { 0x2f9a7, 1, { 0x452b, 0 } },
+ { 0x2f9a8, 1, { 0x84f1, 0 } },
+ { 0x2f9a9, 1, { 0x84f3, 0 } },
+ { 0x2f9aa, 1, { 0x8516, 0 } },
+ { 0x2f9ab, 2, { 0xd85c, 0xdfca } },
+ { 0x2f9ac, 1, { 0x8564, 0 } },
+ { 0x2f9ad, 2, { 0xd85b, 0xdf2c } },
+ { 0x2f9ae, 1, { 0x455d, 0 } },
+ { 0x2f9af, 1, { 0x4561, 0 } },
+ { 0x2f9b0, 2, { 0xd85b, 0xdfb1 } },
+ { 0x2f9b1, 2, { 0xd85c, 0xdcd2 } },
+ { 0x2f9b2, 1, { 0x456b, 0 } },
+ { 0x2f9b3, 1, { 0x8650, 0 } },
+ { 0x2f9b4, 1, { 0x865c, 0 } },
+ { 0x2f9b5, 1, { 0x8667, 0 } },
+ { 0x2f9b6, 1, { 0x8669, 0 } },
+ { 0x2f9b7, 1, { 0x86a9, 0 } },
+ { 0x2f9b8, 1, { 0x8688, 0 } },
+ { 0x2f9b9, 1, { 0x870e, 0 } },
+ { 0x2f9ba, 1, { 0x86e2, 0 } },
+ { 0x2f9bb, 1, { 0x8779, 0 } },
+ { 0x2f9bc, 1, { 0x8728, 0 } },
+ { 0x2f9bd, 1, { 0x876b, 0 } },
+ { 0x2f9be, 1, { 0x8786, 0 } },
+ { 0x2f9c0, 1, { 0x87e1, 0 } },
+ { 0x2f9c1, 1, { 0x8801, 0 } },
+ { 0x2f9c2, 1, { 0x45f9, 0 } },
+ { 0x2f9c3, 1, { 0x8860, 0 } },
+ { 0x2f9c4, 1, { 0x8863, 0 } },
+ { 0x2f9c5, 2, { 0xd85d, 0xde67 } },
+ { 0x2f9c6, 1, { 0x88d7, 0 } },
+ { 0x2f9c7, 1, { 0x88de, 0 } },
+ { 0x2f9c8, 1, { 0x4635, 0 } },
+ { 0x2f9c9, 1, { 0x88fa, 0 } },
+ { 0x2f9ca, 1, { 0x34bb, 0 } },
+ { 0x2f9cb, 2, { 0xd85e, 0xdcae } },
+ { 0x2f9cc, 2, { 0xd85e, 0xdd66 } },
+ { 0x2f9cd, 1, { 0x46be, 0 } },
+ { 0x2f9ce, 1, { 0x46c7, 0 } },
+ { 0x2f9cf, 1, { 0x8aa0, 0 } },
+ { 0x2f9d0, 1, { 0x8aed, 0 } },
+ { 0x2f9d1, 1, { 0x8b8a, 0 } },
+ { 0x2f9d2, 1, { 0x8c55, 0 } },
+ { 0x2f9d3, 2, { 0xd85f, 0xdca8 } },
+ { 0x2f9d4, 1, { 0x8cab, 0 } },
+ { 0x2f9d5, 1, { 0x8cc1, 0 } },
+ { 0x2f9d6, 1, { 0x8d1b, 0 } },
+ { 0x2f9d7, 1, { 0x8d77, 0 } },
+ { 0x2f9d8, 2, { 0xd85f, 0xdf2f } },
+ { 0x2f9d9, 2, { 0xd842, 0xdc04 } },
+ { 0x2f9da, 1, { 0x8dcb, 0 } },
+ { 0x2f9db, 1, { 0x8dbc, 0 } },
+ { 0x2f9dc, 1, { 0x8df0, 0 } },
+ { 0x2f9dd, 2, { 0xd842, 0xdcde } },
+ { 0x2f9de, 1, { 0x8ed4, 0 } },
+ { 0x2f9df, 1, { 0x8f38, 0 } },
+ { 0x2f9e0, 2, { 0xd861, 0xddd2 } },
+ { 0x2f9e1, 2, { 0xd861, 0xdded } },
+ { 0x2f9e2, 1, { 0x9094, 0 } },
+ { 0x2f9e3, 1, { 0x90f1, 0 } },
+ { 0x2f9e4, 1, { 0x9111, 0 } },
+ { 0x2f9e5, 2, { 0xd861, 0xdf2e } },
+ { 0x2f9e6, 1, { 0x911b, 0 } },
+ { 0x2f9e7, 1, { 0x9238, 0 } },
+ { 0x2f9e8, 1, { 0x92d7, 0 } },
+ { 0x2f9e9, 1, { 0x92d8, 0 } },
+ { 0x2f9ea, 1, { 0x927c, 0 } },
+ { 0x2f9eb, 1, { 0x93f9, 0 } },
+ { 0x2f9ec, 1, { 0x9415, 0 } },
+ { 0x2f9ed, 2, { 0xd862, 0xdffa } },
+ { 0x2f9ee, 1, { 0x958b, 0 } },
+ { 0x2f9ef, 1, { 0x4995, 0 } },
+ { 0x2f9f0, 1, { 0x95b7, 0 } },
+ { 0x2f9f1, 2, { 0xd863, 0xdd77 } },
+ { 0x2f9f2, 1, { 0x49e6, 0 } },
+ { 0x2f9f3, 1, { 0x96c3, 0 } },
+ { 0x2f9f4, 1, { 0x5db2, 0 } },
+ { 0x2f9f5, 1, { 0x9723, 0 } },
+ { 0x2f9f6, 2, { 0xd864, 0xdd45 } },
+ { 0x2f9f7, 2, { 0xd864, 0xde1a } },
+ { 0x2f9f8, 1, { 0x4a6e, 0 } },
+ { 0x2f9f9, 1, { 0x4a76, 0 } },
+ { 0x2f9fa, 1, { 0x97e0, 0 } },
+ { 0x2f9fb, 2, { 0xd865, 0xdc0a } },
+ { 0x2f9fc, 1, { 0x4ab2, 0 } },
+ { 0x2f9fd, 2, { 0xd865, 0xdc96 } },
+ { 0x2f9fe, 1, { 0x980b, 0 } },
+ { 0x2f9ff, 1, { 0x980b, 0 } },
+ { 0x2fa00, 1, { 0x9829, 0 } },
+ { 0x2fa01, 2, { 0xd865, 0xddb6 } },
+ { 0x2fa02, 1, { 0x98e2, 0 } },
+ { 0x2fa03, 1, { 0x4b33, 0 } },
+ { 0x2fa04, 1, { 0x9929, 0 } },
+ { 0x2fa05, 1, { 0x99a7, 0 } },
+ { 0x2fa06, 1, { 0x99c2, 0 } },
+ { 0x2fa07, 1, { 0x99fe, 0 } },
+ { 0x2fa08, 1, { 0x4bce, 0 } },
+ { 0x2fa09, 2, { 0xd866, 0xdf30 } },
+ { 0x2fa0a, 1, { 0x9b12, 0 } },
+ { 0x2fa0b, 1, { 0x9c40, 0 } },
+ { 0x2fa0c, 1, { 0x9cfd, 0 } },
+ { 0x2fa0d, 1, { 0x4cce, 0 } },
+ { 0x2fa0e, 1, { 0x4ced, 0 } },
+ { 0x2fa0f, 1, { 0x9d67, 0 } },
+ { 0x2fa10, 2, { 0xd868, 0xdcce } },
+ { 0x2fa11, 1, { 0x4cf8, 0 } },
+ { 0x2fa12, 2, { 0xd868, 0xdd05 } },
+ { 0x2fa13, 2, { 0xd868, 0xde0e } },
+ { 0x2fa14, 2, { 0xd868, 0xde91 } },
+ { 0x2fa15, 1, { 0x9ebb, 0 } },
+ { 0x2fa16, 1, { 0x4d56, 0 } },
+ { 0x2fa17, 1, { 0x9ef9, 0 } },
+ { 0x2fa18, 1, { 0x9efe, 0 } },
+ { 0x2fa19, 1, { 0x9f05, 0 } },
+ { 0x2fa1a, 1, { 0x9f0f, 0 } },
+ { 0x2fa1b, 1, { 0x9f16, 0 } },
+ { 0x2fa1c, 1, { 0x9f3b, 0 } },
+ { 0x2fa1d, 2, { 0xd869, 0xde00 } },
+};
+
+Q_CORE_EXPORT QStringView QT_FASTCALL idnaMapping(char32_t ucs4) noexcept
+{
+ auto i = std::lower_bound(std::begin(idnaMap), std::end(idnaMap), ucs4,
+ [](const auto &p, char32_t c) { return p.codePoint < c; });
+ if (i == std::end(idnaMap) || i->codePoint != ucs4)
+ return {};
+
+ return QStringView(i->size > 2 ? idnaMappingData + i->ucs[0] : i->ucs, i->size);
+}
+
} // namespace QUnicodeTables
using namespace QUnicodeTables;
diff --git a/src/corelib/text/qunicodetables_p.h b/src/corelib/text/qunicodetables_p.h
index e59aea25bd..eabdc919cb 100644
--- a/src/corelib/text/qunicodetables_p.h
+++ b/src/corelib/text/qunicodetables_p.h
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/* This file is autogenerated from the Unicode 13.0 database. Do not edit */
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: Unicode-DFS-2016
+
+/* This file is autogenerated from the Unicode 15.1 database. Do not edit */
//
// W A R N I N G
@@ -59,7 +23,7 @@
QT_BEGIN_NAMESPACE
-#define UNICODE_DATA_VERSION QChar::Unicode_13_0
+#define UNICODE_DATA_VERSION QChar::Unicode_15_1
namespace QUnicodeTables {
@@ -79,7 +43,8 @@ struct Properties {
ushort joining : 3;
signed short digitValue : 5;
signed short mirrorDiff : 16;
- ushort unicodeVersion : 8; /* 5 used */
+ ushort unicodeVersion : 5; /* 5 used */
+ ushort eastAsianWidth : 3; /* 3 used */
ushort nfQuickCheck : 8;
#ifdef Q_OS_WASM
unsigned char : 0; //wasm 64 packing trick
@@ -94,7 +59,8 @@ struct Properties {
ushort graphemeBreakClass : 5; /* 5 used */
ushort wordBreakClass : 5; /* 5 used */
ushort lineBreakClass : 6; /* 6 used */
- ushort sentenceBreakClass : 8; /* 4 used */
+ ushort sentenceBreakClass : 4; /* 4 used */
+ ushort idnaStatus : 4; /* 3 used */
ushort script : 8;
};
@@ -103,6 +69,15 @@ Q_CORE_EXPORT const Properties * QT_FASTCALL properties(char16_t ucs2) noexcept;
static_assert(sizeof(Properties) == 20);
+enum class EastAsianWidth : unsigned int {
+ A,
+ F,
+ H,
+ N,
+ Na,
+ W,
+};
+
enum GraphemeBreakClass {
GraphemeBreak_Any,
GraphemeBreak_CR,
@@ -118,10 +93,7 @@ enum GraphemeBreakClass {
GraphemeBreak_T,
GraphemeBreak_LV,
GraphemeBreak_LVT,
- Graphemebreak_E_Base,
- Graphemebreak_E_Modifier,
- Graphemebreak_Glue_After_Zwj,
- Graphemebreak_E_Base_GAZ,
+ GraphemeBreak_Extended_Pictographic,
NumGraphemeBreakClasses
};
@@ -145,10 +117,6 @@ enum WordBreakClass {
WordBreak_MidNum,
WordBreak_Numeric,
WordBreak_ExtendNumLet,
- WordBreak_E_Base,
- WordBreak_E_Modifier,
- WordBreak_Glue_After_Zwj,
- WordBreak_E_Base_GAZ,
WordBreak_WSegSpace,
NumWordBreakClasses
@@ -174,9 +142,11 @@ enum SentenceBreakClass {
};
// see http://www.unicode.org/reports/tr14/tr14-30.html
-// we don't use the XX and AI classes and map them to AL instead.
+// we don't use the XX, AK, AP, AS and AI classes and map them to AL instead.
+// VI and VF classes are mapped to CM.
enum LineBreakClass {
- LineBreak_OP, LineBreak_CL, LineBreak_CP, LineBreak_QU, LineBreak_GL,
+ LineBreak_OP, LineBreak_CL, LineBreak_CP,
+ LineBreak_QU, LineBreak_QU_Pi, LineBreak_QU_Pf, LineBreak_GL,
LineBreak_NS, LineBreak_EX, LineBreak_SY, LineBreak_IS, LineBreak_PR,
LineBreak_PO, LineBreak_NU, LineBreak_AL, LineBreak_HL, LineBreak_ID,
LineBreak_IN, LineBreak_HY, LineBreak_BA, LineBreak_BB, LineBreak_B2,
@@ -189,6 +159,14 @@ enum LineBreakClass {
NumLineBreakClasses
};
+enum class IdnaStatus : unsigned int {
+ Disallowed,
+ Valid,
+ Ignored,
+ Mapped,
+ Deviation
+};
+
Q_CORE_EXPORT GraphemeBreakClass QT_FASTCALL graphemeBreakClass(char32_t ucs4) noexcept;
inline GraphemeBreakClass graphemeBreakClass(QChar ch) noexcept
{ return graphemeBreakClass(ch.unicode()); }
@@ -205,6 +183,18 @@ Q_CORE_EXPORT LineBreakClass QT_FASTCALL lineBreakClass(char32_t ucs4) noexcept;
inline LineBreakClass lineBreakClass(QChar ch) noexcept
{ return lineBreakClass(ch.unicode()); }
+Q_CORE_EXPORT IdnaStatus QT_FASTCALL idnaStatus(char32_t ucs4) noexcept;
+inline IdnaStatus idnaStatus(QChar ch) noexcept
+{ return idnaStatus(ch.unicode()); }
+
+Q_CORE_EXPORT QStringView QT_FASTCALL idnaMapping(char32_t usc4) noexcept;
+inline QStringView idnaMapping(QChar ch) noexcept
+{ return idnaMapping(ch.unicode()); }
+
+Q_CORE_EXPORT EastAsianWidth QT_FASTCALL eastAsianWidth(char32_t ucs4) noexcept;
+inline EastAsianWidth eastAsianWidth(QChar ch) noexcept
+{ return eastAsianWidth(ch.unicode()); }
+
} // namespace QUnicodeTables
QT_END_NAMESPACE
diff --git a/src/corelib/text/qunicodetools.cpp b/src/corelib/text/qunicodetools.cpp
index 61976ab9ca..2917804830 100644
--- a/src/corelib/text/qunicodetools.cpp
+++ b/src/corelib/text/qunicodetools.cpp
@@ -1,108 +1,128 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qunicodetools_p.h"
#include "qunicodetables_p.h"
#include "qvarlengtharray.h"
+#if QT_CONFIG(library)
#include "qlibrary.h"
+#endif
+
+#include <limits.h>
#define FLAG(x) (1 << (x))
QT_BEGIN_NAMESPACE
-Q_AUTOTEST_EXPORT int qt_initcharattributes_default_algorithm_only = 0;
+using namespace Qt::StringLiterals;
+
+#ifdef QT_BUILD_INTERNAL
+Q_CONSTINIT Q_AUTOTEST_EXPORT
+#else
+constexpr
+#endif
+int qt_initcharattributes_default_algorithm_only = 0;
namespace QUnicodeTools {
// -----------------------------------------------------------------------------------------------------
//
// The text boundaries determination algorithm.
-// See http://www.unicode.org/reports/tr29/tr29-31.html
+// See https://www.unicode.org/reports/tr29/tr29-37.html
//
// -----------------------------------------------------------------------------------------------------
namespace GB {
-/*
- * Most grapheme break rules can be implemented table driven, but rules GB10, GB12 and GB13 need a bit
- * of special treatment.
- */
-enum State : uchar {
- Break,
- Inside,
- GB10,
- GB10_2,
- GB10_3,
- GB13, // also covers GB12
+// This table is indexed by the grapheme break classes of two
+// (adjacent) code points.
+// The class of the first code point selects an entry.
+// If the entry's bit at position second_cp_class is set
+// (in other words: if entry & (1u << second_cp_class) is non-zero)
+// then there is NO grapheme break between the two code points.
+
+using GBTableEntryType = quint16;
+
+// Check that we have enough bits in the table (in case
+// NumGraphemeBreakClasses grows too much).
+static_assert(sizeof(GBTableEntryType) * CHAR_BIT >= QUnicodeTables::NumGraphemeBreakClasses,
+ "Internal error: increase the size in bits of GBTableEntryType");
+
+// GB9, GB9a
+static const GBTableEntryType Extend_SpacingMark_ZWJ =
+ FLAG(QUnicodeTables::GraphemeBreak_Extend)
+ | FLAG(QUnicodeTables::GraphemeBreak_SpacingMark)
+ | FLAG(QUnicodeTables::GraphemeBreak_ZWJ);
+
+static const GBTableEntryType HardBreak = 0u;
+
+static const GBTableEntryType breakTable[QUnicodeTables::NumGraphemeBreakClasses] = {
+ Extend_SpacingMark_ZWJ, // Any
+ FLAG(QUnicodeTables::GraphemeBreak_LF), // CR
+ HardBreak, // LF
+ HardBreak, // Control
+ Extend_SpacingMark_ZWJ, // Extend
+ Extend_SpacingMark_ZWJ, // ZWJ
+ Extend_SpacingMark_ZWJ, // RegionalIndicator
+ (Extend_SpacingMark_ZWJ
+ | FLAG(QUnicodeTables::GraphemeBreak_Any)
+ | FLAG(QUnicodeTables::GraphemeBreak_Prepend)
+ | FLAG(QUnicodeTables::GraphemeBreak_L)
+ | FLAG(QUnicodeTables::GraphemeBreak_V)
+ | FLAG(QUnicodeTables::GraphemeBreak_T)
+ | FLAG(QUnicodeTables::GraphemeBreak_LV)
+ | FLAG(QUnicodeTables::GraphemeBreak_LVT)
+ | FLAG(QUnicodeTables::GraphemeBreak_RegionalIndicator)
+ | FLAG(QUnicodeTables::GraphemeBreak_Extended_Pictographic)
+ ), // Prepend
+ Extend_SpacingMark_ZWJ, // SpacingMark
+ (Extend_SpacingMark_ZWJ
+ | FLAG(QUnicodeTables::GraphemeBreak_L)
+ | FLAG(QUnicodeTables::GraphemeBreak_V)
+ | FLAG(QUnicodeTables::GraphemeBreak_LV)
+ | FLAG(QUnicodeTables::GraphemeBreak_LVT)
+ ), // L
+ (Extend_SpacingMark_ZWJ
+ | FLAG(QUnicodeTables::GraphemeBreak_V)
+ | FLAG(QUnicodeTables::GraphemeBreak_T)
+ ), // V
+ (Extend_SpacingMark_ZWJ
+ | FLAG(QUnicodeTables::GraphemeBreak_T)
+ ), // T
+ (Extend_SpacingMark_ZWJ
+ | FLAG(QUnicodeTables::GraphemeBreak_V)
+ | FLAG(QUnicodeTables::GraphemeBreak_T)
+ ), // LV
+ (Extend_SpacingMark_ZWJ
+ | FLAG(QUnicodeTables::GraphemeBreak_T)
+ ), // LVT
+ Extend_SpacingMark_ZWJ // Extended_Pictographic
};
-static const State breakTable[QUnicodeTables::NumGraphemeBreakClasses][QUnicodeTables::NumGraphemeBreakClasses] = {
-// Any CR LF Control Extend ZWJ RI Prepend S-Mark L V T LV LVT E_B E_M GAZ EBG
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Any
- { Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // CR
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // LF
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Control
- { Break , Break , Break , Break , GB10_2, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , GB10_3, Break , Break }, // Extend
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Inside, Inside }, // ZWJ
- { Break , Break , Break , Break , Inside, Inside, GB13 , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // RegionalIndicator
- { Inside, Break , Break , Break , Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside }, // Prepend
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // SpacingMark
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Inside, Inside, Break , Inside, Inside, Break , Break , Break , Break }, // L
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Inside, Inside, Break , Break , Break , Break , Break , Break }, // V
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break }, // T
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Inside, Inside, Break , Break , Break , Break , Break , Break }, // LV
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break }, // LVT
- { Break , Break , Break , Break , GB10 , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Inside, Break , Break }, // E_B
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // E_M
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // GAZ
- { Break , Break , Break , Break , GB10 , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Inside, Break , Break }, // EBG
+static bool shouldBreakBetweenClasses(QUnicodeTables::GraphemeBreakClass first,
+ QUnicodeTables::GraphemeBreakClass second)
+{
+ return (breakTable[first] & FLAG(second)) == 0;
+}
+
+// Some rules (GB11, GB12, GB13) cannot be represented by the table alone,
+// so we need to store some local state.
+enum class State : uchar {
+ Normal,
+ GB11_ExtPicExt, // saw a Extend after a Extended_Pictographic
+ GB11_ExtPicExtZWJ, // saw a ZWG after a Extended_Pictographic and zero or more Extend
+ GB12_13_RI, // saw a RegionalIndicator following a non-RegionalIndicator
};
} // namespace GB
-static void getGraphemeBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)
+static void getGraphemeBreaks(const char16_t *string, qsizetype len, QCharAttributes *attributes)
{
QUnicodeTables::GraphemeBreakClass lcls = QUnicodeTables::GraphemeBreak_LF; // to meet GB1
- GB::State state = GB::Break; // only required to track some of the rules
- for (quint32 i = 0; i != len; ++i) {
- quint32 pos = i;
+ GB::State state = GB::State::Normal;
+ for (qsizetype i = 0; i != len; ++i) {
+ qsizetype pos = i;
char32_t ucs4 = string[i];
if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {
ushort low = string[i + 1];
@@ -115,37 +135,67 @@ static void getGraphemeBreaks(const ushort *string, quint32 len, QCharAttributes
const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);
QUnicodeTables::GraphemeBreakClass cls = (QUnicodeTables::GraphemeBreakClass) prop->graphemeBreakClass;
- switch (GB::breakTable[lcls][cls]) {
- case GB::Break:
- attributes[pos].graphemeBoundary = true;
- state = GB::Break;
- break;
- case GB::Inside:
- state = GB::Break;
- break;
- case GB::GB10:
- state = GB::GB10;
+ bool shouldBreak = GB::shouldBreakBetweenClasses(lcls, cls);
+ bool handled = false;
+
+ switch (state) {
+ case GB::State::Normal:
+ break; // will deal with it below
+
+ case GB::State::GB11_ExtPicExt:
+ Q_ASSERT(lcls == QUnicodeTables::GraphemeBreak_Extend);
+ if (cls == QUnicodeTables::GraphemeBreak_Extend) {
+ // keep going in the current state
+ Q_ASSERT(!shouldBreak); // GB9, do not break before Extend
+ handled = true;
+ } else if (cls == QUnicodeTables::GraphemeBreak_ZWJ) {
+ state = GB::State::GB11_ExtPicExtZWJ;
+ Q_ASSERT(!shouldBreak); // GB9, do not break before ZWJ
+ handled = true;
+ } else {
+ state = GB::State::Normal;
+ }
break;
- case GB::GB10_2:
- if (state == GB::GB10 || state == GB::GB10_2)
- state = GB::GB10_2;
- else
- state = GB::Break;
+
+ case GB::State::GB11_ExtPicExtZWJ:
+ Q_ASSERT(lcls == QUnicodeTables::GraphemeBreak_ZWJ);
+ if (cls == QUnicodeTables::GraphemeBreak_Extended_Pictographic) {
+ shouldBreak = false;
+ handled = true;
+ }
+
+ state = GB::State::Normal;
break;
- case GB::GB10_3:
- if (state != GB::GB10 && state != GB::GB10_2)
- attributes[pos].graphemeBoundary = true;
- state = GB::Break;
+
+ case GB::State::GB12_13_RI:
+ Q_ASSERT(lcls == QUnicodeTables::GraphemeBreak_RegionalIndicator);
+ if (cls == QUnicodeTables::GraphemeBreak_RegionalIndicator) {
+ shouldBreak = false;
+ handled = true;
+ }
+
+ state = GB::State::Normal;
break;
- case GB::GB13:
- if (state != GB::GB13) {
- state = GB::GB13;
- } else {
- attributes[pos].graphemeBoundary = true;
- state = GB::Break;
+ }
+
+ if (!handled) {
+ Q_ASSERT(state == GB::State::Normal);
+ if (lcls == QUnicodeTables::GraphemeBreak_Extended_Pictographic) { // GB11
+ if (cls == QUnicodeTables::GraphemeBreak_Extend) {
+ state = GB::State::GB11_ExtPicExt;
+ Q_ASSERT(!shouldBreak); // GB9, do not break before Extend
+ } else if (cls == QUnicodeTables::GraphemeBreak_ZWJ) {
+ state = GB::State::GB11_ExtPicExtZWJ;
+ Q_ASSERT(!shouldBreak); // GB9, do not break before ZWJ
+ }
+ } else if (cls == QUnicodeTables::GraphemeBreak_RegionalIndicator) { // GB12, GB13
+ state = GB::State::GB12_13_RI;
}
}
+ if (shouldBreak)
+ attributes[pos].graphemeBoundary = true;
+
lcls = cls;
}
@@ -163,43 +213,41 @@ enum Action {
};
static const uchar breakTable[QUnicodeTables::NumWordBreakClasses][QUnicodeTables::NumWordBreakClasses] = {
-// Any CR LF Newline Extend ZWJ Format RI Katakana HLetter ALetter SQuote DQuote MidNumLet MidLetter MidNum Numeric ExtNumLet E_Base E_Mod GAZ EBG WSeg
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Any
- { Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // CR
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // LF
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Newline
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Extend
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, NoBreak, Break }, // ZWJ
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Format
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // RegionalIndicator
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break , Break , Break }, // Katakana
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Lookup , LookupW, LookupW, Break , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // HebrewLetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Break , LookupW, LookupW, Break , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // ALetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // SingleQuote
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // DoubleQuote
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNumLet
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidLetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNum
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, Lookup , Break , Lookup , Break , Lookup , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // Numeric
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // ExtendNumLet
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break }, // E_Base
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // E_Mod
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // GAZ
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break }, // EBG
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // WSeg
+// Any CR LF Newline Extend ZWJ Format RI Katakana HLetter ALetter SQuote DQuote MidNumLet MidLetter MidNum Numeric ExtNumLet WSeg
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Any
+ { Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // CR
+ { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // LF
+ { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Newline
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Extend
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // ZWJ
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Format
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // RegionalIndicator
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break }, // Katakana
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Lookup , LookupW, LookupW, Break , NoBreak, NoBreak, Break }, // HebrewLetter
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Break , LookupW, LookupW, Break , NoBreak, NoBreak, Break }, // ALetter
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // SingleQuote
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // DoubleQuote
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNumLet
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidLetter
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNum
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, Lookup , Break , Lookup , Break , Lookup , NoBreak, NoBreak, Break }, // Numeric
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , NoBreak, NoBreak, Break }, // ExtendNumLet
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak }, // WSegSpace
};
} // namespace WB
-static void getWordBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)
+static void getWordBreaks(const char16_t *string, qsizetype len, QCharAttributes *attributes)
{
enum WordType {
WordTypeNone, WordTypeAlphaNumeric, WordTypeHiraganaKatakana
} currentWordType = WordTypeNone;
QUnicodeTables::WordBreakClass cls = QUnicodeTables::WordBreak_LF; // to meet WB1
- for (quint32 i = 0; i != len; ++i) {
- quint32 pos = i;
+ auto real_cls = cls; // Unaffected by WB4
+
+ for (qsizetype i = 0; i != len; ++i) {
+ qsizetype pos = i;
char32_t ucs4 = string[i];
if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {
ushort low = string[i + 1];
@@ -211,7 +259,6 @@ static void getWordBreaks(const ushort *string, quint32 len, QCharAttributes *at
const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);
QUnicodeTables::WordBreakClass ncls = (QUnicodeTables::WordBreakClass) prop->wordBreakClass;
-#ifdef QT_BUILD_INTERNAL
if (qt_initcharattributes_default_algorithm_only) {
// as of Unicode 5.1, some punctuation marks were mapped to MidLetter and MidNumLet
// which caused "hi.there" to be treated like if it were just a single word;
@@ -222,26 +269,36 @@ static void getWordBreaks(const ushort *string, quint32 len, QCharAttributes *at
else if (ucs4 == 0x003A) // COLON
ncls = QUnicodeTables::WordBreak_MidLetter;
}
-#endif
uchar action = WB::breakTable[cls][ncls];
switch (action) {
case WB::Break:
+ if (Q_UNLIKELY(real_cls == QUnicodeTables::WordBreak_ZWJ
+ && prop->graphemeBreakClass
+ == QUnicodeTables::GraphemeBreak_Extended_Pictographic)) {
+ // WB3c: ZWJ × \p{Extended_Pictographic}
+ action = WB::NoBreak;
+ }
break;
case WB::NoBreak:
if (Q_UNLIKELY(ncls == QUnicodeTables::WordBreak_Extend || ncls == QUnicodeTables::WordBreak_ZWJ || ncls == QUnicodeTables::WordBreak_Format)) {
// WB4: X(Extend|Format)* -> X
- if (cls != QUnicodeTables::WordBreak_ZWJ) // WB3c
- continue;
+ real_cls = ncls;
+ continue;
}
if (Q_UNLIKELY(cls == QUnicodeTables::WordBreak_RegionalIndicator)) {
// WB15/WB16: break between pairs of Regional indicator
ncls = QUnicodeTables::WordBreak_Any;
}
+ if (Q_UNLIKELY(ncls == QUnicodeTables::WordBreak_WSegSpace
+ && real_cls != QUnicodeTables::WordBreak_WSegSpace)) {
+ // WB3d should not be affected by WB4
+ action = WB::Break;
+ }
break;
case WB::Lookup:
case WB::LookupW:
- for (quint32 lookahead = i + 1; lookahead < len; ++lookahead) {
+ for (qsizetype lookahead = i + 1; lookahead < len; ++lookahead) {
ucs4 = string[lookahead];
if (QChar::isHighSurrogate(ucs4) && lookahead + 1 != len) {
ushort low = string[lookahead + 1];
@@ -276,6 +333,8 @@ static void getWordBreaks(const ushort *string, quint32 len, QCharAttributes *at
}
cls = ncls;
+ real_cls = ncls;
+
if (action == WB::Break) {
attributes[pos].wordBreak = true;
if (currentWordType != WordTypeNone)
@@ -343,11 +402,11 @@ static const uchar breakTable[BAfter + 1][QUnicodeTables::NumSentenceBreakClasse
} // namespace SB
-static void getSentenceBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)
+static void getSentenceBreaks(const char16_t *string, qsizetype len, QCharAttributes *attributes)
{
uchar state = SB::BAfter; // to meet SB1
- for (quint32 i = 0; i != len; ++i) {
- quint32 pos = i;
+ for (qsizetype i = 0; i != len; ++i) {
+ qsizetype pos = i;
char32_t ucs4 = string[i];
if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {
ushort low = string[i + 1];
@@ -364,7 +423,7 @@ static void getSentenceBreaks(const ushort *string, quint32 len, QCharAttributes
state = SB::breakTable[state][ncls];
if (Q_UNLIKELY(state == SB::Lookup)) { // SB8
state = SB::Break;
- for (quint32 lookahead = i + 1; lookahead < len; ++lookahead) {
+ for (qsizetype lookahead = i + 1; lookahead < len; ++lookahead) {
ucs4 = string[lookahead];
if (QChar::isHighSurrogate(ucs4) && lookahead + 1 != len) {
ushort low = string[lookahead + 1];
@@ -496,61 +555,67 @@ enum Action {
IndirectBreak, IB = IndirectBreak,
CombiningIndirectBreak, CI = CombiningIndirectBreak,
CombiningProhibitedBreak, CP = CombiningProhibitedBreak,
- ProhibitedBreakAfterHebrewPlusHyphen, HH = ProhibitedBreakAfterHebrewPlusHyphen
+ ProhibitedBreakAfterHebrewPlusHyphen, HH = ProhibitedBreakAfterHebrewPlusHyphen,
+ IndirectBreakIfNarrow, IN = IndirectBreakIfNarrow, // For LB30
};
-static const uchar breakTable[QUnicodeTables::LineBreak_SA][QUnicodeTables::LineBreak_SA] = {
-/* OP CL CP QU GL NS EX SY IS PR PO NU AL HL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT RI CB EB EM ZWJ*/
-/* OP */ { PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, CP, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB },
-/* CL */ { DB, PB, PB, IB, IB, PB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* CP */ { DB, PB, PB, IB, IB, PB, PB, PB, PB, DB, DB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* QU */ { PB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
-/* GL */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
-/* NS */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* EX */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* SY */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* IS */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* PR */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, IB, DB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, IB, DB, DB, IB, IB, IB },
-/* PO */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* NU */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* AL */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* HL */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, CI, CI, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* ID */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* IN */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* HY */ { HH, PB, PB, IB, HH, IB, PB, PB, PB, HH, HH, IB, HH, HH, HH, HH, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB, DB, DB, IB },
-/* BA */ { HH, PB, PB, IB, HH, IB, PB, PB, PB, HH, HH, HH, HH, HH, HH, HH, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB, DB, DB, IB },
-/* BB */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, DB, IB, IB, IB },
-/* B2 */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, PB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* ZW */ { DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
-/* CM */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* WJ */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
-/* H2 */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB, DB, DB, IB },
-/* H3 */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB, DB, DB, IB },
-/* JL */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, DB, DB, DB, DB, DB, IB },
-/* JV */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB, DB, DB, IB },
-/* JT */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB, DB, DB, IB },
-/* RI */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, IB, DB, DB, DB, IB },
-/* CB */ { DB, PB, PB, IB, IB, DB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* EB */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, IB, IB },
-/* EM */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* ZWJ*/ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, IB }
+// See https://www.unicode.org/reports/tr14/tr14-37.html for the information
+// about the table. It was removed in the later versions of the standard.
+static const uchar breakTable[QUnicodeTables::LineBreak_ZWJ][QUnicodeTables::LineBreak_ZWJ] = {
+/* 1↓ 2→ OP CL CP QU +Pi +Pf GL NS EX SY IS PR PO NU AL HL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT RI CB EB EM*/
+/* OP */ { PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, CP, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB },
+/* CL */ { DB, PB, PB, IB, IB, PB, IB, PB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* CP */ { DB, PB, PB, IB, IB, PB, IB, PB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* QU */ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
+/* +Pi*/ { PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, CP, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB },
+/* +Pf*/ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
+/* GL */ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
+/* NS */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* EX */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* SY */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* IS */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* PR */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, IB, IB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, IB, DB, DB, IB, IB },
+/* PO */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* NU */ { IN, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* AL */ { IN, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* HL */ { IN, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, CI, CI, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* ID */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* IN */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* HY */ { HH, PB, PB, IB, IB, PB, HH, IB, PB, PB, PB, HH, HH, IB, HH, HH, HH, IB, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB, DB, DB },
+/* BA */ { HH, PB, PB, IB, IB, PB, HH, IB, PB, PB, PB, HH, HH, HH, HH, HH, HH, IB, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB, DB, DB },
+/* BB */ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, DB, IB, IB },
+/* B2 */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, PB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* ZW */ { DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* CM */ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* WJ */ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
+/* H2 */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB, DB, DB },
+/* H3 */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB, DB, DB },
+/* JL */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, DB, DB, DB, DB, DB },
+/* JV */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB, DB, DB },
+/* JT */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB, DB, DB },
+/* RI */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, IB, DB, DB, DB },
+/* CB */ { DB, PB, PB, IB, IB, PB, IB, DB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* EB */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
+/* EM */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
};
// The following line break classes are not treated by the pair table
// and must be resolved outside:
-// AI, BK, CB, CJ, CR, LF, NL, SA, SG, SP, XX
+// AI, AK, AP, AS, BK, CB, CJ, CR, LF, NL, SA, SG, SP, VF, VI, XX, ZWJ
} // namespace LB
-static void getLineBreaks(const ushort *string, quint32 len, QCharAttributes *attributes, QUnicodeTools::CharAttributeOptions options)
+static void getLineBreaks(const char16_t *string, qsizetype len, QCharAttributes *attributes, QUnicodeTools::CharAttributeOptions options)
{
- quint32 nestart = 0;
+ qsizetype nestart = 0;
LB::NS::Class nelast = LB::NS::XX;
QUnicodeTables::LineBreakClass lcls = QUnicodeTables::LineBreak_LF; // to meet LB10
QUnicodeTables::LineBreakClass cls = lcls;
- for (quint32 i = 0; i != len; ++i) {
- quint32 pos = i;
+ const QUnicodeTables::Properties *lastProp = QUnicodeTables::properties(U'\n');
+
+ for (qsizetype i = 0; i != len; ++i) {
+ qsizetype pos = i;
char32_t ucs4 = string[i];
if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {
ushort low = string[i + 1];
@@ -596,6 +661,61 @@ static void getLineBreaks(const ushort *string, quint32 len, QCharAttributes *at
ncls = QUnicodeTables::LineBreak_CM;
}
+ if (Q_UNLIKELY(ncls == QUnicodeTables::LineBreak_QU)) {
+ if (prop->category == QChar::Punctuation_InitialQuote) {
+ // LB15a: Do not break after an unresolved initial punctuation
+ // that lies at the start of the line, after a space, after
+ // opening punctuation, or after an unresolved quotation mark,
+ // even after spaces.
+ // (sot | BK | CR | LF | NL | OP | QU | GL | SP | ZW)
+ // [\p{Pi}&QU] SP* ×
+ // Note: sot is treated as LF here due to initial loop setup.
+ constexpr QUnicodeTables::LineBreakClass lb15a[] = {
+ QUnicodeTables::LineBreak_BK, QUnicodeTables::LineBreak_CR,
+ QUnicodeTables::LineBreak_LF, QUnicodeTables::LineBreak_OP,
+ QUnicodeTables::LineBreak_QU, QUnicodeTables::LineBreak_QU_Pi,
+ QUnicodeTables::LineBreak_QU_Pf, QUnicodeTables::LineBreak_GL,
+ QUnicodeTables::LineBreak_SP, QUnicodeTables::LineBreak_ZW};
+ if (std::any_of(std::begin(lb15a), std::end(lb15a),
+ [lcls](auto x) { return x == lcls; })) {
+ ncls = QUnicodeTables::LineBreak_QU_Pi;
+ }
+ } else if (prop->category == QChar::Punctuation_FinalQuote) {
+ // LB15b: Do not break before an unresolved final punctuation
+ // that lies at the end of the line, before a space, before
+ // a prohibited break, or before an unresolved quotation mark,
+ // even after spaces.
+ // × [\p{Pf}&QU] ( SP | GL | WJ | CL | QU | CP | EX | IS
+ // | SY | BK | CR | LF | NL | ZW | eot)
+ auto nncls = QUnicodeTables::LineBreak_LF;
+
+ if (i + 1 < len) {
+ char32_t c = string[i + 1];
+ if (QChar::isHighSurrogate(c) && i + 2 != len) {
+ ushort low = string[i + 2];
+ if (QChar::isLowSurrogate(low))
+ c = QChar::surrogateToUcs4(c, low);
+ }
+ nncls = QUnicodeTables::LineBreakClass(
+ QUnicodeTables::properties(c)->lineBreakClass);
+ }
+
+ constexpr QUnicodeTables::LineBreakClass lb15b[] = {
+ QUnicodeTables::LineBreak_SP, QUnicodeTables::LineBreak_GL,
+ QUnicodeTables::LineBreak_WJ, QUnicodeTables::LineBreak_CL,
+ QUnicodeTables::LineBreak_QU, QUnicodeTables::LineBreak_QU_Pi,
+ QUnicodeTables::LineBreak_QU_Pf, QUnicodeTables::LineBreak_CP,
+ QUnicodeTables::LineBreak_EX, QUnicodeTables::LineBreak_IS,
+ QUnicodeTables::LineBreak_SY, QUnicodeTables::LineBreak_BK,
+ QUnicodeTables::LineBreak_CR, QUnicodeTables::LineBreak_LF,
+ QUnicodeTables::LineBreak_ZW};
+ if (std::any_of(std::begin(lb15b), std::end(lb15b),
+ [nncls](auto x) { return x == nncls; })) {
+ ncls = QUnicodeTables::LineBreak_QU_Pf;
+ }
+ }
+ }
+
if (Q_UNLIKELY(lcls >= QUnicodeTables::LineBreak_CR)) {
// LB4: BK!, LB5: (CRxLF|CR|LF|NL)!
if (lcls > QUnicodeTables::LineBreak_CR || ncls != QUnicodeTables::LineBreak_LF)
@@ -621,9 +741,8 @@ static void getLineBreaks(const ushort *string, quint32 len, QCharAttributes *at
}
if (Q_UNLIKELY(lcls == QUnicodeTables::LineBreak_ZWJ)) {
- // LB8a: ZWJ x (ID | EB | EM)
- if (ncls == QUnicodeTables::LineBreak_ID || ncls == QUnicodeTables::LineBreak_EB || ncls == QUnicodeTables::LineBreak_EM)
- goto next;
+ // LB8a: ZWJ x
+ goto next;
}
// LB25: do not break lines inside numbers
@@ -632,7 +751,7 @@ static void getLineBreaks(const ushort *string, quint32 len, QCharAttributes *at
switch (LB::NS::actionTable[nelast][necur]) {
case LB::NS::Break:
// do not change breaks before and after the expression
- for (quint32 j = nestart + 1; j < pos; ++j)
+ for (qsizetype j = nestart + 1; j < pos; ++j)
attributes[j].lineBreak = false;
Q_FALLTHROUGH();
case LB::NS::None:
@@ -653,16 +772,24 @@ static void getLineBreaks(const ushort *string, quint32 len, QCharAttributes *at
goto next;
}
+ if (Q_UNLIKELY(ncls == QUnicodeTables::LineBreak_EM
+ && lastProp->category == QChar::Other_NotAssigned
+ && lastProp->graphemeBreakClass
+ == QUnicodeTables::GraphemeBreak_Extended_Pictographic)) {
+ // LB30b: [\p{Extended_Pictographic}&\p{Cn}] × EM
+ goto next;
+ }
+
// for South East Asian chars that require a complex analysis, the Unicode
// standard recommends to treat them as AL. tailoring that do dictionary analysis can override
if (Q_UNLIKELY(cls >= QUnicodeTables::LineBreak_SA))
cls = QUnicodeTables::LineBreak_AL;
tcls = cls;
- if (tcls == QUnicodeTables::LineBreak_CM)
+ if (tcls == QUnicodeTables::LineBreak_CM || tcls == QUnicodeTables::LineBreak_ZWJ)
// LB10
tcls = QUnicodeTables::LineBreak_AL;
- switch (LB::breakTable[tcls][ncls < QUnicodeTables::LineBreak_SA ? ncls : QUnicodeTables::LineBreak_AL]) {
+ switch (LB::breakTable[tcls][ncls < QUnicodeTables::LineBreak_ZWJ ? ncls : QUnicodeTables::LineBreak_AL]) {
case LB::DirectBreak:
attributes[pos].lineBreak = true;
break;
@@ -683,6 +810,19 @@ static void getLineBreaks(const ushort *string, quint32 len, QCharAttributes *at
if (lcls != QUnicodeTables::LineBreak_HL)
attributes[pos].lineBreak = true;
break;
+ case LB::IndirectBreakIfNarrow:
+ switch (static_cast<QUnicodeTables::EastAsianWidth>(prop->eastAsianWidth)) {
+ default:
+ if (lcls != QUnicodeTables::LineBreak_SP)
+ break;
+ Q_FALLTHROUGH();
+ case QUnicodeTables::EastAsianWidth::F:
+ case QUnicodeTables::EastAsianWidth::W:
+ case QUnicodeTables::EastAsianWidth::H:
+ attributes[pos].lineBreak = true;
+ break;
+ }
+ break;
case LB::ProhibitedBreak:
// nothing to do
default:
@@ -691,13 +831,14 @@ static void getLineBreaks(const ushort *string, quint32 len, QCharAttributes *at
next:
cls = ncls;
+ lastProp = prop;
next_no_cls_update:
lcls = ncls;
}
if (Q_UNLIKELY(LB::NS::actionTable[nelast][LB::NS::XX] == LB::NS::Break)) {
// LB25: do not break lines inside numbers
- for (quint32 j = nestart + 1; j < len; ++j)
+ for (qsizetype j = nestart + 1; j < len; ++j)
attributes[j].lineBreak = false;
}
@@ -706,9 +847,9 @@ static void getLineBreaks(const ushort *string, quint32 len, QCharAttributes *at
}
-static void getWhiteSpaces(const ushort *string, quint32 len, QCharAttributes *attributes)
+static void getWhiteSpaces(const char16_t *string, qsizetype len, QCharAttributes *attributes)
{
- for (quint32 i = 0; i != len; ++i) {
+ for (qsizetype i = 0; i != len; ++i) {
uint ucs4 = string[i];
if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {
ushort low = string[i + 1];
@@ -725,7 +866,7 @@ static void getWhiteSpaces(const ushort *string, quint32 len, QCharAttributes *a
namespace Tailored {
-using CharAttributeFunction = void (*)(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes);
+using CharAttributeFunction = void (*)(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes);
enum Form {
@@ -1179,17 +1320,17 @@ static inline Form form(unsigned short uc) {
(Consonant Nukta? Halant)* Consonant Halant
IndependentVowel VowelMark? StressMark?
- We return syllable boundaries on invalid combinations aswell
+ We return syllable boundaries on invalid combinations as well
*/
-static int indic_nextSyllableBoundary(QChar::Script script, const ushort *s, int start, int end, bool *invalid)
+static qsizetype indic_nextSyllableBoundary(QChar::Script script, const char16_t *s, qsizetype start, qsizetype end, bool *invalid)
{
*invalid = false;
- IDEBUG("indic_nextSyllableBoundary: start=%d, end=%d", start, end);
- const ushort *uc = s+start;
+ IDEBUG("indic_nextSyllableBoundary: start=%lld, end=%lld", qlonglong(start), qlonglong(end));
+ const char16_t *uc = s+start;
- int pos = 0;
+ qsizetype pos = 0;
Form state = form(uc[pos]);
- IDEBUG("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);
+ IDEBUG("state[%lld]=%d (uc=%4x)", qlonglong(pos), state, uc[pos]);
pos++;
if (state != Consonant && state != IndependentVowel) {
@@ -1200,7 +1341,7 @@ static int indic_nextSyllableBoundary(QChar::Script script, const ushort *s, int
while (pos < end - start) {
Form newState = form(uc[pos]);
- IDEBUG("state[%d]=%d (uc=%4x)", pos, newState, uc[pos]);
+ IDEBUG("state[%lld]=%d (uc=%4x)", qlonglong(pos), newState, uc[pos]);
switch (newState) {
case Control:
newState = state;
@@ -1242,11 +1383,11 @@ static int indic_nextSyllableBoundary(QChar::Script script, const ushort *s, int
case StressMark:
if (state == VowelMark)
break;
- // fall through
+ Q_FALLTHROUGH();
case VowelMark:
if (state == Matra || state == LengthMark || state == IndependentVowel)
break;
- // fall through
+ Q_FALLTHROUGH();
case Matra:
if (state == Consonant || state == Nukta)
break;
@@ -1273,6 +1414,7 @@ static int indic_nextSyllableBoundary(QChar::Script script, const ushort *s, int
// ### needs proper testing for correct two/three part matras
break;
}
+ Q_FALLTHROUGH();
case IndependentVowel:
case Invalid:
case Other:
@@ -1285,22 +1427,20 @@ static int indic_nextSyllableBoundary(QChar::Script script, const ushort *s, int
return pos+start;
}
-static void indicAttributes(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes)
+static void indicAttributes(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes)
{
- int end = from + len;
- const ushort *uc = text + from;
+ qsizetype end = from + len;
attributes += from;
- uint i = 0;
+ qsizetype i = 0;
while (i < len) {
bool invalid;
- uint boundary = indic_nextSyllableBoundary(script, text, from+i, end, &invalid) - from;
+ qsizetype boundary = indic_nextSyllableBoundary(script, text, from+i, end, &invalid) - from;
attributes[i].graphemeBoundary = true;
if (boundary > len-1) boundary = len;
i++;
while (i < boundary) {
attributes[i].graphemeBoundary = false;
- ++uc;
++i;
}
assert(i == boundary);
@@ -1309,6 +1449,8 @@ static void indicAttributes(QChar::Script script, const ushort *text, uint from,
}
+#if QT_CONFIG(library)
+
#define LIBTHAI_MAJOR 0
/*
@@ -1319,38 +1461,87 @@ struct thcell_t {
unsigned char hilo; /**< upper/lower vowel/diacritic */
unsigned char top; /**< top-level mark */
};
-typedef int (*th_brk_def) (const unsigned char*, int*, size_t);
-typedef size_t (*th_next_cell_def) (const unsigned char *, size_t, struct thcell_t *, int);
-
-/* libthai related function handles */
-static th_brk_def th_brk = 0;
-static th_next_cell_def th_next_cell = 0;
-
-static int init_libthai() {
- static bool initialized = false;
- if (!initialized && (!th_brk || !th_next_cell)) {
- th_brk = (th_brk_def) QLibrary::resolve(QLatin1String("thai"), (int)LIBTHAI_MAJOR, "th_brk");
- th_next_cell = (th_next_cell_def)QLibrary::resolve(QLatin1String("thai"), LIBTHAI_MAJOR, "th_next_cell");
- initialized = true;
+
+using ThBrk = struct _ThBrk;
+
+namespace {
+
+class LibThai final
+{
+ Q_DISABLE_COPY_MOVE(LibThai)
+
+ using th_brk_new_def = ThBrk *(*)(const char *);
+ using th_brk_delete_def = void (*)(ThBrk *);
+ using th_brk_find_breaks_def = int (*)(ThBrk *, const unsigned char *, int *, size_t);
+ using th_next_cell_def = size_t (*)(const unsigned char *, size_t, struct thcell_t *, int);
+
+public:
+ LibThai() : m_library("thai"_L1, LIBTHAI_MAJOR)
+ {
+ m_th_brk_find_breaks =
+ reinterpret_cast<th_brk_find_breaks_def>(m_library.resolve("th_brk_find_breaks"));
+ m_th_next_cell = reinterpret_cast<th_next_cell_def>(m_library.resolve("th_next_cell"));
+
+ auto th_brk_new = reinterpret_cast<th_brk_new_def>(m_library.resolve("th_brk_new"));
+ if (th_brk_new) {
+ m_state = th_brk_new(nullptr);
+ m_th_brk_delete =
+ reinterpret_cast<th_brk_delete_def>(m_library.resolve("th_brk_delete"));
+ }
+ }
+
+ ~LibThai()
+ {
+ if (m_state && m_th_brk_delete)
+ m_th_brk_delete(m_state);
+ m_library.unload();
+ }
+
+ bool isInitialized() const { return m_th_brk_find_breaks && m_th_next_cell && m_state; }
+
+ int brk_find_breaks(const unsigned char *s, int *pos, size_t pos_sz) const
+ {
+ Q_ASSERT(m_state);
+ Q_ASSERT(m_th_brk_find_breaks);
+ return m_th_brk_find_breaks(m_state, s, pos, pos_sz);
+ }
+
+ size_t next_cell(const unsigned char *s, size_t len, struct thcell_t *cell, int is_decomp_am)
+ {
+ Q_ASSERT(m_th_next_cell);
+ return m_th_next_cell(s, len, cell, is_decomp_am);
}
- if (th_brk && th_next_cell)
- return 1;
- else
- return 0;
-}
-static void to_tis620(const ushort *string, uint len, char *cstr)
+private:
+ QLibrary m_library;
+
+ // Global state for th_brk_find_breaks().
+ // Note: even if signature for th_brk_find_breaks() suggests otherwise, the
+ // state is read-only, and so it is safe to use it from multiple threads after
+ // initialization. This is also stated in the libthai documentation.
+ ThBrk *m_state = nullptr;
+
+ th_brk_find_breaks_def m_th_brk_find_breaks = nullptr;
+ th_next_cell_def m_th_next_cell = nullptr;
+ th_brk_delete_def m_th_brk_delete = nullptr;
+};
+
+} // unnamed namespace
+
+Q_GLOBAL_STATIC(LibThai, g_libThai)
+
+static void to_tis620(const char16_t *string, qsizetype len, char *cstr)
{
- uint i;
- unsigned char *result = (unsigned char *)cstr;
+ qsizetype i;
+ unsigned char *result = reinterpret_cast<unsigned char *>(cstr);
for (i = 0; i < len; ++i) {
if (string[i] <= 0xa0)
- result[i] = (unsigned char)string[i];
+ result[i] = static_cast<unsigned char>(string[i]);
else if (string[i] >= 0xe01 && string[i] <= 0xe5b)
- result[i] = (unsigned char)(string[i] - 0xe00 + 0xa0);
+ result[i] = static_cast<unsigned char>(string[i] - 0xe00 + 0xa0);
else
- result[i] = (unsigned char)~0; // Same encoding as libthai uses for invalid chars
+ result[i] = static_cast<unsigned char>(~0); // Same encoding as libthai uses for invalid chars
}
result[len] = 0;
@@ -1359,23 +1550,19 @@ static void to_tis620(const ushort *string, uint len, char *cstr)
/*
* Thai Attributes: computes Word Break, Word Boundary and Char stop for THAI.
*/
-static void thaiAssignAttributes(const ushort *string, uint len, QCharAttributes *attributes)
+static void thaiAssignAttributes(const char16_t *string, qsizetype len, QCharAttributes *attributes)
{
- char s[128];
- char *cstr = s;
- int *break_positions = 0;
- int brp[128];
- int brp_size = 0;
- uint numbreaks, i, j, cell_length;
+ constexpr qsizetype Prealloc = 128;
+ QVarLengthArray<char, Prealloc + 1> s(len + 1);
+ QVarLengthArray<int, Prealloc> break_positions(len);
+ qsizetype numbreaks, i;
struct thcell_t tis_cell;
- if (!init_libthai())
- return ;
-
- if (len >= 128)
- cstr = (char *)malloc(len*sizeof(char) + 1);
+ LibThai *libThai = g_libThai;
+ if (!libThai || !libThai->isInitialized())
+ return;
- to_tis620(string, len, cstr);
+ to_tis620(string, len, s.data());
for (i = 0; i < len; ++i) {
attributes[i].wordBreak = false;
@@ -1384,61 +1571,53 @@ static void thaiAssignAttributes(const ushort *string, uint len, QCharAttributes
attributes[i].lineBreak = false;
}
- if (len > 128) {
- break_positions = (int*) malloc (sizeof(int) * len);
- memset (break_positions, 0, sizeof(int) * len);
- brp_size = len;
- }
- else {
- break_positions = brp;
- brp_size = 128;
- }
-
- if (break_positions) {
- attributes[0].wordBreak = true;
- attributes[0].wordStart = true;
- attributes[0].wordEnd = false;
- numbreaks = th_brk((const unsigned char *)cstr, break_positions, brp_size);
- for (i = 0; i < numbreaks; ++i) {
- attributes[break_positions[i]].wordBreak = true;
- attributes[break_positions[i]].wordStart = true;
- attributes[break_positions[i]].wordEnd = true;
- attributes[break_positions[i]].lineBreak = true;
- }
- if (numbreaks > 0)
- attributes[break_positions[numbreaks - 1]].wordStart = false;
-
- if (break_positions != brp)
- free(break_positions);
+ attributes[0].wordBreak = true;
+ attributes[0].wordStart = true;
+ attributes[0].wordEnd = false;
+ numbreaks = libThai->brk_find_breaks(reinterpret_cast<const unsigned char *>(s.data()),
+ break_positions.data(),
+ static_cast<size_t>(break_positions.size()));
+ for (i = 0; i < numbreaks; ++i) {
+ attributes[break_positions[i]].wordBreak = true;
+ attributes[break_positions[i]].wordStart = true;
+ attributes[break_positions[i]].wordEnd = true;
+ attributes[break_positions[i]].lineBreak = true;
}
+ if (numbreaks > 0)
+ attributes[break_positions[numbreaks - 1]].wordStart = false;
/* manage grapheme boundaries */
i = 0;
while (i < len) {
- cell_length = (uint)(th_next_cell((const unsigned char *)cstr + i, len - i, &tis_cell, true));
+ size_t cell_length =
+ libThai->next_cell(reinterpret_cast<const unsigned char *>(s.data()) + i,
+ size_t(len - i), &tis_cell, true);
attributes[i].graphemeBoundary = true;
- for (j = 1; j < cell_length; j++)
+ for (size_t j = 1; j < cell_length; ++j)
attributes[i + j].graphemeBoundary = false;
- /* Set graphemeBoundary for SARA AM */
- if (cstr[i + cell_length - 1] == (char)0xd3)
- attributes[i + cell_length - 1].graphemeBoundary = true;
-
i += cell_length;
}
-
- if (len >= 128)
- free(cstr);
}
-static void thaiAttributes(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes)
+#endif // QT_CONFIG(library)
+
+static void thaiAttributes(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes)
{
assert(script == QChar::Script_Thai);
- const ushort *uc = text + from;
+#if QT_CONFIG(library)
+ const char16_t *uc = text + from;
attributes += from;
Q_UNUSED(script);
thaiAssignAttributes(uc, len, attributes);
+#else
+ Q_UNUSED(script);
+ Q_UNUSED(text);
+ Q_UNUSED(from);
+ Q_UNUSED(len);
+ Q_UNUSED(attributes);
+#endif
}
/*
@@ -1505,11 +1684,11 @@ static const unsigned char tibetanForm[0x80] = {
#define tibetan_form(c) \
((c) >= 0x0f40 && (c) < 0x0fc0 ? (TibetanForm)tibetanForm[(c) - 0x0f40] : TibetanOther)
-static int tibetan_nextSyllableBoundary(const ushort *s, int start, int end, bool *invalid)
+static qsizetype tibetan_nextSyllableBoundary(const char16_t *s, qsizetype start, qsizetype end, bool *invalid)
{
- const ushort *uc = s + start;
+ const char16_t *uc = s + start;
- int pos = 0;
+ qsizetype pos = 0;
TibetanForm state = tibetan_form(*uc);
/* qDebug("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);*/
@@ -1549,16 +1728,15 @@ finish:
return start+pos;
}
-static void tibetanAttributes(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes)
+static void tibetanAttributes(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes)
{
- int end = from + len;
- const ushort *uc = text + from;
- uint i = 0;
+ qsizetype end = from + len;
+ qsizetype i = 0;
Q_UNUSED(script);
attributes += from;
while (i < len) {
bool invalid;
- uint boundary = tibetan_nextSyllableBoundary(text, from+i, end, &invalid) - from;
+ qsizetype boundary = tibetan_nextSyllableBoundary(text, from+i, end, &invalid) - from;
attributes[i].graphemeBoundary = true;
@@ -1566,7 +1744,6 @@ static void tibetanAttributes(QChar::Script script, const ushort *text, uint fro
i++;
while (i < boundary) {
attributes[i].graphemeBoundary = false;
- ++uc;
++i;
}
assert(i == boundary);
@@ -1617,6 +1794,8 @@ enum MymrCharClassFlags {
Mymr_CF_AFTER_KINZI = 0x00100000
};
+Q_DECLARE_MIXED_ENUM_OPERATORS(int, MymrCharClassValues, MymrCharClassFlags)
+
/* Characters that get refrered to by name */
enum MymrChar
{
@@ -1736,11 +1915,11 @@ static const signed char mymrStateTable[][Mymr_CC_COUNT] =
// calculate, using the state table, which one is the last character of the syllable
// that starts in the starting position.
*/
-static int myanmar_nextSyllableBoundary(const ushort *s, int start, int end, bool *invalid)
+static qsizetype myanmar_nextSyllableBoundary(const char16_t *s, qsizetype start, qsizetype end, bool *invalid)
{
- const ushort *uc = s + start;
+ const char16_t *uc = s + start;
int state = 0;
- int pos = start;
+ qsizetype pos = start;
*invalid = false;
while (pos < end) {
@@ -1749,7 +1928,7 @@ static int myanmar_nextSyllableBoundary(const ushort *s, int start, int end, boo
if (pos == start)
*invalid = (bool)(charClass & Mymr_CF_DOTTED_CIRCLE);
- MMDEBUG("state[%d]=%d class=%8x (uc=%4x)", pos - start, state, charClass, *uc);
+ MMDEBUG("state[%lld]=%d class=%8x (uc=%4x)", qlonglong(pos - start), state, charClass, *uc);
if (state < 0) {
if (state < -1)
@@ -1762,16 +1941,15 @@ static int myanmar_nextSyllableBoundary(const ushort *s, int start, int end, boo
return pos;
}
-static void myanmarAttributes(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes)
+static void myanmarAttributes(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes)
{
- int end = from + len;
- const ushort *uc = text + from;
- uint i = 0;
+ qsizetype end = from + len;
+ qsizetype i = 0;
Q_UNUSED(script);
attributes += from;
while (i < len) {
bool invalid;
- uint boundary = myanmar_nextSyllableBoundary(text, from+i, end, &invalid) - from;
+ qsizetype boundary = myanmar_nextSyllableBoundary(text, from+i, end, &invalid) - from;
attributes[i].graphemeBoundary = true;
attributes[i].lineBreak = true;
@@ -1781,7 +1959,6 @@ static void myanmarAttributes(QChar::Script script, const ushort *text, uint fro
i++;
while (i < boundary) {
attributes[i].graphemeBoundary = false;
- ++uc;
++i;
}
assert(i == boundary);
@@ -1864,6 +2041,7 @@ enum KhmerCharClassFlags {
CF_POS_MASK = 0x000f0000
};
+Q_DECLARE_MIXED_ENUM_OPERATORS(int, KhmerCharClassValues, KhmerCharClassFlags)
/* Characters that get referred to by name */
enum KhmerChar {
@@ -2071,11 +2249,11 @@ static const signed char khmerStateTable[][CC_COUNT] =
// calculate, using the state table, which one is the last character of the syllable
// that starts in the starting position.
*/
-static int khmer_nextSyllableBoundary(const ushort *s, int start, int end, bool *invalid)
+static qsizetype khmer_nextSyllableBoundary(const char16_t *s, qsizetype start, qsizetype end, bool *invalid)
{
- const ushort *uc = s + start;
+ const char16_t *uc = s + start;
int state = 0;
- int pos = start;
+ qsizetype pos = start;
*invalid = false;
while (pos < end) {
@@ -2085,7 +2263,7 @@ static int khmer_nextSyllableBoundary(const ushort *s, int start, int end, bool
}
state = khmerStateTable[state][charClass & CF_CLASS_MASK];
- KHDEBUG("state[%d]=%d class=%8lx (uc=%4x)", pos - start, state,
+ KHDEBUG("state[%lld]=%d class=%8lx (uc=%4x)", qlonglong(pos - start), state,
charClass, *uc );
if (state < 0) {
@@ -2097,16 +2275,15 @@ static int khmer_nextSyllableBoundary(const ushort *s, int start, int end, bool
return pos;
}
-static void khmerAttributes(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes)
+static void khmerAttributes(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes)
{
- int end = from + len;
- const ushort *uc = text + from;
- uint i = 0;
+ qsizetype end = from + len;
+ qsizetype i = 0;
Q_UNUSED(script);
attributes += from;
while ( i < len ) {
bool invalid;
- uint boundary = khmer_nextSyllableBoundary( text, from+i, end, &invalid ) - from;
+ qsizetype boundary = khmer_nextSyllableBoundary( text, from+i, end, &invalid ) - from;
attributes[i].graphemeBoundary = true;
@@ -2114,7 +2291,6 @@ static void khmerAttributes(QChar::Script script, const ushort *text, uint from,
i++;
while ( i < boundary ) {
attributes[i].graphemeBoundary = false;
- ++uc;
++i;
}
assert( i == boundary );
@@ -2191,52 +2367,52 @@ const CharAttributeFunction charAttributeFunction[] = {
khmerAttributes
};
-static void getCharAttributes(const ushort *string, uint stringLength,
- const QUnicodeTools::ScriptItem *items, uint numItems,
+static void getCharAttributes(const char16_t *string, qsizetype stringLength,
+ const QUnicodeTools::ScriptItem *items, qsizetype numItems,
QCharAttributes *attributes)
{
if (stringLength == 0)
return;
- for (uint i = 0; i < numItems; ++i) {
+ for (qsizetype i = 0; i < numItems; ++i) {
QChar::Script script = items[i].script;
if (script > QChar::Script_Khmer)
script = QChar::Script_Common;
CharAttributeFunction attributeFunction = charAttributeFunction[script];
if (!attributeFunction)
continue;
- int end = i < numItems - 1 ? items[i + 1].position : stringLength;
+ qsizetype end = i < numItems - 1 ? items[i + 1].position : stringLength;
attributeFunction(script, string, items[i].position, end - items[i].position, attributes);
}
}
}
-Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
- const ScriptItem *items, int numItems,
+Q_CORE_EXPORT void initCharAttributes(QStringView string,
+ const ScriptItem *items, qsizetype numItems,
QCharAttributes *attributes, CharAttributeOptions options)
{
- if (length <= 0)
+ if (string.size() <= 0)
return;
if (!(options & DontClearAttributes))
- ::memset(attributes, 0, (length + 1) * sizeof(QCharAttributes));
+ ::memset(attributes, 0, (string.size() + 1) * sizeof(QCharAttributes));
if (options & GraphemeBreaks)
- getGraphemeBreaks(string, length, attributes);
+ getGraphemeBreaks(string.utf16(), string.size(), attributes);
if (options & WordBreaks)
- getWordBreaks(string, length, attributes);
+ getWordBreaks(string.utf16(), string.size(), attributes);
if (options & SentenceBreaks)
- getSentenceBreaks(string, length, attributes);
+ getSentenceBreaks(string.utf16(), string.size(), attributes);
if (options & LineBreaks)
- getLineBreaks(string, length, attributes, options);
+ getLineBreaks(string.utf16(), string.size(), attributes, options);
if (options & WhiteSpaces)
- getWhiteSpaces(string, length, attributes);
+ getWhiteSpaces(string.utf16(), string.size(), attributes);
if (!qt_initcharattributes_default_algorithm_only) {
if (!items || numItems <= 0)
return;
- Tailored::getCharAttributes(string, length, items, numItems, attributes);
+ Tailored::getCharAttributes(string.utf16(), string.size(), items, numItems, attributes);
}
}
@@ -2247,16 +2423,16 @@ Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
//
// ----------------------------------------------------------------------------
-Q_CORE_EXPORT void initScripts(const ushort *string, int length, ScriptItemArray *scripts)
+Q_CORE_EXPORT void initScripts(QStringView string, ScriptItemArray *scripts)
{
- int sor = 0;
- int eor = 0;
+ qsizetype sor = 0;
+ qsizetype eor = 0;
QChar::Script script = QChar::Script_Common;
- for (int i = 0; i < length; ++i, eor = i) {
- char32_t ucs4 = string[i];
- if (QChar::isHighSurrogate(ucs4) && i + 1 < length) {
- ushort low = string[i + 1];
+ for (qsizetype i = 0; i < string.size(); ++i, eor = i) {
+ char32_t ucs4 = string[i].unicode();
+ if (QChar::isHighSurrogate(ucs4) && i + 1 < string.size()) {
+ ushort low = string[i + 1].unicode();
if (QChar::isLowSurrogate(low)) {
ucs4 = QChar::surrogateToUcs4(ucs4, low);
++i;
@@ -2294,7 +2470,7 @@ Q_CORE_EXPORT void initScripts(const ushort *string, int length, ScriptItemArray
}
Q_ASSERT(script >= QChar::Script_Common);
- Q_ASSERT(eor == length);
+ Q_ASSERT(eor == string.size());
scripts->append(ScriptItem{sor, script});
}
diff --git a/src/corelib/text/qunicodetools_p.h b/src/corelib/text/qunicodetools_p.h
index 5715444025..06f31a5511 100644
--- a/src/corelib/text/qunicodetools_p.h
+++ b/src/corelib/text/qunicodetools_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QUNICODETOOLS_P_H
#define QUNICODETOOLS_P_H
@@ -74,7 +38,7 @@ namespace QUnicodeTools {
struct ScriptItem
{
- int position;
+ qsizetype position;
QChar::Script script;
};
@@ -91,19 +55,18 @@ enum CharAttributeOption {
LineBreaks = 0x08,
WhiteSpaces = 0x10,
HangulLineBreakTailoring = 0x20,
- DefaultOptionsCompat = GraphemeBreaks | LineBreaks | WhiteSpaces, // ### remove
DontClearAttributes = 0x1000
};
Q_DECLARE_FLAGS(CharAttributeOptions, CharAttributeOption)
// attributes buffer has to have a length of string length + 1
-Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
- const ScriptItem *items, int numItems,
- QCharAttributes *attributes, CharAttributeOptions options = DefaultOptionsCompat);
+Q_CORE_EXPORT void initCharAttributes(QStringView str,
+ const ScriptItem *items, qsizetype numItems,
+ QCharAttributes *attributes, CharAttributeOptions options);
-Q_CORE_EXPORT void initScripts(const ushort *string, int length, ScriptItemArray *scripts);
+Q_CORE_EXPORT void initScripts(QStringView str, ScriptItemArray *scripts);
} // namespace QUnicodeTools
diff --git a/src/corelib/text/qutf8stringview.h b/src/corelib/text/qutf8stringview.h
new file mode 100644
index 0000000000..fe105e283e
--- /dev/null
+++ b/src/corelib/text/qutf8stringview.h
@@ -0,0 +1,434 @@
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+#ifndef QUTF8STRINGVIEW_H
+#define QUTF8STRINGVIEW_H
+
+#if 0
+#pragma qt_class(QUtf8StringView)
+#endif
+
+#include <QtCore/qstringalgorithms.h>
+#include <QtCore/qstringfwd.h>
+#include <QtCore/qarraydata.h> // for QContainerImplHelper
+#include <QtCore/qbytearrayview.h>
+#include <QtCore/qcompare.h>
+
+#include <string>
+#include <string_view>
+#include <QtCore/q20type_traits.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate {
+template <typename Char>
+using IsCompatibleChar8TypeHelper = std::disjunction<
+#ifdef __cpp_char8_t
+ std::is_same<Char, char8_t>,
+#endif
+ std::is_same<Char, char>,
+ std::is_same<Char, uchar>,
+ std::is_same<Char, signed char>
+ >;
+template <typename Char>
+using IsCompatibleChar8Type
+ = IsCompatibleChar8TypeHelper<q20::remove_cvref_t<Char>>;
+
+template <typename Pointer>
+struct IsCompatiblePointer8Helper : std::false_type {};
+template <typename Char>
+struct IsCompatiblePointer8Helper<Char*>
+ : IsCompatibleChar8Type<Char> {};
+template <typename Pointer>
+using IsCompatiblePointer8
+ = IsCompatiblePointer8Helper<q20::remove_cvref_t<Pointer>>;
+
+template <typename T, typename Enable = void>
+struct IsContainerCompatibleWithQUtf8StringView : std::false_type {};
+
+template <typename T>
+struct IsContainerCompatibleWithQUtf8StringView<T, std::enable_if_t<std::conjunction_v<
+ // lacking concepts and ranges, we accept any T whose std::data yields a suitable pointer ...
+ IsCompatiblePointer8<decltype(std::data(std::declval<const T &>()))>,
+ // ... and that has a suitable size ...
+ std::is_convertible<
+ decltype(std::size(std::declval<const T &>())),
+ qsizetype
+ >,
+ // ... and it's a range as it defines an iterator-like API
+ IsCompatibleChar8Type<typename std::iterator_traits<
+ decltype(std::begin(std::declval<const T &>()))>::value_type
+ >,
+ std::is_convertible<
+ decltype( std::begin(std::declval<const T &>()) != std::end(std::declval<const T &>()) ),
+ bool
+ >,
+
+ // This needs to be treated specially due to the empty vs null distinction
+ std::negation<std::is_same<std::decay_t<T>, QByteArray>>,
+
+ // This has a compatible value_type, but explicitly a different encoding
+ std::negation<std::is_same<std::decay_t<T>, QLatin1StringView>>,
+
+ // Don't make an accidental copy constructor
+ std::negation<std::disjunction<
+ std::is_same<std::decay_t<T>, QBasicUtf8StringView<true>>,
+ std::is_same<std::decay_t<T>, QBasicUtf8StringView<false>>
+ >>
+ >>> : std::true_type {};
+
+struct hide_char8_t {
+#ifdef __cpp_char8_t
+ using type = char8_t;
+#endif
+};
+
+struct wrap_char { using type = char; };
+
+} // namespace QtPrivate
+
+#ifdef Q_QDOC
+#define QBasicUtf8StringView QUtf8StringView
+#else
+template <bool UseChar8T>
+#endif
+class QBasicUtf8StringView
+{
+public:
+#ifndef Q_QDOC
+ using storage_type = typename std::conditional<UseChar8T,
+ QtPrivate::hide_char8_t,
+ QtPrivate::wrap_char
+ >::type::type;
+#else
+ using storage_type = typename QtPrivate::hide_char8_t;
+#endif
+ typedef const storage_type value_type;
+ typedef qptrdiff difference_type;
+ typedef qsizetype size_type;
+ typedef value_type &reference;
+ typedef value_type &const_reference;
+ typedef value_type *pointer;
+ typedef value_type *const_pointer;
+
+ typedef pointer iterator;
+ typedef const_pointer const_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+private:
+ template <typename Char>
+ using if_compatible_char = std::enable_if_t<QtPrivate::IsCompatibleChar8Type<Char>::value, bool>;
+
+ template <typename Pointer>
+ using if_compatible_pointer = std::enable_if_t<QtPrivate::IsCompatiblePointer8<Pointer>::value, bool>;
+
+ template <typename T>
+ using if_compatible_qstring_like = std::enable_if_t<std::is_same_v<T, QByteArray>, bool>;
+
+ template <typename T>
+ using if_compatible_container = std::enable_if_t<QtPrivate::IsContainerCompatibleWithQUtf8StringView<T>::value, bool>;
+
+ template <typename Container>
+ static constexpr qsizetype lengthHelperContainer(const Container &c) noexcept
+ {
+ return qsizetype(std::size(c));
+ }
+
+ // Note: Do not replace with std::size(const Char (&)[N]), cause the result
+ // will be of by one.
+ template <typename Char, size_t N>
+ static constexpr qsizetype lengthHelperContainer(const Char (&str)[N]) noexcept
+ {
+ const auto it = std::char_traits<Char>::find(str, N, Char(0));
+ const auto end = it ? it : std::next(str, N);
+ return qsizetype(std::distance(str, end));
+ }
+
+ template <typename Char>
+ static const storage_type *castHelper(const Char *str) noexcept
+ { return reinterpret_cast<const storage_type*>(str); }
+ static constexpr const storage_type *castHelper(const storage_type *str) noexcept
+ { return str; }
+
+public:
+ constexpr QBasicUtf8StringView() noexcept
+ : m_data(nullptr), m_size(0) {}
+ constexpr QBasicUtf8StringView(std::nullptr_t) noexcept
+ : QBasicUtf8StringView() {}
+
+ template <typename Char, if_compatible_char<Char> = true>
+ constexpr QBasicUtf8StringView(const Char *str, qsizetype len)
+ : m_data(castHelper(str)),
+ m_size((Q_ASSERT(len >= 0), Q_ASSERT(str || !len), len)) {}
+
+ template <typename Char, if_compatible_char<Char> = true>
+ constexpr QBasicUtf8StringView(const Char *f, const Char *l)
+ : QBasicUtf8StringView(f, l - f) {}
+
+#ifdef Q_QDOC
+ template <typename Char, size_t N>
+ constexpr QBasicUtf8StringView(const Char (&array)[N]) noexcept;
+
+ template <typename Char>
+ constexpr QBasicUtf8StringView(const Char *str) noexcept;
+#else
+ template <typename Pointer, if_compatible_pointer<Pointer> = true>
+ constexpr QBasicUtf8StringView(const Pointer &str) noexcept
+ : QBasicUtf8StringView(str,
+ str ? std::char_traits<std::remove_cv_t<std::remove_pointer_t<Pointer>>>::length(str) : 0) {}
+#endif
+
+#ifdef Q_QDOC
+ QBasicUtf8StringView(const QByteArray &str) noexcept;
+ constexpr QBasicUtf8StringView(const storage_type *d, qsizetype n) noexcept {};
+#else
+ template <typename String, if_compatible_qstring_like<String> = true>
+ QBasicUtf8StringView(const String &str) noexcept
+ : QBasicUtf8StringView(str.isNull() ? nullptr : str.data(), qsizetype(str.size())) {}
+#endif
+
+ template <typename Container, if_compatible_container<Container> = true>
+ constexpr QBasicUtf8StringView(const Container &c) noexcept
+ : QBasicUtf8StringView(std::data(c), lengthHelperContainer(c)) {}
+
+#if defined(__cpp_char8_t) && !defined(Q_QDOC)
+ constexpr QBasicUtf8StringView(QBasicUtf8StringView<!UseChar8T> other)
+ : QBasicUtf8StringView(other.data(), other.size()) {}
+#endif
+
+ template <typename Char, size_t Size, if_compatible_char<Char> = true>
+ [[nodiscard]] constexpr static QBasicUtf8StringView fromArray(const Char (&string)[Size]) noexcept
+ { return QBasicUtf8StringView(string, Size); }
+
+ [[nodiscard]] inline QString toString() const; // defined in qstring.h
+
+ [[nodiscard]] constexpr qsizetype size() const noexcept { return m_size; }
+ [[nodiscard]] constexpr const_pointer data() const noexcept { return m_data; }
+#ifdef __cpp_char8_t
+ [[nodiscard]] const char8_t *utf8() const noexcept { return reinterpret_cast<const char8_t*>(m_data); }
+#endif
+
+ [[nodiscard]] constexpr storage_type operator[](qsizetype n) const
+ { verify(n, 1); return m_data[n]; }
+
+ //
+ // QString API
+ //
+
+ [[nodiscard]] constexpr storage_type at(qsizetype n) const { return (*this)[n]; }
+
+ [[nodiscard]]
+ constexpr QBasicUtf8StringView mid(qsizetype pos, qsizetype n = -1) const
+ {
+ using namespace QtPrivate;
+ auto result = QContainerImplHelper::mid(size(), &pos, &n);
+ return result == QContainerImplHelper::Null ? QBasicUtf8StringView() : QBasicUtf8StringView(m_data + pos, n);
+ }
+ [[nodiscard]]
+ constexpr QBasicUtf8StringView left(qsizetype n) const
+ {
+ if (size_t(n) >= size_t(size()))
+ n = size();
+ return QBasicUtf8StringView(m_data, n);
+ }
+ [[nodiscard]]
+ constexpr QBasicUtf8StringView right(qsizetype n) const
+ {
+ if (size_t(n) >= size_t(size()))
+ n = size();
+ return QBasicUtf8StringView(m_data + m_size - n, n);
+ }
+
+ [[nodiscard]] constexpr QBasicUtf8StringView sliced(qsizetype pos) const
+ { verify(pos, 0); return QBasicUtf8StringView{m_data + pos, m_size - pos}; }
+ [[nodiscard]] constexpr QBasicUtf8StringView sliced(qsizetype pos, qsizetype n) const
+ { verify(pos, n); return QBasicUtf8StringView(m_data + pos, n); }
+ [[nodiscard]] constexpr QBasicUtf8StringView first(qsizetype n) const
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] constexpr QBasicUtf8StringView last(qsizetype n) const
+ { verify(0, n); return sliced(m_size - n, n); }
+ [[nodiscard]] constexpr QBasicUtf8StringView chopped(qsizetype n) const
+ { verify(0, n); return sliced(0, m_size - n); }
+
+ constexpr void truncate(qsizetype n)
+ { verify(0, n); m_size = n; }
+ constexpr void chop(qsizetype n)
+ { verify(0, n); m_size -= n; }
+
+ [[nodiscard]] inline bool isValidUtf8() const noexcept
+ {
+ return QByteArrayView(reinterpret_cast<const char *>(data()), size()).isValidUtf8();
+ }
+
+ //
+ // STL compatibility API:
+ //
+ [[nodiscard]] const_iterator begin() const noexcept { return data(); }
+ [[nodiscard]] const_iterator end() const noexcept { return data() + size(); }
+ [[nodiscard]] const_iterator cbegin() const noexcept { return begin(); }
+ [[nodiscard]] const_iterator cend() const noexcept { return end(); }
+ [[nodiscard]] const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ [[nodiscard]] const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ [[nodiscard]] const_reverse_iterator crbegin() const noexcept { return rbegin(); }
+ [[nodiscard]] const_reverse_iterator crend() const noexcept { return rend(); }
+
+ [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; }
+ [[nodiscard]] constexpr storage_type front() const { return Q_ASSERT(!empty()), m_data[0]; }
+ [[nodiscard]] constexpr storage_type back() const { return Q_ASSERT(!empty()), m_data[m_size - 1]; }
+
+ [[nodiscard]] Q_IMPLICIT operator std::basic_string_view<storage_type>() const noexcept
+ { return std::basic_string_view<storage_type>(data(), size_t(size())); }
+
+ //
+ // Qt compatibility API:
+ //
+ [[nodiscard]] constexpr bool isNull() const noexcept { return !m_data; }
+ [[nodiscard]] constexpr bool isEmpty() const noexcept { return empty(); }
+ [[nodiscard]] constexpr qsizetype length() const noexcept
+ { return size(); }
+
+ [[nodiscard]] int compare(QBasicUtf8StringView other,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ {
+ return QtPrivate::compareStrings(*this, other, cs);
+ }
+
+ [[nodiscard]] int compare(QChar other,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] int compare(QStringView other,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] int compare(QLatin1StringView other,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] int compare(const QByteArray &other,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+
+ [[nodiscard]] bool equal(QChar other) const noexcept;
+ [[nodiscard]] bool equal(QStringView other) const noexcept;
+ [[nodiscard]] bool equal(QLatin1StringView other) const noexcept;
+ [[nodiscard]] bool equal(const QByteArray &other) const noexcept;
+
+private:
+ [[nodiscard]] static inline int compare(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
+ {
+ return QtPrivate::compareStrings(QBasicUtf8StringView<false>(lhs.data(), lhs.size()),
+ QBasicUtf8StringView<false>(rhs.data(), rhs.size()));
+ }
+
+ friend bool
+ comparesEqual(const QBasicUtf8StringView &lhs, const QBasicUtf8StringView &rhs) noexcept
+ {
+ return lhs.size() == rhs.size()
+ && QtPrivate::equalStrings(QBasicUtf8StringView<false>(lhs.data(), lhs.size()),
+ QBasicUtf8StringView<false>(rhs.data(), rhs.size()));
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QBasicUtf8StringView &rhs) noexcept
+ {
+ const int res = QBasicUtf8StringView::compare(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView)
+
+ friend bool
+ comparesEqual(const QBasicUtf8StringView &lhs, const QLatin1StringView &rhs) noexcept
+ {
+ return lhs.equal(rhs);
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QLatin1StringView &rhs) noexcept
+ {
+ const int res = lhs.compare(rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, QLatin1StringView)
+
+ friend bool
+ comparesEqual(const QBasicUtf8StringView &lhs, const QStringView &rhs) noexcept
+ { return lhs.equal(rhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QStringView &rhs) noexcept
+ {
+ const int res = lhs.compare(rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, QStringView)
+
+ friend bool comparesEqual(const QBasicUtf8StringView &lhs, const QChar &rhs) noexcept
+ { return lhs.equal(rhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QChar &rhs) noexcept
+ {
+ const int res = lhs.compare(rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, QChar)
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, char16_t)
+
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ friend bool
+ comparesEqual(const QBasicUtf8StringView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ return lhs.size() == rhs.size()
+ && QtPrivate::equalStrings(QBasicUtf8StringView<false>(lhs.data(), lhs.size()),
+ QBasicUtf8StringView<false>(rhs.data(), rhs.size()));
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ const int res = QtPrivate::compareStrings(QBasicUtf8StringView<false>(lhs.data(), lhs.size()),
+ QBasicUtf8StringView<false>(rhs.data(), rhs.size()));
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, QByteArrayView, QT_ASCII_CAST_WARN)
+
+ friend bool
+ comparesEqual(const QBasicUtf8StringView &lhs, const QByteArray &rhs) noexcept
+ {
+ return lhs.equal(rhs);
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QByteArray &rhs) noexcept
+ {
+ const int res = lhs.compare(rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, QByteArray, QT_ASCII_CAST_WARN)
+
+ friend bool comparesEqual(const QBasicUtf8StringView &lhs, const char *rhs) noexcept
+ { return comparesEqual(lhs, QByteArrayView(rhs)); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const char *rhs) noexcept
+ { return compareThreeWay(lhs, QByteArrayView(rhs)); }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, const char *, QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= size());
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= size() - pos);
+ }
+ const storage_type *m_data;
+ qsizetype m_size;
+};
+
+constexpr QByteArrayView::QByteArrayView(QUtf8StringView v) noexcept
+ : QByteArrayView(v.data(), v.size())
+{}
+
+#ifdef Q_QDOC
+#undef QBasicUtf8StringView
+#else
+template <bool UseChar8T>
+Q_DECLARE_TYPEINFO_BODY(QBasicUtf8StringView<UseChar8T>, Q_PRIMITIVE_TYPE);
+
+template <typename QStringLike, std::enable_if_t<std::is_same_v<QStringLike, QByteArray>, bool> = true>
+[[nodiscard]] inline q_no_char8_t::QUtf8StringView qToUtf8StringViewIgnoringNull(const QStringLike &s) noexcept
+{ return q_no_char8_t::QUtf8StringView(s.begin(), s.size()); }
+#endif // Q_QDOC
+
+QT_END_NAMESPACE
+
+#endif /* QUTF8STRINGVIEW_H */
diff --git a/src/corelib/text/qutf8stringview.qdoc b/src/corelib/text/qutf8stringview.qdoc
new file mode 100644
index 0000000000..b433e5b995
--- /dev/null
+++ b/src/corelib/text/qutf8stringview.qdoc
@@ -0,0 +1,720 @@
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \class QUtf8StringView
+ \inmodule QtCore
+ \since 6.0
+ \brief The QUtf8StringView class provides a unified view on UTF-8 strings
+ with a read-only subset of the QString API.
+ \reentrant
+ \ingroup tools
+ \ingroup string-processing
+
+ \compares strong
+ \compareswith strong char16_t QChar {const char16_t *} QString QStringView \
+ QLatin1StringView
+ \endcompareswith
+ \compareswith strong {const char *} QByteArray QByteArrayView
+ The contents of byte arrays is interpreted as utf-8.
+ \endcompareswith
+
+ A QUtf8StringView references a contiguous portion of a UTF-8
+ string it does not own. It acts as an interface type to all kinds
+ of UTF-8 string, without the need to construct a QString or
+ QByteArray first.
+
+ The UTF-8 string may be represented as an array (or an
+ array-compatible data-structure such as std::basic_string, etc.)
+ of \c char8_t, \c char, \c{signed char} or \c{unsigned char}.
+
+ QUtf8StringView is designed as an interface type; its main
+ use-case is as a function parameter type. When QUtf8StringViews
+ are used as automatic variables or data members, care must be
+ taken to ensure that the referenced string data (for example,
+ owned by a std::u8string) outlives the QUtf8StringView on all code
+ paths, lest the string view ends up referencing deleted data.
+
+ When used as an interface type, QUtf8StringView allows a single
+ function to accept a wide variety of UTF-8 string data
+ sources. One function accepting QUtf8StringView thus replaces
+ several function overloads (taking e.g. QByteArray), while at the
+ same time enabling even more string data sources to be passed to
+ the function, such as \c{u8"Hello World"}, a \c char8_t (C++20) or
+ \c char (C++17) string literal. The \c char8_t incompatibility
+ between C++17 and C++20 goes away when using QUtf8StringView.
+
+ Like all views, QUtf8StringViews should be passed by value, not by
+ reference-to-const:
+ \snippet code/src_corelib_text_qutf8stringview.cpp 0
+
+ If you want to give your users maximum freedom in what strings
+ they can pass to your function, consider using QAnyStringView
+ instead.
+
+ QUtf8StringView can also be used as the return value of a
+ function. If you call a function returning QUtf8StringView, take
+ extra care to not keep the QUtf8StringView around longer than the
+ function promises to keep the referenced string data alive. If in
+ doubt, obtain a strong reference to the data by calling toString()
+ to convert the QUtf8StringView into a QString.
+
+ QUtf8StringView is a \e{Literal Type}.
+
+ \section2 Compatible Character Types
+
+ QUtf8StringView accepts strings over a variety of character types:
+
+ \list
+ \li \c char (both signed and unsigned)
+ \li \c char8_t (C++20 only)
+ \endlist
+
+ \section2 Sizes and Sub-Strings
+
+ All sizes and positions in QUtf8StringView functions are in
+ UTF-8 code points (that is, UTF-8 multibyte sequences count as
+ two, three or four, depending on their length). QUtf8StringView
+ does not an attempt to detect or prevent slicing right through
+ UTF-8 multibyte sequences. This is similar to the situation with
+ QStringView and surrogate pairs.
+
+ \section2 C++20, char8_t, and QUtf8StringView
+
+ In C++20, \c{u8""} string literals changed their type from
+ \c{const char[]} to \c{const char8_t[]}. If Qt 6 could have depended
+ on C++20, QUtf8StringView would store \c char8_t natively, and the
+ following functions and aliases would use (pointers to) \c char8_t:
+
+ \list
+ \li storage_type, value_type, etc
+ \li begin(), end(), data(), etc
+ \li front(), back(), at(), operator[]()
+ \endlist
+
+ This is what QUtf8StringView is expected to look like in Qt 7, but for
+ Qt 6, this was not possible. Instead of locking users into a C++17-era
+ interface for the next decade, Qt provides two QUtf8StringView classes,
+ in different (inline) namespaces. The first, in namespace \c{q_no_char8_t},
+ has a value_type of \c{const char} and is universally available.
+ The second, in namespace \c{q_has_char8_t}, has a value_type of
+ \c{const char8_t} and is only available when compiling in C++20 mode.
+
+ \c{q_no_char8_t} is an inline namespace regardless of C++ edition, to avoid
+ accidental binary incompatibilities. To use the \c{char8_t} version, you
+ need to name it explicitly with \c{q_has_char8_t::QUtf8StringView}.
+
+ Internally, both are instantiations of the same template class,
+ QBasicUtf8StringView. Please do not use the template class's name in your
+ source code.
+
+ \sa QAnyStringView, QUtf8StringView, QString
+*/
+
+/*!
+ \typedef QUtf8StringView::storage_type
+
+ Alias for \c{char}.
+*/
+
+/*!
+ \typedef QUtf8StringView::value_type
+
+ Alias for \c{const char}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QUtf8StringView::difference_type
+
+ Alias for \c{std::ptrdiff_t}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QUtf8StringView::size_type
+
+ Alias for qsizetype. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QUtf8StringView::reference
+
+ Alias for \c{value_type &}. Provided for compatibility with the STL.
+
+ QUtf8StringView does not support mutable references, so this is the same
+ as const_reference.
+*/
+
+/*!
+ \typedef QUtf8StringView::const_reference
+
+ Alias for \c{value_type &}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QUtf8StringView::pointer
+
+ Alias for \c{value_type *}. Provided for compatibility with the STL.
+
+ QUtf8StringView does not support mutable pointers, so this is the same
+ as const_pointer.
+*/
+
+/*!
+ \typedef QUtf8StringView::const_pointer
+
+ Alias for \c{value_type *}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QUtf8StringView::iterator
+
+ This typedef provides an STL-style const iterator for QUtf8StringView.
+
+ QUtf8StringView does not support mutable iterators, so this is the same
+ as const_iterator.
+
+ \sa const_iterator, reverse_iterator
+*/
+
+/*!
+ \typedef QUtf8StringView::const_iterator
+
+ This typedef provides an STL-style const iterator for QUtf8StringView.
+
+ \sa iterator, const_reverse_iterator
+*/
+
+/*!
+ \typedef QUtf8StringView::reverse_iterator
+
+ This typedef provides an STL-style const reverse iterator for QUtf8StringView.
+
+ QUtf8StringView does not support mutable reverse iterators, so this is the
+ same as const_reverse_iterator.
+
+ \sa const_reverse_iterator, iterator
+*/
+
+/*!
+ \typedef QUtf8StringView::const_reverse_iterator
+
+ This typedef provides an STL-style const reverse iterator for QUtf8StringView.
+
+ \sa reverse_iterator, const_iterator
+*/
+
+/*!
+ \fn QUtf8StringView::QUtf8StringView()
+
+ Constructs a null string view.
+
+ \sa isNull()
+*/
+
+/*!
+ \fn QUtf8StringView::QUtf8StringView(const storage_type *d, qsizetype n)
+ \internal
+*/
+
+/*!
+ \fn QUtf8StringView::QUtf8StringView(std::nullptr_t)
+
+ Constructs a null string view.
+
+ \sa isNull()
+*/
+
+/*!
+ \fn template <typename Char, QUtf8StringView::if_compatible_char<Char> = true> QUtf8StringView::QUtf8StringView(const Char *str, qsizetype len)
+
+ Constructs a string view on \a str with length \a len.
+
+ The range \c{[str,len)} must remain valid for the lifetime of this string view object.
+
+ Passing \nullptr as \a str is safe if \a len is 0, too, and results in a null string view.
+
+ The behavior is undefined if \a len is negative or, when positive, if \a str is \nullptr.
+
+ This constructor only participates in overload resolution if \c Char is a compatible
+ character type. The compatible character types are: \c char8_t, \c char, \c{signed char} and
+ \c{unsigned char}.
+*/
+
+/*!
+ \fn template <typename Char, QUtf8StringView::if_compatible_char<Char> = true> QUtf8StringView::QUtf8StringView(const Char *first, const Char *last)
+
+ Constructs a string view on \a first with length (\a last - \a first).
+
+ The range \c{[first,last)} must remain valid for the lifetime of
+ this string view object.
+
+ Passing \c \nullptr as \a first is safe if \a last is \nullptr, too,
+ and results in a null string view.
+
+ The behavior is undefined if \a last precedes \a first, or \a first
+ is \nullptr and \a last is not.
+
+ This constructor only participates in overload resolution if \c Char is a compatible
+ character type. The compatible character types are: \c char8_t, \c char, \c{signed char} and
+ \c{unsigned char}.
+*/
+
+/*!
+ \fn template <typename Char> QUtf8StringView::QUtf8StringView(const Char *str)
+
+ Constructs a string view on \a str. The length is determined
+ by scanning for the first \c{Char(0)}.
+
+ \a str must remain valid for the lifetime of this string view object.
+
+ Passing \nullptr as \a str is safe and results in a null string view.
+
+ This constructor only participates in overload resolution if \a str
+ is not an array and if \c Char is a compatible character type. The
+ compatible character types are: \c char8_t, \c char, \c{signed char} and
+ \c{unsigned char}.
+*/
+
+/*!
+ \fn template <typename Char, size_t N> QUtf8StringView::QUtf8StringView(const Char (&string)[N])
+
+ Constructs a string view on the character string literal \a string.
+ The view covers the array until the first \c{Char(0)} is encountered,
+ or \c N, whichever comes first.
+ If you need the full array, use fromArray() instead.
+
+ \a string must remain valid for the lifetime of this string view
+ object.
+
+ This constructor only participates in overload resolution if \a string
+ is an actual array and if \c Char is a compatible character type. The
+ compatible character types are: \c char8_t, \c char, \c{signed char} and
+ \c{unsigned char}.
+
+ \sa fromArray()
+*/
+
+/*!
+ \fn template <typename Container, QUtf8StringView::if_compatible_container<Container>> QUtf8StringView::QUtf8StringView(const Container &str)
+
+ Constructs a string view on \a str. The length is taken from \c{std::size(str)}.
+
+ \c{std::data(str)} must remain valid for the lifetime of this string view object.
+
+ This constructor only participates in overload resolution if \c Container is a
+ container with a compatible character type as \c{value_type}. The
+ compatible character types are: \c char8_t, \c char, \c{signed char} and
+ \c{unsigned char}.
+
+ The string view will be empty if and only if \c{std::size(str) == 0}. It is unspecified
+ whether this constructor can result in a null string view (\c{std::data(str)} would
+ have to return \nullptr for this).
+
+ \sa isNull(), isEmpty()
+*/
+
+/*!
+ \fn template <typename Char, size_t Size, QUtf8StringView::if_compatible_char<Char>> QUtf8StringView::fromArray(const Char (&string)[Size])
+
+ Constructs a string view on the full character string literal \a string,
+ including any trailing \c{Char(0)}. If you don't want the
+ null-terminator included in the view then you can chop() it off
+ when you are certain it is at the end. Alternatively you can use
+ the constructor overload taking an array literal which will create
+ a view up to, but not including, the first null-terminator in the data.
+
+ \a string must remain valid for the lifetime of this string view
+ object.
+
+ This function will work with any array literal if \c Char is a
+ compatible character type. The compatible character types
+ are: \c char8_t, \c char, \c{signed char} and \c{unsigned char}.
+*/
+
+/*!
+ \fn QString QUtf8StringView::toString() const
+
+ Returns a deep copy of this string view's data as a QString.
+
+ The return value will be a null QString if and only if this string view is null.
+*/
+
+/*!
+ \fn QUtf8StringView::data() const
+
+ Returns a const pointer to the first code point in the string view.
+
+ \note The character array represented by the return value is \e not null-terminated.
+
+ \sa begin(), end(), utf8()
+*/
+
+/*!
+ \fn QUtf8StringView::utf8() const
+
+ Returns a const pointer to the first code point in the string view.
+
+ The result is returned as a \c{const char8_t*}, so this function is only available when
+ compiling in C++20 mode.
+
+ \note The character array represented by the return value is \e not null-terminated.
+
+ \sa begin(), end(), data()
+*/
+
+/*!
+ \fn QUtf8StringView::const_iterator QUtf8StringView::begin() const
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first code point in
+ the string view.
+
+ This function is provided for STL compatibility.
+
+ \sa end(), cbegin(), rbegin(), data()
+*/
+
+/*!
+ \fn QUtf8StringView::const_iterator QUtf8StringView::cbegin() const
+
+ Same as begin().
+
+ This function is provided for STL compatibility.
+
+ \sa cend(), begin(), crbegin(), data()
+*/
+
+/*!
+ \fn QUtf8StringView::const_iterator QUtf8StringView::end() const
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
+ code point after the last code point in the list.
+
+ This function is provided for STL compatibility.
+
+ \sa begin(), cend(), rend()
+*/
+
+/*! \fn QUtf8StringView::const_iterator QUtf8StringView::cend() const
+
+ Same as end().
+
+ This function is provided for STL compatibility.
+
+ \sa cbegin(), end(), crend()
+*/
+
+/*!
+ \fn QUtf8StringView::const_reverse_iterator QUtf8StringView::rbegin() const
+
+ Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
+ code point in the string view, in reverse order.
+
+ This function is provided for STL compatibility.
+
+ \sa rend(), crbegin(), begin()
+*/
+
+/*!
+ \fn QUtf8StringView::const_reverse_iterator QUtf8StringView::crbegin() const
+
+ Same as rbegin().
+
+ This function is provided for STL compatibility.
+
+ \sa crend(), rbegin(), cbegin()
+*/
+
+/*!
+ \fn QUtf8StringView::const_reverse_iterator QUtf8StringView::rend() const
+
+ Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
+ the last code point in the string view, in reverse order.
+
+ This function is provided for STL compatibility.
+
+ \sa rbegin(), crend(), end()
+*/
+
+/*!
+ \fn QUtf8StringView::const_reverse_iterator QUtf8StringView::crend() const
+
+ Same as rend().
+
+ This function is provided for STL compatibility.
+
+ \sa crbegin(), rend(), cend()
+*/
+
+/*!
+ \fn bool QUtf8StringView::empty() const
+
+ Returns whether this string view is empty - that is, whether \c{size() == 0}.
+
+ This function is provided for STL compatibility.
+
+ \sa isEmpty(), isNull(), size(), length()
+*/
+
+/*!
+ \fn bool QUtf8StringView::isEmpty() const
+
+ Returns whether this string view is empty - that is, whether \c{size() == 0}.
+
+ This function is provided for compatibility with other Qt containers.
+
+ \sa empty(), isNull(), size(), length()
+*/
+
+/*!
+ \fn bool QUtf8StringView::isNull() const
+
+ Returns whether this string view is null - that is, whether \c{data() == nullptr}.
+
+ This functions is provided for compatibility with other Qt containers.
+
+ \sa empty(), isEmpty(), size(), length()
+*/
+
+/*!
+ \fn qsizetype QUtf8StringView::size() const
+
+ Returns the size of this string view, in UTF-8 code points (that is,
+ multi-byte sequences count as more than one for the purposes of this function, the same
+ as surrogate pairs in QString and QStringView).
+
+ \sa empty(), isEmpty(), isNull(), length()
+*/
+
+/*!
+ \fn QUtf8StringView::length() const
+
+ Same as size().
+
+ This function is provided for compatibility with other Qt containers.
+
+ \sa empty(), isEmpty(), isNull(), size()
+*/
+
+/*!
+ \fn QUtf8StringView::operator[](qsizetype n) const
+
+ Returns the code point at position \a n in this string view.
+
+ The behavior is undefined if \a n is negative or not less than size().
+
+ \sa at(), front(), back()
+*/
+
+/*!
+ \fn QUtf8StringView::at(qsizetype n) const
+
+ Returns the code point at position \a n in this string view.
+
+ The behavior is undefined if \a n is negative or not less than size().
+
+ \sa operator[](), front(), back()
+*/
+
+/*!
+ \fn QUtf8StringView::front() const
+
+ Returns the first code point in the string view. Same as first().
+
+ This function is provided for STL compatibility.
+
+ \warning Calling this function on an empty string view constitutes
+ undefined behavior.
+
+ \sa back()
+*/
+
+/*!
+ \fn QUtf8StringView::back() const
+
+ Returns the last code point in the string view. Same as last().
+
+ This function is provided for STL compatibility.
+
+ \warning Calling this function on an empty string view constitutes
+ undefined behavior.
+
+ \sa front()
+*/
+
+/*!
+ \fn QUtf8StringView::mid(qsizetype pos, qsizetype n) const
+
+ Returns the substring of length \a n starting at position
+ \a pos in this object.
+
+ \deprecated Use sliced() instead in new code.
+
+ Returns an empty string view if \a n exceeds the
+ length of the string view. If there are less than \a n code points
+ available in the string view starting at \a pos, or if
+ \a n is negative (default), the function returns all code points that
+ are available from \a pos.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QUtf8StringView::left(qsizetype n) const
+
+ \deprecated Use first() instead in new code.
+
+ Returns the substring of length \a n starting at position
+ 0 in this object.
+
+ The entire string view is returned if \a n is greater than or equal
+ to size(), or less than zero.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QUtf8StringView::right(qsizetype n) const
+
+ \deprecated Use last() instead in new code.
+
+ Returns the substring of length \a n starting at position
+ size() - \a n in this object.
+
+ The entire string view is returned if \a n is greater than or equal
+ to size(), or less than zero.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QUtf8StringView::first(qsizetype n) const
+
+ Returns a string view that contains the first \a n code points
+ of this string view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa last(), sliced(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QUtf8StringView::last(qsizetype n) const
+
+ Returns a string view that contains the last \a n code points of this string view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa first(), sliced(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QUtf8StringView::sliced(qsizetype pos, qsizetype n) const
+
+ Returns a string view containing \a n code points of this string view,
+ starting at position \a pos.
+
+//! [UB-sliced-index-length]
+ \note The behavior is undefined when \a pos < 0, \a n < 0,
+ or \a pos + \a n > size().
+//! [UB-sliced-index-length]
+
+ \sa first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QUtf8StringView::sliced(qsizetype pos) const
+
+ Returns a string view starting at position \a pos in this object,
+ and extending to its end.
+
+//! [UB-sliced-index-only]
+ \note The behavior is undefined when \a pos < 0 or \a pos > size().
+//! [UB-sliced-index-only]
+
+ \sa first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QUtf8StringView::chopped(qsizetype n) const
+
+ Returns the substring of length size() - \a n starting at the
+ beginning of this object.
+
+ Same as \c{first(size() - n)}.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa sliced(), first(), last(), chop(), truncate()
+*/
+
+/*!
+ \fn QUtf8StringView::truncate(qsizetype n)
+
+ Truncates this string view to \a n code points.
+
+ Same as \c{*this = first(n)}.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa sliced(), first(), last(), chopped(), chop()
+*/
+
+/*!
+ \fn QUtf8StringView::chop(qsizetype n)
+
+ Truncates this string view by \a n code points.
+
+ Same as \c{*this = first(size() - n)}.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa sliced(), first(), last(), chopped(), truncate()
+*/
+
+/*!
+ \fn int QUtf8StringView::compare(QLatin1StringView str, Qt::CaseSensitivity cs) const
+ \fn int QUtf8StringView::compare(QUtf8StringView str, Qt::CaseSensitivity cs) const
+ \fn int QUtf8StringView::compare(QStringView str, Qt::CaseSensitivity cs) const
+ \since 6.5
+
+ Compares this string view with \a str and returns a negative integer if
+ this string view is less than \a str, a positive integer if it is greater than
+ \a str, and zero if they are equal.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
+*/
+
+
+/*!
+ \fn QUtf8StringView::isValidUtf8() const
+
+ Returns \c true if this string contains valid UTF-8 encoded data,
+ or \c false otherwise.
+
+ \since 6.3
+*/
+
+/*!
+ \fn template <typename QStringLike> qToUtf8StringViewIgnoringNull(const QStringLike &s);
+ \relates QUtf8StringView
+ \internal
+
+ Convert \a s to a QUtf8StringView ignoring \c{s.isNull()}.
+
+ Returns a string view that references \a{s}'s data, but is never null.
+
+ This is a faster way to convert a QByteArray to a QUtf8StringView,
+ if null QByteArrays can legitimately be treated as empty ones.
+
+ \sa QByteArray::isNull(), QUtf8StringView
+*/
+
+
+/*! \fn QUtf8StringView::operator std::basic_string_view<storage_type>() const
+ \since 6.7
+
+ Converts this QUtf8StringView object to a
+ \c{std::basic_string_view} object. The returned view will have the
+ same data pointer and length of this view. The character type of
+ the returned view will be \c{storage_type}.
+*/
diff --git a/src/corelib/text/qvsnprintf.cpp b/src/corelib/text/qvsnprintf.cpp
index 43a21771a1..839fc24217 100644
--- a/src/corelib/text/qvsnprintf.cpp
+++ b/src/corelib/text/qvsnprintf.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
@@ -46,7 +10,7 @@
QT_BEGIN_NAMESPACE
-#if !defined(QT_VSNPRINTF) || defined(Q_CLANG_QDOC)
+#if !defined(QT_VSNPRINTF) || defined(Q_QDOC)
/*!
\relates QByteArray
diff --git a/src/corelib/text/text.pri b/src/corelib/text/text.pri
deleted file mode 100644
index 1d83bc151b..0000000000
--- a/src/corelib/text/text.pri
+++ /dev/null
@@ -1,92 +0,0 @@
-# Qt text / string / character / unicode / byte array module
-
-HEADERS += \
- text/qbytearray.h \
- text/qbytearray_p.h \
- text/qbytearraylist.h \
- text/qbytearraymatcher.h \
- text/qbytedata_p.h \
- text/qchar.h \
- text/qcollator.h \
- text/qcollator_p.h \
- text/qdoublescanprint_p.h \
- text/qlocale.h \
- text/qlocale_p.h \
- text/qlocale_tools_p.h \
- text/qlocale_data_p.h \
- text/qregexp.h \
- text/qstring.h \
- text/qstringalgorithms.h \
- text/qstringalgorithms_p.h \
- text/qstringbuilder.h \
- text/qstringconverter.h \
- text/qstringconverter_p.h \
- text/qstringiterator_p.h \
- text/qstringlist.h \
- text/qstringliteral.h \
- text/qstringmatcher.h \
- text/qstringview.h \
- text/qstringtokenizer.h \
- text/qtextboundaryfinder.h \
- text/qunicodetables_p.h \
- text/qunicodetools_p.h
-
-
-SOURCES += \
- text/qbytearray.cpp \
- text/qbytearraylist.cpp \
- text/qbytearraymatcher.cpp \
- text/qcollator.cpp \
- text/qlocale.cpp \
- text/qlocale_tools.cpp \
- text/qregexp.cpp \
- text/qstring.cpp \
- text/qstringbuilder.cpp \
- text/qstringconverter.cpp \
- text/qstringlist.cpp \
- text/qstringview.cpp \
- text/qstringtokenizer.cpp \
- text/qtextboundaryfinder.cpp \
- text/qunicodetools.cpp \
- text/qvsnprintf.cpp
-
-NO_PCH_SOURCES += text/qstring_compat.cpp
-false: SOURCES += $$NO_PCH_SOURCES # Hack for QtCreator
-
-!nacl:darwin: {
- SOURCES += text/qlocale_mac.mm
-}
-else:unix {
- SOURCES += text/qlocale_unix.cpp
-}
-else:win32 {
- SOURCES += text/qlocale_win.cpp
-} else:integrity {
- SOURCES += text/qlocale_unix.cpp
-}
-
-qtConfig(icu) {
- QMAKE_USE_PRIVATE += icu
-
- SOURCES += text/qlocale_icu.cpp \
- text/qcollator_icu.cpp
-} else: win32 {
- SOURCES += text/qcollator_win.cpp
-} else: macos {
- SOURCES += text/qcollator_macx.cpp
-} else {
- SOURCES += text/qcollator_posix.cpp
-}
-
-qtConfig(regularexpression) {
- QMAKE_USE_PRIVATE += pcre2
-
- HEADERS += \
- text/qregularexpression.h
- SOURCES += text/qregularexpression.cpp
-}
-
-TR_EXCLUDE += ../3rdparty/*
-
-# MIPS DSP
-MIPS_DSP_ASM += text/qstring_mips_dsp_asm.S