diff --git a/base/poco/JSON/include/Poco/JSON/ParserImpl.h b/base/poco/JSON/include/Poco/JSON/ParserImpl.h index 7a8ea647180c..6cf2451f5129 100644 --- a/base/poco/JSON/include/Poco/JSON/ParserImpl.h +++ b/base/poco/JSON/include/Poco/JSON/ParserImpl.h @@ -43,6 +43,9 @@ namespace JSON static const std::size_t JSON_PARSE_BUFFER_SIZE = 4096; static const std::size_t JSON_PARSER_STACK_SIZE = 128; static const int JSON_UNLIMITED_DEPTH = -1; + /// Default nesting limit so that parsing untrusted JSON cannot overflow the native stack via + /// Poco's recursive descent. Far above any legitimate JSON; raise per-parser with setDepth. + static const int JSON_DEFAULT_DEPTH = 1000; ParserImpl(const Handler::Ptr & pHandler = new ParseHandler, std::size_t bufSize = JSON_PARSE_BUFFER_SIZE); /// Creates JSON ParserImpl, using the given Handler and buffer size. @@ -109,6 +112,7 @@ namespace JSON struct json_stream * _pJSON; Handler::Ptr _pHandler; int _depth; + int _currentDepth = 0; char _decimalPoint; bool _allowNullByte; bool _allowComments; diff --git a/base/poco/JSON/src/ParserImpl.cpp b/base/poco/JSON/src/ParserImpl.cpp index 07e9f0a256da..b47f5c2430f0 100644 --- a/base/poco/JSON/src/ParserImpl.cpp +++ b/base/poco/JSON/src/ParserImpl.cpp @@ -37,7 +37,7 @@ namespace JSON { ParserImpl::ParserImpl(const Handler::Ptr& pHandler, std::size_t bufSize): _pJSON(new json_stream), _pHandler(pHandler), - _depth(JSON_UNLIMITED_DEPTH), + _depth(JSON_DEFAULT_DEPTH), _decimalPoint('.'), _allowNullByte(true), _allowComments(false) @@ -53,6 +53,7 @@ ParserImpl::~ParserImpl() void ParserImpl::handle(const std::string& json) { + _currentDepth = 0; if (!_allowNullByte && json.find("\\u0000") != json.npos) throw JSONException("Null bytes in strings not allowed."); @@ -139,6 +140,12 @@ void ParserImpl::stripComments(std::string& json) void ParserImpl::handleArray() { + // Enforce the configured depth limit (set via setDepth) to avoid a native-stack + // overflow on deeply nested input. _depth == JSON_UNLIMITED_DEPTH (-1) means no limit. + if (_depth != JSON_UNLIMITED_DEPTH && _currentDepth >= _depth) + throw JSONException("Maximum allowed JSON depth exceeded"); + ++_currentDepth; + json_type tok = json_peek(_pJSON); while (tok != JSON_ARRAY_END && checkError()) { @@ -148,11 +155,17 @@ void ParserImpl::handleArray() if (tok == JSON_ARRAY_END) handle(); else throw JSONException("JSON array end not found"); + + --_currentDepth; } void ParserImpl::handleObject() { + if (_depth != JSON_UNLIMITED_DEPTH && _currentDepth >= _depth) + throw JSONException("Maximum allowed JSON depth exceeded"); + ++_currentDepth; + json_type tok = json_peek(_pJSON); while (tok != JSON_OBJECT_END && checkError()) { @@ -166,6 +179,8 @@ void ParserImpl::handleObject() if (tok == JSON_OBJECT_END) handle(); else throw JSONException("JSON object end not found"); + + --_currentDepth; } diff --git a/ci/docker/integration/mysql_java_client/Dockerfile b/ci/docker/integration/mysql_java_client/Dockerfile index 5826ee77d501..47e644b33efb 100644 --- a/ci/docker/integration/mysql_java_client/Dockerfile +++ b/ci/docker/integration/mysql_java_client/Dockerfile @@ -1,13 +1,19 @@ # docker build -t altinityinfra/mysql-java-client . # MySQL Java client docker container -FROM openjdk:8-jdk-alpine +FROM eclipse-temurin:21-jdk-alpine RUN apk --no-cache add curl -ARG ver=8.1.0 +# Connector/J 8.2.0+ (including 9.x) reads the `info` field of the MySQL `OK` +# packet as a length-encoded string; it used to be pinned to 8.1.0 because +# ClickHouse wrote that field as a plain string and newer drivers failed to +# connect. Fixed by length-encoding `info` (see #84542), so test against a +# modern driver. CLASSPATH=. is required so javac-compiled .class files in the +# WORKDIR are found at runtime. +ARG ver=9.7.0 RUN curl -L -o /mysql-connector-j-${ver}.jar https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/${ver}/mysql-connector-j-${ver}.jar -ENV CLASSPATH=$CLASSPATH:/mysql-connector-j-${ver}.jar +ENV CLASSPATH=.:/mysql-connector-j-${ver}.jar WORKDIR /jdbc COPY MySQLJavaClientTest.java MySQLJavaClientTest.java diff --git a/ci/jobs/check_style.py b/ci/jobs/check_style.py index c613d711fe5f..24a96cdddcb5 100644 --- a/ci/jobs/check_style.py +++ b/ci/jobs/check_style.py @@ -6,6 +6,7 @@ from concurrent.futures import ProcessPoolExecutor from pathlib import Path +from praktika.info import Info from praktika.result import Result from praktika.utils import Shell, Utils @@ -322,7 +323,13 @@ def parse_args(): ) ) testname = "test_numbers_check" - if testpattern.lower() in testname.lower(): + # Skip on release branches and backport PRs: backports cherry-pick a small + # subset of test files, which legitimately leaves large gaps in the numbering. + info = Info() + release_branch_re = re.compile(r"^\d{2}\.\d+$") + branch_to_check = (info.base_branch or info.git_branch or "").removeprefix("release/") + is_release_branch = bool(release_branch_re.match(branch_to_check)) + if testpattern.lower() in testname.lower() and not is_release_branch: results.append( Result.from_commands_run( name=testname, diff --git a/ci/jobs/install_check.py b/ci/jobs/install_check.py index 7abf1d2166fa..38aa99aaed9d 100644 --- a/ci/jobs/install_check.py +++ b/ci/jobs/install_check.py @@ -29,7 +29,12 @@ def prepare_test_scripts(): trap "bash -ex /packages/preserve_logs.sh" ERR test_env='TEST_THE_DEFAULT_PARAMETER=15' echo "$test_env" >> /etc/default/clickhouse +# The init.d wrapper prints "Server started" once the pid file exists, but the TCP +# listener can take longer to open on a slow CI host; poll for up to 30s. See #86278. /etc/init.d/clickhouse-server start +for i in {1..30}; do + clickhouse-client -q 'SELECT version()' && break || sleep 1 +done clickhouse-client -q 'SELECT version()' grep "$test_env" /proc/$(cat /var/run/clickhouse-server/clickhouse-server.pid)/environ""" keeper_test = r"""#!/bin/bash diff --git a/cmake/autogenerated_versions.txt b/cmake/autogenerated_versions.txt index 4ea045d55b28..f0521a4d247a 100644 --- a/cmake/autogenerated_versions.txt +++ b/cmake/autogenerated_versions.txt @@ -2,13 +2,13 @@ # NOTE: VERSION_REVISION has nothing common with DBMS_TCP_PROTOCOL_VERSION, # only DBMS_TCP_PROTOCOL_VERSION should be incremented on protocol changes. -SET(VERSION_REVISION 54523) +SET(VERSION_REVISION 54528) SET(VERSION_MAJOR 25) SET(VERSION_MINOR 8) -SET(VERSION_PATCH 23) -SET(VERSION_GITHASH 6d29497525664acca46a1d1cd0d5787e9ad0857d) -SET(VERSION_DESCRIBE v25.8.23.10001.altinitytest) -SET(VERSION_STRING 25.8.23.10001.altinitytest) +SET(VERSION_PATCH 28) +SET(VERSION_GITHASH 33fef01d6a00ddd46f0a359a1716cd0a27fdd9c6) +SET(VERSION_DESCRIBE v25.8.28.10001.altinitytest) +SET(VERSION_STRING 25.8.28.10001.altinitytest) # end of autochange SET(VERSION_TWEAK 10001) diff --git a/contrib/avro b/contrib/avro index b32d5f3c7858..7b7f6a5bc42e 160000 --- a/contrib/avro +++ b/contrib/avro @@ -1 +1 @@ -Subproject commit b32d5f3c7858e32e51d3bc905bf5943d1cddca53 +Subproject commit 7b7f6a5bc42e56b6f74de9fc8f52a2a629c53145 diff --git a/contrib/curl b/contrib/curl index 8c908d2d0a6d..a05f34973e6c 160000 --- a/contrib/curl +++ b/contrib/curl @@ -1 +1 @@ -Subproject commit 8c908d2d0a6d32abdedda2c52e90bd56ec76c24d +Subproject commit a05f34973e6c4bb629d018f7cb51487be1c904d8 diff --git a/contrib/curl-cmake/CMakeLists.txt b/contrib/curl-cmake/CMakeLists.txt index 8b74a53a51e0..4c134500953f 100644 --- a/contrib/curl-cmake/CMakeLists.txt +++ b/contrib/curl-cmake/CMakeLists.txt @@ -15,6 +15,7 @@ set (SRCS "${LIBRARY_DIR}/lib/asyn-thrdd.c" "${LIBRARY_DIR}/lib/bufq.c" "${LIBRARY_DIR}/lib/bufref.c" + "${LIBRARY_DIR}/lib/cf-dns.c" "${LIBRARY_DIR}/lib/cf-h1-proxy.c" "${LIBRARY_DIR}/lib/cf-h2-proxy.c" "${LIBRARY_DIR}/lib/cf-haproxy.c" @@ -37,7 +38,6 @@ set (SRCS "${LIBRARY_DIR}/lib/curl_memrchr.c" "${LIBRARY_DIR}/lib/curl_ntlm_core.c" "${LIBRARY_DIR}/lib/curl_range.c" - "${LIBRARY_DIR}/lib/curl_rtmp.c" "${LIBRARY_DIR}/lib/curl_sasl.c" "${LIBRARY_DIR}/lib/curl_sha512_256.c" "${LIBRARY_DIR}/lib/curl_share.c" @@ -47,6 +47,7 @@ set (SRCS "${LIBRARY_DIR}/lib/cw-out.c" "${LIBRARY_DIR}/lib/cw-pause.c" "${LIBRARY_DIR}/lib/dict.c" + "${LIBRARY_DIR}/lib/dnscache.c" "${LIBRARY_DIR}/lib/doh.c" "${LIBRARY_DIR}/lib/dynhds.c" "${LIBRARY_DIR}/lib/easy.c" @@ -100,6 +101,7 @@ set (SRCS "${LIBRARY_DIR}/lib/pingpong.c" "${LIBRARY_DIR}/lib/pop3.c" "${LIBRARY_DIR}/lib/progress.c" + "${LIBRARY_DIR}/lib/protocol.c" "${LIBRARY_DIR}/lib/psl.c" "${LIBRARY_DIR}/lib/rand.c" "${LIBRARY_DIR}/lib/ratelimit.c" @@ -123,6 +125,8 @@ set (SRCS "${LIBRARY_DIR}/lib/system_win32.c" "${LIBRARY_DIR}/lib/telnet.c" "${LIBRARY_DIR}/lib/tftp.c" + "${LIBRARY_DIR}/lib/thrdpool.c" + "${LIBRARY_DIR}/lib/thrdqueue.c" "${LIBRARY_DIR}/lib/transfer.c" "${LIBRARY_DIR}/lib/uint-bset.c" "${LIBRARY_DIR}/lib/uint-hash.c" diff --git a/contrib/curl-cmake/curl_config.h b/contrib/curl-cmake/curl_config.h index 0e42508dff0f..8fc920bb5158 100644 --- a/contrib/curl-cmake/curl_config.h +++ b/contrib/curl-cmake/curl_config.h @@ -55,8 +55,10 @@ #define ENABLE_IPV6 #define USE_OPENSSL -#define USE_THREADS_POSIX +#define HAVE_THREADS_POSIX #define USE_ARES +#define USE_RESOLV_ARES +#define CURL_ENABLE_NTLM #ifdef __illumos__ #define HAVE_POSIX_STRERROR_R 1 diff --git a/contrib/krb5 b/contrib/krb5 index ed01212a0ba6..42d204a24a57 160000 --- a/contrib/krb5 +++ b/contrib/krb5 @@ -1 +1 @@ -Subproject commit ed01212a0ba6e101f51178b9014368af062c01c4 +Subproject commit 42d204a24a577ef93081cb7b70cb78ff6f7130ee diff --git a/contrib/krb5-cmake/CMakeLists.txt b/contrib/krb5-cmake/CMakeLists.txt index f5e0c4bc0aa4..91a0c7503743 100644 --- a/contrib/krb5-cmake/CMakeLists.txt +++ b/contrib/krb5-cmake/CMakeLists.txt @@ -132,16 +132,18 @@ set(ALL_SRCS "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/ser_sctx.c" "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/k5sealv3.c" "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/acquire_cred.c" - "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/k5unseal.c" + # "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/k5unseal.c" "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/rel_cred.c" "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/util_cksum.c" + "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/verify_mic.c" + "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/unwrap.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/disp_com_err_status.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/gssapi_generic.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/rel_oid_set.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/oid_ops.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_buffer.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_buffer_set.c" - "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_set.c" + # "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_set.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_token.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/disp_major_status.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_seqstate.c" @@ -415,6 +417,7 @@ set(ALL_SRCS "${KRB5_SOURCE_DIR}/lib/krb5/os/realm_dom.c" "${KRB5_SOURCE_DIR}/lib/krb5/os/dnssrv.c" "${KRB5_SOURCE_DIR}/lib/krb5/os/mk_faddr.c" + "${KRB5_SOURCE_DIR}/lib/krb5/os/addr.c" # "${KRB5_SOURCE_DIR}/lib/krb5/os/dnsglue.c" "${KRB5_SOURCE_DIR}/lib/krb5/os/sendto_kdc.c" "${KRB5_SOURCE_DIR}/lib/krb5/os/hostrealm_registry.c" @@ -585,11 +588,11 @@ if(CMAKE_SYSTEM_NAME MATCHES "Darwin") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/kcmrpc.hin" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include_private/" ) - file(RENAME + file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/include_private/kcmrpc.cin" "${CMAKE_CURRENT_BINARY_DIR}/include_private/kcmrpc.c" ) - file(RENAME + file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/include_private/kcmrpc.hin" "${CMAKE_CURRENT_BINARY_DIR}/include_private/kcmrpc.h" ) diff --git a/contrib/libarchive b/contrib/libarchive index 3a9249b4eeb2..ded82291ab41 160000 --- a/contrib/libarchive +++ b/contrib/libarchive @@ -1 +1 @@ -Subproject commit 3a9249b4eeb2a101ca4e0d2b12e4007642bac126 +Subproject commit ded82291ab41d5e355831b96b0e1ff49e24d8939 diff --git a/contrib/libarchive-cmake/config.h b/contrib/libarchive-cmake/config.h index 309251100cd9..86732ed06a9a 100644 --- a/contrib/libarchive-cmake/config.h +++ b/contrib/libarchive-cmake/config.h @@ -1031,6 +1031,9 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 diff --git a/contrib/libxml2 b/contrib/libxml2 index b7fa62cbe8ef..c94eb0210183 160000 --- a/contrib/libxml2 +++ b/contrib/libxml2 @@ -1 +1 @@ -Subproject commit b7fa62cbe8ef0df5869e000d5b690bdedd07f33e +Subproject commit c94eb0210183b9d7cb43f8e7fddc6be55843ef49 diff --git a/contrib/libxml2-cmake/linux_x86_64/include/config.h b/contrib/libxml2-cmake/linux_x86_64/include/config.h index 600e7570e990..8abacf912b82 100644 --- a/contrib/libxml2-cmake/linux_x86_64/include/config.h +++ b/contrib/libxml2-cmake/linux_x86_64/include/config.h @@ -77,7 +77,7 @@ #define PACKAGE_NAME "libxml2" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "libxml2 2.15.1" +#define PACKAGE_STRING "libxml2 2.15.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libxml2" @@ -86,7 +86,7 @@ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "2.15.1" +#define PACKAGE_VERSION "2.15.3" /* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for @@ -94,7 +94,7 @@ #define STDC_HEADERS 1 /* Version number of package */ -#define VERSION "2.15.1" +#define VERSION "2.15.3" /* System configuration directory (/etc) */ #define XML_SYSCONFDIR "/usr/local/etc" diff --git a/contrib/libxml2-cmake/linux_x86_64/include/libxml/xmlversion.h b/contrib/libxml2-cmake/linux_x86_64/include/libxml/xmlversion.h index ff8b0ed8011b..e63ad461ce92 100644 --- a/contrib/libxml2-cmake/linux_x86_64/include/libxml/xmlversion.h +++ b/contrib/libxml2-cmake/linux_x86_64/include/libxml/xmlversion.h @@ -16,17 +16,17 @@ /** * the version string like "1.2.3" */ -#define LIBXML_DOTTED_VERSION "2.15.1" +#define LIBXML_DOTTED_VERSION "2.15.3" /** * the version number: 1.2.3 value is 10203 */ -#define LIBXML_VERSION 21501 +#define LIBXML_VERSION 21503 /** * the version number string, 1.2.3 value is "10203" */ -#define LIBXML_VERSION_STRING "21501" +#define LIBXML_VERSION_STRING "21503" /** * extra version information, used to show a git commit description @@ -37,7 +37,7 @@ * Macro to check that the libxml version in use is compatible with * the version the software has been compiled against */ -#define LIBXML_TEST_VERSION xmlCheckVersion(21501); +#define LIBXML_TEST_VERSION xmlCheckVersion(21503); #if 1 /** diff --git a/contrib/mariadb-connector-c b/contrib/mariadb-connector-c index d0a788c5b9fc..95d6264bb43d 160000 --- a/contrib/mariadb-connector-c +++ b/contrib/mariadb-connector-c @@ -1 +1 @@ -Subproject commit d0a788c5b9fcaca2368d9233770d3ca91ea79f88 +Subproject commit 95d6264bb43d31f825cf2f85ce1928557457b62d diff --git a/contrib/mariadb-connector-c-cmake/CMakeLists.txt b/contrib/mariadb-connector-c-cmake/CMakeLists.txt index 9840009b628f..8c5ff513ae37 100644 --- a/contrib/mariadb-connector-c-cmake/CMakeLists.txt +++ b/contrib/mariadb-connector-c-cmake/CMakeLists.txt @@ -43,6 +43,14 @@ MATH(EXPR MARIADB_VERSION_ID "${MARIADB_CLIENT_VERSION_MAJOR} * 10000 + ${MARIADB_CLIENT_VERSION_MINOR} * 100 + ${MARIADB_CLIENT_VERSION_PATCH}") +set(CPACK_PACKAGE_VERSION_MAJOR 3) +set(CPACK_PACKAGE_VERSION_MINOR 1) +set(CPACK_PACKAGE_VERSION_PATCH 29) +set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") +MATH(EXPR MARIADB_PACKAGE_VERSION_ID "${CPACK_PACKAGE_VERSION_MAJOR} * 10000 + + ${CPACK_PACKAGE_VERSION_MINOR} * 100 + + ${CPACK_PACKAGE_VERSION_PATCH}") + IF (NOT MARIADB_PORT) set(MARIADB_PORT 3306) ENDIF () @@ -207,7 +215,7 @@ set(LIBMARIADB_SOURCES ${LIBMARIADB_SOURCES} ${CC_SOURCE_DIR}/plugins/auth/my_auth.c ${CC_SOURCE_DIR}/libmariadb/ma_array.c ${CC_SOURCE_DIR}/libmariadb/ma_charset.c -${CC_SOURCE_DIR}/libmariadb/ma_hash.c +${CC_SOURCE_DIR}/libmariadb/ma_hashtbl.c ${CC_SOURCE_DIR}/libmariadb/ma_net.c ${CC_SOURCE_DIR}/libmariadb/mariadb_charset.c ${CC_SOURCE_DIR}/libmariadb/ma_time.c diff --git a/contrib/mongo-c-driver b/contrib/mongo-c-driver index 529d7f0af3b8..a26c8e251fec 160000 --- a/contrib/mongo-c-driver +++ b/contrib/mongo-c-driver @@ -1 +1 @@ -Subproject commit 529d7f0af3b86d7da6ce90562cf9bcd10e8a3a0a +Subproject commit a26c8e251fec147258e89b7e85e9adfa259fc42f diff --git a/contrib/mongo-c-driver-cmake/CMakeLists.txt b/contrib/mongo-c-driver-cmake/CMakeLists.txt index 0b608517607c..fa856376c93f 100644 --- a/contrib/mongo-c-driver-cmake/CMakeLists.txt +++ b/contrib/mongo-c-driver-cmake/CMakeLists.txt @@ -5,13 +5,13 @@ if(NOT USE_MONGODB) endif() set(libbson_VERSION_MAJOR 2) -set(libbson_VERSION_MINOR 2) -set(libbson_VERSION_PATCH 2) -set(libbson_VERSION 2.2.2) +set(libbson_VERSION_MINOR 3) +set(libbson_VERSION_PATCH 0) +set(libbson_VERSION 2.3.0) set(libmongoc_VERSION_MAJOR 2) -set(libmongoc_VERSION_MINOR 2) -set(libmongoc_VERSION_PATCH 2) -set(libmongoc_VERSION 2.2.2) +set(libmongoc_VERSION_MINOR 3) +set(libmongoc_VERSION_PATCH 0) +set(libmongoc_VERSION 2.3.0) set(LIBBSON_SOURCES_ROOT "${ClickHouse_SOURCE_DIR}/contrib/mongo-c-driver/src") set(LIBBSON_SOURCE_DIR "${LIBBSON_SOURCES_ROOT}/libbson/src") diff --git a/contrib/orc b/contrib/orc index 1892a6539e65..49e965750a94 160000 --- a/contrib/orc +++ b/contrib/orc @@ -1 +1 @@ -Subproject commit 1892a6539e655280d38a8d0669214dbb9b1d0919 +Subproject commit 49e965750a94627d0ce0a3f3c781423b982cbc1d diff --git a/contrib/postgres b/contrib/postgres index c37596dd61c5..ab6952af3ac8 160000 --- a/contrib/postgres +++ b/contrib/postgres @@ -1 +1 @@ -Subproject commit c37596dd61c5f2b8b7521fdbcdabc651bd9412c4 +Subproject commit ab6952af3ac8cdede654be4dc68f990b0352c213 diff --git a/contrib/postgres-cmake/CMakeLists.txt b/contrib/postgres-cmake/CMakeLists.txt index 93c5159300f3..46d7af59c870 100644 --- a/contrib/postgres-cmake/CMakeLists.txt +++ b/contrib/postgres-cmake/CMakeLists.txt @@ -56,6 +56,7 @@ set(SRCS "${POSTGRES_SOURCE_DIR}/src/port/pgstrcasecmp.c" "${POSTGRES_SOURCE_DIR}/src/port/pg_bitutils.c" "${POSTGRES_SOURCE_DIR}/src/port/path.c" + "${POSTGRES_SOURCE_DIR}/src/port/timingsafe_bcmp.c" ) if(NOT OS_DARWIN) diff --git a/contrib/postgres-cmake/pg_config.h b/contrib/postgres-cmake/pg_config.h index 12767588b94d..84e435838d41 100644 --- a/contrib/postgres-cmake/pg_config.h +++ b/contrib/postgres-cmake/pg_config.h @@ -618,19 +618,24 @@ #define PG_MAJORVERSION_NUM 18 /* PostgreSQL minor version number */ -#define PG_MINORVERSION_NUM 3 +#define PG_MINORVERSION_NUM 4 -/* Define to best printf format archetype, usually gnu_printf if available. */ -#define PG_PRINTF_ATTRIBUTE gnu_printf +/* Define to best C++ printf format archetype, usually gnu_printf if + available. */ +#define PG_CXX_PRINTF_ATTRIBUTE gnu_printf + +/* Define to best C printf format archetype, usually gnu_printf if available. + */ +#define PG_C_PRINTF_ATTRIBUTE gnu_printf /* PostgreSQL version as a string */ -#define PG_VERSION "18.3" +#define PG_VERSION "18.4" /* PostgreSQL version as a number */ -#define PG_VERSION_NUM 180003 +#define PG_VERSION_NUM 180004 /* A string containing the version number, platform, and C compiler */ -#define PG_VERSION_STR "PostgreSQL 18.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 15.2.1 20250813, 64-bit" +#define PG_VERSION_STR "PostgreSQL 18.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 15.2.1 20250813, 64-bit" /* Define to 1 to allow profiling output to be saved separately for each process. */ diff --git a/docker/keeper/Dockerfile.distroless b/docker/keeper/Dockerfile.distroless index 1adc6a362498..9bc627a9b5e6 100644 --- a/docker/keeper/Dockerfile.distroless +++ b/docker/keeper/Dockerfile.distroless @@ -146,7 +146,7 @@ RUN mkdir -p \ # Stage 2: Production distroless image. # ────────────────────────────────────────────────────────────────────────────── # Pinned 2026-04-26. Refresh: docker pull gcr.io/distroless/cc-debian13:nonroot && docker inspect --format='{{index .RepoDigests 0}}' gcr.io/distroless/cc-debian13:nonroot -FROM gcr.io/distroless/cc-debian13:nonroot@sha256:8f960b7fc6a5d6e28bb07f982655925d6206678bd9a6cde2ad00ddb5e2077d78 AS production +FROM gcr.io/distroless/cc-debian13:nonroot@sha256:d3cda6e91129130d7229a1806b6a73d292ef245ab032da7851907798024cefba AS production COPY --from=ch-builder /output/ / @@ -169,7 +169,7 @@ ENTRYPOINT ["/usr/bin/clickhouse", "docker-init", "--keeper"] # at /busybox/sh for interactive troubleshooting. # ────────────────────────────────────────────────────────────────────────────── # Pinned 2026-04-26. Refresh: docker pull gcr.io/distroless/cc-debian13:debug-nonroot && docker inspect --format='{{index .RepoDigests 0}}' gcr.io/distroless/cc-debian13:debug-nonroot -FROM gcr.io/distroless/cc-debian13:debug-nonroot@sha256:55dd32378f7562c890342098a04726f4ef386bb86c87bec3db6ed4eef27d99fb AS debug +FROM gcr.io/distroless/cc-debian13:debug-nonroot@sha256:61e8df8909b98d2cf65fa8f620ee8292be40becd9de3b85d42852bee3f86fdb0 AS debug COPY --from=ch-builder /output/ / diff --git a/docker/server/Dockerfile.distroless b/docker/server/Dockerfile.distroless index bfadfe523c36..056c0d966be6 100644 --- a/docker/server/Dockerfile.distroless +++ b/docker/server/Dockerfile.distroless @@ -164,7 +164,7 @@ RUN { \ # Stage 2: Production distroless image. # ────────────────────────────────────────────────────────────────────────────── # Pinned 2026-04-26. Refresh: docker pull gcr.io/distroless/cc-debian13:nonroot && docker inspect --format='{{index .RepoDigests 0}}' gcr.io/distroless/cc-debian13:nonroot -FROM gcr.io/distroless/cc-debian13:nonroot@sha256:8f960b7fc6a5d6e28bb07f982655925d6206678bd9a6cde2ad00ddb5e2077d78 AS production +FROM gcr.io/distroless/cc-debian13:nonroot@sha256:d3cda6e91129130d7229a1806b6a73d292ef245ab032da7851907798024cefba AS production COPY --from=ch-builder /output/ / @@ -187,7 +187,7 @@ ENTRYPOINT ["/usr/bin/clickhouse", "docker-init"] # at /busybox/sh for interactive troubleshooting. # ────────────────────────────────────────────────────────────────────────────── # Pinned 2026-04-26. Refresh: docker pull gcr.io/distroless/cc-debian13:debug-nonroot && docker inspect --format='{{index .RepoDigests 0}}' gcr.io/distroless/cc-debian13:debug-nonroot -FROM gcr.io/distroless/cc-debian13:debug-nonroot@sha256:55dd32378f7562c890342098a04726f4ef386bb86c87bec3db6ed4eef27d99fb AS debug +FROM gcr.io/distroless/cc-debian13:debug-nonroot@sha256:61e8df8909b98d2cf65fa8f620ee8292be40becd9de3b85d42852bee3f86fdb0 AS debug COPY --from=ch-builder /output/ / diff --git a/src/Access/Authentication.cpp b/src/Access/Authentication.cpp index 03e47ed3b6d6..9ff66db512e2 100644 --- a/src/Access/Authentication.cpp +++ b/src/Access/Authentication.cpp @@ -242,21 +242,45 @@ namespace if (ssl_certificate_credentials->getSSLCertificateSubjects().at(type).contains(subject)) return true; - // Wildcard support (1 only) + // Wildcard support (single '*' only): a '*' must match exactly one component. + // Certificate SAN subjects are stored with a type prefix ("DNS:" or "URI:"), so a + // wildcard SAN pattern must carry one of those prefixes to align with a candidate. + // An unprefixed SAN wildcard (e.g. a bare "*" or "*.corp.example.com") would let '*' + // absorb the candidate's type prefix and span DNS labels, so it matches nothing. + // A DNS label (a CN or a "DNS:" SAN) is one non-empty label with no '.' and no '/'. + // A "URI:" SAN keeps the original rule: only '/' is forbidden in the matched span, + // identical to the original slash-count guard, so "URI:" matching is never widened. if (subject.contains('*')) { - auto prefix = std::string_view(subject).substr(0, subject.find('*')); - auto suffix = std::string_view(subject).substr(subject.find('*') + 1); - auto slashes = std::count(subject.begin(), subject.end(), '/'); + if (type == X509Certificate::Subjects::Type::SAN + && !subject.starts_with("DNS:") && !subject.starts_with("URI:")) + continue; + + const auto star = subject.find('*'); + const auto prefix = std::string_view(subject).substr(0, star); + const auto suffix = std::string_view(subject).substr(star + 1); + const bool is_dns_label = (type == X509Certificate::Subjects::Type::CN) + || (type == X509Certificate::Subjects::Type::SAN && subject.starts_with("DNS:")); for (const auto & certificate_subject : ssl_certificate_credentials->getSSLCertificateSubjects().at(type)) { - bool matches_wildcard = certificate_subject.starts_with(prefix) && certificate_subject.ends_with(suffix); - - // '*' must not represent a '/' in URI, so check if the number of '/' are equal - bool matches_slashes = slashes == count(certificate_subject.begin(), certificate_subject.end(), '/'); - - if (matches_wildcard && matches_slashes) + // Checked before the substr below so its length cannot underflow when prefix and suffix overlap. + if (certificate_subject.size() < prefix.size() + suffix.size()) + continue; + if (!certificate_subject.starts_with(prefix) || !certificate_subject.ends_with(suffix)) + continue; + + const auto matched = std::string_view(certificate_subject).substr( + prefix.size(), certificate_subject.size() - prefix.size() - suffix.size()); + // A single '*' matches exactly one component. A DNS label (a CN or "DNS:" SAN) is one + // non-empty label: the span must be non-empty and contain no '.' and no '/' (a '/' is + // not part of a hostname and the original slash-count guard forbade it). A "URI:" SAN + // keeps the original rule: only '/' is forbidden, so empty path segments stay allowed + // and "URI:" matching is not widened. + const bool span_is_single_component = is_dns_label + ? (!matched.empty() && !matched.contains('.') && !matched.contains('/')) + : !matched.contains('/'); + if (span_is_single_component) return true; } } diff --git a/src/Access/ZooKeeperReplicator.cpp b/src/Access/ZooKeeperReplicator.cpp index 84829e2bf48a..0438625b3c31 100644 --- a/src/Access/ZooKeeperReplicator.cpp +++ b/src/Access/ZooKeeperReplicator.cpp @@ -282,6 +282,7 @@ bool ZooKeeperReplicator::removeEntity(const UUID & id, bool throw_if_not_exists if (!ok) return false; + std::lock_guard refresh_lock{refresh_mutex}; std::lock_guard lock{mutex}; removeEntityNoLock(id); return true; @@ -538,6 +539,13 @@ void ZooKeeperReplicator::refreshEntities(const zkutil::ZooKeeperPtr & zookeeper { LOG_DEBUG(&Poco::Logger::get(storage_name), "Refreshing entities list"); + /// Reading from ZooKeeper is one synchronous round trip per entity and must not happen under + /// `mutex`: findEntity (authentication, Context::getAccess) blocks on it, so holding it across + /// a slow refresh stalls every query on the server. `refresh_mutex` keeps the reads and the + /// publication of their results atomic with respect to other read->publish sequences, so this + /// snapshot can never overwrite the result of a newer read. + std::lock_guard refresh_lock{refresh_mutex}; + if (all) { /// It doesn't make sense to keep the queue because we will reread everything in this function. @@ -557,8 +565,6 @@ void ZooKeeperReplicator::refreshEntities(const zkutil::ZooKeeperPtr & zookeeper for (const String & entity_uuid_str : entity_uuid_strs) entity_uuids.emplace_back(parseUUID(entity_uuid_str)); - std::lock_guard lock{mutex}; - if (all) { /// all=true means we read & parse all access entities from ZooKeeper. @@ -568,17 +574,25 @@ void ZooKeeperReplicator::refreshEntities(const zkutil::ZooKeeperPtr & zookeeper if (auto entity = tryReadEntityFromZooKeeper(zookeeper, uuid)) entities.emplace_back(uuid, entity); } + + std::lock_guard lock{mutex}; memory_storage.setAll(entities); } else { /// all=false means we read & parse only new access entities from ZooKeeper. - memory_storage.removeAllExcept(entity_uuids); - for (const auto & uuid : entity_uuids) + std::vector new_uuids; { - if (!memory_storage.exists(uuid)) - refreshEntityNoLock(zookeeper, uuid); + std::lock_guard lock{mutex}; + memory_storage.removeAllExcept(entity_uuids); + for (const auto & uuid : entity_uuids) + { + if (!memory_storage.exists(uuid)) + new_uuids.push_back(uuid); + } } + for (const auto & uuid : new_uuids) + refreshEntityImpl(zookeeper, uuid); } LOG_DEBUG(&Poco::Logger::get(storage_name), "Refreshing entities list finished"); @@ -586,23 +600,18 @@ void ZooKeeperReplicator::refreshEntities(const zkutil::ZooKeeperPtr & zookeeper void ZooKeeperReplicator::refreshEntity(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) { - LOG_DEBUG(&Poco::Logger::get(storage_name), "Refreshing entity {}", toString(id)); - - auto entity = tryReadEntityFromZooKeeper(zookeeper, id); - - std::lock_guard lock{mutex}; - - if (entity) - setEntityNoLock(id, entity); - else - removeEntityNoLock(id); + std::lock_guard refresh_lock{refresh_mutex}; + refreshEntityImpl(zookeeper, id); } -void ZooKeeperReplicator::refreshEntityNoLock(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) +void ZooKeeperReplicator::refreshEntityImpl(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) { LOG_DEBUG(&Poco::Logger::get(storage_name), "Refreshing entity {}", toString(id)); auto entity = tryReadEntityFromZooKeeper(zookeeper, id); + + std::lock_guard lock{mutex}; + if (entity) setEntityNoLock(id, entity); else diff --git a/src/Access/ZooKeeperReplicator.h b/src/Access/ZooKeeperReplicator.h index b7daaf63e153..486e15d67a0d 100644 --- a/src/Access/ZooKeeperReplicator.h +++ b/src/Access/ZooKeeperReplicator.h @@ -86,12 +86,20 @@ class ZooKeeperReplicator bool refresh(); void refreshEntities(const zkutil::ZooKeeperPtr & zookeeper, bool all); void refreshEntity(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id); - void refreshEntityNoLock(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) TSA_REQUIRES(mutex); + void refreshEntityImpl(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) TSA_REQUIRES(refresh_mutex); AccessEntityPtr tryReadEntityFromZooKeeper(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) const; void setEntityNoLock(const UUID & id, const AccessEntityPtr & entity) TSA_REQUIRES(mutex); void removeEntityNoLock(const UUID & id) TSA_REQUIRES(mutex); + /// Serializes every "read from ZooKeeper -> publish into memory_storage" sequence (entity + /// refreshes and the cache updates of local writes), so that a publish based on an older + /// ZooKeeper read can never overwrite a publish based on a newer one. Held across ZooKeeper + /// round trips, therefore never taken by the read-only methods (findEntity etc.). + /// Lock order: cached_zookeeper_mutex -> refresh_mutex -> mutex. + std::mutex refresh_mutex; + + /// Guards memory_storage; held only for in-memory operations, never across ZooKeeper requests. mutable std::mutex mutex; }; diff --git a/src/AggregateFunctions/AggregateFunctionSingleValueOrNull.cpp b/src/AggregateFunctions/AggregateFunctionSingleValueOrNull.cpp index 68d8676af377..96e1ebffa124 100644 --- a/src/AggregateFunctions/AggregateFunctionSingleValueOrNull.cpp +++ b/src/AggregateFunctions/AggregateFunctionSingleValueOrNull.cpp @@ -92,7 +92,7 @@ struct AggregateFunctionSingleValueOrNullData { ColumnNullable & col = typeid_cast(to); col.getNullMapColumn().insertDefault(); - data().insertResultInto(col.getNestedColumn(), result_type); + data().insertResultInto(col.getNestedColumn(), removeNullable(result_type)); } } }; @@ -169,7 +169,7 @@ class AggregateFunctionSingleValueOrNull final void deserialize(AggregateDataPtr place, ReadBuffer & buf, std::optional /* version */, Arena * arena) const override { - data(place).read(buf, *serialization, result_type, arena); + data(place).read(buf, *serialization, value_type, arena); } bool allocatesMemoryInArena() const override { return singleValueTypeAllocatesMemoryInArena(value_type->getTypeId()); } diff --git a/src/AggregateFunctions/AggregateFunctionWindowFunnel.cpp b/src/AggregateFunctions/AggregateFunctionWindowFunnel.cpp index 650285661d5f..2c9976dd3e8e 100644 --- a/src/AggregateFunctions/AggregateFunctionWindowFunnel.cpp +++ b/src/AggregateFunctions/AggregateFunctionWindowFunnel.cpp @@ -24,6 +24,7 @@ namespace ErrorCodes extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; extern const int TOO_LARGE_ARRAY_SIZE; extern const int BAD_ARGUMENTS; + extern const int INCORRECT_DATA; } namespace @@ -539,7 +540,28 @@ class AggregateFunctionWindowFunnel final void deserialize(AggregateDataPtr __restrict place, ReadBuffer & buf, std::optional /* version */, Arena *) const override { - this->data(place).deserialize(buf); + auto & data = this->data(place); + data.deserialize(buf); + + /// Event types come from untrusted serialized state. getEventLevel* uses (event - 1) to index + /// events_timestamp / event_sequences, both sized events_size, so an out-of-range event would + /// read and write out of bounds. Valid event types are [1, events_size]; 0 is the no-event + /// sentinel produced only with strict_order, so it is accepted only in that mode. + const UInt8 min_event = strict_order ? 0 : 1; + for (const auto & event : data.events_list) + { + UInt8 event_type = 0; + if constexpr (Data::strict_once_enabled) + event_type = event.event_type; + else + event_type = event.second; + + if (event_type < min_event || event_type > events_size) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Invalid event type {} in the state of function {}, must be in range [{}, {}]", + static_cast(event_type), getName(), static_cast(min_event), static_cast(events_size)); + } } void insertResultInto(AggregateDataPtr __restrict place, IColumn & to, Arena *) const override diff --git a/src/AggregateFunctions/QuantileTiming.h b/src/AggregateFunctions/QuantileTiming.h index b2758890022f..d0e334a5c786 100644 --- a/src/AggregateFunctions/QuantileTiming.h +++ b/src/AggregateFunctions/QuantileTiming.h @@ -391,6 +391,8 @@ namespace detail readBinaryLittleEndian(index, buf); if (index == BIG_THRESHOLD) break; + if (index - SMALL_THRESHOLD >= BIG_SIZE) + throw Exception(ErrorCodes::INCORRECT_DATA, "Incorrect index {} in 'large' kind of quantileTiming deserialization", index); UInt64 elem_count = 0; readBinaryLittleEndian(elem_count, buf); diff --git a/src/AggregateFunctions/UniqExactSet.h b/src/AggregateFunctions/UniqExactSet.h index f7fb5bfaf10e..4c3c6945a375 100644 --- a/src/AggregateFunctions/UniqExactSet.h +++ b/src/AggregateFunctions/UniqExactSet.h @@ -223,9 +223,12 @@ class UniqExactSet size_t size() const { return isSingleLevel() ? asSingleLevel().size() : asTwoLevel().size(); } /// To convert set to two level before merging (we cannot just call convertToTwoLevel() on right hand side set, because it is declared const). + /// This is `const` and may run concurrently for the same source set: ROLLUP/CUBE/GROUPING SETS merge the same state into + /// several destinations, and with several threads those merges happen at the same time. So it must not mutate `*this`. + /// The copy-on-write that protects a shared `two_level_set` from in-place mutation is done on the destination side in + /// `asTwoLevelChecked` (before any mutation), so handing out the shared pointer here is safe. std::shared_ptr getTwoLevelSet() const { - doDeepCopyIfNeeded(); return two_level_set ? two_level_set : std::make_shared(asSingleLevel()); } @@ -253,8 +256,11 @@ class UniqExactSet TwoLevelSet & asTwoLevel() { return *two_level_set; } const TwoLevelSet & asTwoLevel() const { return *two_level_set; } - /// Needed when a row can participate in more than one merge, e.g., ROLLUP/CUBE - void doDeepCopyIfNeeded() const + /// Needed when a row can participate in more than one merge, e.g., ROLLUP/CUBE: the destination may share its `two_level_set` + /// with the source (see the fast path in `merge`). Fork a private copy before mutating it in place, so the shared instance, + /// which may still be read concurrently by other merges, is never modified. Only called from the mutable (destination) path, + /// and `*this` is thread-local there, so reading `use_count` and reassigning the pointer is not racy. + void doDeepCopyIfNeeded() { if (two_level_set && two_level_set.use_count() > 1) { @@ -266,6 +272,6 @@ class UniqExactSet } SingleLevelSet single_level_set; - mutable std::shared_ptr two_level_set; + std::shared_ptr two_level_set; }; } diff --git a/src/Analyzer/ConstantNode.cpp b/src/Analyzer/ConstantNode.cpp index aa14b6a74f6e..19e492a3aee2 100644 --- a/src/Analyzer/ConstantNode.cpp +++ b/src/Analyzer/ConstantNode.cpp @@ -93,19 +93,14 @@ void ConstantNode::dumpTreeImpl(WriteBuffer & buffer, FormatState & format_state buffer << ", alias: " << getAlias(); buffer << ", constant_value: "; - if (mask_id) - { - if (mask_id == std::numeric_limits::max()) - buffer << "[HIDDEN]"; - else - buffer << "[HIDDEN id: " << mask_id << "]"; - } + if (isMasked()) + buffer << getMaskString(); else buffer << getValue().dump(); buffer << ", constant_value_type: " << constant_value.getType()->getName(); - if (!mask_id && getSourceExpression()) + if (!isMasked() && getSourceExpression()) { buffer << '\n' << std::string(indent + 2, ' ') << "EXPRESSION" << '\n'; getSourceExpression()->dumpTreeImpl(buffer, format_state, indent + 4); @@ -152,7 +147,9 @@ void ConstantNode::updateTreeHashImpl(HashState & hash_state, CompareOptions com QueryTreeNodePtr ConstantNode::cloneImpl() const { - return std::make_shared(constant_value, source_expression); + auto result = std::make_shared(constant_value, source_expression); + result->mask_id = mask_id; + return result; } ASTPtr ConstantNode::toASTImpl(const ConvertToASTOptions & options) const diff --git a/src/Analyzer/ConstantNode.h b/src/Analyzer/ConstantNode.h index e97063427ec2..18f913234d48 100644 --- a/src/Analyzer/ConstantNode.h +++ b/src/Analyzer/ConstantNode.h @@ -101,12 +101,29 @@ class ConstantNode final : public IQueryTreeNode mask_id = id; } + /// Whether this constant is hidden as a secret (e.g. a key argument of `encrypt`). + bool isMasked() const + { + return mask_id != 0; + } + + /// Placeholder shown instead of the value when this constant is hidden as a secret. + String getMaskString() const + { + chassert(isMasked()); + if (mask_id == std::numeric_limits::max()) + return "[HIDDEN]"; + return "[HIDDEN id: " + std::to_string(mask_id) + "]"; + } + void convertToNullable() override; void dumpTreeImpl(WriteBuffer & buffer, FormatState & format_state, size_t indent) const override; std::pair getValueNameAndType() const { + if (isMasked()) + return {getMaskString(), constant_value.getType()}; return constant_value.getValueNameAndType(); } diff --git a/src/Analyzer/Passes/ConvertQueryToCNFPass.cpp b/src/Analyzer/Passes/ConvertQueryToCNFPass.cpp index 2eac795974dc..9268b5f8f88e 100644 --- a/src/Analyzer/Passes/ConvertQueryToCNFPass.cpp +++ b/src/Analyzer/Passes/ConvertQueryToCNFPass.cpp @@ -30,6 +30,13 @@ namespace Setting namespace { +/// Constraint-based optimization is scoped to a single query node: each (sub)query is optimized +/// independently. Subqueries (`isSubqueryNodeType`) must therefore be treated as opaque boundaries, +/// both when one is a clause root (e.g. constraint reduction collapses `cond OR (subquery)` to just +/// the subquery) and when one is nested inside an expression (e.g. `exists((subquery))`). Crossing +/// the boundary would rewrite a subquery's correlated columns, which must stay plain ColumnNodes for +/// decorrelation. + std::optional tryConvertQueryToCNF(const QueryTreeNodePtr & node, const ContextPtr & context) { auto cnf_form = Analyzer::CNF::tryBuildCNF(node, context); @@ -158,6 +165,12 @@ bool checkIfAtomAlwaysFalseGraph(const Analyzer::CNFAtomicFormula & atom, const void replaceToConstants(QueryTreeNodePtr & term, const ComparisonGraph & graph) { + /// Do not cross into subqueries: replacing a correlated column with its constant equivalent + /// would corrupt the subquery's correlated_columns_list, which the planner expects to hold + /// ColumnNodes (see isSubqueryNodeType). + if (isSubqueryNodeType(term->getNodeType())) + return; + const auto equal_constant = graph.getEqualConst(term); if (equal_constant) { @@ -418,6 +431,11 @@ class ComponentCollectorVisitor : public ConstInDepthQueryTreeVisitorgetNodeType()); + } + void visitImpl(const QueryTreeNodePtr & node) { if (auto id = graph.getComponentId(node)) @@ -472,6 +490,11 @@ class SubstituteColumnVisitor : public InDepthQueryTreeVisitorgetNodeType()); + } + void visitImpl(QueryTreeNodePtr & node) { auto component_id_it = query_node_to_component.find(node); @@ -581,16 +604,24 @@ void substituteColumns(QueryNode & query_node, const QueryTreeNodes & table_expr auto run_for_all = [&](const auto function) { - function(query_node.getProjectionNode()); + /// The needChildVisit guards in the visitors only stop subqueries nested inside a larger + /// expression; a clause that is itself a subquery is the visit root, so guard it here. + const auto run_unless_subquery = [&](QueryTreeNodePtr & node) + { + if (!isSubqueryNodeType(node->getNodeType())) + function(node); + }; + + run_unless_subquery(query_node.getProjectionNode()); if (query_node.hasWhere()) - function(query_node.getWhere()); + run_unless_subquery(query_node.getWhere()); if (query_node.hasPrewhere()) - function(query_node.getPrewhere()); + run_unless_subquery(query_node.getPrewhere()); if (query_node.hasHaving()) - function(query_node.getHaving()); + run_unless_subquery(query_node.getHaving()); }; std::set components; @@ -704,6 +735,22 @@ void optimizeNode(QueryTreeNodePtr & node, const QueryTreeNodes & table_expressi optimizeWithConstraints(*cnf, table_expressions, context); auto new_node = cnf->toQueryTree(); + + /// Constraint reduction can collapse a filter into a standalone correlated subquery. For example, + /// with `CONSTRAINT c ASSUME (a <= b) AND (b <= c) AND (c <= d) AND (d <= a)` (so all columns are + /// equal), the filter + /// WHERE (b < d) OR (SELECT a < c) + /// reduces to + /// WHERE (SELECT a < c) + /// because `b < d` is always false. A standalone correlated subquery predicate is not always + /// decorrelated correctly today: the outer plan may not keep the captured columns (e.g. + /// `SELECT count() ... WHERE (SELECT a < c)` raises NOT_FOUND_COLUMN_IN_BLOCK, while `SELECT *` + /// works). Keep the original filter so the optimization never turns a working query into a + /// failing one. `new_node` is null when the filter reduces to a constant and is dropped, which is + /// fine to apply. + if (new_node && isCorrelatedQueryOrUnionNode(new_node)) + return; + node = std::move(new_node); } diff --git a/src/Backups/BackupIO_S3.cpp b/src/Backups/BackupIO_S3.cpp index 51cf22a12eee..94b788f36bfa 100644 --- a/src/Backups/BackupIO_S3.cpp +++ b/src/Backups/BackupIO_S3.cpp @@ -53,6 +53,7 @@ namespace S3AuthSetting extern const S3AuthSettingsString role_arn; extern const S3AuthSettingsString role_session_name; + extern const S3AuthSettingsString external_id; extern const S3AuthSettingsString http_client; extern const S3AuthSettingsString service_account; extern const S3AuthSettingsString metadata_service; @@ -112,6 +113,7 @@ class S3BackupClientCreator const String & secret_access_key, String role_arn, String role_session_name, + String external_id, const S3Settings & settings, const ContextPtr & context) { @@ -131,6 +133,7 @@ class S3BackupClientCreator { role_arn = settings.auth_settings[S3AuthSetting::role_arn]; role_session_name = settings.auth_settings[S3AuthSetting::role_session_name]; + external_id = settings.auth_settings[S3AuthSetting::external_id]; } S3::PocoHTTPClientConfiguration client_configuration = S3::ClientFactory::instance().createClientConfiguration( @@ -192,6 +195,7 @@ class S3BackupClientCreator settings.auth_settings[S3AuthSetting::no_sign_request], std::move(role_arn), std::move(role_session_name), + std::move(external_id), /*sts_endpoint_override=*/"" }); } @@ -241,6 +245,7 @@ BackupReaderS3::BackupReaderS3( const String & secret_access_key_, const String & role_arn, const String & role_session_name, + const String & external_id, bool allow_s3_native_copy, const ReadSettings & read_settings_, const WriteSettings & write_settings_, @@ -261,7 +266,7 @@ BackupReaderS3::BackupReaderS3( s3_settings.request_settings.updateFromSettings(context_->getSettingsRef(), /* if_changed */true); s3_settings.request_settings[S3RequestSetting::allow_native_copy] = allow_s3_native_copy; - client = makeS3Client(s3_uri_, access_key_id_, secret_access_key_, role_arn, role_session_name, s3_settings, context_); + client = makeS3Client(s3_uri_, access_key_id_, secret_access_key_, role_arn, role_session_name, external_id, s3_settings, context_); if (auto blob_storage_system_log = context_->getBlobStorageLog()) blob_storage_log = std::make_shared(blob_storage_system_log); @@ -339,6 +344,7 @@ BackupWriterS3::BackupWriterS3( const String & secret_access_key_, const String & role_arn, const String & role_session_name, + const String & external_id, bool allow_s3_native_copy, const String & storage_class_name, const ReadSettings & read_settings_, @@ -363,7 +369,7 @@ BackupWriterS3::BackupWriterS3( s3_settings.request_settings[S3RequestSetting::allow_native_copy] = allow_s3_native_copy; s3_settings.request_settings[S3RequestSetting::storage_class_name] = storage_class_name; - client = makeS3Client(s3_uri_, access_key_id_, secret_access_key_, role_arn, role_session_name, s3_settings, context_); + client = makeS3Client(s3_uri_, access_key_id_, secret_access_key_, role_arn, role_session_name, external_id, s3_settings, context_); if (auto blob_storage_system_log = context_->getBlobStorageLog()) { diff --git a/src/Backups/BackupIO_S3.h b/src/Backups/BackupIO_S3.h index c8a3575243e7..b24cecd385d0 100644 --- a/src/Backups/BackupIO_S3.h +++ b/src/Backups/BackupIO_S3.h @@ -49,6 +49,7 @@ class BackupReaderS3 : public BackupReaderDefault const String & secret_access_key_, const String & role_arn, const String & role_session_name, + const String & external_id, bool allow_s3_native_copy, const ReadSettings & read_settings_, const WriteSettings & write_settings_, @@ -82,6 +83,7 @@ class BackupWriterS3 : public BackupWriterDefault const String & secret_access_key_, const String & role_arn, const String & role_session_name, + const String & external_id, bool allow_s3_native_copy, const String & storage_class_name, const ReadSettings & read_settings_, diff --git a/src/Backups/BackupImpl.cpp b/src/Backups/BackupImpl.cpp index bed961f7c10f..724d20f6221e 100644 --- a/src/Backups/BackupImpl.cpp +++ b/src/Backups/BackupImpl.cpp @@ -66,6 +66,7 @@ namespace const int INITIAL_BACKUP_VERSION = 1; /// We may use lightweight backup in version 2. const int CURRENT_BACKUP_VERSION = 2; + constexpr auto BASE_BACKUP_COPY_S3_CREDENTIALS_FROM_BACKUP = "base_backup_copy_s3_credentials_from_backup"; using SizeAndChecksum = IBackup::SizeAndChecksum; @@ -307,10 +308,21 @@ std::shared_ptr BackupImpl::getBaseBackupUnlocked() const { if (!base_backup && base_backup_info) { + /// Copy the credentials into a local copy only used for opening the base backup. + /// The stored `base_backup_info` must stay unchanged because `writeBackupMetadata` + /// serializes it into the `.backup` file, and the copied credentials must not be persisted there. + BackupInfo effective_base_backup_info = *base_backup_info; if (params.use_same_s3_credentials_for_base_backup) - backup_info.copyS3CredentialsTo(*base_backup_info); + { + backup_info.copyS3CredentialsTo(effective_base_backup_info); + } + else if (base_backup_copy_s3_credentials_from_backup && backup_info.canCopyS3CredentialsTo(effective_base_backup_info)) + { + /// Metadata marker asks to copy credentials from this backup locator at restore time. + backup_info.copyS3CredentialsTo(effective_base_backup_info); + } - BackupFactory::CreateParams base_params = params.getCreateParamsForBaseBackup(*base_backup_info, archive_params.password); + BackupFactory::CreateParams base_params = params.getCreateParamsForBaseBackup(std::move(effective_base_backup_info), archive_params.password); base_backup = BackupFactory::instance().createBackup(base_params); if ((open_mode == OpenMode::READ) && (base_backup_uuid != base_backup->getUUID())) @@ -413,8 +425,27 @@ void BackupImpl::writeBackupMetadata() if (base_backup_in_use) { - *out << "" << xml << base_backup_info->toString() << ""; + /// Persist base backup locators without inline `S3` credentials. + BackupInfo effective_base_backup_info = *base_backup_info; + if (params.use_same_s3_credentials_for_base_backup) + backup_info.copyS3CredentialsTo(effective_base_backup_info); + + const BackupInfo base_backup_info_for_metadata = effective_base_backup_info.withoutS3Credentials(params.context); + const bool base_backup_credentials_were_stripped = base_backup_info_for_metadata.toString() != effective_base_backup_info.toString(); + bool base_backup_can_use_this_backup_credentials = false; + + if (base_backup_credentials_were_stripped && backup_info.canCopyS3CredentialsTo(base_backup_info_for_metadata)) + { + BackupInfo base_backup_info_with_this_backup_credentials = base_backup_info_for_metadata; + backup_info.copyS3CredentialsTo(base_backup_info_with_this_backup_credentials); + base_backup_can_use_this_backup_credentials = base_backup_info_with_this_backup_credentials.toString() == effective_base_backup_info.toString(); + } + + *out << "" << xml << base_backup_info_for_metadata.toString() << ""; *out << "" << getBaseBackupUnlocked()->getUUID() << ""; + if (base_backup_can_use_this_backup_credentials) + *out << "<" << BASE_BACKUP_COPY_S3_CREDENTIALS_FROM_BACKUP << ">true"; } } @@ -520,8 +551,14 @@ void BackupImpl::readBackupMetadata() uuid = parse(getString(config_root, "uuid")); if (config_root->getNodeByPath("base_backup") && !base_backup_info) + { base_backup_info = BackupInfo::fromString(getString(config_root, "base_backup")); + /// The marker is honored only when the base backup locator itself comes from the metadata: + /// if the locator was overridden with the `base_backup` setting, the override is used as is. + base_backup_copy_s3_credentials_from_backup = getBool(config_root, BASE_BACKUP_COPY_S3_CREDENTIALS_FROM_BACKUP, false); + } + if (config_root->getNodeByPath("base_backup_uuid")) base_backup_uuid = parse(getString(config_root, "base_backup_uuid")); diff --git a/src/Backups/BackupImpl.h b/src/Backups/BackupImpl.h index 91d46103a97a..8c04776f26fd 100644 --- a/src/Backups/BackupImpl.h +++ b/src/Backups/BackupImpl.h @@ -168,6 +168,8 @@ class BackupImpl : public IBackup mutable std::optional base_backup_info; mutable std::shared_ptr base_backup; mutable std::optional base_backup_uuid; + /// Whether metadata has a marker to copy `S3` credentials from this backup locator to the base backup locator. + bool base_backup_copy_s3_credentials_from_backup = false; std::shared_ptr archive_reader; std::shared_ptr archive_writer; String lock_file_name; diff --git a/src/Backups/BackupInfo.cpp b/src/Backups/BackupInfo.cpp index c50351a621ff..2cada7412821 100644 --- a/src/Backups/BackupInfo.cpp +++ b/src/Backups/BackupInfo.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -12,6 +13,11 @@ #include #include +#include + +#include +#include + namespace DB { @@ -43,6 +49,108 @@ namespace const auto * func = ast->as(); return func && func->name == "equals"; } + + /// Returns the key of a key-value assignment (e.g., "url" for url='...'). + std::optional getKeyValueArgName(const ASTPtr & ast) + { + const auto * func = ast->as(); + if (!func || func->name != "equals") + return std::nullopt; + + const auto * list = func->arguments ? func->arguments->as() : nullptr; + if (!list || list->children.size() != 2) + return std::nullopt; + + if (auto name = tryGetIdentifierName(list->children[0])) + return name; + + const auto * literal = list->children[0]->as(); + if (literal && literal->value.getType() == Field::Types::Which::String) + return literal->value.safeGet(); + + return std::nullopt; + } + + /// Returns the effective key of a key-value assignment, evaluating a constant expression key with + /// the context the same way `getKeyValueFromAST` (the named collection opening path) does. This is + /// needed so that keys written as expressions (e.g. concat('secret_', 'access_key')) are classified + /// correctly and their credentials are not persisted into the backup metadata. Without a context a + /// non-literal key is rejected (fail closed). + std::optional getEffectiveKeyValueArgName(const ASTPtr & ast, const ContextPtr & context) + { + if (auto name = getKeyValueArgName(ast)) + return name; + + const auto * func = ast->as(); + if (!func || func->name != "equals") + return std::nullopt; + + const auto * list = func->arguments ? func->arguments->as() : nullptr; + if (!list || list->children.size() != 2) + return std::nullopt; + + if (!context) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Cannot remove credentials from the base backup locator with a non-literal argument key"); + + ASTPtr evaluated = evaluateConstantExpressionOrIdentifierAsLiteral(list->children[0], context); + const auto * literal = evaluated->as(); + if (!literal || literal->value.getType() != Field::Types::Which::String) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "The base backup locator argument key must be a constant string expression"); + return literal->value.safeGet(); + } + + /// Returns the value of a key-value assignment when it is a string literal (e.g., "..." for url='...'). + std::optional getKeyValueArgStringValue(const ASTPtr & ast) + { + const auto * func = ast->as(); + if (!func || func->name != "equals") + return std::nullopt; + + const auto * list = func->arguments ? func->arguments->as() : nullptr; + if (!list || list->children.size() != 2) + return std::nullopt; + + const auto * literal = list->children[1]->as(); + if (literal && literal->value.getType() == Field::Types::Which::String) + return literal->value.safeGet(); + + return std::nullopt; + } + + /// Removes the credentials embedded in the URL itself: the userinfo part and the authentication + /// query parameters of presigned URLs (the same set as recognized by `S3::URI`). + /// Destination-significant parameters such as `versionId` are kept. + /// Returns the URL unchanged if there is nothing to remove. + String removeCredentialsFromS3URL(const String & url) + { + if (url.find('@') == String::npos && url.find('?') == String::npos) + return url; + + Poco::URI uri(url); + + bool changed = false; + if (!uri.getUserInfo().empty()) + { + uri.setUserInfo(""); + changed = true; + } + + Poco::URI::QueryParameters kept_params; + for (const auto & [key, value] : uri.getQueryParameters()) + { + if (key == "AWSAccessKeyId" || key == "Signature" || key == "Expires" || key.starts_with("X-Amz-") + || key == "GoogleAccessId" || key.starts_with("X-Goog-")) + changed = true; + else + kept_params.push_back({key, value}); + } + + if (!changed) + return url; + + uri.setQueryParameters(kept_params); + return uri.toString(); + } } ASTPtr BackupInfo::toAST() const @@ -135,6 +243,14 @@ String BackupInfo::toStringForLogging() const return toAST()->formatForLogging(); } +bool BackupInfo::canCopyS3CredentialsTo(const BackupInfo & dest) const +{ + /// Must mirror the conditions checked by `copyS3CredentialsTo`. + return id_arg.empty() && dest.id_arg.empty() + && backup_engine_name == "S3" && dest.backup_engine_name == "S3" + && args.size() == 3; +} + void BackupInfo::copyS3CredentialsTo(BackupInfo & dest) const { /// named_collection case, no need to update @@ -154,6 +270,79 @@ void BackupInfo::copyS3CredentialsTo(BackupInfo & dest) const dest_args[2] = args[2]; } +BackupInfo BackupInfo::withoutS3Credentials(ContextPtr context) const +{ + if (backup_engine_name != "S3") + return *this; + + BackupInfo res = *this; + + /// S3('url', 'access_key_id', 'secret_access_key') -> S3('url') + if (res.id_arg.empty() && res.args.size() == 3) + res.args.resize(1); + + /// S3('https://user:password@host/bucket/backup?X-Amz-Signature=...') -> S3('https://host/bucket/backup') + if (res.id_arg.empty() && !res.args.empty() && res.args[0].getType() == Field::Types::Which::String) + res.args[0] = removeCredentialsFromS3URL(res.args[0].safeGet()); + + /// S3(collection, secret_access_key = '...') -> S3(collection) + /// The keys are the `S3` authentication arguments consumed by `registerBackupEngineS3` + /// and `S3StorageParsedArguments::collectCredentials`. The key is resolved with the context, so + /// that an expression key (e.g. concat('secret_', 'access_key')) is recognized as well. + res.kv_args.erase( + std::remove_if( + res.kv_args.begin(), + res.kv_args.end(), + [&context](const ASTPtr & kv_arg) + { + auto key = getEffectiveKeyValueArgName(kv_arg, context); + return key + && (*key == "access_key_id" || *key == "secret_access_key" || *key == "session_token" || *key == "role_arn" + || *key == "role_session_name" || *key == "external_id"); + }), + res.kv_args.end()); + + /// S3('url', extra_credentials(role_arn = '...')) -> S3('url') + res.function_arg = nullptr; + + /// S3(collection, url = 'https://...?X-Amz-Signature=...') -> redact the `url` override as well + for (auto & kv_arg : res.kv_args) + { + auto key = getEffectiveKeyValueArgName(kv_arg, context); + if (!key || *key != "url") + continue; + + auto value = getKeyValueArgStringValue(kv_arg); + bool value_is_literal = value.has_value(); + if (!value) + { + /// The override may be a constant expression, which `getNamedCollection` evaluates via + /// `getParamsMapFromAST`. Evaluate it the same way, so an expression embedding credentials + /// (e.g. url = concat('https://user:', 'password@host/bucket/backup')) is not persisted verbatim. + if (!context) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Cannot remove credentials from the non-literal `url` argument"); + + ASTPtr evaluated + = evaluateConstantExpressionOrIdentifierAsLiteral(kv_arg->as()->arguments->children[1], context); + const auto * literal = evaluated->as(); + if (!literal || literal->value.getType() != Field::Types::Which::String) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "The `url` argument must be a constant string expression"); + value = literal->value.safeGet(); + } + + String redacted = removeCredentialsFromS3URL(*value); + if (!value_is_literal || redacted != *value) + { + /// The AST may be shared with the query, so it must not be modified in place. + ASTPtr cloned = kv_arg->clone(); + cloned->as()->arguments->children[1] = std::make_shared(redacted); + kv_arg = cloned; + } + } + + return res; +} + NamedCollectionPtr BackupInfo::getNamedCollection(ContextPtr context) const { if (id_arg.empty()) diff --git a/src/Backups/BackupInfo.h b/src/Backups/BackupInfo.h index d3c56655040e..a591b97fa678 100644 --- a/src/Backups/BackupInfo.h +++ b/src/Backups/BackupInfo.h @@ -30,6 +30,20 @@ struct BackupInfo void copyS3CredentialsTo(BackupInfo & dest) const; + /// Whether `copyS3CredentialsTo` would succeed (both sides are `S3` without named collections + /// and this backup locator carries explicit credentials). + bool canCopyS3CredentialsTo(const BackupInfo & dest) const; + + /// Returns a copy without `S3` credentials: positional key/secret arguments are removed, + /// credential key-value arguments and trailing `extra_credentials` are removed, and credentials + /// embedded in URLs are redacted. + /// Used to serialize the base backup locator into the `.backup` metadata, which must never + /// contain credentials; on restore they are taken from the restore source locator, from the + /// `base_backup` setting, or from the server-side configuration. + /// The context is used to evaluate non-literal argument keys and `url` overrides the same way + /// `getNamedCollection` does; without a context such expressions are rejected. + BackupInfo withoutS3Credentials(ContextPtr context = nullptr) const; + /// Gets the named collection specified by id_arg, checks access rights, /// and applies any key-value overrides from kv_args. /// Returns nullptr if id_arg is empty (i.e., no named collection is used). diff --git a/src/Backups/RestorerFromBackup.h b/src/Backups/RestorerFromBackup.h index 48561c89f6d8..cec83d5c15b1 100644 --- a/src/Backups/RestorerFromBackup.h +++ b/src/Backups/RestorerFromBackup.h @@ -64,6 +64,7 @@ class RestorerFromBackup : private boost::noncopyable bool isNonEmptyTableAllowed() const { return getRestoreSettings().allow_non_empty_tables; } std::shared_ptr getRestoreCoordination() const { return restore_coordination; } ContextMutablePtr getContext() const { return context; } + const ZooKeeperRetriesInfo & getZooKeeperRetriesInfo() const { return zookeeper_retries_info; } /// Adds a data restore task which will be later returned by getDataRestoreTasks(). /// This function can be called by implementations of IStorage::restoreFromBackup() in inherited storage classes. diff --git a/src/Backups/registerBackupEngineS3.cpp b/src/Backups/registerBackupEngineS3.cpp index b0a3b6a668d0..b39d42b97762 100644 --- a/src/Backups/registerBackupEngineS3.cpp +++ b/src/Backups/registerBackupEngineS3.cpp @@ -17,6 +17,7 @@ namespace DB::S3AuthSetting { extern const S3AuthSettingsString role_arn; extern const S3AuthSettingsString role_session_name; + extern const S3AuthSettingsString external_id; } #endif @@ -61,6 +62,7 @@ void registerBackupEngineS3(BackupFactory & factory) String secret_access_key; String role_arn; String role_session_name; + String external_id; if (auto collection = params.backup_info.getNamedCollection(params.context)) { @@ -69,6 +71,7 @@ void registerBackupEngineS3(BackupFactory & factory) secret_access_key = collection->getOrDefault("secret_access_key", ""); role_arn = collection->getOrDefault("role_arn", ""); role_session_name = collection->getOrDefault("role_session_name", ""); + external_id = collection->getOrDefault("external_id", ""); if (collection->has("filename")) s3_uri = std::filesystem::path(s3_uri) / collection->get("filename"); @@ -101,6 +104,7 @@ void registerBackupEngineS3(BackupFactory & factory) role_arn = std::move(auth_settings[S3AuthSetting::role_arn]); role_session_name = std::move(auth_settings[S3AuthSetting::role_session_name]); + external_id = std::move(auth_settings[S3AuthSetting::external_id]); } } @@ -129,6 +133,7 @@ void registerBackupEngineS3(BackupFactory & factory) secret_access_key, role_arn, role_session_name, + external_id, params.allow_s3_native_copy, params.read_settings, params.write_settings, @@ -144,6 +149,7 @@ void registerBackupEngineS3(BackupFactory & factory) secret_access_key, role_arn, role_session_name, + external_id, params.allow_s3_native_copy, params.s3_storage_class, params.read_settings, @@ -165,6 +171,7 @@ void registerBackupEngineS3(BackupFactory & factory) secret_access_key, role_arn, role_session_name, + external_id, params.allow_s3_native_copy, params.read_settings, params.write_settings, @@ -184,6 +191,7 @@ void registerBackupEngineS3(BackupFactory & factory) secret_access_key, role_arn, role_session_name, + external_id, params.allow_s3_native_copy, params.read_settings, params.write_settings, @@ -201,6 +209,7 @@ void registerBackupEngineS3(BackupFactory & factory) secret_access_key, std::move(role_arn), std::move(role_session_name), + std::move(external_id), params.allow_s3_native_copy, params.s3_storage_class, params.read_settings, diff --git a/src/Backups/tests/gtest_backup_info.cpp b/src/Backups/tests/gtest_backup_info.cpp new file mode 100644 index 000000000000..d6dcd3b6702c --- /dev/null +++ b/src/Backups/tests/gtest_backup_info.cpp @@ -0,0 +1,223 @@ +#include + +#include +#include +#include + +#include + +#include +#include + + +using namespace DB; + +namespace +{ + void checkCanCopyS3CredentialsInvariant(const String & source_str, const String & dest_str) + { + auto source = BackupInfo::fromString(source_str); + auto dest = BackupInfo::fromString(dest_str); + auto dest_for_copy = dest; + + bool copy_succeeded = true; + try + { + source.copyS3CredentialsTo(dest_for_copy); + } + catch (const Exception &) + { + copy_succeeded = false; + } + + EXPECT_EQ(source.canCopyS3CredentialsTo(dest), copy_succeeded) << source_str << " -> " << dest_str; + } + + void requireContains(const String & str, const String & expected) + { + if (str.find(expected) == String::npos) + { + std::cerr << "Expected to find " << expected << " in " << str << '\n'; + std::_Exit(1); + } + } + + void requireNotContains(const String & str, const String & unexpected) + { + if (str.find(unexpected) != String::npos) + { + std::cerr << "Did not expect to find " << unexpected << " in " << str << '\n'; + std::_Exit(1); + } + } + + [[noreturn]] void checkURLOverrideExpressionWithContext() + { + tryRegisterFunctions(); + const auto & context = getContext().context; + auto info = BackupInfo::fromString("S3(collection, url = concat('https://user:URLPASSWORD@', 's3.example.com/bucket/backup'))"); + + String str = info.withoutS3Credentials(context).toString(); + requireContains(str, "'https://s3.example.com/bucket/backup'"); + requireNotContains(str, "URLPASSWORD"); + requireNotContains(str, "concat"); + std::_Exit(0); + } + + [[noreturn]] void checkExpressionCredentialKeyWithContext() + { + tryRegisterFunctions(); + const auto & context = getContext().context; + auto info = BackupInfo::fromString("S3(collection, concat('secret_', 'access_key') = 'KEYSECRET')"); + + String str = info.withoutS3Credentials(context).toString(); + requireNotContains(str, "KEYSECRET"); + requireNotContains(str, "concat"); + std::_Exit(0); + } + + [[noreturn]] void checkExpressionURLKeyAndValueWithContext() + { + tryRegisterFunctions(); + const auto & context = getContext().context; + auto info = BackupInfo::fromString("S3(collection, concat('u', 'rl') = concat('https://user:URLPASSWORD@', 'host/bucket/backup'))"); + + String str = info.withoutS3Credentials(context).toString(); + requireContains(str, "host/bucket/backup"); + requireNotContains(str, "URLPASSWORD"); + std::_Exit(0); + } +} + + +TEST(BackupInfoDeathTest, WithoutS3CredentialsEvaluatesURLOverrideExpression) +{ + ::testing::FLAGS_gtest_death_test_style = "threadsafe"; + EXPECT_EXIT(checkURLOverrideExpressionWithContext(), ::testing::ExitedWithCode(0), ".*"); +} + + +TEST(BackupInfoDeathTest, WithoutS3CredentialsStripsExpressionCredentialKey) +{ + ::testing::FLAGS_gtest_death_test_style = "threadsafe"; + EXPECT_EXIT(checkExpressionCredentialKeyWithContext(), ::testing::ExitedWithCode(0), ".*"); +} + + +TEST(BackupInfoDeathTest, WithoutS3CredentialsRedactsExpressionURLKeyAndValue) +{ + ::testing::FLAGS_gtest_death_test_style = "threadsafe"; + EXPECT_EXIT(checkExpressionURLKeyAndValueWithContext(), ::testing::ExitedWithCode(0), ".*"); +} + + +TEST(BackupInfo, WithoutS3CredentialsStripsPositionalArguments) +{ + auto info = BackupInfo::fromString("S3('https://s3.example.com/bucket/backup', 'KEYID', 'KEYSECRET')"); + + EXPECT_EQ(info.withoutS3Credentials().toString(), "S3('https://s3.example.com/bucket/backup')"); +} + +TEST(BackupInfo, WithoutS3CredentialsStripsAuthKeyValueArguments) +{ + auto info = BackupInfo::fromString( + "S3(collection, filename = 'backup', access_key_id = 'KEYID', secret_access_key = 'KEYSECRET', session_token = 'TOKEN', " + "role_arn = 'ROLEARN', role_session_name = 'ROLESESSION', external_id = 'EXTERNALID')"); + + String str = info.withoutS3Credentials().toString(); + EXPECT_NE(str.find("collection"), String::npos); + EXPECT_NE(str.find("filename"), String::npos); + for (const auto * credential : {"KEYID", "KEYSECRET", "TOKEN", "ROLEARN", "ROLESESSION", "EXTERNALID"}) + EXPECT_EQ(str.find(credential), String::npos) << str; +} + +TEST(BackupInfo, WithoutS3CredentialsStripsExtraCredentials) +{ + auto info = BackupInfo::fromString( + "S3('https://s3.example.com/bucket/backup', extra_credentials(role_arn = 'ROLEARN', role_session_name = 'ROLESESSION'))"); + + EXPECT_EQ(info.withoutS3Credentials().toString(), "S3('https://s3.example.com/bucket/backup')"); +} + +TEST(BackupInfo, WithoutS3CredentialsRedactsURLUserInfo) +{ + auto info = BackupInfo::fromString("S3('https://user:URLPASSWORD@s3.example.com/bucket/backup', 'KEYID', 'KEYSECRET')"); + + EXPECT_EQ(info.withoutS3Credentials().toString(), "S3('https://s3.example.com/bucket/backup')"); +} + +TEST(BackupInfo, WithoutS3CredentialsRedactsPresignedURLParameters) +{ + auto info = BackupInfo::fromString( + "S3('https://s3.example.com/bucket/backup?versionId=v1&X-Amz-Signature=URLSIGNATURE&Expires=12345')"); + + EXPECT_EQ(info.withoutS3Credentials().toString(), "S3('https://s3.example.com/bucket/backup?versionId=v1')"); +} + +TEST(BackupInfo, WithoutS3CredentialsRedactsCombinedURLCredentials) +{ + auto info = BackupInfo::fromString( + "S3('https://user:URLPASSWORD@s3.example.com/bucket/backup?versionId=v1&X-Amz-Signature=URLSIGNATURE&Expires=12345', " + "'KEYID', 'KEYSECRET')"); + + EXPECT_EQ(info.withoutS3Credentials().toString(), "S3('https://s3.example.com/bucket/backup?versionId=v1')"); +} + +TEST(BackupInfo, WithoutS3CredentialsRedactsURLOverride) +{ + auto info = BackupInfo::fromString("S3(collection, url = 'https://s3.example.com/bucket/backup?X-Amz-Signature=URLSIGNATURE')"); + + String str = info.withoutS3Credentials().toString(); + EXPECT_NE(str.find("bucket/backup"), String::npos) << str; + EXPECT_EQ(str.find("URLSIGNATURE"), String::npos) << str; +} + +TEST(BackupInfo, WithoutS3CredentialsRejectsExpressionCredentialKeyWithoutContext) +{ + auto info = BackupInfo::fromString("S3(collection, concat('secret_', 'access_key') = 'KEYSECRET')"); + + EXPECT_THROW((void)info.withoutS3Credentials(), Exception); +} + +TEST(BackupInfo, WithoutS3CredentialsRejectsURLOverrideExpressionWithoutContext) +{ + auto info = BackupInfo::fromString("S3(collection, url = concat('https://host/', 'bucket'))"); + + EXPECT_THROW((void)info.withoutS3Credentials(), Exception); +} + +TEST(BackupInfo, WithoutS3CredentialsKeepsPlainQuery) +{ + auto info = BackupInfo::fromString("S3('https://s3.example.com/bucket/backup?foo=bar')"); + + EXPECT_EQ(info.withoutS3Credentials().toString(), "S3('https://s3.example.com/bucket/backup?foo=bar')"); +} + +TEST(BackupInfo, WithoutS3CredentialsIsIdempotent) +{ + auto info = BackupInfo::fromString( + "S3(collection, url = 'https://user:URLPASSWORD@s3.example.com/bucket/backup?versionId=v1&X-Amz-Signature=URLSIGNATURE', " + "access_key_id = 'KEYID', secret_access_key = 'KEYSECRET', extra_credentials(external_id = 'SECRET_EXTERNAL_ID'))"); + + auto once = info.withoutS3Credentials(); + EXPECT_EQ(once.withoutS3Credentials().toString(), once.toString()); +} + +TEST(BackupInfo, WithoutS3CredentialsKeepsOtherEngines) +{ + for (const auto * backup_name : {"Disk('backups', 'path')", "File('path')"}) + { + auto info = BackupInfo::fromString(backup_name); + EXPECT_EQ(info.withoutS3Credentials().toString(), info.toString()); + } +} + +TEST(BackupInfo, CanCopyS3CredentialsToMatchesCopyS3CredentialsTo) +{ + checkCanCopyS3CredentialsInvariant("S3('https://s3.example.com/backup', 'KEYID', 'KEYSECRET')", "S3('https://s3.example.com/base')"); + checkCanCopyS3CredentialsInvariant("S3(collection)", "S3('https://s3.example.com/base')"); + checkCanCopyS3CredentialsInvariant("S3('https://s3.example.com/backup', 'KEYID', 'KEYSECRET')", "S3(collection)"); + checkCanCopyS3CredentialsInvariant("Disk('backups', 'path')", "S3('https://s3.example.com/base')"); + checkCanCopyS3CredentialsInvariant("S3('https://s3.example.com/backup', 'KEYID', 'KEYSECRET')", "Disk('backups', 'path')"); + checkCanCopyS3CredentialsInvariant("S3('https://s3.example.com/backup')", "S3('https://s3.example.com/base')"); +} diff --git a/src/Columns/ColumnObject.cpp b/src/Columns/ColumnObject.cpp index 7e6a1e356c19..83f0d93fa232 100644 --- a/src/Columns/ColumnObject.cpp +++ b/src/Columns/ColumnObject.cpp @@ -531,6 +531,7 @@ bool ColumnObject::tryInsert(const Field & x) for (const auto & path : new_dynamic_paths) { dynamic_paths_ptrs.erase(path); + sorted_dynamic_paths.erase(path); dynamic_paths.erase(path); } @@ -566,6 +567,7 @@ bool ColumnObject::tryInsert(const Field & x) } else if (auto * dynamic_path_column = tryToAddNewDynamicPath(path)) { + new_dynamic_paths.insert(String(path)); if (!dynamic_path_column->tryInsert(value_field)) { restore_sizes(); diff --git a/src/Columns/tests/gtest_column_object.cpp b/src/Columns/tests/gtest_column_object.cpp index 4a0ca225617d..b5c05c6b6b67 100644 --- a/src/Columns/tests/gtest_column_object.cpp +++ b/src/Columns/tests/gtest_column_object.cpp @@ -444,3 +444,50 @@ TEST(ColumnObject, RepairDuplicatesInDynamicPathsAndSharedData) ASSERT_EQ((*column_object)[2], (Object{{"b", Field(1u)}, {"c", Field(1u)}, {"d", Field(1u)}})); ASSERT_EQ((*column_object)[3], (Object{{"d", Field(1u)}})); } + +TEST(ColumnObject, TryInsertRestoresSortedDynamicPaths) +{ + /// "b" is a typed UInt32 path; everything else becomes a dynamic path. + auto type = DataTypeFactory::instance().get("JSON(max_dynamic_types=10, max_dynamic_paths=10, b UInt32)"); + auto col = type->createColumn(); + auto & col_object = assert_cast(*col); + const auto & dynamic_paths = col_object.getDynamicPaths(); + + /// One valid row so we have something to serialize later. + col_object.insert(Object{{"b", Field{5u}}}); + ASSERT_EQ(col_object.size(), 1u); + ASSERT_EQ(dynamic_paths.size(), 0u); + + /// tryInsert with Object{"a_new": 1, "b": "not_a_number"}. + /// Fields are processed in alphabetical order ("a_new" before "b"), so: + /// 1. "a_new" is new → tryToAddNewDynamicPath succeeds, "a_new" is added to all + /// three structures including sorted_dynamic_paths. + /// 2. ColumnDynamic::tryInsert(1u) for "a_new" succeeds. + /// 3. ColumnUInt32::tryInsert(String) for "b" returns false. + /// 4. restore_sizes() is called. + /// BUG 1: new_dynamic_paths was never populated, so the loop that removes + /// newly-added paths is a no-op — "a_new" is left in dynamic_paths, + /// dynamic_paths_ptrs, and sorted_dynamic_paths with a rolled-back size. + /// BUG 2: even after populating new_dynamic_paths, the old code erased from + /// dynamic_paths before sorted_dynamic_paths, leaving a dangling view. + /// FIX: record the path in new_dynamic_paths immediately after + /// tryToAddNewDynamicPath succeeds, and erase sorted_dynamic_paths + /// before dynamic_paths. + bool result = col_object.tryInsert(Object{{"a_new", Field{1u}}, {"b", Field{String("not_a_number")}}}); + ASSERT_FALSE(result); + + ASSERT_EQ(col_object.size(), 1u); + ASSERT_EQ(dynamic_paths.size(), 0u); /// "a_new" must be fully rolled back + + /// serializeValueIntoArena iterates sorted_dynamic_paths. + /// Without the fix the stale "a_new" entry causes undefined behavior here (see comment above). + Arena arena; + const char * begin = nullptr; + auto ref = col_object.serializeValueIntoArena(0, arena, begin, nullptr); + + /// Round-trip sanity check. + ReadBufferFromMemory buf(ref.data, ref.size); + col_object.deserializeAndInsertFromArena(buf, nullptr); + ASSERT_EQ(col_object.size(), 2u); + ASSERT_EQ(col_object[1], col_object[0]); +} diff --git a/src/Common/Elf.cpp b/src/Common/Elf.cpp index 769bd5b9c9ec..d5ebc070592a 100644 --- a/src/Common/Elf.cpp +++ b/src/Common/Elf.cpp @@ -14,6 +14,13 @@ namespace ErrorCodes } +/// Whether [offset, offset + length) is within `total` bytes, computed so it can't overflow. +static bool rangeWithin(uint64_t offset, uint64_t length, uint64_t total) +{ + return offset <= total && length <= total - offset; +} + + Elf::Elf(const std::string & path_) { in.emplace(path_, 0); @@ -46,7 +53,7 @@ void Elf::init(const char * data, size_t size, const std::string & path_) if (!section_header_offset || !section_header_num_entries - || section_header_offset + section_header_num_entries * sizeof(ElfSectionHeader) > elf_size) + || !rangeWithin(section_header_offset, section_header_num_entries * sizeof(ElfSectionHeader), elf_size)) throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "The ELF '{}' is truncated (section header points after end of file)", path); section_headers = reinterpret_cast(mapped + section_header_offset); @@ -61,10 +68,16 @@ void Elf::init(const char * data, size_t size, const std::string & path_) throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "The ELF '{}' doesn't have string table with section names", path); uint64_t section_names_offset = section_names_strtab->header.offset; - if (section_names_offset >= elf_size) + uint64_t section_names_table_size = section_names_strtab->header.size; + if (!rangeWithin(section_names_offset, section_names_table_size, elf_size)) throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "The ELF '{}' is truncated (section names string table points after end of file)", path); section_names = reinterpret_cast(mapped + section_names_offset); + section_names_size = section_names_table_size; + + /// Require the trailing NUL (guaranteed by the ELF spec) so name() can return C strings without re-scanning. + if (section_names_size == 0 || section_names[section_names_size - 1] != '\0') + throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "The ELF '{}' has a section names string table that is not zero-terminated", path); /// Get program headers @@ -73,7 +86,7 @@ void Elf::init(const char * data, size_t size, const std::string & path_) if (!program_header_offset || !program_header_num_entries - || program_header_offset + program_header_num_entries * sizeof(ElfProgramHeader) > elf_size) + || !rangeWithin(program_header_offset, program_header_num_entries * sizeof(ElfProgramHeader), elf_size)) throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "The ELF '{}' is truncated (program header points after end of file)", path); program_headers = reinterpret_cast(mapped + program_header_offset); @@ -92,8 +105,8 @@ bool Elf::iterateSections(std::function elf_size) + /// Skip sections that span past the end of file. + if (!rangeWithin(section.header.offset, section.header.size, elf_size)) continue; if (pred(section, idx)) @@ -152,7 +165,11 @@ String Elf::getBuildID() const const ElfProgramHeader & phdr = program_headers[idx]; if (phdr.type == ProgramHeaderType::NOTE) + { + if (!rangeWithin(phdr.offset, phdr.filesz, elf_size)) + continue; return getBuildID(mapped + phdr.offset, phdr.filesz); + } } return {}; @@ -164,14 +181,22 @@ String Elf::getBuildID(const char * nhdr_pos, size_t size) while (nhdr_pos < nhdr_end) { + if (static_cast(nhdr_end - nhdr_pos) < sizeof(ElfNameHeader)) + break; + ElfNameHeader nhdr = unalignedLoad(nhdr_pos); + nhdr_pos += sizeof(ElfNameHeader); + + if (nhdr.namesz > static_cast(nhdr_end - nhdr_pos)) + break; + nhdr_pos += nhdr.namesz; + + if (nhdr.descsz > static_cast(nhdr_end - nhdr_pos)) + break; - nhdr_pos += sizeof(ElfNameHeader) + nhdr.namesz; if (nhdr.type == NameHeaderType::GNU_BUILD_ID) - { - const char * build_id = nhdr_pos; - return {build_id, nhdr.descsz}; - } + return {nhdr_pos, nhdr.descsz}; + nhdr_pos += nhdr.descsz; } @@ -192,7 +217,10 @@ const char * Elf::Section::name() const if (!elf.section_names) throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "Section names are not initialized"); - /// TODO buffer overflow is possible, we may need to check strlen. + /// init() verified the table ends with a NUL, so a forward scan from any in-bounds offset stays in-bounds. + if (header.name >= elf.section_names_size) + throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "Section name offset is out of bounds"); + return elf.section_names + header.name; } diff --git a/src/Common/Elf.h b/src/Common/Elf.h index f9782c375dbc..743f00cb0c7d 100644 --- a/src/Common/Elf.h +++ b/src/Common/Elf.h @@ -163,6 +163,7 @@ class Elf final const ElfSectionHeader * section_headers; const ElfProgramHeader * program_headers; const char * section_names = nullptr; + size_t section_names_size = 0; // bytes available starting at `section_names`, for bounds checking void init(const char * data, size_t size, const std::string & path_); }; diff --git a/src/Common/FailPoint.cpp b/src/Common/FailPoint.cpp index d467b17a2e3c..129d9a499ef2 100644 --- a/src/Common/FailPoint.cpp +++ b/src/Common/FailPoint.cpp @@ -81,6 +81,7 @@ static struct InitFiu REGULAR(smt_outdated_parts_exception_response) \ REGULAR(object_storage_queue_fail_in_the_middle_of_file) \ PAUSEABLE_ONCE(replicated_merge_tree_insert_retry_pause) \ + ONCE(replicated_merge_tree_restore_attach_retry) \ PAUSEABLE_ONCE(finish_set_quorum_failed_parts) \ PAUSEABLE_ONCE(finish_clean_quorum_failed_parts) \ PAUSEABLE_ONCE(smt_wait_next_mutation) \ diff --git a/src/Common/FieldVisitorDump.cpp b/src/Common/FieldVisitorDump.cpp index 7cf5f1f7c5a4..d36f2a8175b1 100644 --- a/src/Common/FieldVisitorDump.cpp +++ b/src/Common/FieldVisitorDump.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -51,6 +52,7 @@ String FieldVisitorDump::operator() (const String & x) const String FieldVisitorDump::operator() (const Array & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << "Array_["; @@ -67,6 +69,7 @@ String FieldVisitorDump::operator() (const Array & x) const String FieldVisitorDump::operator() (const Tuple & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << "Tuple_("; @@ -83,6 +86,7 @@ String FieldVisitorDump::operator() (const Tuple & x) const String FieldVisitorDump::operator() (const Map & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << "Map_("; @@ -99,6 +103,7 @@ String FieldVisitorDump::operator() (const Map & x) const String FieldVisitorDump::operator() (const Object & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << "Object_("; diff --git a/src/Common/FieldVisitorHash.cpp b/src/Common/FieldVisitorHash.cpp index f73c9f064e28..a8f3b2265d4b 100644 --- a/src/Common/FieldVisitorHash.cpp +++ b/src/Common/FieldVisitorHash.cpp @@ -1,4 +1,5 @@ #include +#include #include @@ -80,6 +81,7 @@ void FieldVisitorHash::operator() (const String & x) const void FieldVisitorHash::operator() (const Tuple & x) const { + checkStackSize(); UInt8 type = Field::Types::Tuple; hash.update(type); hash.update(x.size()); @@ -90,6 +92,7 @@ void FieldVisitorHash::operator() (const Tuple & x) const void FieldVisitorHash::operator() (const Map & x) const { + checkStackSize(); UInt8 type = Field::Types::Map; hash.update(type); hash.update(x.size()); @@ -100,6 +103,7 @@ void FieldVisitorHash::operator() (const Map & x) const void FieldVisitorHash::operator() (const Array & x) const { + checkStackSize(); UInt8 type = Field::Types::Array; hash.update(type); hash.update(x.size()); @@ -110,6 +114,7 @@ void FieldVisitorHash::operator() (const Array & x) const void FieldVisitorHash::operator() (const Object & x) const { + checkStackSize(); UInt8 type = Field::Types::Object; hash.update(type); hash.update(x.size()); diff --git a/src/Common/FieldVisitorToJSONElement.cpp b/src/Common/FieldVisitorToJSONElement.cpp index d5e21d9f7fcb..d7845bd0c136 100644 --- a/src/Common/FieldVisitorToJSONElement.cpp +++ b/src/Common/FieldVisitorToJSONElement.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -57,6 +58,7 @@ String FieldVisitorToJSONElement::operator() (const CustomType & x) const { retu String FieldVisitorToJSONElement::operator() (const Array & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << '['; @@ -73,6 +75,7 @@ String FieldVisitorToJSONElement::operator() (const Array & x) const String FieldVisitorToJSONElement::operator() (const Tuple & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << '['; @@ -89,6 +92,7 @@ String FieldVisitorToJSONElement::operator() (const Tuple & x) const String FieldVisitorToJSONElement::operator() (const Map & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << '{'; @@ -107,6 +111,7 @@ String FieldVisitorToJSONElement::operator() (const Map & x) const String FieldVisitorToJSONElement::operator() (const Object & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << '{'; diff --git a/src/Common/FieldVisitorToString.cpp b/src/Common/FieldVisitorToString.cpp index 319c757ee319..a9fb77e7a04b 100644 --- a/src/Common/FieldVisitorToString.cpp +++ b/src/Common/FieldVisitorToString.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -111,6 +112,7 @@ String FieldVisitorToString::operator() (const CustomType & x) const { return x. String FieldVisitorToString::operator() (const Array & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << '['; @@ -127,6 +129,7 @@ String FieldVisitorToString::operator() (const Array & x) const String FieldVisitorToString::operator() (const Tuple & x) const { + checkStackSize(); WriteBufferFromOwnString wb; // For single-element tuples we must use the explicit tuple() function, @@ -153,6 +156,7 @@ String FieldVisitorToString::operator() (const Tuple & x) const String FieldVisitorToString::operator() (const Map & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << '['; @@ -169,6 +173,7 @@ String FieldVisitorToString::operator() (const Map & x) const String FieldVisitorToString::operator() (const Object & x) const { + checkStackSize(); /// We don't support Object literals in a form of {"a" : ...}. /// So we write Object as a String containing valid JSON. return formatQuoted(convertObjectToString(x)); diff --git a/src/Common/FieldVisitorWriteBinary.cpp b/src/Common/FieldVisitorWriteBinary.cpp index af0637dfa39e..3cd8b190db0d 100644 --- a/src/Common/FieldVisitorWriteBinary.cpp +++ b/src/Common/FieldVisitorWriteBinary.cpp @@ -1,4 +1,5 @@ #include +#include #include @@ -31,6 +32,7 @@ void FieldVisitorWriteBinary::operator() (const AggregateFunctionStateData & x, void FieldVisitorWriteBinary::operator() (const Array & x, WriteBuffer & buf) const { + checkStackSize(); const size_t size = x.size(); writeBinary(size, buf); @@ -44,6 +46,7 @@ void FieldVisitorWriteBinary::operator() (const Array & x, WriteBuffer & buf) co void FieldVisitorWriteBinary::operator() (const Tuple & x, WriteBuffer & buf) const { + checkStackSize(); const size_t size = x.size(); writeBinary(size, buf); @@ -58,6 +61,7 @@ void FieldVisitorWriteBinary::operator() (const Tuple & x, WriteBuffer & buf) co void FieldVisitorWriteBinary::operator() (const Map & x, WriteBuffer & buf) const { + checkStackSize(); const size_t size = x.size(); writeBinary(size, buf); @@ -71,6 +75,7 @@ void FieldVisitorWriteBinary::operator() (const Map & x, WriteBuffer & buf) cons void FieldVisitorWriteBinary::operator() (const Object & x, WriteBuffer & buf) const { + checkStackSize(); const size_t size = x.size(); writeBinary(size, buf); diff --git a/src/Common/NamedCollections/NamedCollectionsFactory.cpp b/src/Common/NamedCollections/NamedCollectionsFactory.cpp index 9295bbfdf722..ad1abc36f928 100644 --- a/src/Common/NamedCollections/NamedCollectionsFactory.cpp +++ b/src/Common/NamedCollections/NamedCollectionsFactory.cpp @@ -380,34 +380,34 @@ void NamedCollectionFactory::updateFunc() while (!shutdown_called.load()) { - if (metadata_storage->waitUpdate()) + try { - try + if (metadata_storage->waitUpdate()) { reloadFromSQL(); } - catch (const Coordination::Exception & e) + } + catch (const Coordination::Exception & e) + { + if (Coordination::isHardwareError(e.code)) { - if (Coordination::isHardwareError(e.code)) - { - LOG_INFO(log, "Lost ZooKeeper connection, will try to connect again: {}", - DB::getCurrentExceptionMessage(true)); - - sleepForSeconds(1); - } - else - { - tryLogCurrentException(__PRETTY_FUNCTION__); - chassert(false); - } - continue; + LOG_INFO(log, "Lost ZooKeeper connection, will try to connect again: {}", + DB::getCurrentExceptionMessage(true)); + + sleepForSeconds(1); } - catch (...) + else { - DB::tryLogCurrentException(__PRETTY_FUNCTION__); + tryLogCurrentException(__PRETTY_FUNCTION__); chassert(false); - continue; } + continue; + } + catch (...) + { + DB::tryLogCurrentException(__PRETTY_FUNCTION__); + chassert(false); + continue; } } diff --git a/src/Common/checkStackSize.cpp b/src/Common/checkStackSize.cpp index c0b08b2c9fab..2a3c452ccb59 100644 --- a/src/Common/checkStackSize.cpp +++ b/src/Common/checkStackSize.cpp @@ -24,14 +24,27 @@ namespace DB } } -static thread_local void * stack_address = nullptr; -static thread_local size_t max_stack_size = 0; +namespace +{ +/// The stack address and size are detected once per thread and cached here. Both fields live +/// in one thread_local object so a single TLS access serves both (one base computation instead +/// of two; this is essentially free on x86 but matters on platforms where each thread_local +/// symbol needs its own TLS-resolution sequence). constinit guarantees constant initialization, +/// so there is no thread-safe-initialization guard on access. +struct StackBounds +{ + void * address = nullptr; + size_t max_size = 0; +}; + +constinit thread_local StackBounds stack_bounds; +} /** * @param out_address - if not nullptr, here the address of the stack will be written. * @return stack size */ -static size_t getStackSize(void ** out_address) +static NO_INLINE size_t getStackSize(void ** out_address) { using namespace DB; @@ -103,53 +116,53 @@ static size_t getStackSize(void ** out_address) return size; } -/** It works fine when interpreters are instantiated by ClickHouse code in properly prepared threads, - * but there are cases when ClickHouse runs as a library inside another application. - * If application is using user-space lightweight threads with manually allocated stacks, - * current implementation is not reasonable, as it has no way to properly check the remaining - * stack size without knowing the details of how stacks are allocated. - * We mark this function as weak symbol to be able to replace it in another ClickHouse-based products. - */ -__attribute__((__weak__)) void checkStackSize() +/// Kept out of line so the rare error paths do not bloat checkStackSize (which is inlined into many callers). +[[noreturn]] [[gnu::cold]] NO_INLINE static void throwFrameAddressError() { - using namespace DB; + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "Frame address is greater than stack begin address"); +} + +[[noreturn]] [[gnu::cold]] NO_INLINE static void throwTooDeepRecursion(const void * stack_begin, const void * frame, size_t used_stack_size, size_t total_stack_size) +{ + throw DB::Exception(DB::ErrorCodes::TOO_DEEP_RECURSION, + "Stack size too large. Stack address: {}, frame address: {}, stack size: {}, maximum stack size: {}", + stack_begin, frame, used_stack_size, total_stack_size); +} +void checkStackSize() +{ /// Not implemented for coroutines. if (Fiber::getCurrentFiber()) return; - if (!stack_address) - max_stack_size = getStackSize(&stack_address); + if (unlikely(!stack_bounds.address)) + stack_bounds.max_size = getStackSize(&stack_bounds.address); /// The check is impossible. - if (!max_stack_size) + if (unlikely(!stack_bounds.max_size)) return; const void * frame_address = __builtin_frame_address(0); uintptr_t int_frame_address = reinterpret_cast(frame_address); - uintptr_t int_stack_address = reinterpret_cast(stack_address); + uintptr_t int_stack_address = reinterpret_cast(stack_bounds.address); #if !defined(THREAD_SANITIZER) /// It's overkill to use more then half of stack. - static constexpr double STACK_SIZE_FREE_RATIO = 0.5; + static constexpr size_t STACK_SIZE_FREE_RATIO = 2; #else /// Under TSan recursion eats too much RAM, so half of stack is too much. /// So under TSan only 5% of a stack is allowed (this is ~400K) - static constexpr double STACK_SIZE_FREE_RATIO = 0.05; + static constexpr size_t STACK_SIZE_FREE_RATIO = 20; #endif - /// We assume that stack grows towards lower addresses. And that it starts to grow from the end of a chunk of memory of max_stack_size. - if (int_frame_address > int_stack_address + max_stack_size) - throw Exception(ErrorCodes::LOGICAL_ERROR, "Frame address is greater than stack begin address"); + /// We assume that stack grows towards lower addresses. And that it starts to grow from the end of a chunk of memory of max_size. + if (unlikely(int_frame_address > int_stack_address + stack_bounds.max_size)) + throwFrameAddressError(); - size_t stack_size = int_stack_address + max_stack_size - int_frame_address; - size_t max_stack_size_allowed = static_cast(max_stack_size * STACK_SIZE_FREE_RATIO); + size_t stack_size = int_stack_address + stack_bounds.max_size - int_frame_address; + size_t max_stack_size_allowed = stack_bounds.max_size / STACK_SIZE_FREE_RATIO; /// Just check if we have eat more than a STACK_SIZE_FREE_RATIO of stack size already. - if (stack_size > max_stack_size_allowed) - { - throw Exception(ErrorCodes::TOO_DEEP_RECURSION, - "Stack size too large. Stack address: {}, frame address: {}, stack size: {}, maximum stack size: {}", - stack_address, frame_address, stack_size, max_stack_size); - } + if (unlikely(stack_size > max_stack_size_allowed)) + throwTooDeepRecursion(stack_bounds.address, frame_address, stack_size, stack_bounds.max_size); } diff --git a/src/Coordination/KeeperStorage.cpp b/src/Coordination/KeeperStorage.cpp index 11be234d7584..8fc631af15d1 100644 --- a/src/Coordination/KeeperStorage.cpp +++ b/src/Coordination/KeeperStorage.cpp @@ -1323,7 +1323,10 @@ Coordination::Error KeeperStorage::commit(KeeperStorageBase::DeltaRan else if constexpr (std::same_as) { std::lock_guard auth_lock{auth_mutex}; - committed_session_and_auth[operation.session_id].emplace_back(std::move(*operation.auth_id)); + /// Copy instead of move because the uncommitted state may still hold + /// a shared_ptr to the same AuthID object, and a concurrent preprocess + /// call can read it without holding auth_mutex. + committed_session_and_auth[operation.session_id].emplace_back(*operation.auth_id); return Coordination::Error::ZOK; } else if constexpr (std::same_as) @@ -1789,8 +1792,7 @@ std::list preprocess( ProfileEvents::increment(ProfileEvents::KeeperGetRequest); if (zk_request.path == Coordination::keeper_api_feature_flags_path - || zk_request.path == Coordination::keeper_config_path - || zk_request.path == Coordination::keeper_availability_zone_path) + || zk_request.path == Coordination::keeper_config_path) return {}; if (!storage.uncommitted_state.getNode(zk_request.path)) diff --git a/src/Core/MySQL/PacketsGeneric.cpp b/src/Core/MySQL/PacketsGeneric.cpp index af80797d5c16..5e9b442ab176 100644 --- a/src/Core/MySQL/PacketsGeneric.cpp +++ b/src/Core/MySQL/PacketsGeneric.cpp @@ -46,16 +46,14 @@ size_t OKPacket::getPayloadSize() const result += 2; } - if (capabilities & CLIENT_SESSION_TRACK) - { - result += getLengthEncodedStringSize(info); - if (status_flags & SERVER_SESSION_STATE_CHANGED) - result += getLengthEncodedStringSize(session_state_changes); - } - else - { - result += info.size(); - } + /// `info` is always a length-encoded string, matching real MySQL. The protocol documentation + /// describes it as a rest-of-packet string when `CLIENT_SESSION_TRACK` is not negotiated, but the + /// MySQL server length-encodes it unconditionally, and `MySQL Connector/J` >= 8.2 reads it as a + /// length-encoded string regardless of the negotiated capabilities. Writing a plain string here + /// made `Connector/J` interpret the first byte of `info` as a length and fail to connect. + result += getLengthEncodedStringSize(info); + if ((capabilities & CLIENT_SESSION_TRACK) && (status_flags & SERVER_SESSION_STATE_CHANGED)) + result += getLengthEncodedStringSize(session_state_changes); return result; } @@ -77,18 +75,9 @@ void OKPacket::readPayloadImpl(ReadBuffer & payload) payload.readStrict(reinterpret_cast(&status_flags), 2); } - if (capabilities & CLIENT_SESSION_TRACK) - { - readLengthEncodedString(info, payload); - if (status_flags & SERVER_SESSION_STATE_CHANGED) - { - readLengthEncodedString(session_state_changes, payload); - } - } - else - { - readString(info, payload); - } + readLengthEncodedString(info, payload); + if ((capabilities & CLIENT_SESSION_TRACK) && (status_flags & SERVER_SESSION_STATE_CHANGED)) + readLengthEncodedString(session_state_changes, payload); } void OKPacket::writePayloadImpl(WriteBuffer & buffer) const @@ -108,16 +97,9 @@ void OKPacket::writePayloadImpl(WriteBuffer & buffer) const buffer.write(reinterpret_cast(&status_flags), 2); } - if (capabilities & CLIENT_SESSION_TRACK) - { - writeLengthEncodedString(info, buffer); - if (status_flags & SERVER_SESSION_STATE_CHANGED) - writeLengthEncodedString(session_state_changes, buffer); - } - else - { - writeString(info, buffer); - } + writeLengthEncodedString(info, buffer); + if ((capabilities & CLIENT_SESSION_TRACK) && (status_flags & SERVER_SESSION_STATE_CHANGED)) + writeLengthEncodedString(session_state_changes, buffer); } EOFPacket::EOFPacket() : warnings(0x00), status_flags(0x00) diff --git a/src/Core/PostgreSQL/insertPostgreSQLValue.cpp b/src/Core/PostgreSQL/insertPostgreSQLValue.cpp index e4c243f8f7e2..e731d0a38953 100644 --- a/src/Core/PostgreSQL/insertPostgreSQLValue.cpp +++ b/src/Core/PostgreSQL/insertPostgreSQLValue.cpp @@ -149,6 +149,9 @@ void insertPostgreSQLValue( { max_dimension = std::max(max_dimension, dimension); + if (dimension == 0) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Unexpected array closing bracket"); + --dimension; if (dimension == 0) break; diff --git a/src/Core/PostgreSQLProtocol.h b/src/Core/PostgreSQLProtocol.h index 9c03e43c9db2..c7d0e1f16139 100644 --- a/src/Core/PostgreSQLProtocol.h +++ b/src/Core/PostgreSQLProtocol.h @@ -218,6 +218,9 @@ class MessageTransport { Int32 size; readBinaryBigEndian(size, *in); + if (size < 4) + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Wrong message length {} received from client, it must be at least 4", size); in->ignore(size - 4); } @@ -513,8 +516,15 @@ class SASLInitialResponse : public Messaging::FrontMessage readNullTerminated(auth_method, in); Int32 size_sasl_mechanism; readBinaryBigEndian(size_sasl_mechanism, in); - sasl_mechanism.resize(size_sasl_mechanism); - in.readStrict(sasl_mechanism.data(), size_sasl_mechanism); + /// -1 is the protocol sentinel for "no initial response"; any other negative value is malformed. + if (size_sasl_mechanism < -1) + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Wrong SASL mechanism length {} in SASLInitialResponse, it must not be less than -1", size_sasl_mechanism); + if (size_sasl_mechanism > 0) + { + sasl_mechanism.resize(size_sasl_mechanism); + in.readStrict(sasl_mechanism.data(), size_sasl_mechanism); + } } MessageType getMessageType() const override @@ -563,6 +573,9 @@ class SASLResponse : public Messaging::FrontMessage readBinaryBigEndian(message_type, in); Int32 size; readBinaryBigEndian(size, in); + if (size < 4) + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Wrong message length {} in SASLResponse, it must be at least 4", size); sasl_mechanism.resize(size - 4); in.readStrict(sasl_mechanism.data(), size - 4); } @@ -767,6 +780,16 @@ class BindQuery : FrontMessage { Int32 sz_param; readBinaryBigEndian(sz_param, in); + /// -1 is the protocol sentinel for a NULL parameter and no value bytes follow; + /// any other negative value is malformed. + if (sz_param < -1) + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Wrong parameter length {} in Bind message, it must not be less than -1", sz_param); + if (sz_param == -1) + { + parameters.emplace_back("NULL"); + continue; + } String current_param(sz_param, 0); in.readStrict(current_param.data(), sz_param); parameters.push_back(current_param); @@ -1141,6 +1164,9 @@ class CopyInData : FrontMessage { Int32 sz; readBinaryBigEndian(sz, in); + if (sz < static_cast(sizeof(Int32))) + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Wrong message length {} in CopyData, it must be at least 4", sz); query.reserve(sz - sizeof(Int32)); for (size_t i = 0; i < sz - sizeof(Int32); ++i) { diff --git a/src/Core/ServerSettings.cpp b/src/Core/ServerSettings.cpp index 02210b0760ce..f4e815d0a7c3 100644 --- a/src/Core/ServerSettings.cpp +++ b/src/Core/ServerSettings.cpp @@ -1283,7 +1283,7 @@ void ServerSettings::dumpToSystemServerSettingsColumns(ServerSettingColumnsParam {"mark_cache_size", {std::to_string(context->getMarkCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, {"uncompressed_cache_size", {std::to_string(context->getUncompressedCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, {"index_mark_cache_size", {std::to_string(context->getIndexMarkCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, - {"index_uncompressed_cache_size", {std::to_string(context->getIndexUncompressedCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, + {"index_uncompressed_cache_size", {std::to_string(context->getIndexUncompressedCache(/*only_if_enabled=*/ false)->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, {"mmap_cache_size", {std::to_string(context->getMMappedFileCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, {"query_condition_cache_size", {std::to_string(context->getQueryConditionCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, diff --git a/src/Core/tests/gtest_insertPostgreSQLValue.cpp b/src/Core/tests/gtest_insertPostgreSQLValue.cpp new file mode 100644 index 000000000000..f37e64b43c52 --- /dev/null +++ b/src/Core/tests/gtest_insertPostgreSQLValue.cpp @@ -0,0 +1,96 @@ +#include "config.h" + +#if USE_LIBPQXX + +#include + +#include +#include +#include +#include +#include +#include + + +using namespace DB; + +namespace DB::ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} + +/// Regression test for dimension underflow in PostgreSQL array parser. +/// When pqxx::array_parser emits row_end before any row_start (e.g. malformed +/// input starting with '}'), the dimension counter must not underflow from 0. +/// See https://github.com/ClickHouse/clickhouse-core-incidents/issues/1693 + +TEST(InsertPostgreSQLValue, MalformedArrayClosingBracketThrows) +{ + auto nested_type = std::make_shared(); + auto array_type = std::make_shared(nested_type); + auto column = ColumnArray::create(ColumnInt32::create()); + + std::unordered_map array_info; + preparePostgreSQLArrayInfo(array_info, 0, array_type); + + /// Input "}" causes row_end at dimension 0 — must throw BAD_ARGUMENTS, + /// not underflow size_t to SIZE_MAX and crash. + try + { + insertPostgreSQLValue( + *column, "}", + ExternalResultDescription::ValueType::vtArray, + array_type, array_info, 0); + FAIL() << "Expected BAD_ARGUMENTS exception for malformed array '}'"; + } + catch (const Exception & e) + { + EXPECT_EQ(e.code(), ErrorCodes::BAD_ARGUMENTS); + } +} + +TEST(InsertPostgreSQLValue, MalformedArrayClosingThenOpeningThrows) +{ + auto nested_type = std::make_shared(); + auto array_type = std::make_shared(nested_type); + auto column = ColumnArray::create(ColumnInt32::create()); + + std::unordered_map array_info; + preparePostgreSQLArrayInfo(array_info, 0, array_type); + + /// Input "}{" also starts with row_end at dimension 0. + try + { + insertPostgreSQLValue( + *column, "}{", + ExternalResultDescription::ValueType::vtArray, + array_type, array_info, 0); + FAIL() << "Expected BAD_ARGUMENTS exception for malformed array '}{'" ; + } + catch (const Exception & e) + { + EXPECT_EQ(e.code(), ErrorCodes::BAD_ARGUMENTS); + } +} + +TEST(InsertPostgreSQLValue, WellFormedArraySucceeds) +{ + auto nested_type = std::make_shared(); + auto array_type = std::make_shared(nested_type); + auto column = ColumnArray::create(ColumnInt32::create()); + + std::unordered_map array_info; + preparePostgreSQLArrayInfo(array_info, 0, array_type); + + /// Well-formed "{1,2,3}" must succeed without exceptions. + EXPECT_NO_THROW( + insertPostgreSQLValue( + *column, "{1,2,3}", + ExternalResultDescription::ValueType::vtArray, + array_type, array_info, 0)); + + /// Verify the column now has one row with 3 elements. + ASSERT_EQ(column->size(), 1u); +} + +#endif diff --git a/src/Core/tests/gtest_postgresql_protocol.cpp b/src/Core/tests/gtest_postgresql_protocol.cpp new file mode 100644 index 000000000000..5c0d4c3c8e18 --- /dev/null +++ b/src/Core/tests/gtest_postgresql_protocol.cpp @@ -0,0 +1,211 @@ +#include + +#include +#include +#include +#include + +#include + +namespace DB::ErrorCodes +{ + extern const int UNKNOWN_PACKET_FROM_CLIENT; +} + +using namespace DB; +namespace Messaging = DB::PostgreSQLProtocol::Messaging; + +namespace +{ + +void putUInt8(std::string & s, UInt8 v) +{ + s.push_back(static_cast(v)); +} + +void putInt16(std::string & s, Int16 v) +{ + s.push_back(static_cast((v >> 8) & 0xFF)); + s.push_back(static_cast(v & 0xFF)); +} + +void putInt32(std::string & s, Int32 v) +{ + for (int i = 3; i >= 0; --i) + s.push_back(static_cast((v >> (8 * i)) & 0xFF)); +} + +/// Run `body` over the bytes and report whether it threw UNKNOWN_PACKET_FROM_CLIENT. +template +bool throwsUnknownPacket(const std::string & bytes, F && body) +{ + ReadBufferFromMemory in(bytes.data(), bytes.size()); + try + { + body(in); + return false; + } + catch (const Exception & e) + { + EXPECT_EQ(e.code(), ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT); + return e.code() == ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT; + } +} + +} + +TEST(PostgreSQLProtocol, DropMessageRejectsLengthBelowFour) +{ + /// The message-length field includes its own four bytes, so anything below 4 underflows `size - 4`. + for (Int32 size = 0; size < 4; ++size) + { + std::string bytes; + putInt32(bytes, size); + WriteBufferFromOwnString out; + EXPECT_TRUE(throwsUnknownPacket(bytes, [&](ReadBuffer & in) + { + Messaging::MessageTransport mt(&in, &out); + mt.dropMessage(); + })) << "size = " << size; + } + + /// A well-formed length skips the declared number of trailing bytes. + std::string bytes; + putInt32(bytes, 8); + bytes += "abcd"; + ReadBufferFromMemory in(bytes.data(), bytes.size()); + WriteBufferFromOwnString out; + Messaging::MessageTransport mt(&in, &out); + EXPECT_NO_THROW(mt.dropMessage()); +} + +TEST(PostgreSQLProtocol, SASLResponseRejectsLengthBelowFour) +{ + for (Int32 size = 0; size < 4; ++size) + { + std::string bytes; + putUInt8(bytes, 'p'); + putInt32(bytes, size); + EXPECT_TRUE(throwsUnknownPacket(bytes, [](ReadBuffer & in) + { + Messaging::SASLResponse msg; + msg.deserialize(in); + })) << "size = " << size; + } + + /// size == 4 means an empty SASL payload. + std::string bytes; + putUInt8(bytes, 'p'); + putInt32(bytes, 4); + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::SASLResponse msg; + EXPECT_NO_THROW(msg.deserialize(in)); + EXPECT_TRUE(msg.sasl_mechanism.empty()); +} + +TEST(PostgreSQLProtocol, SASLInitialResponseHandlesMechanismLength) +{ + auto build = [](Int32 size_sasl_mechanism, const std::string & data) + { + std::string bytes; + putUInt8(bytes, 'p'); + putInt32(bytes, 0); /// the outer size field is not used for bounds here + bytes += "SCRAM-SHA-256"; + bytes.push_back('\0'); + putInt32(bytes, size_sasl_mechanism); + bytes += data; + return bytes; + }; + + /// Below -1 is malformed. + EXPECT_TRUE(throwsUnknownPacket(build(-2, ""), [](ReadBuffer & in) + { + Messaging::SASLInitialResponse msg; + msg.deserialize(in); + })); + + /// -1 is the protocol sentinel for "no initial response". + { + std::string bytes = build(-1, ""); + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::SASLInitialResponse msg; + EXPECT_NO_THROW(msg.deserialize(in)); + EXPECT_TRUE(msg.sasl_mechanism.empty()); + } + + /// A non-negative length reads exactly that many bytes. + { + std::string bytes = build(3, "abc"); + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::SASLInitialResponse msg; + EXPECT_NO_THROW(msg.deserialize(in)); + EXPECT_EQ(msg.sasl_mechanism, "abc"); + } +} + +TEST(PostgreSQLProtocol, BindHandlesParameterLength) +{ + auto build = [](Int32 sz_param, const std::string & data) + { + std::string bytes; + putInt32(bytes, 0); /// the outer size field is not used for bounds here + bytes.push_back('\0'); /// empty portal name + bytes.push_back('\0'); /// empty statement name + putInt16(bytes, 0); /// no parameter format codes + putInt16(bytes, 1); /// one parameter + putInt32(bytes, sz_param); + bytes += data; + putInt16(bytes, 0); /// no result format codes + return bytes; + }; + + /// Below -1 is malformed. + EXPECT_TRUE(throwsUnknownPacket(build(-2, ""), [](ReadBuffer & in) + { + Messaging::BindQuery msg; + msg.deserialize(in); + })); + + /// -1 is the protocol sentinel for a NULL parameter; no value bytes follow. + { + std::string bytes = build(-1, ""); + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::BindQuery msg; + EXPECT_NO_THROW(msg.deserialize(in)); + ASSERT_EQ(msg.parameters.size(), 1u); + EXPECT_EQ(msg.parameters[0], "NULL"); + } + + /// A non-negative length reads exactly that many bytes. + { + std::string bytes = build(2, "hi"); + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::BindQuery msg; + EXPECT_NO_THROW(msg.deserialize(in)); + ASSERT_EQ(msg.parameters.size(), 1u); + EXPECT_EQ(msg.parameters[0], "hi"); + } +} + +TEST(PostgreSQLProtocol, CopyDataRejectsLengthBelowFour) +{ + for (Int32 size = 0; size < 4; ++size) + { + std::string bytes; + putInt32(bytes, size); + EXPECT_TRUE(throwsUnknownPacket(bytes, [](ReadBuffer & in) + { + Messaging::CopyInData msg; + msg.deserialize(in); + })) << "size = " << size; + } + + /// A well-formed length carries `size - 4` payload bytes. + std::string bytes; + putInt32(bytes, 6); + bytes += "ab"; + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::CopyInData msg; + EXPECT_NO_THROW(msg.deserialize(in)); + EXPECT_EQ(msg.query, "ab"); +} diff --git a/src/DataTypes/FieldToDataType.cpp b/src/DataTypes/FieldToDataType.cpp index 80ff68df9a3a..478c3e46e545 100644 --- a/src/DataTypes/FieldToDataType.cpp +++ b/src/DataTypes/FieldToDataType.cpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace DB @@ -161,6 +162,8 @@ DataTypePtr FieldToDataType::operator() (const Decimal256 &, UInt32 sc template DataTypePtr FieldToDataType::operator() (const Array & x) const { + checkStackSize(); + DataTypes element_types; element_types.reserve(x.size()); @@ -173,6 +176,8 @@ DataTypePtr FieldToDataType::operator() (const Array & x) const template DataTypePtr FieldToDataType::operator() (const Tuple & tuple) const { + checkStackSize(); + DataTypes element_types; element_types.reserve(tuple.size()); @@ -185,6 +190,8 @@ DataTypePtr FieldToDataType::operator() (const Tuple & tuple) const template DataTypePtr FieldToDataType::operator() (const Map & map) const { + checkStackSize(); + DataTypes key_types; DataTypes value_types; key_types.reserve(map.size()); diff --git a/src/DataTypes/Serializations/SerializationDynamic.cpp b/src/DataTypes/Serializations/SerializationDynamic.cpp index e21836f408bf..6ccb1bd8992d 100644 --- a/src/DataTypes/Serializations/SerializationDynamic.cpp +++ b/src/DataTypes/Serializations/SerializationDynamic.cpp @@ -636,6 +636,13 @@ void SerializationDynamic::deserializeBinaryBulkWithMultipleStreams( { ColumnPtr type_column = flattened_column.types[i]->createColumn(); flattened_column.types[i]->getDefaultSerialization()->deserializeBinaryBulkWithMultipleStreams(type_column, 0, flattened_limits[i], settings, dynamic_state->flattened_states[i], cache); + if (type_column->size() != flattened_limits[i]) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Mismatch in flattened Dynamic column: indexes declare {} rows for type {}, but only {} rows were deserialized", + flattened_limits[i], + flattened_column.types[i]->getName(), + type_column->size()); flattened_column.columns.emplace_back(std::move(type_column)); } diff --git a/src/DataTypes/getLeastSupertype.cpp b/src/DataTypes/getLeastSupertype.cpp index d310fb47cdb8..1381a067ac93 100644 --- a/src/DataTypes/getLeastSupertype.cpp +++ b/src/DataTypes/getLeastSupertype.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -338,6 +339,8 @@ DataTypePtr getLeastSuperTypeForTuple(const DataTypes & types) template DataTypePtr getLeastSupertype(const DataTypes & types) { + checkStackSize(); + /// Trivial cases if (types.empty()) diff --git a/src/Databases/TablesDependencyGraph.cpp b/src/Databases/TablesDependencyGraph.cpp index 8a6dc373ca13..5a4579e6edc7 100644 --- a/src/Databases/TablesDependencyGraph.cpp +++ b/src/Databases/TablesDependencyGraph.cpp @@ -707,10 +707,29 @@ std::vector> TablesDependencyGraph::getTablesSplitByDepen if (sorted_nodes.empty()) return tables_split_by_level; - tables_split_by_level.resize(sorted_nodes.back()->level + 1); + /// Find the maximum non-cyclic level to size the vector. + /// Nodes with level == CYCLIC_LEVEL are placed into a dedicated trailing bucket + /// so that callers (e.g. RestorerFromBackup) that tolerate cycles still work + /// instead of crashing due to SIZE_MAX + 1 overflow in resize(). + size_t max_level = 0; + bool has_cyclic = false; for (const auto * node : sorted_nodes) { - tables_split_by_level[node->level].emplace_back(node->storage_id); + if (node->level == CYCLIC_LEVEL) + has_cyclic = true; + else if (node->level > max_level) + max_level = node->level; + } + + tables_split_by_level.resize(max_level + 1 + (has_cyclic ? 1 : 0)); + size_t cyclic_bucket = max_level + 1; + + for (const auto * node : sorted_nodes) + { + if (node->level == CYCLIC_LEVEL) + tables_split_by_level[cyclic_bucket].emplace_back(node->storage_id); + else + tables_split_by_level[node->level].emplace_back(node->storage_id); } return tables_split_by_level; } diff --git a/src/Databases/tests/gtest_tables_dependency_graph.cpp b/src/Databases/tests/gtest_tables_dependency_graph.cpp new file mode 100644 index 000000000000..eaf1e7ad9217 --- /dev/null +++ b/src/Databases/tests/gtest_tables_dependency_graph.cpp @@ -0,0 +1,81 @@ +#include +#include + +#include + +using namespace DB; + +namespace +{ + +size_t countTables(const std::vector> & split) +{ + size_t total = 0; + for (const auto & level : split) + total += level.size(); + return total; +} + +} + +/// Regression test for https://github.com/ClickHouse/ClickHouse/issues/103746 +/// +/// Cyclic nodes get level == CYCLIC_LEVEL (std::numeric_limits::max()). +/// The old getTablesSplitByDependencyLevel did resize(sorted_nodes.back()->level + 1), +/// which for a cyclic graph is resize(SIZE_MAX + 1) == resize(0), followed by an +/// out-of-bounds write tables_split_by_level[CYCLIC_LEVEL].emplace_back(...). +/// This aborted the server during RESTORE of backups with cyclic dependencies. +TEST(TablesDependencyGraph, SplitByDependencyLevelPureCycle) +{ + TablesDependencyGraph graph("test"); + + StorageID a{"db", "a"}; + StorageID b{"db", "b"}; + + /// A depends on B and B depends on A - a pure cycle. + graph.addDependency(a, b); + graph.addDependency(b, a); + + ASSERT_TRUE(graph.hasCyclicDependencies()); + + /// Must not abort / write out of bounds. + auto split = graph.getTablesSplitByDependencyLevel(); + + /// Both cyclic tables must be present, in the trailing bucket. + EXPECT_EQ(countTables(split), 2u); + ASSERT_FALSE(split.empty()); + EXPECT_EQ(split.back().size(), 2u); +} + +/// A mix of acyclic tables and a cycle: acyclic ordering by level must be +/// preserved, while cyclic tables are placed into the trailing bucket. +TEST(TablesDependencyGraph, SplitByDependencyLevelMixedCycle) +{ + TablesDependencyGraph graph("test"); + + StorageID root{"db", "root"}; /// no dependencies -> level 0 + StorageID leaf{"db", "leaf"}; /// depends on root -> level 1 + StorageID c1{"db", "c1"}; + StorageID c2{"db", "c2"}; + + graph.addDependency(leaf, root); + + /// A separate cycle c1 <-> c2. + graph.addDependency(c1, c2); + graph.addDependency(c2, c1); + + ASSERT_TRUE(graph.hasCyclicDependencies()); + + auto split = graph.getTablesSplitByDependencyLevel(); + + /// All four tables must be present. + EXPECT_EQ(countTables(split), 4u); + + /// Levels 0 and 1 hold the acyclic tables; the trailing bucket holds the cycle. + ASSERT_GE(split.size(), 3u); + EXPECT_EQ(split[0].size(), 1u); + EXPECT_EQ(split[0][0].getTableName(), "root"); + EXPECT_EQ(split[1].size(), 1u); + EXPECT_EQ(split[1][0].getTableName(), "leaf"); + EXPECT_EQ(split.back().size(), 2u); +} diff --git a/src/Dictionaries/ClickHouseDictionarySource.cpp b/src/Dictionaries/ClickHouseDictionarySource.cpp index ebdddbf62ab9..b1b11076438c 100644 --- a/src/Dictionaries/ClickHouseDictionarySource.cpp +++ b/src/Dictionaries/ClickHouseDictionarySource.cpp @@ -142,10 +142,8 @@ bool ClickHouseDictionarySource::isModified() const if (!configuration.invalidate_query.empty()) { auto response = doInvalidateQuery(configuration.invalidate_query); - LOG_TRACE(log, "Invalidate query has returned: {}, previous value: {}", response, invalidate_query_response); - if (invalidate_query_response == response) - return false; - invalidate_query_response = response; + LOG_TRACE(log, "Invalidate query has returned: {}", response); + return invalidate_query_response.updateAndCheckModified(response); } return true; } diff --git a/src/Dictionaries/ClickHouseDictionarySource.h b/src/Dictionaries/ClickHouseDictionarySource.h index 33c7abc598f5..20c5c14255e4 100644 --- a/src/Dictionaries/ClickHouseDictionarySource.h +++ b/src/Dictionaries/ClickHouseDictionarySource.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace DB @@ -81,7 +82,7 @@ class ClickHouseDictionarySource final : public IDictionarySource std::chrono::time_point update_time; const DictionaryStructure dict_struct; const Configuration configuration; - mutable std::string invalidate_query_response; + mutable InvalidateQueryResponse invalidate_query_response; ExternalQueryBuilderPtr query_builder; Block sample_block; ContextMutablePtr context; diff --git a/src/Dictionaries/InvalidateQueryResponse.cpp b/src/Dictionaries/InvalidateQueryResponse.cpp new file mode 100644 index 000000000000..7ed91254673b --- /dev/null +++ b/src/Dictionaries/InvalidateQueryResponse.cpp @@ -0,0 +1,21 @@ +#include + +namespace DB +{ + +InvalidateQueryResponse::InvalidateQueryResponse(const InvalidateQueryResponse & other) +{ + std::lock_guard lock(other.mutex); + response = other.response; +} + +bool InvalidateQueryResponse::updateAndCheckModified(const std::string & new_response) +{ + std::lock_guard lock(mutex); + if (response == new_response) + return false; + response = new_response; + return true; +} + +} diff --git a/src/Dictionaries/InvalidateQueryResponse.h b/src/Dictionaries/InvalidateQueryResponse.h new file mode 100644 index 000000000000..5ad836ea196a --- /dev/null +++ b/src/Dictionaries/InvalidateQueryResponse.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +namespace DB +{ + +/// Thread-safe holder for the last value returned by a dictionary source's invalidate query. +class InvalidateQueryResponse +{ +public: + InvalidateQueryResponse() = default; + InvalidateQueryResponse(const InvalidateQueryResponse & other); + InvalidateQueryResponse & operator=(const InvalidateQueryResponse &) = delete; + + bool updateAndCheckModified(const std::string & new_response); + +private: + mutable std::mutex mutex; + std::string response; +}; + +} diff --git a/src/Dictionaries/MongoDBDictionarySource.cpp b/src/Dictionaries/MongoDBDictionarySource.cpp index 1704a058fcbb..3e2c38528a12 100644 --- a/src/Dictionaries/MongoDBDictionarySource.cpp +++ b/src/Dictionaries/MongoDBDictionarySource.cpp @@ -95,6 +95,7 @@ void registerDictionarySourceMongoDB(DictionarySourceFactory & factory) } configuration->checkHosts(context); + configuration->checkCollection(); return std::make_unique(dict_struct, std::move(configuration), std::make_shared(sample_block)); }; diff --git a/src/Dictionaries/MySQLDictionarySource.cpp b/src/Dictionaries/MySQLDictionarySource.cpp index 7ba8eb01c6f6..e5fd9b7614bb 100644 --- a/src/Dictionaries/MySQLDictionarySource.cpp +++ b/src/Dictionaries/MySQLDictionarySource.cpp @@ -268,11 +268,7 @@ bool MySQLDictionarySource::isModified() const { LOG_TRACE(log, "Executing invalidate query: {}", configuration.invalidate_query); auto response = doInvalidateQuery(configuration.invalidate_query); - if (response == invalidate_query_response) - return false; - - invalidate_query_response = response; - return true; + return invalidate_query_response.updateAndCheckModified(response); } return true; diff --git a/src/Dictionaries/MySQLDictionarySource.h b/src/Dictionaries/MySQLDictionarySource.h index 81e835669414..128daeda99ee 100644 --- a/src/Dictionaries/MySQLDictionarySource.h +++ b/src/Dictionaries/MySQLDictionarySource.h @@ -10,6 +10,7 @@ # include # include # include +# include # include namespace Poco @@ -89,7 +90,7 @@ class MySQLDictionarySource final : public IDictionarySource Block sample_block; ExternalQueryBuilder query_builder; const std::string load_all_query; - mutable std::string invalidate_query_response; + mutable InvalidateQueryResponse invalidate_query_response; const StreamSettings settings; }; diff --git a/src/Dictionaries/PostgreSQLDictionarySource.cpp b/src/Dictionaries/PostgreSQLDictionarySource.cpp index 516bab8a483b..5623c9d4f4db 100644 --- a/src/Dictionaries/PostgreSQLDictionarySource.cpp +++ b/src/Dictionaries/PostgreSQLDictionarySource.cpp @@ -130,9 +130,7 @@ bool PostgreSQLDictionarySource::isModified() const if (!configuration.invalidate_query.empty()) { auto response = doInvalidateQuery(configuration.invalidate_query); - if (response == invalidate_query_response) - return false; - invalidate_query_response = response; + return invalidate_query_response.updateAndCheckModified(response); } return true; } diff --git a/src/Dictionaries/PostgreSQLDictionarySource.h b/src/Dictionaries/PostgreSQLDictionarySource.h index d3d6aeca56c5..0f36cfc54071 100644 --- a/src/Dictionaries/PostgreSQLDictionarySource.h +++ b/src/Dictionaries/PostgreSQLDictionarySource.h @@ -3,6 +3,7 @@ #include "config.h" #include #include +#include #if USE_LIBPQXX #include @@ -65,7 +66,7 @@ class PostgreSQLDictionarySource final : public IDictionarySource ExternalQueryBuilder query_builder; const std::string load_all_query; std::chrono::time_point update_time; - mutable std::string invalidate_query_response; + mutable InvalidateQueryResponse invalidate_query_response; }; diff --git a/src/Dictionaries/XDBCDictionarySource.cpp b/src/Dictionaries/XDBCDictionarySource.cpp index 680401ca9785..27bb003a25c8 100644 --- a/src/Dictionaries/XDBCDictionarySource.cpp +++ b/src/Dictionaries/XDBCDictionarySource.cpp @@ -187,9 +187,7 @@ bool XDBCDictionarySource::isModified() const if (!configuration.invalidate_query.empty()) { auto response = doInvalidateQuery(configuration.invalidate_query); - if (invalidate_query_response == response) - return false; - invalidate_query_response = response; + return invalidate_query_response.updateAndCheckModified(response); } return true; } diff --git a/src/Dictionaries/XDBCDictionarySource.h b/src/Dictionaries/XDBCDictionarySource.h index 55223162bddd..3128ab899384 100644 --- a/src/Dictionaries/XDBCDictionarySource.h +++ b/src/Dictionaries/XDBCDictionarySource.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace Poco @@ -83,7 +84,7 @@ class XDBCDictionarySource final : public IDictionarySource, WithContext Block sample_block; ExternalQueryBuilder query_builder; const std::string load_all_query; - mutable std::string invalidate_query_response; + mutable InvalidateQueryResponse invalidate_query_response; BridgeHelperPtr bridge_helper; Poco::URI bridge_url; diff --git a/src/Disks/ObjectStorages/S3/diskSettings.cpp b/src/Disks/ObjectStorages/S3/diskSettings.cpp index e9c4fe2df80a..bf020f039779 100644 --- a/src/Disks/ObjectStorages/S3/diskSettings.cpp +++ b/src/Disks/ObjectStorages/S3/diskSettings.cpp @@ -56,6 +56,7 @@ namespace S3AuthSetting extern const S3AuthSettingsString role_arn; extern const S3AuthSettingsString role_session_name; + extern const S3AuthSettingsString external_id; extern const S3AuthSettingsString http_client; extern const S3AuthSettingsString service_account; extern const S3AuthSettingsString metadata_service; @@ -166,6 +167,7 @@ getClient(const S3::URI & url, const S3Settings & settings, ContextPtr context, auth_settings[S3AuthSetting::no_sign_request], auth_settings[S3AuthSetting::role_arn], auth_settings[S3AuthSetting::role_session_name], + auth_settings[S3AuthSetting::external_id], /*sts_endpoint_override=*/"" }; diff --git a/src/Formats/SchemaInferenceUtils.cpp b/src/Formats/SchemaInferenceUtils.cpp index 837947997fb2..61af04526755 100644 --- a/src/Formats/SchemaInferenceUtils.cpp +++ b/src/Formats/SchemaInferenceUtils.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -1156,7 +1157,10 @@ namespace bool tryReadJSONObject(ReadBuffer & buf, const FormatSettings & settings, DataTypeJSONPaths::Paths & paths, const std::vector & path, JSONInferenceInfo * json_info, size_t depth) { - if (depth > settings.max_parser_depth) + /// max_parser_depth is the primary bound but user-tunable; keep a checkStackSize backstop. + /// max_parser_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + checkStackSize(); + if (settings.max_parser_depth != 0 && depth > settings.max_parser_depth) throw Exception(ErrorCodes::TOO_DEEP_RECURSION, "Maximum parse depth ({}) exceeded. Consider raising max_parser_depth setting.", settings.max_parser_depth); @@ -1335,7 +1339,11 @@ namespace template DataTypePtr tryInferDataTypeForSingleFieldImpl(ReadBuffer & buf, const FormatSettings & settings, JSONInferenceInfo * json_info, size_t depth) { - if (depth > settings.max_parser_depth) + /// The max_parser_depth limit below is the primary bound, but it is user-tunable; keep a + /// checkStackSize backstop so a raised limit cannot turn deep nesting into a stack overflow. + /// max_parser_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + checkStackSize(); + if (settings.max_parser_depth != 0 && depth > settings.max_parser_depth) throw Exception(ErrorCodes::TOO_DEEP_RECURSION, "Maximum parse depth ({}) exceeded. Consider raising max_parser_depth setting.", settings.max_parser_depth); @@ -1438,6 +1446,8 @@ void transformInferredJSONTypesFromDifferentFilesIfNeeded(DataTypePtr & first, D void transformFinalInferredJSONTypeIfNeededImpl(DataTypePtr & data_type, const FormatSettings & settings, JSONInferenceInfo * json_info, bool remain_nothing_types = false) { + checkStackSize(); + if (!data_type) return; @@ -1631,6 +1641,10 @@ DataTypePtr tryInferDataTypeForSingleJSONField(std::string_view field, const For DataTypePtr makeNullableRecursively(DataTypePtr type, const FormatSettings & settings) { + /// The inferred type tree can be arbitrarily deep (e.g. a deeply nested Array/Map/Tuple from a + /// crafted input). This walk runs after the per-format schema reader, so guard the native stack. + checkStackSize(); + if (!type) return nullptr; @@ -1722,6 +1736,8 @@ NamesAndTypesList getNamesAndRecursivelyNullableTypes(const Block & header, cons bool checkIfTypeIsComplete(const DataTypePtr & type) { + checkStackSize(); + if (!type) return false; diff --git a/src/Functions/CMakeLists.txt b/src/Functions/CMakeLists.txt index 6b7355dca5d6..232f114652ec 100644 --- a/src/Functions/CMakeLists.txt +++ b/src/Functions/CMakeLists.txt @@ -164,6 +164,8 @@ if (USE_GPERF) && clang-format -i HTMLCharacterReference.generated.cpp # for clang-tidy, since string.h is deprecated && sed -i 's/\#include /\#include /g' HTMLCharacterReference.generated.cpp + # the table must be constexpr for the compile-time entity-expansion static_assert in the .gperf + && sed -i 's/static const struct NameAndGlyph wordlist/static constexpr struct NameAndGlyph wordlist/g' HTMLCharacterReference.generated.cpp SOURCES HTMLCharacterReference.gperf WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) diff --git a/src/Functions/FunctionBinaryArithmetic.h b/src/Functions/FunctionBinaryArithmetic.h index 60bd11f85aaf..f815afbdeaf5 100644 --- a/src/Functions/FunctionBinaryArithmetic.h +++ b/src/Functions/FunctionBinaryArithmetic.h @@ -1160,6 +1160,21 @@ class FunctionBinaryArithmetic : public IFunction /// We use exponentiation by squaring algorithm to perform multiplying aggregate states by N in O(log(N)) operations /// https://en.wikipedia.org/wiki/Exponentiation_by_squaring + /// + /// The squaring step computes vec_from[i] := vec_from[i] + vec_from[i]. + /// Calling `function->merge(state, state)` directly is undefined behaviour: + /// many aggregate function `merge` implementations append the source's + /// internal storage to the destination's. When `src == dst` and the + /// destination reallocates, the source iterators (pointing to the freed + /// buffer) are dereferenced, producing a heap-use-after-free. We avoid + /// the alias by copying `vec_from` into an independent column first. + /// + /// The temporary column is constructed inside the squaring branch so + /// that its arena is released at the end of each iteration. Re-using a + /// single column across iterations would leak per-iteration state + /// memory into the column's monotonic arena (`popBack` decrements the + /// row count but does not free arena allocations), causing the + /// temporary footprint to grow with the multiplier. while (m) { if (m % 2) @@ -1170,8 +1185,15 @@ class FunctionBinaryArithmetic : public IFunction } else { + auto column_temp = ColumnAggregateFunction::create(function); + column_temp->reserve(size); for (size_t i = 0; i < size; ++i) - function->merge(vec_from[i], vec_from[i], arena.get()); + column_temp->insertFrom(vec_from[i]); + auto & vec_temp = column_temp->getData(); + + for (size_t i = 0; i < size; ++i) + function->merge(vec_from[i], vec_temp[i], arena.get()); + m /= 2; } } diff --git a/src/Functions/FunctionsCodingIP.h b/src/Functions/FunctionsCodingIP.h index 00b1deb1a3d5..9ec94dc2d628 100644 --- a/src/Functions/FunctionsCodingIP.h +++ b/src/Functions/FunctionsCodingIP.h @@ -180,7 +180,7 @@ namespace detail if constexpr (exception_mode == IPStringToNumExceptionMode::Throw) throw Exception(ErrorCodes::CANNOT_PARSE_IPV6, "Invalid IPv6 value"); else if constexpr (exception_mode == IPStringToNumExceptionMode::Default) - vec_res[i] = 0; + std::fill_n(&vec_res[out_offset], offset_inc, 0); else if constexpr (exception_mode == IPStringToNumExceptionMode::Null) (*vec_null_map_to)[i] = true; } diff --git a/src/Functions/FunctionsExternalDictionaries.h b/src/Functions/FunctionsExternalDictionaries.h index 76251b874e25..0fddd31fbb22 100644 --- a/src/Functions/FunctionsExternalDictionaries.h +++ b/src/Functions/FunctionsExternalDictionaries.h @@ -720,9 +720,9 @@ class FunctionDictGetNoType final : public IFunction result = dictionary->getColumn(attribute_names[0], attribute_type, key_columns, key_types, default_mask); auto [defaults_column, mask_column] = - getDefaultsShortCircuit(std::move(default_mask), result_type, last_argument); + getDefaultsShortCircuit(std::move(default_mask), attribute_type, last_argument); - restoreShortCircuitColumn(result, defaults_column, mask_column, result_type); + restoreShortCircuitColumn(result, defaults_column, mask_column, attribute_type); } else { diff --git a/src/Functions/HTMLCharacterReference.generated.cpp b/src/Functions/HTMLCharacterReference.generated.cpp index dec2f2695de4..4efbf3bfd82d 100644 --- a/src/Functions/HTMLCharacterReference.generated.cpp +++ b/src/Functions/HTMLCharacterReference.generated.cpp @@ -1,5 +1,5 @@ /* C++ code produced by gperf version 3.1 */ -/* Command-line: /usr/bin/gperf -t --output-file=HTMLCharacterReference.generated.cpp HTMLCharacterReference.gperf */ +/* Command-line: gperf -t --output-file=HTMLCharacterReference.generated.cpp HTMLCharacterReference.gperf */ /* Computed positions: -k'1-8,12,14' */ #if !( \ @@ -15,10 +15,10 @@ && ('q' == 113) && ('r' == 114) && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) && ('w' == 119) && ('x' == 120) \ && ('y' == 121) && ('z' == 122) && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ -# error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif -#line 7 "HTMLCharacterReference.gperf" +#line 8 "HTMLCharacterReference.gperf" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" @@ -27,7 +27,7 @@ #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #pragma GCC diagnostic ignored "-Wshorten-64-to-32" // NOLINTBEGIN(google-runtime-int,hicpp-use-nullptr,modernize-use-nullptr,modernize-macro-to-enum) -#line 16 "HTMLCharacterReference.gperf" +#line 17 "HTMLCharacterReference.gperf" struct NameAndGlyph { const char * name; @@ -73,17791 +73,17780 @@ inline unsigned int HTMLCharacterHash::hash(const char * str, size_t len) switch (hval) { - default: - hval += asso_values[static_cast(str[13])]; + default: hval += asso_values[static_cast(str[13])]; /*FALLTHROUGH*/ case 13: - case 12: - hval += asso_values[static_cast(str[11])]; + case 12: hval += asso_values[static_cast(str[11])]; /*FALLTHROUGH*/ case 11: case 10: case 9: - case 8: - hval += asso_values[static_cast(str[7])]; + case 8: hval += asso_values[static_cast(str[7])]; /*FALLTHROUGH*/ - case 7: - hval += asso_values[static_cast(str[6] + 1)]; + case 7: hval += asso_values[static_cast(str[6] + 1)]; /*FALLTHROUGH*/ - case 6: - hval += asso_values[static_cast(str[5] + 2)]; + case 6: hval += asso_values[static_cast(str[5] + 2)]; /*FALLTHROUGH*/ - case 5: - hval += asso_values[static_cast(str[4] + 3)]; + case 5: hval += asso_values[static_cast(str[4] + 3)]; /*FALLTHROUGH*/ - case 4: - hval += asso_values[static_cast(str[3] + 5)]; + case 4: hval += asso_values[static_cast(str[3] + 5)]; /*FALLTHROUGH*/ - case 3: - hval += asso_values[static_cast(str[2] + 1)]; + case 3: hval += asso_values[static_cast(str[2] + 1)]; /*FALLTHROUGH*/ - case 2: - hval += asso_values[static_cast(str[1])]; + case 2: hval += asso_values[static_cast(str[1])]; /*FALLTHROUGH*/ - case 1: - hval += asso_values[static_cast(str[0] + 13)]; - break; + case 1: hval += asso_values[static_cast(str[0] + 13)]; break; } return hval; } -const struct NameAndGlyph * HTMLCharacterHash::Lookup(const char * str, size_t len) -{ - static const struct NameAndGlyph wordlist[] - = {{""}, - {""}, -#line 1155 "HTMLCharacterReference.gperf" - {"gt", ">"}, +static constexpr struct NameAndGlyph wordlist[] + = {{""}, + {""}, #line 1156 "HTMLCharacterReference.gperf" - {"gt;", ">"}, - {""}, - {""}, - {""}, -#line 1410 "HTMLCharacterReference.gperf" - {"lt", "<"}, + {"gt", ">"}, +#line 1157 "HTMLCharacterReference.gperf" + {"gt;", ">"}, + {""}, + {""}, + {""}, #line 1411 "HTMLCharacterReference.gperf" - {"lt;", "<"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 704 "HTMLCharacterReference.gperf" - {"ap;", "≈"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1398 "HTMLCharacterReference.gperf" - {"lrm;", "‎"}, - {""}, - {""}, - {""}, - {""}, -#line 1062 "HTMLCharacterReference.gperf" - {"eta;", "η"}, -#line 1044 "HTMLCharacterReference.gperf" - {"epsi;", "ε"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1046 "HTMLCharacterReference.gperf" - {"epsiv;", "ϵ"}, - {""}, - {""}, - {""}, - {""}, -#line 1148 "HTMLCharacterReference.gperf" - {"gnsim;", "⋧"}, - {""}, - {""}, - {""}, - {""}, -#line 1373 "HTMLCharacterReference.gperf" - {"lnsim;", "⋦"}, - {""}, - {""}, - {""}, -#line 601 "HTMLCharacterReference.gperf" - {"Upsi;", "ϒ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1392 "HTMLCharacterReference.gperf" - {"lpar;", "("}, - {""}, - {""}, - {""}, - {""}, -#line 1041 "HTMLCharacterReference.gperf" - {"epar;", "⋕"}, - {""}, - {""}, - {""}, - {""}, -#line 1038 "HTMLCharacterReference.gperf" - {"ensp;", " "}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1049 "HTMLCharacterReference.gperf" - {"eqsim;", "≂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1143 "HTMLCharacterReference.gperf" - {"gnap;", "⪊"}, - {""}, - {""}, - {""}, - {""}, -#line 1368 "HTMLCharacterReference.gperf" - {"lnap;", "⪉"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"lt", "<"}, +#line 1412 "HTMLCharacterReference.gperf" + {"lt;", "<"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 705 "HTMLCharacterReference.gperf" + {"ap;", "≈"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1399 "HTMLCharacterReference.gperf" + {"lrm;", "‎"}, + {""}, + {""}, + {""}, + {""}, +#line 1063 "HTMLCharacterReference.gperf" + {"eta;", "η"}, +#line 1045 "HTMLCharacterReference.gperf" + {"epsi;", "ε"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1047 "HTMLCharacterReference.gperf" + {"epsiv;", "ϵ"}, + {""}, + {""}, + {""}, + {""}, +#line 1149 "HTMLCharacterReference.gperf" + {"gnsim;", "⋧"}, + {""}, + {""}, + {""}, + {""}, +#line 1374 "HTMLCharacterReference.gperf" + {"lnsim;", "⋦"}, + {""}, + {""}, + {""}, +#line 602 "HTMLCharacterReference.gperf" + {"Upsi;", "ϒ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1393 "HTMLCharacterReference.gperf" + {"lpar;", "("}, + {""}, + {""}, + {""}, + {""}, +#line 1042 "HTMLCharacterReference.gperf" + {"epar;", "⋕"}, + {""}, + {""}, + {""}, + {""}, +#line 1039 "HTMLCharacterReference.gperf" + {"ensp;", " "}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1050 "HTMLCharacterReference.gperf" + {"eqsim;", "≂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1144 "HTMLCharacterReference.gperf" + {"gnap;", "⪊"}, + {""}, + {""}, + {""}, + {""}, +#line 1369 "HTMLCharacterReference.gperf" + {"lnap;", "⪉"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2199 "HTMLCharacterReference.gperf" + {"wr;", "≀"}, + {""}, + {""}, + {""}, + {""}, #line 2198 "HTMLCharacterReference.gperf" - {"wr;", "≀"}, - {""}, - {""}, - {""}, - {""}, -#line 2197 "HTMLCharacterReference.gperf" - {"wp;", "℘"}, -#line 917 "HTMLCharacterReference.gperf" - {"cup;", "∪"}, -#line 1420 "HTMLCharacterReference.gperf" - {"ltri;", "◃"}, -#line 1394 "HTMLCharacterReference.gperf" - {"lrarr;", "⇆"}, - {""}, - {""}, - {""}, - {""}, -#line 1058 "HTMLCharacterReference.gperf" - {"erarr;", "⥱"}, - {""}, - {""}, -#line 1065 "HTMLCharacterReference.gperf" - {"euml", "ë"}, + {"wp;", "℘"}, +#line 918 "HTMLCharacterReference.gperf" + {"cup;", "∪"}, +#line 1421 "HTMLCharacterReference.gperf" + {"ltri;", "◃"}, +#line 1395 "HTMLCharacterReference.gperf" + {"lrarr;", "⇆"}, + {""}, + {""}, + {""}, + {""}, +#line 1059 "HTMLCharacterReference.gperf" + {"erarr;", "⥱"}, + {""}, + {""}, #line 1066 "HTMLCharacterReference.gperf" - {"euml;", "ë"}, -#line 903 "HTMLCharacterReference.gperf" - {"crarr;", "↵"}, - {""}, - {""}, - {""}, -#line 1179 "HTMLCharacterReference.gperf" - {"hbar;", "ℏ"}, - {""}, - {""}, - {""}, -#line 720 "HTMLCharacterReference.gperf" - {"auml", "ä"}, + {"euml", "ë"}, +#line 1067 "HTMLCharacterReference.gperf" + {"euml;", "ë"}, +#line 904 "HTMLCharacterReference.gperf" + {"crarr;", "↵"}, + {""}, + {""}, + {""}, +#line 1180 "HTMLCharacterReference.gperf" + {"hbar;", "ℏ"}, + {""}, + {""}, + {""}, #line 721 "HTMLCharacterReference.gperf" - {"auml;", "ä"}, -#line 1303 "HTMLCharacterReference.gperf" - {"lbarr;", "⤌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 606 "HTMLCharacterReference.gperf" - {"Uuml", "Ü"}, + {"auml", "ä"}, +#line 722 "HTMLCharacterReference.gperf" + {"auml;", "ä"}, +#line 1304 "HTMLCharacterReference.gperf" + {"lbarr;", "⤌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 607 "HTMLCharacterReference.gperf" - {"Uuml;", "Ü"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1067 "HTMLCharacterReference.gperf" - {"euro;", "€"}, - {""}, - {""}, - {""}, - {""}, -#line 998 "HTMLCharacterReference.gperf" - {"dtri;", "▿"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 922 "HTMLCharacterReference.gperf" - {"cupor;", "⩅"}, - {""}, - {""}, -#line 715 "HTMLCharacterReference.gperf" - {"ast;", "*"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 774 "HTMLCharacterReference.gperf" - {"bnot;", "⌐"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 995 "HTMLCharacterReference.gperf" - {"dsol;", "⧶"}, -#line 1000 "HTMLCharacterReference.gperf" - {"duarr;", "⇵"}, - {""}, -#line 1250 "HTMLCharacterReference.gperf" - {"it;", "⁢"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1037 "HTMLCharacterReference.gperf" - {"eng;", "ŋ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 684 "HTMLCharacterReference.gperf" - {"ang;", "∠"}, -#line 891 "HTMLCharacterReference.gperf" - {"comp;", "∁"}, - {""}, - {""}, -#line 1225 "HTMLCharacterReference.gperf" - {"in;", "∈"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 979 "HTMLCharacterReference.gperf" - {"dot;", "˙"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1006 "HTMLCharacterReference.gperf" - {"eDot;", "≑"}, -#line 1375 "HTMLCharacterReference.gperf" - {"loarr;", "⇽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 668 "HTMLCharacterReference.gperf" - {"af;", "⁡"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1145 "HTMLCharacterReference.gperf" - {"gne;", "⪈"}, -#line 836 "HTMLCharacterReference.gperf" - {"bump;", "≎"}, - {""}, - {""}, - {""}, -#line 1370 "HTMLCharacterReference.gperf" - {"lne;", "⪇"}, - {""}, -#line 696 "HTMLCharacterReference.gperf" - {"angrt;", "∟"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 325 "HTMLCharacterReference.gperf" - {"Lt;", "≪"}, -#line 707 "HTMLCharacterReference.gperf" - {"ape;", "≊"}, -#line 733 "HTMLCharacterReference.gperf" - {"bbrk;", "⎵"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1230 "HTMLCharacterReference.gperf" - {"int;", "∫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1054 "HTMLCharacterReference.gperf" - {"equiv;", "≡"}, - {""}, - {""}, - {""}, -#line 831 "HTMLCharacterReference.gperf" - {"bsol;", "\\"}, -#line 1188 "HTMLCharacterReference.gperf" - {"hoarr;", "⇿"}, - {""}, - {""}, - {""}, - {""}, -#line 1421 "HTMLCharacterReference.gperf" - {"ltrie;", "⊴"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1042 "HTMLCharacterReference.gperf" - {"eparsl;", "⧣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1090 "HTMLCharacterReference.gperf" - {"frac12", "½"}, + {"Uuml", "Ü"}, +#line 608 "HTMLCharacterReference.gperf" + {"Uuml;", "Ü"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1068 "HTMLCharacterReference.gperf" + {"euro;", "€"}, + {""}, + {""}, + {""}, + {""}, +#line 999 "HTMLCharacterReference.gperf" + {"dtri;", "▿"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 923 "HTMLCharacterReference.gperf" + {"cupor;", "⩅"}, + {""}, + {""}, +#line 716 "HTMLCharacterReference.gperf" + {"ast;", "*"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 775 "HTMLCharacterReference.gperf" + {"bnot;", "⌐"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 996 "HTMLCharacterReference.gperf" + {"dsol;", "⧶"}, +#line 1001 "HTMLCharacterReference.gperf" + {"duarr;", "⇵"}, + {""}, +#line 1251 "HTMLCharacterReference.gperf" + {"it;", "⁢"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1038 "HTMLCharacterReference.gperf" + {"eng;", "ŋ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 685 "HTMLCharacterReference.gperf" + {"ang;", "∠"}, +#line 892 "HTMLCharacterReference.gperf" + {"comp;", "∁"}, + {""}, + {""}, +#line 1226 "HTMLCharacterReference.gperf" + {"in;", "∈"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 980 "HTMLCharacterReference.gperf" + {"dot;", "˙"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1007 "HTMLCharacterReference.gperf" + {"eDot;", "≑"}, +#line 1376 "HTMLCharacterReference.gperf" + {"loarr;", "⇽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 669 "HTMLCharacterReference.gperf" + {"af;", "⁡"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1146 "HTMLCharacterReference.gperf" + {"gne;", "⪈"}, +#line 837 "HTMLCharacterReference.gperf" + {"bump;", "≎"}, + {""}, + {""}, + {""}, +#line 1371 "HTMLCharacterReference.gperf" + {"lne;", "⪇"}, + {""}, +#line 697 "HTMLCharacterReference.gperf" + {"angrt;", "∟"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 326 "HTMLCharacterReference.gperf" + {"Lt;", "≪"}, +#line 708 "HTMLCharacterReference.gperf" + {"ape;", "≊"}, +#line 734 "HTMLCharacterReference.gperf" + {"bbrk;", "⎵"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1231 "HTMLCharacterReference.gperf" + {"int;", "∫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1055 "HTMLCharacterReference.gperf" + {"equiv;", "≡"}, + {""}, + {""}, + {""}, +#line 832 "HTMLCharacterReference.gperf" + {"bsol;", "\\"}, +#line 1189 "HTMLCharacterReference.gperf" + {"hoarr;", "⇿"}, + {""}, + {""}, + {""}, + {""}, +#line 1422 "HTMLCharacterReference.gperf" + {"ltrie;", "⊴"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1043 "HTMLCharacterReference.gperf" + {"eparsl;", "⧣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1091 "HTMLCharacterReference.gperf" - {"frac12;", "½"}, - {""}, - {""}, - {""}, -#line 2182 "HTMLCharacterReference.gperf" - {"vprop;", "∝"}, - {""}, - {""}, - {""}, - {""}, -#line 1307 "HTMLCharacterReference.gperf" - {"lbrke;", "⦋"}, - {""}, - {""}, -#line 1253 "HTMLCharacterReference.gperf" - {"iuml", "ï"}, + {"frac12", "½"}, +#line 1092 "HTMLCharacterReference.gperf" + {"frac12;", "½"}, + {""}, + {""}, + {""}, +#line 2183 "HTMLCharacterReference.gperf" + {"vprop;", "∝"}, + {""}, + {""}, + {""}, + {""}, +#line 1308 "HTMLCharacterReference.gperf" + {"lbrke;", "⦋"}, + {""}, + {""}, #line 1254 "HTMLCharacterReference.gperf" - {"iuml;", "ï"}, -#line 1093 "HTMLCharacterReference.gperf" - {"frac14", "¼"}, + {"iuml", "ï"}, +#line 1255 "HTMLCharacterReference.gperf" + {"iuml;", "ï"}, #line 1094 "HTMLCharacterReference.gperf" - {"frac14;", "¼"}, - {""}, -#line 776 "HTMLCharacterReference.gperf" - {"bot;", "⊥"}, - {""}, -#line 961 "HTMLCharacterReference.gperf" - {"dharr;", "⇂"}, + {"frac14", "¼"}, #line 1095 "HTMLCharacterReference.gperf" - {"frac15;", "⅕"}, - {""}, -#line 1133 "HTMLCharacterReference.gperf" - {"gfr;", "𝔤"}, - {""}, - {""}, + {"frac14;", "¼"}, + {""}, +#line 777 "HTMLCharacterReference.gperf" + {"bot;", "⊥"}, + {""}, +#line 962 "HTMLCharacterReference.gperf" + {"dharr;", "⇂"}, #line 1096 "HTMLCharacterReference.gperf" - {"frac16;", "⅙"}, - {""}, -#line 1351 "HTMLCharacterReference.gperf" - {"lfr;", "𝔩"}, -#line 1087 "HTMLCharacterReference.gperf" - {"fork;", "⋔"}, -#line 1100 "HTMLCharacterReference.gperf" - {"frac34", "¾"}, -#line 1101 "HTMLCharacterReference.gperf" - {"frac34;", "¾"}, - {""}, -#line 1019 "HTMLCharacterReference.gperf" - {"efr;", "𝔢"}, - {""}, + {"frac15;", "⅕"}, + {""}, +#line 1134 "HTMLCharacterReference.gperf" + {"gfr;", "𝔤"}, + {""}, + {""}, +#line 1097 "HTMLCharacterReference.gperf" + {"frac16;", "⅙"}, + {""}, +#line 1352 "HTMLCharacterReference.gperf" + {"lfr;", "𝔩"}, #line 1088 "HTMLCharacterReference.gperf" - {"forkv;", "⫙"}, + {"fork;", "⋔"}, +#line 1101 "HTMLCharacterReference.gperf" + {"frac34", "¾"}, #line 1102 "HTMLCharacterReference.gperf" - {"frac35;", "⅗"}, - {""}, -#line 864 "HTMLCharacterReference.gperf" - {"cfr;", "𝔠"}, - {""}, - {""}, -#line 1104 "HTMLCharacterReference.gperf" - {"frac45;", "⅘"}, - {""}, -#line 669 "HTMLCharacterReference.gperf" - {"afr;", "𝔞"}, -#line 644 "HTMLCharacterReference.gperf" - {"Yuml;", "Ÿ"}, - {""}, - {""}, - {""}, -#line 1257 "HTMLCharacterReference.gperf" - {"jfr;", "𝔧"}, -#line 1279 "HTMLCharacterReference.gperf" - {"lHar;", "⥢"}, - {""}, + {"frac34;", "¾"}, + {""}, +#line 1020 "HTMLCharacterReference.gperf" + {"efr;", "𝔢"}, + {""}, +#line 1089 "HTMLCharacterReference.gperf" + {"forkv;", "⫙"}, +#line 1103 "HTMLCharacterReference.gperf" + {"frac35;", "⅗"}, + {""}, +#line 865 "HTMLCharacterReference.gperf" + {"cfr;", "𝔠"}, + {""}, + {""}, #line 1105 "HTMLCharacterReference.gperf" - {"frac56;", "⅚"}, - {""}, -#line 578 "HTMLCharacterReference.gperf" - {"Ufr;", "𝔘"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 908 "HTMLCharacterReference.gperf" - {"csup;", "⫐"}, - {""}, -#line 1092 "HTMLCharacterReference.gperf" - {"frac13;", "⅓"}, - {""}, -#line 1774 "HTMLCharacterReference.gperf" - {"quot", "\""}, + {"frac45;", "⅘"}, + {""}, +#line 670 "HTMLCharacterReference.gperf" + {"afr;", "𝔞"}, +#line 645 "HTMLCharacterReference.gperf" + {"Yuml;", "Ÿ"}, + {""}, + {""}, + {""}, +#line 1258 "HTMLCharacterReference.gperf" + {"jfr;", "𝔧"}, +#line 1280 "HTMLCharacterReference.gperf" + {"lHar;", "⥢"}, + {""}, +#line 1106 "HTMLCharacterReference.gperf" + {"frac56;", "⅚"}, + {""}, +#line 579 "HTMLCharacterReference.gperf" + {"Ufr;", "𝔘"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 909 "HTMLCharacterReference.gperf" + {"csup;", "⫐"}, + {""}, +#line 1093 "HTMLCharacterReference.gperf" + {"frac13;", "⅓"}, + {""}, #line 1775 "HTMLCharacterReference.gperf" - {"quot;", "\""}, -#line 1039 "HTMLCharacterReference.gperf" - {"eogon;", "ę"}, - {""}, - {""}, - {""}, - {""}, -#line 930 "HTMLCharacterReference.gperf" - {"curren", "¤"}, + {"quot", "\""}, +#line 1776 "HTMLCharacterReference.gperf" + {"quot;", "\""}, +#line 1040 "HTMLCharacterReference.gperf" + {"eogon;", "ę"}, + {""}, + {""}, + {""}, + {""}, #line 931 "HTMLCharacterReference.gperf" - {"curren;", "¤"}, -#line 334 "HTMLCharacterReference.gperf" - {"Mu;", "Μ"}, -#line 959 "HTMLCharacterReference.gperf" - {"dfr;", "𝔡"}, - {""}, -#line 702 "HTMLCharacterReference.gperf" - {"aogon;", "ą"}, -#line 1163 "HTMLCharacterReference.gperf" - {"gtrarr;", "⥸"}, - {""}, -#line 1185 "HTMLCharacterReference.gperf" - {"hfr;", "𝔥"}, - {""}, - {""}, -#line 1099 "HTMLCharacterReference.gperf" - {"frac25;", "⅖"}, - {""}, - {""}, - {""}, -#line 588 "HTMLCharacterReference.gperf" - {"Uogon;", "Ų"}, - {""}, - {""}, -#line 772 "HTMLCharacterReference.gperf" - {"bne;", "=⃥"}, - {""}, - {""}, -#line 1097 "HTMLCharacterReference.gperf" - {"frac18;", "⅛"}, - {""}, - {""}, -#line 940 "HTMLCharacterReference.gperf" - {"dHar;", "⥥"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 913 "HTMLCharacterReference.gperf" - {"cuepr;", "⋞"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1103 "HTMLCharacterReference.gperf" - {"frac38;", "⅜"}, - {""}, - {""}, - {""}, + {"curren", "¤"}, +#line 932 "HTMLCharacterReference.gperf" + {"curren;", "¤"}, +#line 335 "HTMLCharacterReference.gperf" + {"Mu;", "Μ"}, #line 960 "HTMLCharacterReference.gperf" - {"dharl;", "⇃"}, -#line 1393 "HTMLCharacterReference.gperf" - {"lparlt;", "⦓"}, - {""}, -#line 457 "HTMLCharacterReference.gperf" - {"Qfr;", "𝔔"}, - {""}, - {""}, -#line 1106 "HTMLCharacterReference.gperf" - {"frac58;", "⅝"}, - {""}, - {""}, - {""}, - {""}, + {"dfr;", "𝔡"}, + {""}, +#line 703 "HTMLCharacterReference.gperf" + {"aogon;", "ą"}, +#line 1164 "HTMLCharacterReference.gperf" + {"gtrarr;", "⥸"}, + {""}, +#line 1186 "HTMLCharacterReference.gperf" + {"hfr;", "𝔥"}, + {""}, + {""}, +#line 1100 "HTMLCharacterReference.gperf" + {"frac25;", "⅖"}, + {""}, + {""}, + {""}, +#line 589 "HTMLCharacterReference.gperf" + {"Uogon;", "Ų"}, + {""}, + {""}, +#line 773 "HTMLCharacterReference.gperf" + {"bne;", "=⃥"}, + {""}, + {""}, #line 1098 "HTMLCharacterReference.gperf" - {"frac23;", "⅔"}, - {""}, -#line 1078 "HTMLCharacterReference.gperf" - {"ffr;", "𝔣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2195 "HTMLCharacterReference.gperf" - {"wfr;", "𝔴"}, - {""}, -#line 838 "HTMLCharacterReference.gperf" - {"bumpe;", "≏"}, - {""}, - {""}, - {""}, - {""}, -#line 686 "HTMLCharacterReference.gperf" - {"angle;", "∠"}, - {""}, - {""}, -#line 2177 "HTMLCharacterReference.gperf" - {"vfr;", "𝔳"}, - {""}, - {""}, -#line 924 "HTMLCharacterReference.gperf" - {"curarr;", "↷"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1146 "HTMLCharacterReference.gperf" - {"gneq;", "⪈"}, + {"frac18;", "⅛"}, + {""}, + {""}, +#line 941 "HTMLCharacterReference.gperf" + {"dHar;", "⥥"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 914 "HTMLCharacterReference.gperf" + {"cuepr;", "⋞"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1104 "HTMLCharacterReference.gperf" + {"frac38;", "⅜"}, + {""}, + {""}, + {""}, +#line 961 "HTMLCharacterReference.gperf" + {"dharl;", "⇃"}, +#line 1394 "HTMLCharacterReference.gperf" + {"lparlt;", "⦓"}, + {""}, +#line 458 "HTMLCharacterReference.gperf" + {"Qfr;", "𝔔"}, + {""}, + {""}, +#line 1107 "HTMLCharacterReference.gperf" + {"frac58;", "⅝"}, + {""}, + {""}, + {""}, + {""}, +#line 1099 "HTMLCharacterReference.gperf" + {"frac23;", "⅔"}, + {""}, +#line 1079 "HTMLCharacterReference.gperf" + {"ffr;", "𝔣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2196 "HTMLCharacterReference.gperf" + {"wfr;", "𝔴"}, + {""}, +#line 839 "HTMLCharacterReference.gperf" + {"bumpe;", "≏"}, + {""}, + {""}, + {""}, + {""}, +#line 687 "HTMLCharacterReference.gperf" + {"angle;", "∠"}, + {""}, + {""}, +#line 2178 "HTMLCharacterReference.gperf" + {"vfr;", "𝔳"}, + {""}, + {""}, +#line 925 "HTMLCharacterReference.gperf" + {"curarr;", "↷"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1147 "HTMLCharacterReference.gperf" - {"gneqq;", "≩"}, - {""}, - {""}, - {""}, -#line 1371 "HTMLCharacterReference.gperf" - {"lneq;", "⪇"}, + {"gneq;", "⪈"}, +#line 1148 "HTMLCharacterReference.gperf" + {"gneqq;", "≩"}, + {""}, + {""}, + {""}, #line 1372 "HTMLCharacterReference.gperf" - {"lneqq;", "≨"}, -#line 899 "HTMLCharacterReference.gperf" - {"coprod;", "∐"}, -#line 1121 "HTMLCharacterReference.gperf" - {"ge;", "≥"}, -#line 746 "HTMLCharacterReference.gperf" - {"bfr;", "𝔟"}, - {""}, - {""}, - {""}, -#line 1321 "HTMLCharacterReference.gperf" - {"le;", "≤"}, -#line 1126 "HTMLCharacterReference.gperf" - {"ges;", "⩾"}, - {""}, -#line 1383 "HTMLCharacterReference.gperf" - {"lopar;", "⦅"}, -#line 777 "HTMLCharacterReference.gperf" - {"bottom;", "⊥"}, -#line 1017 "HTMLCharacterReference.gperf" - {"ee;", "ⅇ"}, -#line 1336 "HTMLCharacterReference.gperf" - {"les;", "⩽"}, - {""}, - {""}, -#line 1107 "HTMLCharacterReference.gperf" - {"frac78;", "⅞"}, - {""}, -#line 1123 "HTMLCharacterReference.gperf" - {"geq;", "≥"}, - {""}, - {""}, - {""}, - {""}, -#line 1333 "HTMLCharacterReference.gperf" - {"leq;", "≤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1159 "HTMLCharacterReference.gperf" - {"gtdot;", "⋗"}, - {""}, - {""}, + {"lneq;", "⪇"}, +#line 1373 "HTMLCharacterReference.gperf" + {"lneqq;", "≨"}, #line 900 "HTMLCharacterReference.gperf" - {"copy", "©"}, + {"coprod;", "∐"}, +#line 1122 "HTMLCharacterReference.gperf" + {"ge;", "≥"}, +#line 747 "HTMLCharacterReference.gperf" + {"bfr;", "𝔟"}, + {""}, + {""}, + {""}, +#line 1322 "HTMLCharacterReference.gperf" + {"le;", "≤"}, +#line 1127 "HTMLCharacterReference.gperf" + {"ges;", "⩾"}, + {""}, +#line 1384 "HTMLCharacterReference.gperf" + {"lopar;", "⦅"}, +#line 778 "HTMLCharacterReference.gperf" + {"bottom;", "⊥"}, +#line 1018 "HTMLCharacterReference.gperf" + {"ee;", "ⅇ"}, +#line 1337 "HTMLCharacterReference.gperf" + {"les;", "⩽"}, + {""}, + {""}, +#line 1108 "HTMLCharacterReference.gperf" + {"frac78;", "⅞"}, + {""}, +#line 1124 "HTMLCharacterReference.gperf" + {"geq;", "≥"}, + {""}, + {""}, + {""}, + {""}, +#line 1334 "HTMLCharacterReference.gperf" + {"leq;", "≤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1160 "HTMLCharacterReference.gperf" + {"gtdot;", "⋗"}, + {""}, + {""}, #line 901 "HTMLCharacterReference.gperf" - {"copy;", "©"}, -#line 1414 "HTMLCharacterReference.gperf" - {"ltdot;", "⋖"}, - {""}, - {""}, - {""}, - {""}, -#line 782 "HTMLCharacterReference.gperf" - {"boxDr;", "╓"}, - {""}, - {""}, - {""}, - {""}, + {"copy", "©"}, +#line 902 "HTMLCharacterReference.gperf" + {"copy;", "©"}, +#line 1415 "HTMLCharacterReference.gperf" + {"ltdot;", "⋖"}, + {""}, + {""}, + {""}, + {""}, +#line 783 "HTMLCharacterReference.gperf" + {"boxDr;", "╓"}, + {""}, + {""}, + {""}, + {""}, +#line 911 "HTMLCharacterReference.gperf" + {"ctdot;", "⋯"}, + {""}, + {""}, +#line 680 "HTMLCharacterReference.gperf" + {"and;", "∧"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1132 "HTMLCharacterReference.gperf" + {"gesl;", "⋛︀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 215 "HTMLCharacterReference.gperf" + {"Hfr;", "ℌ"}, + {""}, + {""}, + {""}, + {""}, +#line 182 "HTMLCharacterReference.gperf" + {"Ffr;", "𝔉"}, + {""}, + {""}, +#line 840 "HTMLCharacterReference.gperf" + {"bumpeq;", "≏"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1210 "HTMLCharacterReference.gperf" + {"ifr;", "𝔦"}, + {""}, +#line 998 "HTMLCharacterReference.gperf" + {"dtdot;", "⋱"}, + {""}, + {""}, + {""}, + {""}, #line 910 "HTMLCharacterReference.gperf" - {"ctdot;", "⋯"}, - {""}, - {""}, -#line 679 "HTMLCharacterReference.gperf" - {"and;", "∧"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1131 "HTMLCharacterReference.gperf" - {"gesl;", "⋛︀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 214 "HTMLCharacterReference.gperf" - {"Hfr;", "ℌ"}, - {""}, - {""}, - {""}, - {""}, -#line 181 "HTMLCharacterReference.gperf" - {"Ffr;", "𝔉"}, - {""}, - {""}, -#line 839 "HTMLCharacterReference.gperf" - {"bumpeq;", "≏"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1209 "HTMLCharacterReference.gperf" - {"ifr;", "𝔦"}, - {""}, -#line 997 "HTMLCharacterReference.gperf" - {"dtdot;", "⋱"}, - {""}, - {""}, - {""}, - {""}, -#line 909 "HTMLCharacterReference.gperf" - {"csupe;", "⫒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 837 "HTMLCharacterReference.gperf" - {"bumpE;", "⪮"}, -#line 897 "HTMLCharacterReference.gperf" - {"conint;", "∮"}, - {""}, - {""}, -#line 531 "HTMLCharacterReference.gperf" - {"Star;", "⋆"}, - {""}, - {""}, - {""}, -#line 641 "HTMLCharacterReference.gperf" - {"Yfr;", "𝔜"}, - {""}, -#line 1237 "HTMLCharacterReference.gperf" - {"iogon;", "į"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 540 "HTMLCharacterReference.gperf" - {"Sum;", "∑"}, - {""}, -#line 781 "HTMLCharacterReference.gperf" - {"boxDl;", "╖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 117 "HTMLCharacterReference.gperf" - {"Dot;", "¨"}, - {""}, -#line 1060 "HTMLCharacterReference.gperf" - {"esdot;", "≐"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1134 "HTMLCharacterReference.gperf" - {"gg;", "≫"}, -#line 309 "HTMLCharacterReference.gperf" - {"Lfr;", "𝔏"}, - {""}, - {""}, - {""}, -#line 1352 "HTMLCharacterReference.gperf" - {"lg;", "≶"}, - {""}, - {""}, - {""}, - {""}, -#line 1020 "HTMLCharacterReference.gperf" - {"eg;", "⪚"}, + {"csupe;", "⫒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 838 "HTMLCharacterReference.gperf" + {"bumpE;", "⪮"}, +#line 898 "HTMLCharacterReference.gperf" + {"conint;", "∮"}, + {""}, + {""}, +#line 532 "HTMLCharacterReference.gperf" + {"Star;", "⋆"}, + {""}, + {""}, + {""}, +#line 642 "HTMLCharacterReference.gperf" + {"Yfr;", "𝔜"}, + {""}, +#line 1238 "HTMLCharacterReference.gperf" + {"iogon;", "į"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 541 "HTMLCharacterReference.gperf" - {"Sup;", "⋑"}, - {""}, - {""}, - {""}, -#line 96 "HTMLCharacterReference.gperf" - {"DD;", "ⅅ"}, -#line 1023 "HTMLCharacterReference.gperf" - {"egs;", "⪖"}, - {""}, - {""}, - {""}, -#line 1612 "HTMLCharacterReference.gperf" - {"nu;", "ν"}, -#line 861 "HTMLCharacterReference.gperf" - {"cent", "¢"}, -#line 862 "HTMLCharacterReference.gperf" - {"cent;", "¢"}, -#line 866 "HTMLCharacterReference.gperf" - {"check;", "✓"}, - {""}, -#line 1045 "HTMLCharacterReference.gperf" - {"epsilon;", "ε"}, -#line 238 "HTMLCharacterReference.gperf" - {"Int;", "∬"}, -#line 1239 "HTMLCharacterReference.gperf" - {"iota;", "ι"}, - {""}, - {""}, - {""}, -#line 1765 "HTMLCharacterReference.gperf" - {"qfr;", "𝔮"}, - {""}, - {""}, - {""}, -#line 1167 "HTMLCharacterReference.gperf" - {"gtrless;", "≷"}, - {""}, -#line 1560 "HTMLCharacterReference.gperf" - {"npar;", "∦"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 780 "HTMLCharacterReference.gperf" - {"boxDR;", "╔"}, - {""}, -#line 602 "HTMLCharacterReference.gperf" - {"Upsilon;", "Υ"}, + {"Sum;", "∑"}, + {""}, +#line 782 "HTMLCharacterReference.gperf" + {"boxDl;", "╖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 118 "HTMLCharacterReference.gperf" + {"Dot;", "¨"}, + {""}, +#line 1061 "HTMLCharacterReference.gperf" + {"esdot;", "≐"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1135 "HTMLCharacterReference.gperf" + {"gg;", "≫"}, +#line 310 "HTMLCharacterReference.gperf" + {"Lfr;", "𝔏"}, + {""}, + {""}, + {""}, +#line 1353 "HTMLCharacterReference.gperf" + {"lg;", "≶"}, + {""}, + {""}, + {""}, + {""}, +#line 1021 "HTMLCharacterReference.gperf" + {"eg;", "⪚"}, +#line 542 "HTMLCharacterReference.gperf" + {"Sup;", "⋑"}, + {""}, + {""}, + {""}, +#line 97 "HTMLCharacterReference.gperf" + {"DD;", "ⅅ"}, +#line 1024 "HTMLCharacterReference.gperf" + {"egs;", "⪖"}, + {""}, + {""}, + {""}, #line 1613 "HTMLCharacterReference.gperf" - {"num;", "#"}, - {""}, - {""}, -#line 1181 "HTMLCharacterReference.gperf" - {"hearts;", "♥"}, - {""}, -#line 1489 "HTMLCharacterReference.gperf" - {"nbsp", " "}, + {"nu;", "ν"}, +#line 862 "HTMLCharacterReference.gperf" + {"cent", "¢"}, +#line 863 "HTMLCharacterReference.gperf" + {"cent;", "¢"}, +#line 867 "HTMLCharacterReference.gperf" + {"check;", "✓"}, + {""}, +#line 1046 "HTMLCharacterReference.gperf" + {"epsilon;", "ε"}, +#line 239 "HTMLCharacterReference.gperf" + {"Int;", "∬"}, +#line 1240 "HTMLCharacterReference.gperf" + {"iota;", "ι"}, + {""}, + {""}, + {""}, +#line 1766 "HTMLCharacterReference.gperf" + {"qfr;", "𝔮"}, + {""}, + {""}, + {""}, +#line 1168 "HTMLCharacterReference.gperf" + {"gtrless;", "≷"}, + {""}, +#line 1561 "HTMLCharacterReference.gperf" + {"npar;", "∦"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 781 "HTMLCharacterReference.gperf" + {"boxDR;", "╔"}, + {""}, +#line 603 "HTMLCharacterReference.gperf" + {"Upsilon;", "Υ"}, +#line 1614 "HTMLCharacterReference.gperf" + {"num;", "#"}, + {""}, + {""}, +#line 1182 "HTMLCharacterReference.gperf" + {"hearts;", "♥"}, + {""}, #line 1490 "HTMLCharacterReference.gperf" - {"nbsp;", " "}, - {""}, - {""}, - {""}, -#line 1332 "HTMLCharacterReference.gperf" - {"leg;", "⋚"}, -#line 522 "HTMLCharacterReference.gperf" - {"Sqrt;", "√"}, -#line 791 "HTMLCharacterReference.gperf" - {"boxUr;", "╙"}, - {""}, - {""}, -#line 330 "HTMLCharacterReference.gperf" - {"Mfr;", "𝔐"}, - {""}, -#line 1563 "HTMLCharacterReference.gperf" - {"npart;", "∂̸"}, - {""}, - {""}, - {""}, -#line 1162 "HTMLCharacterReference.gperf" - {"gtrapprox;", "⪆"}, - {""}, -#line 687 "HTMLCharacterReference.gperf" - {"angmsd;", "∡"}, - {""}, -#line 249 "HTMLCharacterReference.gperf" - {"Iuml", "Ï"}, + {"nbsp", " "}, +#line 1491 "HTMLCharacterReference.gperf" + {"nbsp;", " "}, + {""}, + {""}, + {""}, +#line 1333 "HTMLCharacterReference.gperf" + {"leg;", "⋚"}, +#line 523 "HTMLCharacterReference.gperf" + {"Sqrt;", "√"}, +#line 792 "HTMLCharacterReference.gperf" + {"boxUr;", "╙"}, + {""}, + {""}, +#line 331 "HTMLCharacterReference.gperf" + {"Mfr;", "𝔐"}, + {""}, +#line 1564 "HTMLCharacterReference.gperf" + {"npart;", "∂̸"}, + {""}, + {""}, + {""}, +#line 1163 "HTMLCharacterReference.gperf" + {"gtrapprox;", "⪆"}, + {""}, +#line 688 "HTMLCharacterReference.gperf" + {"angmsd;", "∡"}, + {""}, #line 250 "HTMLCharacterReference.gperf" - {"Iuml;", "Ï"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2176 "HTMLCharacterReference.gperf" - {"vert;", "|"}, - {""}, - {""}, - {""}, -#line 1565 "HTMLCharacterReference.gperf" - {"npr;", "⊀"}, -#line 1124 "HTMLCharacterReference.gperf" - {"geqq;", "≧"}, -#line 1571 "HTMLCharacterReference.gperf" - {"nrarr;", "↛"}, -#line 1052 "HTMLCharacterReference.gperf" - {"equals;", "="}, - {""}, - {""}, -#line 1334 "HTMLCharacterReference.gperf" - {"leqq;", "≦"}, - {""}, -#line 1573 "HTMLCharacterReference.gperf" - {"nrarrw;", "↝̸"}, -#line 954 "HTMLCharacterReference.gperf" - {"deg", "°"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"Iuml", "Ï"}, +#line 251 "HTMLCharacterReference.gperf" + {"Iuml;", "Ï"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2177 "HTMLCharacterReference.gperf" + {"vert;", "|"}, + {""}, + {""}, + {""}, +#line 1566 "HTMLCharacterReference.gperf" + {"npr;", "⊀"}, +#line 1125 "HTMLCharacterReference.gperf" + {"geqq;", "≧"}, +#line 1572 "HTMLCharacterReference.gperf" + {"nrarr;", "↛"}, +#line 1053 "HTMLCharacterReference.gperf" + {"equals;", "="}, + {""}, + {""}, +#line 1335 "HTMLCharacterReference.gperf" + {"leqq;", "≦"}, + {""}, +#line 1574 "HTMLCharacterReference.gperf" + {"nrarrw;", "↝̸"}, #line 955 "HTMLCharacterReference.gperf" - {"deg;", "°"}, - {""}, -#line 1632 "HTMLCharacterReference.gperf" - {"nwarr;", "↖"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 902 "HTMLCharacterReference.gperf" - {"copysr;", "℗"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 983 "HTMLCharacterReference.gperf" - {"dotplus;", "∔"}, - {""}, -#line 1406 "HTMLCharacterReference.gperf" - {"lsqb;", "["}, - {""}, -#line 1086 "HTMLCharacterReference.gperf" - {"forall;", "∀"}, - {""}, -#line 1389 "HTMLCharacterReference.gperf" - {"loz;", "◊"}, - {""}, - {""}, - {""}, -#line 209 "HTMLCharacterReference.gperf" - {"Gt;", "≫"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 689 "HTMLCharacterReference.gperf" - {"angmsdab;", "⦩"}, - {""}, - {""}, - {""}, -#line 925 "HTMLCharacterReference.gperf" - {"curarrm;", "⤼"}, -#line 175 "HTMLCharacterReference.gperf" - {"Eta;", "Η"}, - {""}, - {""}, - {""}, - {""}, -#line 108 "HTMLCharacterReference.gperf" - {"Dfr;", "𝔇"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 790 "HTMLCharacterReference.gperf" - {"boxUl;", "╜"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1132 "HTMLCharacterReference.gperf" - {"gesles;", "⪔"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 810 "HTMLCharacterReference.gperf" - {"boxplus;", "⊞"}, - {""}, - {""}, - {""}, - {""}, -#line 1548 "HTMLCharacterReference.gperf" - {"not", "¬"}, - {""}, - {""}, -#line 832 "HTMLCharacterReference.gperf" - {"bsolb;", "⧅"}, - {""}, - {""}, -#line 1549 "HTMLCharacterReference.gperf" - {"not;", "¬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 253 "HTMLCharacterReference.gperf" - {"Jfr;", "𝔍"}, - {""}, - {""}, - {""}, - {""}, -#line 1135 "HTMLCharacterReference.gperf" - {"ggg;", "⋙"}, -#line 1169 "HTMLCharacterReference.gperf" - {"gvertneqq;", "≩︀"}, -#line 1150 "HTMLCharacterReference.gperf" - {"grave;", "`"}, - {""}, - {""}, - {""}, -#line 1425 "HTMLCharacterReference.gperf" - {"lvertneqq;", "≨︀"}, - {""}, - {""}, - {""}, - {""}, -#line 1604 "HTMLCharacterReference.gperf" - {"ntgl;", "≹"}, -#line 789 "HTMLCharacterReference.gperf" - {"boxUR;", "╚"}, - {""}, - {""}, -#line 630 "HTMLCharacterReference.gperf" - {"Xfr;", "𝔛"}, -#line 867 "HTMLCharacterReference.gperf" - {"checkmark;", "✓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1629 "HTMLCharacterReference.gperf" - {"nvsim;", "∼⃒"}, - {""}, - {""}, + {"deg", "°"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 956 "HTMLCharacterReference.gperf" + {"deg;", "°"}, + {""}, +#line 1633 "HTMLCharacterReference.gperf" + {"nwarr;", "↖"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 903 "HTMLCharacterReference.gperf" + {"copysr;", "℗"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 984 "HTMLCharacterReference.gperf" + {"dotplus;", "∔"}, + {""}, +#line 1407 "HTMLCharacterReference.gperf" + {"lsqb;", "["}, + {""}, +#line 1087 "HTMLCharacterReference.gperf" + {"forall;", "∀"}, + {""}, +#line 1390 "HTMLCharacterReference.gperf" + {"loz;", "◊"}, + {""}, + {""}, + {""}, +#line 210 "HTMLCharacterReference.gperf" + {"Gt;", "≫"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 690 "HTMLCharacterReference.gperf" + {"angmsdab;", "⦩"}, + {""}, + {""}, + {""}, +#line 926 "HTMLCharacterReference.gperf" + {"curarrm;", "⤼"}, #line 176 "HTMLCharacterReference.gperf" - {"Euml", "Ë"}, -#line 177 "HTMLCharacterReference.gperf" - {"Euml;", "Ë"}, - {""}, -#line 1184 "HTMLCharacterReference.gperf" - {"hercon;", "⊹"}, - {""}, -#line 2171 "HTMLCharacterReference.gperf" - {"vee;", "∨"}, - {""}, -#line 2218 "HTMLCharacterReference.gperf" - {"xrarr;", "⟶"}, - {""}, - {""}, - {""}, - {""}, + {"Eta;", "Η"}, + {""}, + {""}, + {""}, + {""}, +#line 109 "HTMLCharacterReference.gperf" + {"Dfr;", "𝔇"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 791 "HTMLCharacterReference.gperf" + {"boxUl;", "╜"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1133 "HTMLCharacterReference.gperf" + {"gesles;", "⪔"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 811 "HTMLCharacterReference.gperf" + {"boxplus;", "⊞"}, + {""}, + {""}, + {""}, + {""}, +#line 1549 "HTMLCharacterReference.gperf" + {"not", "¬"}, + {""}, + {""}, +#line 833 "HTMLCharacterReference.gperf" + {"bsolb;", "⧅"}, + {""}, + {""}, #line 1550 "HTMLCharacterReference.gperf" - {"notin;", "∉"}, -#line 742 "HTMLCharacterReference.gperf" - {"bernou;", "ℬ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1309 "HTMLCharacterReference.gperf" - {"lbrkslu;", "⦍"}, - {""}, - {""}, -#line 1354 "HTMLCharacterReference.gperf" - {"lhard;", "↽"}, - {""}, - {""}, -#line 514 "HTMLCharacterReference.gperf" - {"Sfr;", "𝔖"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 816 "HTMLCharacterReference.gperf" - {"boxv;", "│"}, + {"not;", "¬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 254 "HTMLCharacterReference.gperf" + {"Jfr;", "𝔍"}, + {""}, + {""}, + {""}, + {""}, +#line 1136 "HTMLCharacterReference.gperf" + {"ggg;", "⋙"}, +#line 1170 "HTMLCharacterReference.gperf" + {"gvertneqq;", "≩︀"}, +#line 1151 "HTMLCharacterReference.gperf" + {"grave;", "`"}, + {""}, + {""}, + {""}, +#line 1426 "HTMLCharacterReference.gperf" + {"lvertneqq;", "≨︀"}, + {""}, + {""}, + {""}, + {""}, +#line 1605 "HTMLCharacterReference.gperf" + {"ntgl;", "≹"}, +#line 790 "HTMLCharacterReference.gperf" + {"boxUR;", "╚"}, + {""}, + {""}, +#line 631 "HTMLCharacterReference.gperf" + {"Xfr;", "𝔛"}, +#line 868 "HTMLCharacterReference.gperf" + {"checkmark;", "✓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1630 "HTMLCharacterReference.gperf" + {"nvsim;", "∼⃒"}, + {""}, + {""}, +#line 177 "HTMLCharacterReference.gperf" + {"Euml", "Ë"}, +#line 178 "HTMLCharacterReference.gperf" + {"Euml;", "Ë"}, + {""}, +#line 1185 "HTMLCharacterReference.gperf" + {"hercon;", "⊹"}, + {""}, +#line 2172 "HTMLCharacterReference.gperf" + {"vee;", "∨"}, + {""}, +#line 2219 "HTMLCharacterReference.gperf" + {"xrarr;", "⟶"}, + {""}, + {""}, + {""}, + {""}, +#line 1551 "HTMLCharacterReference.gperf" + {"notin;", "∉"}, +#line 743 "HTMLCharacterReference.gperf" + {"bernou;", "ℬ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1310 "HTMLCharacterReference.gperf" + {"lbrkslu;", "⦍"}, + {""}, + {""}, +#line 1355 "HTMLCharacterReference.gperf" + {"lhard;", "↽"}, + {""}, + {""}, +#line 515 "HTMLCharacterReference.gperf" + {"Sfr;", "𝔖"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 817 "HTMLCharacterReference.gperf" - {"boxvH;", "╪"}, - {""}, - {""}, - {""}, - {""}, -#line 1523 "HTMLCharacterReference.gperf" - {"nharr;", "↮"}, - {""}, - {""}, - {""}, -#line 1618 "HTMLCharacterReference.gperf" - {"nvap;", "≍⃒"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 586 "HTMLCharacterReference.gperf" - {"Union;", "⋃"}, -#line 1562 "HTMLCharacterReference.gperf" - {"nparsl;", "⫽⃥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1152 "HTMLCharacterReference.gperf" - {"gsim;", "≳"}, - {""}, - {""}, - {""}, -#line 695 "HTMLCharacterReference.gperf" - {"angmsdah;", "⦯"}, -#line 1403 "HTMLCharacterReference.gperf" - {"lsim;", "≲"}, - {""}, - {""}, - {""}, -#line 475 "HTMLCharacterReference.gperf" - {"Rho;", "Ρ"}, -#line 1061 "HTMLCharacterReference.gperf" - {"esim;", "≂"}, -#line 1127 "HTMLCharacterReference.gperf" - {"gescc;", "⪩"}, + {"boxv;", "│"}, +#line 818 "HTMLCharacterReference.gperf" + {"boxvH;", "╪"}, + {""}, + {""}, + {""}, + {""}, +#line 1524 "HTMLCharacterReference.gperf" + {"nharr;", "↮"}, + {""}, + {""}, + {""}, +#line 1619 "HTMLCharacterReference.gperf" + {"nvap;", "≍⃒"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 587 "HTMLCharacterReference.gperf" + {"Union;", "⋃"}, +#line 1563 "HTMLCharacterReference.gperf" + {"nparsl;", "⫽⃥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1153 "HTMLCharacterReference.gperf" + {"gsim;", "≳"}, + {""}, + {""}, + {""}, +#line 696 "HTMLCharacterReference.gperf" + {"angmsdah;", "⦯"}, +#line 1404 "HTMLCharacterReference.gperf" + {"lsim;", "≲"}, + {""}, + {""}, + {""}, +#line 476 "HTMLCharacterReference.gperf" + {"Rho;", "Ρ"}, +#line 1062 "HTMLCharacterReference.gperf" + {"esim;", "≂"}, +#line 1128 "HTMLCharacterReference.gperf" + {"gescc;", "⪩"}, +#line 824 "HTMLCharacterReference.gperf" + {"bprime;", "‵"}, + {""}, +#line 232 "HTMLCharacterReference.gperf" + {"Ifr;", "ℑ"}, + {""}, +#line 1338 "HTMLCharacterReference.gperf" + {"lescc;", "⪨"}, + {""}, + {""}, + {""}, +#line 744 "HTMLCharacterReference.gperf" + {"beta;", "β"}, + {""}, + {""}, +#line 407 "HTMLCharacterReference.gperf" + {"Nu;", "Ν"}, + {""}, + {""}, +#line 1228 "HTMLCharacterReference.gperf" + {"infin;", "∞"}, + {""}, + {""}, + {""}, + {""}, #line 823 "HTMLCharacterReference.gperf" - {"bprime;", "‵"}, - {""}, -#line 231 "HTMLCharacterReference.gperf" - {"Ifr;", "ℑ"}, - {""}, -#line 1337 "HTMLCharacterReference.gperf" - {"lescc;", "⪨"}, - {""}, - {""}, - {""}, -#line 743 "HTMLCharacterReference.gperf" - {"beta;", "β"}, - {""}, - {""}, -#line 406 "HTMLCharacterReference.gperf" - {"Nu;", "Ν"}, - {""}, - {""}, -#line 1227 "HTMLCharacterReference.gperf" - {"infin;", "∞"}, - {""}, - {""}, - {""}, - {""}, + {"boxvr;", "├"}, + {""}, + {""}, +#line 1513 "HTMLCharacterReference.gperf" + {"nfr;", "𝔫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1492 "HTMLCharacterReference.gperf" + {"nbump;", "≎̸"}, + {""}, + {""}, + {""}, + {""}, +#line 244 "HTMLCharacterReference.gperf" + {"Iogon;", "Į"}, + {""}, + {""}, + {""}, +#line 907 "HTMLCharacterReference.gperf" + {"csub;", "⫏"}, +#line 1241 "HTMLCharacterReference.gperf" + {"iprod;", "⨼"}, + {""}, + {""}, + {""}, +#line 1599 "HTMLCharacterReference.gperf" + {"nsup;", "⊅"}, +#line 938 "HTMLCharacterReference.gperf" + {"cwint;", "∱"}, + {""}, + {""}, + {""}, + {""}, +#line 724 "HTMLCharacterReference.gperf" + {"awint;", "⨑"}, + {""}, + {""}, +#line 694 "HTMLCharacterReference.gperf" + {"angmsdaf;", "⦭"}, + {""}, + {""}, + {""}, + {""}, +#line 653 "HTMLCharacterReference.gperf" + {"Zfr;", "ℨ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1622 "HTMLCharacterReference.gperf" + {"nvgt;", ">⃒"}, + {""}, + {""}, + {""}, +#line 869 "HTMLCharacterReference.gperf" + {"chi;", "χ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 246 "HTMLCharacterReference.gperf" + {"Iota;", "Ι"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 119 "HTMLCharacterReference.gperf" + {"DotDot;", "⃜"}, + {""}, + {""}, +#line 686 "HTMLCharacterReference.gperf" + {"ange;", "⦤"}, #line 822 "HTMLCharacterReference.gperf" - {"boxvr;", "├"}, - {""}, - {""}, -#line 1512 "HTMLCharacterReference.gperf" - {"nfr;", "𝔫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1491 "HTMLCharacterReference.gperf" - {"nbump;", "≎̸"}, - {""}, - {""}, - {""}, - {""}, -#line 243 "HTMLCharacterReference.gperf" - {"Iogon;", "Į"}, - {""}, - {""}, - {""}, -#line 906 "HTMLCharacterReference.gperf" - {"csub;", "⫏"}, -#line 1240 "HTMLCharacterReference.gperf" - {"iprod;", "⨼"}, - {""}, - {""}, - {""}, -#line 1598 "HTMLCharacterReference.gperf" - {"nsup;", "⊅"}, -#line 937 "HTMLCharacterReference.gperf" - {"cwint;", "∱"}, - {""}, - {""}, - {""}, - {""}, -#line 723 "HTMLCharacterReference.gperf" - {"awint;", "⨑"}, - {""}, - {""}, -#line 693 "HTMLCharacterReference.gperf" - {"angmsdaf;", "⦭"}, - {""}, - {""}, - {""}, - {""}, -#line 652 "HTMLCharacterReference.gperf" - {"Zfr;", "ℨ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1621 "HTMLCharacterReference.gperf" - {"nvgt;", ">⃒"}, - {""}, - {""}, - {""}, -#line 868 "HTMLCharacterReference.gperf" - {"chi;", "χ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 245 "HTMLCharacterReference.gperf" - {"Iota;", "Ι"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 118 "HTMLCharacterReference.gperf" - {"DotDot;", "⃜"}, - {""}, - {""}, -#line 685 "HTMLCharacterReference.gperf" - {"ange;", "⦤"}, -#line 821 "HTMLCharacterReference.gperf" - {"boxvl;", "┤"}, - {""}, - {""}, - {""}, - {""}, -#line 2207 "HTMLCharacterReference.gperf" - {"xharr;", "⟷"}, -#line 267 "HTMLCharacterReference.gperf" - {"LT", "<"}, + {"boxvl;", "┤"}, + {""}, + {""}, + {""}, + {""}, +#line 2208 "HTMLCharacterReference.gperf" + {"xharr;", "⟷"}, #line 268 "HTMLCharacterReference.gperf" - {"LT;", "<"}, - {""}, -#line 1206 "HTMLCharacterReference.gperf" - {"iexcl", "¡"}, + {"LT", "<"}, +#line 269 "HTMLCharacterReference.gperf" + {"LT;", "<"}, + {""}, #line 1207 "HTMLCharacterReference.gperf" - {"iexcl;", "¡"}, - {""}, - {""}, - {""}, - {""}, -#line 1587 "HTMLCharacterReference.gperf" - {"nspar;", "∦"}, - {""}, - {""}, - {""}, - {""}, -#line 980 "HTMLCharacterReference.gperf" - {"doteq;", "≐"}, - {""}, - {""}, - {""}, -#line 829 "HTMLCharacterReference.gperf" - {"bsim;", "∽"}, -#line 1154 "HTMLCharacterReference.gperf" - {"gsiml;", "⪐"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1416 "HTMLCharacterReference.gperf" - {"ltimes;", "⋉"}, - {""}, -#line 474 "HTMLCharacterReference.gperf" - {"Rfr;", "ℜ"}, - {""}, - {""}, - {""}, - {""}, -#line 1473 "HTMLCharacterReference.gperf" - {"nLt;", "≪⃒"}, - {""}, - {""}, -#line 680 "HTMLCharacterReference.gperf" - {"andand;", "⩕"}, - {""}, -#line 46 "HTMLCharacterReference.gperf" - {"Auml", "Ä"}, -#line 47 "HTMLCharacterReference.gperf" - {"Auml;", "Ä"}, - {""}, - {""}, - {""}, -#line 160 "HTMLCharacterReference.gperf" - {"Efr;", "𝔈"}, - {""}, -#line 1374 "HTMLCharacterReference.gperf" - {"loang;", "⟬"}, - {""}, - {""}, -#line 351 "HTMLCharacterReference.gperf" - {"Not;", "⫬"}, - {""}, -#line 934 "HTMLCharacterReference.gperf" - {"cuvee;", "⋎"}, - {""}, -#line 1501 "HTMLCharacterReference.gperf" - {"ne;", "≠"}, -#line 2205 "HTMLCharacterReference.gperf" - {"xfr;", "𝔵"}, - {""}, -#line 819 "HTMLCharacterReference.gperf" - {"boxvR;", "╞"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1768 "HTMLCharacterReference.gperf" - {"qprime;", "⁗"}, - {""}, + {"iexcl", "¡"}, #line 1208 "HTMLCharacterReference.gperf" - {"iff;", "⇔"}, - {""}, -#line 1153 "HTMLCharacterReference.gperf" - {"gsime;", "⪎"}, - {""}, - {""}, -#line 198 "HTMLCharacterReference.gperf" - {"Gfr;", "𝔊"}, - {""}, -#line 1404 "HTMLCharacterReference.gperf" - {"lsime;", "⪍"}, - {""}, - {""}, - {""}, - {""}, -#line 167 "HTMLCharacterReference.gperf" - {"Eogon;", "Ę"}, - {""}, - {""}, - {""}, -#line 724 "HTMLCharacterReference.gperf" - {"bNot;", "⫭"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1509 "HTMLCharacterReference.gperf" - {"nesim;", "≂̸"}, - {""}, - {""}, -#line 1552 "HTMLCharacterReference.gperf" - {"notindot;", "⋵̸"}, -#line 683 "HTMLCharacterReference.gperf" - {"andv;", "⩚"}, - {""}, - {""}, - {""}, - {""}, -#line 1120 "HTMLCharacterReference.gperf" - {"gdot;", "ġ"}, -#line 1524 "HTMLCharacterReference.gperf" - {"nhpar;", "⫲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1016 "HTMLCharacterReference.gperf" - {"edot;", "ė"}, - {""}, - {""}, -#line 1386 "HTMLCharacterReference.gperf" - {"lotimes;", "⨴"}, - {""}, -#line 857 "HTMLCharacterReference.gperf" - {"cdot;", "ċ"}, -#line 907 "HTMLCharacterReference.gperf" - {"csube;", "⫑"}, - {""}, -#line 1308 "HTMLCharacterReference.gperf" - {"lbrksld;", "⦏"}, - {""}, - {""}, -#line 1600 "HTMLCharacterReference.gperf" - {"nsupe;", "⊉"}, - {""}, - {""}, - {""}, + {"iexcl;", "¡"}, + {""}, + {""}, + {""}, + {""}, +#line 1588 "HTMLCharacterReference.gperf" + {"nspar;", "∦"}, + {""}, + {""}, + {""}, + {""}, +#line 981 "HTMLCharacterReference.gperf" + {"doteq;", "≐"}, + {""}, + {""}, + {""}, +#line 830 "HTMLCharacterReference.gperf" + {"bsim;", "∽"}, +#line 1155 "HTMLCharacterReference.gperf" + {"gsiml;", "⪐"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1417 "HTMLCharacterReference.gperf" + {"ltimes;", "⋉"}, + {""}, +#line 475 "HTMLCharacterReference.gperf" + {"Rfr;", "ℜ"}, + {""}, + {""}, + {""}, + {""}, +#line 1474 "HTMLCharacterReference.gperf" + {"nLt;", "≪⃒"}, + {""}, + {""}, +#line 681 "HTMLCharacterReference.gperf" + {"andand;", "⩕"}, + {""}, +#line 47 "HTMLCharacterReference.gperf" + {"Auml", "Ä"}, +#line 48 "HTMLCharacterReference.gperf" + {"Auml;", "Ä"}, + {""}, + {""}, + {""}, +#line 161 "HTMLCharacterReference.gperf" + {"Efr;", "𝔈"}, + {""}, +#line 1375 "HTMLCharacterReference.gperf" + {"loang;", "⟬"}, + {""}, + {""}, +#line 352 "HTMLCharacterReference.gperf" + {"Not;", "⫬"}, + {""}, +#line 935 "HTMLCharacterReference.gperf" + {"cuvee;", "⋎"}, + {""}, +#line 1502 "HTMLCharacterReference.gperf" + {"ne;", "≠"}, +#line 2206 "HTMLCharacterReference.gperf" + {"xfr;", "𝔵"}, + {""}, +#line 820 "HTMLCharacterReference.gperf" + {"boxvR;", "╞"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1769 "HTMLCharacterReference.gperf" + {"qprime;", "⁗"}, + {""}, +#line 1209 "HTMLCharacterReference.gperf" + {"iff;", "⇔"}, + {""}, +#line 1154 "HTMLCharacterReference.gperf" + {"gsime;", "⪎"}, + {""}, + {""}, +#line 199 "HTMLCharacterReference.gperf" + {"Gfr;", "𝔊"}, + {""}, +#line 1405 "HTMLCharacterReference.gperf" + {"lsime;", "⪍"}, + {""}, + {""}, + {""}, + {""}, +#line 168 "HTMLCharacterReference.gperf" + {"Eogon;", "Ę"}, + {""}, + {""}, + {""}, +#line 725 "HTMLCharacterReference.gperf" + {"bNot;", "⫭"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1510 "HTMLCharacterReference.gperf" + {"nesim;", "≂̸"}, + {""}, + {""}, +#line 1553 "HTMLCharacterReference.gperf" + {"notindot;", "⋵̸"}, +#line 684 "HTMLCharacterReference.gperf" + {"andv;", "⩚"}, + {""}, + {""}, + {""}, + {""}, +#line 1121 "HTMLCharacterReference.gperf" + {"gdot;", "ġ"}, +#line 1525 "HTMLCharacterReference.gperf" + {"nhpar;", "⫲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1017 "HTMLCharacterReference.gperf" + {"edot;", "ė"}, + {""}, + {""}, +#line 1387 "HTMLCharacterReference.gperf" + {"lotimes;", "⨴"}, + {""}, #line 858 "HTMLCharacterReference.gperf" - {"cedil", "¸"}, + {"cdot;", "ċ"}, +#line 908 "HTMLCharacterReference.gperf" + {"csube;", "⫑"}, + {""}, +#line 1309 "HTMLCharacterReference.gperf" + {"lbrksld;", "⦏"}, + {""}, + {""}, +#line 1601 "HTMLCharacterReference.gperf" + {"nsupe;", "⊉"}, + {""}, + {""}, + {""}, #line 859 "HTMLCharacterReference.gperf" - {"cedil;", "¸"}, - {""}, -#line 950 "HTMLCharacterReference.gperf" - {"dd;", "ⅆ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2188 "HTMLCharacterReference.gperf" - {"vsupne;", "⊋︀"}, - {""}, - {""}, -#line 792 "HTMLCharacterReference.gperf" - {"boxV;", "║"}, + {"cedil", "¸"}, +#line 860 "HTMLCharacterReference.gperf" + {"cedil;", "¸"}, + {""}, +#line 951 "HTMLCharacterReference.gperf" + {"dd;", "ⅆ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2189 "HTMLCharacterReference.gperf" + {"vsupne;", "⊋︀"}, + {""}, + {""}, #line 793 "HTMLCharacterReference.gperf" - {"boxVH;", "╬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 824 "HTMLCharacterReference.gperf" - {"breve;", "˘"}, - {""}, - {""}, - {""}, - {""}, -#line 1158 "HTMLCharacterReference.gperf" - {"gtcir;", "⩺"}, - {""}, - {""}, - {""}, - {""}, -#line 1413 "HTMLCharacterReference.gperf" - {"ltcir;", "⩹"}, - {""}, - {""}, - {""}, - {""}, -#line 1504 "HTMLCharacterReference.gperf" - {"nearr;", "↗"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 470 "HTMLCharacterReference.gperf" - {"Re;", "ℜ"}, - {""}, - {""}, - {""}, -#line 1572 "HTMLCharacterReference.gperf" - {"nrarrc;", "⤳̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1235 "HTMLCharacterReference.gperf" - {"intprod;", "⨼"}, - {""}, -#line 1244 "HTMLCharacterReference.gperf" - {"isin;", "∈"}, - {""}, + {"boxV;", "║"}, +#line 794 "HTMLCharacterReference.gperf" + {"boxVH;", "╬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 825 "HTMLCharacterReference.gperf" + {"breve;", "˘"}, + {""}, + {""}, + {""}, + {""}, +#line 1159 "HTMLCharacterReference.gperf" + {"gtcir;", "⩺"}, + {""}, + {""}, + {""}, + {""}, +#line 1414 "HTMLCharacterReference.gperf" + {"ltcir;", "⩹"}, + {""}, + {""}, + {""}, + {""}, +#line 1505 "HTMLCharacterReference.gperf" + {"nearr;", "↗"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 471 "HTMLCharacterReference.gperf" + {"Re;", "ℜ"}, + {""}, + {""}, + {""}, +#line 1573 "HTMLCharacterReference.gperf" + {"nrarrc;", "⤳̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1236 "HTMLCharacterReference.gperf" + {"intprod;", "⨼"}, + {""}, +#line 1245 "HTMLCharacterReference.gperf" + {"isin;", "∈"}, + {""}, +#line 993 "HTMLCharacterReference.gperf" + {"drcrop;", "⌌"}, + {""}, +#line 693 "HTMLCharacterReference.gperf" + {"angmsdae;", "⦬"}, + {""}, +#line 1250 "HTMLCharacterReference.gperf" + {"isinv;", "∈"}, + {""}, +#line 445 "HTMLCharacterReference.gperf" + {"Pr;", "⪻"}, + {""}, + {""}, +#line 799 "HTMLCharacterReference.gperf" + {"boxVr;", "╟"}, + {""}, + {""}, +#line 348 "HTMLCharacterReference.gperf" + {"Nfr;", "𝔑"}, + {""}, + {""}, + {""}, +#line 913 "HTMLCharacterReference.gperf" + {"cudarrr;", "⤵"}, + {""}, +#line 1152 "HTMLCharacterReference.gperf" + {"gscr;", "ℊ"}, +#line 596 "HTMLCharacterReference.gperf" + {"UpTee;", "⊥"}, +#line 1262 "HTMLCharacterReference.gperf" + {"jsercy;", "ј"}, + {""}, +#line 1117 "HTMLCharacterReference.gperf" + {"gap;", "⪆"}, +#line 1402 "HTMLCharacterReference.gperf" + {"lscr;", "𝓁"}, +#line 831 "HTMLCharacterReference.gperf" + {"bsime;", "⋍"}, #line 992 "HTMLCharacterReference.gperf" - {"drcrop;", "⌌"}, - {""}, -#line 692 "HTMLCharacterReference.gperf" - {"angmsdae;", "⦬"}, - {""}, -#line 1249 "HTMLCharacterReference.gperf" - {"isinv;", "∈"}, - {""}, -#line 444 "HTMLCharacterReference.gperf" - {"Pr;", "⪻"}, - {""}, - {""}, -#line 798 "HTMLCharacterReference.gperf" - {"boxVr;", "╟"}, - {""}, - {""}, -#line 347 "HTMLCharacterReference.gperf" - {"Nfr;", "𝔑"}, - {""}, - {""}, - {""}, -#line 912 "HTMLCharacterReference.gperf" - {"cudarrr;", "⤵"}, - {""}, -#line 1151 "HTMLCharacterReference.gperf" - {"gscr;", "ℊ"}, -#line 595 "HTMLCharacterReference.gperf" - {"UpTee;", "⊥"}, + {"drcorn;", "⌟"}, + {""}, +#line 1288 "HTMLCharacterReference.gperf" + {"lap;", "⪅"}, +#line 1060 "HTMLCharacterReference.gperf" + {"escr;", "ℯ"}, + {""}, + {""}, + {""}, +#line 1300 "HTMLCharacterReference.gperf" + {"lat;", "⪫"}, +#line 906 "HTMLCharacterReference.gperf" + {"cscr;", "𝒸"}, + {""}, + {""}, + {""}, +#line 842 "HTMLCharacterReference.gperf" + {"cap;", "∩"}, +#line 715 "HTMLCharacterReference.gperf" + {"ascr;", "𝒶"}, + {""}, +#line 1306 "HTMLCharacterReference.gperf" + {"lbrace;", "{"}, + {""}, + {""}, #line 1261 "HTMLCharacterReference.gperf" - {"jsercy;", "ј"}, - {""}, -#line 1116 "HTMLCharacterReference.gperf" - {"gap;", "⪆"}, -#line 1401 "HTMLCharacterReference.gperf" - {"lscr;", "𝓁"}, -#line 830 "HTMLCharacterReference.gperf" - {"bsime;", "⋍"}, -#line 991 "HTMLCharacterReference.gperf" - {"drcorn;", "⌟"}, - {""}, -#line 1287 "HTMLCharacterReference.gperf" - {"lap;", "⪅"}, -#line 1059 "HTMLCharacterReference.gperf" - {"escr;", "ℯ"}, - {""}, - {""}, - {""}, -#line 1299 "HTMLCharacterReference.gperf" - {"lat;", "⪫"}, -#line 905 "HTMLCharacterReference.gperf" - {"cscr;", "𝒸"}, - {""}, - {""}, - {""}, -#line 841 "HTMLCharacterReference.gperf" - {"cap;", "∩"}, -#line 714 "HTMLCharacterReference.gperf" - {"ascr;", "𝒶"}, - {""}, -#line 1305 "HTMLCharacterReference.gperf" - {"lbrace;", "{"}, - {""}, - {""}, -#line 1260 "HTMLCharacterReference.gperf" - {"jscr;", "𝒿"}, - {""}, - {""}, - {""}, - {""}, -#line 604 "HTMLCharacterReference.gperf" - {"Uscr;", "𝒰"}, -#line 1519 "HTMLCharacterReference.gperf" - {"ngsim;", "≵"}, - {""}, - {""}, - {""}, -#line 1165 "HTMLCharacterReference.gperf" - {"gtreqless;", "⋛"}, -#line 952 "HTMLCharacterReference.gperf" - {"ddarr;", "⇊"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1599 "HTMLCharacterReference.gperf" - {"nsupE;", "⫆̸"}, - {""}, - {""}, - {""}, -#line 993 "HTMLCharacterReference.gperf" - {"dscr;", "𝒹"}, - {""}, - {""}, - {""}, + {"jscr;", "𝒿"}, + {""}, + {""}, + {""}, + {""}, +#line 605 "HTMLCharacterReference.gperf" + {"Uscr;", "𝒰"}, #line 1520 "HTMLCharacterReference.gperf" - {"ngt;", "≯"}, -#line 1194 "HTMLCharacterReference.gperf" - {"hscr;", "𝒽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1617 "HTMLCharacterReference.gperf" - {"nvHarr;", "⤄"}, - {""}, -#line 31 "HTMLCharacterReference.gperf" - {"Afr;", "𝔄"}, -#line 1157 "HTMLCharacterReference.gperf" - {"gtcc;", "⪧"}, -#line 889 "HTMLCharacterReference.gperf" - {"comma;", ","}, - {""}, - {""}, - {""}, -#line 1412 "HTMLCharacterReference.gperf" - {"ltcc;", "⪦"}, - {""}, - {""}, - {""}, - {""}, + {"ngsim;", "≵"}, + {""}, + {""}, + {""}, +#line 1166 "HTMLCharacterReference.gperf" + {"gtreqless;", "⋛"}, +#line 953 "HTMLCharacterReference.gperf" + {"ddarr;", "⇊"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1600 "HTMLCharacterReference.gperf" + {"nsupE;", "⫆̸"}, + {""}, + {""}, + {""}, +#line 994 "HTMLCharacterReference.gperf" + {"dscr;", "𝒹"}, + {""}, + {""}, + {""}, #line 1521 "HTMLCharacterReference.gperf" - {"ngtr;", "≯"}, - {""}, - {""}, - {""}, -#line 981 "HTMLCharacterReference.gperf" - {"doteqdot;", "≑"}, -#line 1290 "HTMLCharacterReference.gperf" - {"larr;", "←"}, -#line 797 "HTMLCharacterReference.gperf" - {"boxVl;", "╢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 459 "HTMLCharacterReference.gperf" - {"Qscr;", "𝒬"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 37 "HTMLCharacterReference.gperf" - {"Aogon;", "Ą"}, - {""}, -#line 658 "HTMLCharacterReference.gperf" - {"ac;", "∾"}, - {""}, -#line 1110 "HTMLCharacterReference.gperf" - {"fscr;", "𝒻"}, - {""}, - {""}, - {""}, - {""}, -#line 570 "HTMLCharacterReference.gperf" - {"Uarr;", "↟"}, - {""}, - {""}, - {""}, -#line 918 "HTMLCharacterReference.gperf" - {"cupbrcap;", "⩈"}, -#line 2200 "HTMLCharacterReference.gperf" - {"wscr;", "𝓌"}, -#line 1596 "HTMLCharacterReference.gperf" - {"nsucc;", "⊁"}, - {""}, - {""}, - {""}, - {""}, -#line 849 "HTMLCharacterReference.gperf" - {"caron;", "ˇ"}, - {""}, - {""}, - {""}, -#line 2184 "HTMLCharacterReference.gperf" - {"vscr;", "𝓋"}, - {""}, - {""}, - {""}, - {""}, -#line 943 "HTMLCharacterReference.gperf" - {"darr;", "↓"}, - {""}, -#line 1298 "HTMLCharacterReference.gperf" - {"larrtl;", "↢"}, - {""}, -#line 694 "HTMLCharacterReference.gperf" - {"angmsdag;", "⦮"}, -#line 1176 "HTMLCharacterReference.gperf" - {"harr;", "↔"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1586 "HTMLCharacterReference.gperf" - {"nsmid;", "∤"}, - {""}, - {""}, - {""}, - {""}, -#line 795 "HTMLCharacterReference.gperf" - {"boxVR;", "╠"}, - {""}, -#line 169 "HTMLCharacterReference.gperf" - {"Epsilon;", "Ε"}, - {""}, -#line 827 "HTMLCharacterReference.gperf" - {"bscr;", "𝒷"}, -#line 596 "HTMLCharacterReference.gperf" - {"UpTeeArrow;", "↥"}, - {""}, - {""}, - {""}, - {""}, + {"ngt;", "≯"}, +#line 1195 "HTMLCharacterReference.gperf" + {"hscr;", "𝒽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1618 "HTMLCharacterReference.gperf" + {"nvHarr;", "⤄"}, + {""}, +#line 32 "HTMLCharacterReference.gperf" + {"Afr;", "𝔄"}, +#line 1158 "HTMLCharacterReference.gperf" + {"gtcc;", "⪧"}, +#line 890 "HTMLCharacterReference.gperf" + {"comma;", ","}, + {""}, + {""}, + {""}, +#line 1413 "HTMLCharacterReference.gperf" + {"ltcc;", "⪦"}, + {""}, + {""}, + {""}, + {""}, +#line 1522 "HTMLCharacterReference.gperf" + {"ngtr;", "≯"}, + {""}, + {""}, + {""}, +#line 982 "HTMLCharacterReference.gperf" + {"doteqdot;", "≑"}, +#line 1291 "HTMLCharacterReference.gperf" + {"larr;", "←"}, +#line 798 "HTMLCharacterReference.gperf" + {"boxVl;", "╢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 460 "HTMLCharacterReference.gperf" + {"Qscr;", "𝒬"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 38 "HTMLCharacterReference.gperf" + {"Aogon;", "Ą"}, + {""}, +#line 659 "HTMLCharacterReference.gperf" + {"ac;", "∾"}, + {""}, +#line 1111 "HTMLCharacterReference.gperf" + {"fscr;", "𝒻"}, + {""}, + {""}, + {""}, + {""}, +#line 571 "HTMLCharacterReference.gperf" + {"Uarr;", "↟"}, + {""}, + {""}, + {""}, +#line 919 "HTMLCharacterReference.gperf" + {"cupbrcap;", "⩈"}, +#line 2201 "HTMLCharacterReference.gperf" + {"wscr;", "𝓌"}, +#line 1597 "HTMLCharacterReference.gperf" + {"nsucc;", "⊁"}, + {""}, + {""}, + {""}, + {""}, +#line 850 "HTMLCharacterReference.gperf" + {"caron;", "ˇ"}, + {""}, + {""}, + {""}, +#line 2185 "HTMLCharacterReference.gperf" + {"vscr;", "𝓋"}, + {""}, + {""}, + {""}, + {""}, +#line 944 "HTMLCharacterReference.gperf" + {"darr;", "↓"}, + {""}, +#line 1299 "HTMLCharacterReference.gperf" + {"larrtl;", "↢"}, + {""}, +#line 695 "HTMLCharacterReference.gperf" + {"angmsdag;", "⦮"}, +#line 1177 "HTMLCharacterReference.gperf" + {"harr;", "↔"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1587 "HTMLCharacterReference.gperf" + {"nsmid;", "∤"}, + {""}, + {""}, + {""}, + {""}, +#line 796 "HTMLCharacterReference.gperf" + {"boxVR;", "╠"}, + {""}, #line 170 "HTMLCharacterReference.gperf" - {"Equal;", "⩵"}, - {""}, -#line 199 "HTMLCharacterReference.gperf" - {"Gg;", "⋙"}, - {""}, - {""}, - {""}, -#line 1009 "HTMLCharacterReference.gperf" - {"easter;", "⩮"}, - {""}, - {""}, - {""}, -#line 1304 "HTMLCharacterReference.gperf" - {"lbbrk;", "❲"}, - {""}, - {""}, - {""}, -#line 609 "HTMLCharacterReference.gperf" - {"Vbar;", "⫫"}, -#line 2213 "HTMLCharacterReference.gperf" - {"xodot;", "⨀"}, -#line 1310 "HTMLCharacterReference.gperf" - {"lcaron;", "ľ"}, - {""}, - {""}, - {""}, - {""}, + {"Epsilon;", "Ε"}, + {""}, +#line 828 "HTMLCharacterReference.gperf" + {"bscr;", "𝒷"}, +#line 597 "HTMLCharacterReference.gperf" + {"UpTeeArrow;", "↥"}, + {""}, + {""}, + {""}, + {""}, +#line 171 "HTMLCharacterReference.gperf" + {"Equal;", "⩵"}, + {""}, +#line 200 "HTMLCharacterReference.gperf" + {"Gg;", "⋙"}, + {""}, + {""}, + {""}, #line 1010 "HTMLCharacterReference.gperf" - {"ecaron;", "ě"}, - {""}, - {""}, - {""}, - {""}, -#line 851 "HTMLCharacterReference.gperf" - {"ccaron;", "č"}, - {""}, - {""}, - {""}, - {""}, -#line 1014 "HTMLCharacterReference.gperf" - {"ecolon;", "≕"}, - {""}, - {""}, - {""}, - {""}, -#line 1419 "HTMLCharacterReference.gperf" - {"ltrPar;", "⦖"}, - {""}, - {""}, -#line 651 "HTMLCharacterReference.gperf" - {"Zeta;", "Ζ"}, - {""}, - {""}, - {""}, - {""}, -#line 2159 "HTMLCharacterReference.gperf" - {"varr;", "↕"}, - {""}, -#line 919 "HTMLCharacterReference.gperf" - {"cupcap;", "⩆"}, - {""}, - {""}, - {""}, -#line 1247 "HTMLCharacterReference.gperf" - {"isins;", "⋴"}, + {"easter;", "⩮"}, + {""}, + {""}, + {""}, +#line 1305 "HTMLCharacterReference.gperf" + {"lbbrk;", "❲"}, + {""}, + {""}, + {""}, +#line 610 "HTMLCharacterReference.gperf" + {"Vbar;", "⫫"}, +#line 2214 "HTMLCharacterReference.gperf" + {"xodot;", "⨀"}, +#line 1311 "HTMLCharacterReference.gperf" + {"lcaron;", "ľ"}, + {""}, + {""}, + {""}, + {""}, +#line 1011 "HTMLCharacterReference.gperf" + {"ecaron;", "ě"}, + {""}, + {""}, + {""}, + {""}, +#line 852 "HTMLCharacterReference.gperf" + {"ccaron;", "č"}, + {""}, + {""}, + {""}, + {""}, +#line 1015 "HTMLCharacterReference.gperf" + {"ecolon;", "≕"}, + {""}, + {""}, + {""}, + {""}, +#line 1420 "HTMLCharacterReference.gperf" + {"ltrPar;", "⦖"}, + {""}, + {""}, +#line 652 "HTMLCharacterReference.gperf" + {"Zeta;", "Ζ"}, + {""}, + {""}, + {""}, + {""}, +#line 2160 "HTMLCharacterReference.gperf" + {"varr;", "↕"}, + {""}, +#line 920 "HTMLCharacterReference.gperf" + {"cupcap;", "⩆"}, + {""}, + {""}, + {""}, +#line 1248 "HTMLCharacterReference.gperf" + {"isins;", "⋴"}, +#line 1297 "HTMLCharacterReference.gperf" + {"larrpl;", "⤹"}, + {""}, + {""}, +#line 219 "HTMLCharacterReference.gperf" + {"Hscr;", "ℋ"}, + {""}, +#line 2200 "HTMLCharacterReference.gperf" + {"wreath;", "≀"}, + {""}, + {""}, +#line 188 "HTMLCharacterReference.gperf" + {"Fscr;", "ℱ"}, + {""}, +#line 949 "HTMLCharacterReference.gperf" + {"dcaron;", "ď"}, + {""}, +#line 213 "HTMLCharacterReference.gperf" + {"Hat;", "^"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1244 "HTMLCharacterReference.gperf" + {"iscr;", "𝒾"}, + {""}, + {""}, + {""}, +#line 1396 "HTMLCharacterReference.gperf" + {"lrcorner;", "⌟"}, + {""}, + {""}, + {""}, + {""}, +#line 628 "HTMLCharacterReference.gperf" + {"Wfr;", "𝔚"}, + {""}, + {""}, + {""}, + {""}, +#line 37 "HTMLCharacterReference.gperf" + {"And;", "⩓"}, + {""}, + {""}, #line 1296 "HTMLCharacterReference.gperf" - {"larrpl;", "⤹"}, - {""}, - {""}, -#line 218 "HTMLCharacterReference.gperf" - {"Hscr;", "ℋ"}, - {""}, -#line 2199 "HTMLCharacterReference.gperf" - {"wreath;", "≀"}, - {""}, - {""}, -#line 187 "HTMLCharacterReference.gperf" - {"Fscr;", "ℱ"}, - {""}, -#line 948 "HTMLCharacterReference.gperf" - {"dcaron;", "ď"}, - {""}, -#line 212 "HTMLCharacterReference.gperf" - {"Hat;", "^"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1243 "HTMLCharacterReference.gperf" - {"iscr;", "𝒾"}, - {""}, - {""}, - {""}, -#line 1395 "HTMLCharacterReference.gperf" - {"lrcorner;", "⌟"}, - {""}, - {""}, - {""}, - {""}, -#line 627 "HTMLCharacterReference.gperf" - {"Wfr;", "𝔚"}, - {""}, - {""}, - {""}, - {""}, -#line 36 "HTMLCharacterReference.gperf" - {"And;", "⩓"}, - {""}, - {""}, -#line 1295 "HTMLCharacterReference.gperf" - {"larrlp;", "↫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 863 "HTMLCharacterReference.gperf" - {"centerdot;", "·"}, - {""}, - {""}, - {""}, -#line 1514 "HTMLCharacterReference.gperf" - {"nge;", "≱"}, -#line 643 "HTMLCharacterReference.gperf" - {"Yscr;", "𝒴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 860 "HTMLCharacterReference.gperf" - {"cemptyv;", "⦲"}, - {""}, -#line 894 "HTMLCharacterReference.gperf" - {"complexes;", "ℂ"}, -#line 1376 "HTMLCharacterReference.gperf" - {"lobrk;", "⟦"}, -#line 189 "HTMLCharacterReference.gperf" - {"GT", ">"}, + {"larrlp;", "↫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 864 "HTMLCharacterReference.gperf" + {"centerdot;", "·"}, + {""}, + {""}, + {""}, +#line 1515 "HTMLCharacterReference.gperf" + {"nge;", "≱"}, +#line 644 "HTMLCharacterReference.gperf" + {"Yscr;", "𝒴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 861 "HTMLCharacterReference.gperf" + {"cemptyv;", "⦲"}, + {""}, +#line 895 "HTMLCharacterReference.gperf" + {"complexes;", "ℂ"}, +#line 1377 "HTMLCharacterReference.gperf" + {"lobrk;", "⟦"}, #line 190 "HTMLCharacterReference.gperf" - {"GT;", ">"}, - {""}, -#line 1583 "HTMLCharacterReference.gperf" - {"nsim;", "≁"}, - {""}, -#line 1053 "HTMLCharacterReference.gperf" - {"equest;", "≟"}, - {""}, - {""}, -#line 1567 "HTMLCharacterReference.gperf" - {"npre;", "⪯̸"}, - {""}, -#line 890 "HTMLCharacterReference.gperf" - {"commat;", "@"}, - {""}, - {""}, -#line 322 "HTMLCharacterReference.gperf" - {"Lscr;", "ℒ"}, -#line 893 "HTMLCharacterReference.gperf" - {"complement;", "∁"}, - {""}, - {""}, -#line 2237 "HTMLCharacterReference.gperf" - {"yuml", "ÿ"}, + {"GT", ">"}, +#line 191 "HTMLCharacterReference.gperf" + {"GT;", ">"}, + {""}, +#line 1584 "HTMLCharacterReference.gperf" + {"nsim;", "≁"}, + {""}, +#line 1054 "HTMLCharacterReference.gperf" + {"equest;", "≟"}, + {""}, + {""}, +#line 1568 "HTMLCharacterReference.gperf" + {"npre;", "⪯̸"}, + {""}, +#line 891 "HTMLCharacterReference.gperf" + {"commat;", "@"}, + {""}, + {""}, +#line 323 "HTMLCharacterReference.gperf" + {"Lscr;", "ℒ"}, +#line 894 "HTMLCharacterReference.gperf" + {"complement;", "∁"}, + {""}, + {""}, #line 2238 "HTMLCharacterReference.gperf" - {"yuml;", "ÿ"}, - {""}, - {""}, -#line 1201 "HTMLCharacterReference.gperf" - {"ic;", "⁣"}, - {""}, - {""}, -#line 1245 "HTMLCharacterReference.gperf" - {"isinE;", "⋹"}, - {""}, - {""}, -#line 555 "HTMLCharacterReference.gperf" - {"Tfr;", "𝔗"}, -#line 2251 "HTMLCharacterReference.gperf" - {"zwnj;", "‌"}, - {""}, - {""}, -#line 957 "HTMLCharacterReference.gperf" - {"demptyv;", "⦱"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1590 "HTMLCharacterReference.gperf" - {"nsub;", "⊄"}, - {""}, -#line 1510 "HTMLCharacterReference.gperf" - {"nexist;", "∄"}, -#line 1002 "HTMLCharacterReference.gperf" - {"dwangle;", "⦦"}, - {""}, -#line 1769 "HTMLCharacterReference.gperf" - {"qscr;", "𝓆"}, - {""}, - {""}, -#line 1461 "HTMLCharacterReference.gperf" - {"mp;", "∓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 438 "HTMLCharacterReference.gperf" - {"Pfr;", "𝔓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1117 "HTMLCharacterReference.gperf" - {"gbreve;", "ğ"}, - {""}, -#line 2245 "HTMLCharacterReference.gperf" - {"zfr;", "𝔷"}, -#line 994 "HTMLCharacterReference.gperf" - {"dscy;", "ѕ"}, -#line 1357 "HTMLCharacterReference.gperf" - {"lhblk;", "▄"}, - {""}, - {""}, - {""}, -#line 333 "HTMLCharacterReference.gperf" - {"Mscr;", "ℳ"}, - {""}, -#line 1614 "HTMLCharacterReference.gperf" - {"numero;", "№"}, - {""}, -#line 326 "HTMLCharacterReference.gperf" - {"Map;", "⤅"}, - {""}, - {""}, -#line 1492 "HTMLCharacterReference.gperf" - {"nbumpe;", "≏̸"}, - {""}, - {""}, - {""}, - {""}, -#line 657 "HTMLCharacterReference.gperf" - {"abreve;", "ă"}, -#line 1464 "HTMLCharacterReference.gperf" - {"mu;", "μ"}, - {""}, -#line 273 "HTMLCharacterReference.gperf" - {"Larr;", "↞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 573 "HTMLCharacterReference.gperf" - {"Ubreve;", "Ŭ"}, - {""}, - {""}, - {""}, -#line 1506 "HTMLCharacterReference.gperf" - {"nedot;", "≐̸"}, -#line 2216 "HTMLCharacterReference.gperf" - {"xotime;", "⨂"}, - {""}, - {""}, - {""}, - {""}, -#line 1231 "HTMLCharacterReference.gperf" - {"intcal;", "⊺"}, - {""}, - {""}, -#line 2158 "HTMLCharacterReference.gperf" - {"varpropto;", "∝"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 352 "HTMLCharacterReference.gperf" - {"NotCongruent;", "≢"}, - {""}, - {""}, -#line 1021 "HTMLCharacterReference.gperf" - {"egrave", "è"}, + {"yuml", "ÿ"}, +#line 2239 "HTMLCharacterReference.gperf" + {"yuml;", "ÿ"}, + {""}, + {""}, +#line 1202 "HTMLCharacterReference.gperf" + {"ic;", "⁣"}, + {""}, + {""}, +#line 1246 "HTMLCharacterReference.gperf" + {"isinE;", "⋹"}, + {""}, + {""}, +#line 556 "HTMLCharacterReference.gperf" + {"Tfr;", "𝔗"}, +#line 2252 "HTMLCharacterReference.gperf" + {"zwnj;", "‌"}, + {""}, + {""}, +#line 958 "HTMLCharacterReference.gperf" + {"demptyv;", "⦱"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1591 "HTMLCharacterReference.gperf" + {"nsub;", "⊄"}, + {""}, +#line 1511 "HTMLCharacterReference.gperf" + {"nexist;", "∄"}, +#line 1003 "HTMLCharacterReference.gperf" + {"dwangle;", "⦦"}, + {""}, +#line 1770 "HTMLCharacterReference.gperf" + {"qscr;", "𝓆"}, + {""}, + {""}, +#line 1462 "HTMLCharacterReference.gperf" + {"mp;", "∓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 439 "HTMLCharacterReference.gperf" + {"Pfr;", "𝔓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1118 "HTMLCharacterReference.gperf" + {"gbreve;", "ğ"}, + {""}, +#line 2246 "HTMLCharacterReference.gperf" + {"zfr;", "𝔷"}, +#line 995 "HTMLCharacterReference.gperf" + {"dscy;", "ѕ"}, +#line 1358 "HTMLCharacterReference.gperf" + {"lhblk;", "▄"}, + {""}, + {""}, + {""}, +#line 334 "HTMLCharacterReference.gperf" + {"Mscr;", "ℳ"}, + {""}, +#line 1615 "HTMLCharacterReference.gperf" + {"numero;", "№"}, + {""}, +#line 327 "HTMLCharacterReference.gperf" + {"Map;", "⤅"}, + {""}, + {""}, +#line 1493 "HTMLCharacterReference.gperf" + {"nbumpe;", "≏̸"}, + {""}, + {""}, + {""}, + {""}, +#line 658 "HTMLCharacterReference.gperf" + {"abreve;", "ă"}, +#line 1465 "HTMLCharacterReference.gperf" + {"mu;", "μ"}, + {""}, +#line 274 "HTMLCharacterReference.gperf" + {"Larr;", "↞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 574 "HTMLCharacterReference.gperf" + {"Ubreve;", "Ŭ"}, + {""}, + {""}, + {""}, +#line 1507 "HTMLCharacterReference.gperf" + {"nedot;", "≐̸"}, +#line 2217 "HTMLCharacterReference.gperf" + {"xotime;", "⨂"}, + {""}, + {""}, + {""}, + {""}, +#line 1232 "HTMLCharacterReference.gperf" + {"intcal;", "⊺"}, + {""}, + {""}, +#line 2159 "HTMLCharacterReference.gperf" + {"varpropto;", "∝"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 353 "HTMLCharacterReference.gperf" + {"NotCongruent;", "≢"}, + {""}, + {""}, #line 1022 "HTMLCharacterReference.gperf" - {"egrave;", "è"}, - {""}, - {""}, -#line 865 "HTMLCharacterReference.gperf" - {"chcy;", "ч"}, -#line 850 "HTMLCharacterReference.gperf" - {"ccaps;", "⩍"}, -#line 1074 "HTMLCharacterReference.gperf" - {"female;", "♀"}, -#line 740 "HTMLCharacterReference.gperf" - {"bemptyv;", "⦰"}, - {""}, - {""}, -#line 670 "HTMLCharacterReference.gperf" - {"agrave", "à"}, + {"egrave", "è"}, +#line 1023 "HTMLCharacterReference.gperf" + {"egrave;", "è"}, + {""}, + {""}, +#line 866 "HTMLCharacterReference.gperf" + {"chcy;", "ч"}, +#line 851 "HTMLCharacterReference.gperf" + {"ccaps;", "⩍"}, +#line 1075 "HTMLCharacterReference.gperf" + {"female;", "♀"}, +#line 741 "HTMLCharacterReference.gperf" + {"bemptyv;", "⦰"}, + {""}, + {""}, #line 671 "HTMLCharacterReference.gperf" - {"agrave;", "à"}, - {""}, - {""}, - {""}, - {""}, -#line 1174 "HTMLCharacterReference.gperf" - {"hamilt;", "ℋ"}, - {""}, - {""}, -#line 174 "HTMLCharacterReference.gperf" - {"Esim;", "⩳"}, -#line 579 "HTMLCharacterReference.gperf" - {"Ugrave", "Ù"}, + {"agrave", "à"}, +#line 672 "HTMLCharacterReference.gperf" + {"agrave;", "à"}, + {""}, + {""}, + {""}, + {""}, +#line 1175 "HTMLCharacterReference.gperf" + {"hamilt;", "ℋ"}, + {""}, + {""}, +#line 175 "HTMLCharacterReference.gperf" + {"Esim;", "⩳"}, #line 580 "HTMLCharacterReference.gperf" - {"Ugrave;", "Ù"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 148 "HTMLCharacterReference.gperf" - {"Dscr;", "𝒟"}, -#line 2173 "HTMLCharacterReference.gperf" - {"veeeq;", "≚"}, -#line 710 "HTMLCharacterReference.gperf" - {"approx;", "≈"}, - {""}, -#line 621 "HTMLCharacterReference.gperf" - {"Vfr;", "𝔙"}, -#line 1474 "HTMLCharacterReference.gperf" - {"nLtv;", "≪̸"}, -#line 1407 "HTMLCharacterReference.gperf" - {"lsquo;", "‘"}, + {"Ugrave", "Ù"}, +#line 581 "HTMLCharacterReference.gperf" + {"Ugrave;", "Ù"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 149 "HTMLCharacterReference.gperf" + {"Dscr;", "𝒟"}, +#line 2174 "HTMLCharacterReference.gperf" + {"veeeq;", "≚"}, +#line 711 "HTMLCharacterReference.gperf" + {"approx;", "≈"}, + {""}, +#line 622 "HTMLCharacterReference.gperf" + {"Vfr;", "𝔙"}, +#line 1475 "HTMLCharacterReference.gperf" + {"nLtv;", "≪̸"}, #line 1408 "HTMLCharacterReference.gperf" - {"lsquor;", "‚"}, -#line 151 "HTMLCharacterReference.gperf" - {"ETH", "Ð"}, -#line 582 "HTMLCharacterReference.gperf" - {"UnderBar;", "_"}, - {""}, - {""}, - {""}, - {""}, + {"lsquo;", "‘"}, +#line 1409 "HTMLCharacterReference.gperf" + {"lsquor;", "‚"}, #line 152 "HTMLCharacterReference.gperf" - {"ETH;", "Ð"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 274 "HTMLCharacterReference.gperf" - {"Lcaron;", "Ľ"}, - {""}, - {""}, - {""}, - {""}, -#line 256 "HTMLCharacterReference.gperf" - {"Jsercy;", "Ј"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1515 "HTMLCharacterReference.gperf" - {"ngeq;", "≱"}, + {"ETH", "Ð"}, +#line 583 "HTMLCharacterReference.gperf" + {"UnderBar;", "_"}, + {""}, + {""}, + {""}, + {""}, +#line 153 "HTMLCharacterReference.gperf" + {"ETH;", "Ð"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 275 "HTMLCharacterReference.gperf" + {"Lcaron;", "Ľ"}, + {""}, + {""}, + {""}, + {""}, +#line 257 "HTMLCharacterReference.gperf" + {"Jsercy;", "Ј"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1516 "HTMLCharacterReference.gperf" - {"ngeqq;", "≧̸"}, - {""}, - {""}, - {""}, - {""}, -#line 1584 "HTMLCharacterReference.gperf" - {"nsime;", "≄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 255 "HTMLCharacterReference.gperf" - {"Jscr;", "𝒥"}, - {""}, - {""}, - {""}, - {""}, -#line 230 "HTMLCharacterReference.gperf" - {"Idot;", "İ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1241 "HTMLCharacterReference.gperf" - {"iquest", "¿"}, + {"ngeq;", "≱"}, +#line 1517 "HTMLCharacterReference.gperf" + {"ngeqq;", "≧̸"}, + {""}, + {""}, + {""}, + {""}, +#line 1585 "HTMLCharacterReference.gperf" + {"nsime;", "≄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 256 "HTMLCharacterReference.gperf" + {"Jscr;", "𝒥"}, + {""}, + {""}, + {""}, + {""}, +#line 231 "HTMLCharacterReference.gperf" + {"Idot;", "İ"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1242 "HTMLCharacterReference.gperf" - {"iquest;", "¿"}, - {""}, - {""}, - {""}, -#line 1405 "HTMLCharacterReference.gperf" - {"lsimg;", "⪏"}, - {""}, - {""}, - {""}, -#line 633 "HTMLCharacterReference.gperf" - {"Xscr;", "𝒳"}, -#line 1312 "HTMLCharacterReference.gperf" - {"lceil;", "⌈"}, - {""}, - {""}, - {""}, -#line 102 "HTMLCharacterReference.gperf" - {"Darr;", "↡"}, -#line 1592 "HTMLCharacterReference.gperf" - {"nsube;", "⊈"}, -#line 523 "HTMLCharacterReference.gperf" - {"Square;", "□"}, - {""}, - {""}, -#line 712 "HTMLCharacterReference.gperf" - {"aring", "å"}, + {"iquest", "¿"}, +#line 1243 "HTMLCharacterReference.gperf" + {"iquest;", "¿"}, + {""}, + {""}, + {""}, +#line 1406 "HTMLCharacterReference.gperf" + {"lsimg;", "⪏"}, + {""}, + {""}, + {""}, +#line 634 "HTMLCharacterReference.gperf" + {"Xscr;", "𝒳"}, +#line 1313 "HTMLCharacterReference.gperf" + {"lceil;", "⌈"}, + {""}, + {""}, + {""}, +#line 103 "HTMLCharacterReference.gperf" + {"Darr;", "↡"}, +#line 1593 "HTMLCharacterReference.gperf" + {"nsube;", "⊈"}, +#line 524 "HTMLCharacterReference.gperf" + {"Square;", "□"}, + {""}, + {""}, #line 713 "HTMLCharacterReference.gperf" - {"aring;", "å"}, -#line 1047 "HTMLCharacterReference.gperf" - {"eqcirc;", "≖"}, - {""}, - {""}, -#line 663 "HTMLCharacterReference.gperf" - {"acute", "´"}, -#line 664 "HTMLCharacterReference.gperf" - {"acute;", "´"}, - {""}, - {""}, -#line 1444 "HTMLCharacterReference.gperf" - {"mho;", "℧"}, - {""}, -#line 603 "HTMLCharacterReference.gperf" - {"Uring;", "Ů"}, -#line 2186 "HTMLCharacterReference.gperf" - {"vsubne;", "⊊︀"}, - {""}, -#line 2232 "HTMLCharacterReference.gperf" - {"yfr;", "𝔶"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1568 "HTMLCharacterReference.gperf" - {"nprec;", "⊀"}, - {""}, - {""}, - {""}, -#line 649 "HTMLCharacterReference.gperf" - {"Zdot;", "Ż"}, -#line 716 "HTMLCharacterReference.gperf" - {"asymp;", "≈"}, - {""}, - {""}, - {""}, -#line 530 "HTMLCharacterReference.gperf" - {"Sscr;", "𝒮"}, - {""}, - {""}, - {""}, - {""}, -#line 286 "HTMLCharacterReference.gperf" - {"LeftFloor;", "⌊"}, -#line 2180 "HTMLCharacterReference.gperf" - {"vnsup;", "⊃⃒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"aring", "å"}, +#line 714 "HTMLCharacterReference.gperf" + {"aring;", "å"}, #line 1048 "HTMLCharacterReference.gperf" - {"eqcolon;", "≕"}, - {""}, -#line 1236 "HTMLCharacterReference.gperf" - {"iocy;", "ё"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 842 "HTMLCharacterReference.gperf" - {"capand;", "⩄"}, - {""}, - {""}, - {""}, - {""}, -#line 1585 "HTMLCharacterReference.gperf" - {"nsimeq;", "≄"}, - {""}, -#line 542 "HTMLCharacterReference.gperf" - {"Superset;", "⊃"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1620 "HTMLCharacterReference.gperf" - {"nvge;", "≥⃒"}, -#line 1291 "HTMLCharacterReference.gperf" - {"larrb;", "⇤"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1463 "HTMLCharacterReference.gperf" - {"mstpos;", "∾"}, - {""}, -#line 1577 "HTMLCharacterReference.gperf" - {"nsc;", "⊁"}, -#line 246 "HTMLCharacterReference.gperf" - {"Iscr;", "ℐ"}, -#line 855 "HTMLCharacterReference.gperf" - {"ccups;", "⩌"}, -#line 104 "HTMLCharacterReference.gperf" - {"Dcaron;", "Ď"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1511 "HTMLCharacterReference.gperf" - {"nexists;", "∄"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 660 "HTMLCharacterReference.gperf" - {"acd;", "∿"}, - {""}, -#line 1210 "HTMLCharacterReference.gperf" - {"igrave", "ì"}, + {"eqcirc;", "≖"}, + {""}, + {""}, +#line 664 "HTMLCharacterReference.gperf" + {"acute", "´"}, +#line 665 "HTMLCharacterReference.gperf" + {"acute;", "´"}, + {""}, + {""}, +#line 1445 "HTMLCharacterReference.gperf" + {"mho;", "℧"}, + {""}, +#line 604 "HTMLCharacterReference.gperf" + {"Uring;", "Ů"}, +#line 2187 "HTMLCharacterReference.gperf" + {"vsubne;", "⊊︀"}, + {""}, +#line 2233 "HTMLCharacterReference.gperf" + {"yfr;", "𝔶"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1569 "HTMLCharacterReference.gperf" + {"nprec;", "⊀"}, + {""}, + {""}, + {""}, +#line 650 "HTMLCharacterReference.gperf" + {"Zdot;", "Ż"}, +#line 717 "HTMLCharacterReference.gperf" + {"asymp;", "≈"}, + {""}, + {""}, + {""}, +#line 531 "HTMLCharacterReference.gperf" + {"Sscr;", "𝒮"}, + {""}, + {""}, + {""}, + {""}, +#line 287 "HTMLCharacterReference.gperf" + {"LeftFloor;", "⌊"}, +#line 2181 "HTMLCharacterReference.gperf" + {"vnsup;", "⊃⃒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1049 "HTMLCharacterReference.gperf" + {"eqcolon;", "≕"}, + {""}, +#line 1237 "HTMLCharacterReference.gperf" + {"iocy;", "ё"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 843 "HTMLCharacterReference.gperf" + {"capand;", "⩄"}, + {""}, + {""}, + {""}, + {""}, +#line 1586 "HTMLCharacterReference.gperf" + {"nsimeq;", "≄"}, + {""}, +#line 543 "HTMLCharacterReference.gperf" + {"Superset;", "⊃"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1621 "HTMLCharacterReference.gperf" + {"nvge;", "≥⃒"}, +#line 1292 "HTMLCharacterReference.gperf" + {"larrb;", "⇤"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1464 "HTMLCharacterReference.gperf" + {"mstpos;", "∾"}, + {""}, +#line 1578 "HTMLCharacterReference.gperf" + {"nsc;", "⊁"}, +#line 247 "HTMLCharacterReference.gperf" + {"Iscr;", "ℐ"}, +#line 856 "HTMLCharacterReference.gperf" + {"ccups;", "⩌"}, +#line 105 "HTMLCharacterReference.gperf" + {"Dcaron;", "Ď"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1512 "HTMLCharacterReference.gperf" + {"nexists;", "∄"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 661 "HTMLCharacterReference.gperf" + {"acd;", "∿"}, + {""}, #line 1211 "HTMLCharacterReference.gperf" - {"igrave;", "ì"}, - {""}, - {""}, -#line 1580 "HTMLCharacterReference.gperf" - {"nscr;", "𝓃"}, - {""}, - {""}, - {""}, -#line 1481 "HTMLCharacterReference.gperf" - {"nap;", "≉"}, - {""}, - {""}, - {""}, - {""}, -#line 691 "HTMLCharacterReference.gperf" - {"angmsdad;", "⦫"}, - {""}, - {""}, - {""}, -#line 509 "HTMLCharacterReference.gperf" - {"Sc;", "⪼"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 635 "HTMLCharacterReference.gperf" - {"YIcy;", "Ї"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1591 "HTMLCharacterReference.gperf" - {"nsubE;", "⫅̸"}, - {""}, - {""}, - {""}, -#line 159 "HTMLCharacterReference.gperf" - {"Edot;", "Ė"}, - {""}, - {""}, - {""}, - {""}, -#line 654 "HTMLCharacterReference.gperf" - {"Zscr;", "𝒵"}, - {""}, - {""}, - {""}, - {""}, + {"igrave", "ì"}, +#line 1212 "HTMLCharacterReference.gperf" + {"igrave;", "ì"}, + {""}, + {""}, +#line 1581 "HTMLCharacterReference.gperf" + {"nscr;", "𝓃"}, + {""}, + {""}, + {""}, +#line 1482 "HTMLCharacterReference.gperf" + {"nap;", "≉"}, + {""}, + {""}, + {""}, + {""}, +#line 692 "HTMLCharacterReference.gperf" + {"angmsdad;", "⦫"}, + {""}, + {""}, + {""}, +#line 510 "HTMLCharacterReference.gperf" + {"Sc;", "⪼"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 636 "HTMLCharacterReference.gperf" - {"YUcy;", "Ю"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 278 "HTMLCharacterReference.gperf" - {"LeftArrow;", "←"}, -#line 815 "HTMLCharacterReference.gperf" - {"boxur;", "└"}, - {""}, - {""}, -#line 1443 "HTMLCharacterReference.gperf" - {"mfr;", "𝔪"}, -#line 197 "HTMLCharacterReference.gperf" - {"Gdot;", "Ġ"}, - {""}, -#line 43 "HTMLCharacterReference.gperf" - {"Assign;", "≔"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"YIcy;", "Ї"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1592 "HTMLCharacterReference.gperf" + {"nsubE;", "⫅̸"}, + {""}, + {""}, + {""}, +#line 160 "HTMLCharacterReference.gperf" + {"Edot;", "Ė"}, + {""}, + {""}, + {""}, + {""}, +#line 655 "HTMLCharacterReference.gperf" + {"Zscr;", "𝒵"}, + {""}, + {""}, + {""}, + {""}, +#line 637 "HTMLCharacterReference.gperf" + {"YUcy;", "Ю"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 279 "HTMLCharacterReference.gperf" - {"LeftArrowBar;", "⇤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 532 "HTMLCharacterReference.gperf" - {"Sub;", "⋐"}, -#line 615 "HTMLCharacterReference.gperf" - {"Vert;", "‖"}, - {""}, - {""}, - {""}, -#line 263 "HTMLCharacterReference.gperf" - {"Kfr;", "𝔎"}, - {""}, - {""}, - {""}, - {""}, -#line 688 "HTMLCharacterReference.gperf" - {"angmsdaa;", "⦨"}, - {""}, - {""}, - {""}, - {""}, -#line 94 "HTMLCharacterReference.gperf" - {"Cup;", "⋓"}, - {""}, -#line 825 "HTMLCharacterReference.gperf" - {"brvbar", "¦"}, + {"LeftArrow;", "←"}, +#line 816 "HTMLCharacterReference.gperf" + {"boxur;", "└"}, + {""}, + {""}, +#line 1444 "HTMLCharacterReference.gperf" + {"mfr;", "𝔪"}, +#line 198 "HTMLCharacterReference.gperf" + {"Gdot;", "Ġ"}, + {""}, +#line 44 "HTMLCharacterReference.gperf" + {"Assign;", "≔"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 280 "HTMLCharacterReference.gperf" + {"LeftArrowBar;", "⇤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 533 "HTMLCharacterReference.gperf" + {"Sub;", "⋐"}, +#line 616 "HTMLCharacterReference.gperf" + {"Vert;", "‖"}, + {""}, + {""}, + {""}, +#line 264 "HTMLCharacterReference.gperf" + {"Kfr;", "𝔎"}, + {""}, + {""}, + {""}, + {""}, +#line 689 "HTMLCharacterReference.gperf" + {"angmsdaa;", "⦨"}, + {""}, + {""}, + {""}, + {""}, +#line 95 "HTMLCharacterReference.gperf" + {"Cup;", "⋓"}, + {""}, #line 826 "HTMLCharacterReference.gperf" - {"brvbar;", "¦"}, - {""}, - {""}, - {""}, -#line 1050 "HTMLCharacterReference.gperf" - {"eqslantgtr;", "⪖"}, -#line 510 "HTMLCharacterReference.gperf" - {"Scaron;", "Š"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 783 "HTMLCharacterReference.gperf" - {"boxH;", "═"}, - {""}, - {""}, -#line 500 "HTMLCharacterReference.gperf" - {"RoundImplies;", "⥰"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 502 "HTMLCharacterReference.gperf" - {"Rscr;", "ℛ"}, - {""}, - {""}, - {""}, -#line 711 "HTMLCharacterReference.gperf" - {"approxeq;", "≊"}, - {""}, -#line 1466 "HTMLCharacterReference.gperf" - {"mumap;", "⊸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 173 "HTMLCharacterReference.gperf" - {"Escr;", "ℰ"}, - {""}, - {""}, - {""}, -#line 1142 "HTMLCharacterReference.gperf" - {"gnE;", "≩"}, - {""}, -#line 814 "HTMLCharacterReference.gperf" - {"boxul;", "┘"}, - {""}, - {""}, -#line 1367 "HTMLCharacterReference.gperf" - {"lnE;", "≨"}, -#line 2219 "HTMLCharacterReference.gperf" - {"xscr;", "𝓍"}, - {""}, - {""}, - {""}, - {""}, -#line 1517 "HTMLCharacterReference.gperf" - {"ngeqslant;", "⩾̸"}, - {""}, - {""}, - {""}, -#line 705 "HTMLCharacterReference.gperf" - {"apE;", "⩰"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 208 "HTMLCharacterReference.gperf" - {"Gscr;", "𝒢"}, - {""}, + {"brvbar", "¦"}, +#line 827 "HTMLCharacterReference.gperf" + {"brvbar;", "¦"}, + {""}, + {""}, + {""}, +#line 1051 "HTMLCharacterReference.gperf" + {"eqslantgtr;", "⪖"}, +#line 511 "HTMLCharacterReference.gperf" + {"Scaron;", "Š"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 784 "HTMLCharacterReference.gperf" + {"boxH;", "═"}, + {""}, + {""}, +#line 501 "HTMLCharacterReference.gperf" + {"RoundImplies;", "⥰"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 503 "HTMLCharacterReference.gperf" + {"Rscr;", "ℛ"}, + {""}, + {""}, + {""}, +#line 712 "HTMLCharacterReference.gperf" + {"approxeq;", "≊"}, + {""}, +#line 1467 "HTMLCharacterReference.gperf" + {"mumap;", "⊸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 174 "HTMLCharacterReference.gperf" + {"Escr;", "ℰ"}, + {""}, + {""}, + {""}, +#line 1143 "HTMLCharacterReference.gperf" + {"gnE;", "≩"}, + {""}, +#line 815 "HTMLCharacterReference.gperf" + {"boxul;", "┘"}, + {""}, + {""}, +#line 1368 "HTMLCharacterReference.gperf" + {"lnE;", "≨"}, +#line 2220 "HTMLCharacterReference.gperf" + {"xscr;", "𝓍"}, + {""}, + {""}, + {""}, + {""}, +#line 1518 "HTMLCharacterReference.gperf" + {"ngeqslant;", "⩾̸"}, + {""}, + {""}, + {""}, +#line 706 "HTMLCharacterReference.gperf" + {"apE;", "⩰"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 209 "HTMLCharacterReference.gperf" + {"Gscr;", "𝒢"}, + {""}, +#line 1495 "HTMLCharacterReference.gperf" + {"ncaron;", "ň"}, + {""}, + {""}, #line 1494 "HTMLCharacterReference.gperf" - {"ncaron;", "ň"}, - {""}, - {""}, -#line 1493 "HTMLCharacterReference.gperf" - {"ncap;", "⩃"}, - {""}, - {""}, - {""}, -#line 150 "HTMLCharacterReference.gperf" - {"ENG;", "Ŋ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2223 "HTMLCharacterReference.gperf" - {"xvee;", "⋁"}, - {""}, - {""}, -#line 375 "HTMLCharacterReference.gperf" - {"NotLessSlantEqual;", "⩽̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2244 "HTMLCharacterReference.gperf" - {"zeta;", "ζ"}, - {""}, - {""}, -#line 371 "HTMLCharacterReference.gperf" - {"NotLess;", "≮"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 465 "HTMLCharacterReference.gperf" - {"Rarr;", "↠"}, - {""}, -#line 647 "HTMLCharacterReference.gperf" - {"Zcaron;", "Ž"}, - {""}, - {""}, - {""}, -#line 813 "HTMLCharacterReference.gperf" - {"boxuR;", "╘"}, - {""}, -#line 2230 "HTMLCharacterReference.gperf" - {"yen", "¥"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2231 "HTMLCharacterReference.gperf" - {"yen;", "¥"}, - {""}, - {""}, -#line 1193 "HTMLCharacterReference.gperf" - {"horbar;", "―"}, - {""}, -#line 690 "HTMLCharacterReference.gperf" - {"angmsdac;", "⦪"}, -#line 556 "HTMLCharacterReference.gperf" - {"Therefore;", "∴"}, - {""}, - {""}, - {""}, - {""}, -#line 1301 "HTMLCharacterReference.gperf" - {"late;", "⪭"}, -#line 1484 "HTMLCharacterReference.gperf" - {"napos;", "ʼn"}, - {""}, - {""}, -#line 613 "HTMLCharacterReference.gperf" - {"Vee;", "⋁"}, -#line 99 "HTMLCharacterReference.gperf" - {"DScy;", "Ѕ"}, - {""}, - {""}, - {""}, -#line 1190 "HTMLCharacterReference.gperf" - {"hookleftarrow;", "↩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ncap;", "⩃"}, + {""}, + {""}, + {""}, +#line 151 "HTMLCharacterReference.gperf" + {"ENG;", "Ŋ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2224 "HTMLCharacterReference.gperf" + {"xvee;", "⋁"}, + {""}, + {""}, +#line 376 "HTMLCharacterReference.gperf" + {"NotLessSlantEqual;", "⩽̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2245 "HTMLCharacterReference.gperf" + {"zeta;", "ζ"}, + {""}, + {""}, +#line 372 "HTMLCharacterReference.gperf" + {"NotLess;", "≮"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 466 "HTMLCharacterReference.gperf" - {"Rarrtl;", "⤖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1381 "HTMLCharacterReference.gperf" - {"looparrowleft;", "↫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"Rarr;", "↠"}, + {""}, +#line 648 "HTMLCharacterReference.gperf" + {"Zcaron;", "Ž"}, + {""}, + {""}, + {""}, +#line 814 "HTMLCharacterReference.gperf" + {"boxuR;", "╘"}, + {""}, +#line 2231 "HTMLCharacterReference.gperf" + {"yen", "¥"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2232 "HTMLCharacterReference.gperf" + {"yen;", "¥"}, + {""}, + {""}, +#line 1194 "HTMLCharacterReference.gperf" + {"horbar;", "―"}, + {""}, +#line 691 "HTMLCharacterReference.gperf" + {"angmsdac;", "⦪"}, +#line 557 "HTMLCharacterReference.gperf" + {"Therefore;", "∴"}, + {""}, + {""}, + {""}, + {""}, +#line 1302 "HTMLCharacterReference.gperf" + {"late;", "⪭"}, +#line 1485 "HTMLCharacterReference.gperf" + {"napos;", "ʼn"}, + {""}, + {""}, +#line 614 "HTMLCharacterReference.gperf" + {"Vee;", "⋁"}, +#line 100 "HTMLCharacterReference.gperf" + {"DScy;", "Ѕ"}, + {""}, + {""}, + {""}, +#line 1191 "HTMLCharacterReference.gperf" + {"hookleftarrow;", "↩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 467 "HTMLCharacterReference.gperf" - {"Rcaron;", "Ř"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 403 "HTMLCharacterReference.gperf" - {"Nscr;", "𝒩"}, - {""}, - {""}, -#line 1161 "HTMLCharacterReference.gperf" - {"gtquest;", "⩼"}, -#line 454 "HTMLCharacterReference.gperf" - {"Psi;", "Ψ"}, - {""}, - {""}, -#line 155 "HTMLCharacterReference.gperf" - {"Ecaron;", "Ě"}, -#line 1418 "HTMLCharacterReference.gperf" - {"ltquest;", "⩻"}, - {""}, - {""}, -#line 848 "HTMLCharacterReference.gperf" - {"caret;", "⁁"}, - {""}, - {""}, - {""}, -#line 1205 "HTMLCharacterReference.gperf" - {"iecy;", "е"}, - {""}, - {""}, - {""}, - {""}, -#line 2201 "HTMLCharacterReference.gperf" - {"xcap;", "⋂"}, -#line 718 "HTMLCharacterReference.gperf" - {"atilde", "ã"}, + {"Rarrtl;", "⤖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1382 "HTMLCharacterReference.gperf" + {"looparrowleft;", "↫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 468 "HTMLCharacterReference.gperf" + {"Rcaron;", "Ř"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 404 "HTMLCharacterReference.gperf" + {"Nscr;", "𝒩"}, + {""}, + {""}, +#line 1162 "HTMLCharacterReference.gperf" + {"gtquest;", "⩼"}, +#line 455 "HTMLCharacterReference.gperf" + {"Psi;", "Ψ"}, + {""}, + {""}, +#line 156 "HTMLCharacterReference.gperf" + {"Ecaron;", "Ě"}, +#line 1419 "HTMLCharacterReference.gperf" + {"ltquest;", "⩻"}, + {""}, + {""}, +#line 849 "HTMLCharacterReference.gperf" + {"caret;", "⁁"}, + {""}, + {""}, + {""}, +#line 1206 "HTMLCharacterReference.gperf" + {"iecy;", "е"}, + {""}, + {""}, + {""}, + {""}, +#line 2202 "HTMLCharacterReference.gperf" + {"xcap;", "⋂"}, #line 719 "HTMLCharacterReference.gperf" - {"atilde;", "ã"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1601 "HTMLCharacterReference.gperf" - {"nsupset;", "⊃⃒"}, -#line 55 "HTMLCharacterReference.gperf" - {"Bfr;", "𝔅"}, -#line 221 "HTMLCharacterReference.gperf" - {"HumpEqual;", "≏"}, - {""}, -#line 605 "HTMLCharacterReference.gperf" - {"Utilde;", "Ũ"}, - {""}, - {""}, -#line 1011 "HTMLCharacterReference.gperf" - {"ecir;", "≖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 75 "HTMLCharacterReference.gperf" - {"Cfr;", "ℭ"}, - {""}, - {""}, - {""}, -#line 856 "HTMLCharacterReference.gperf" - {"ccupssm;", "⩐"}, - {""}, -#line 1313 "HTMLCharacterReference.gperf" - {"lcub;", "{"}, -#line 2179 "HTMLCharacterReference.gperf" - {"vnsub;", "⊂⃒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1063 "HTMLCharacterReference.gperf" - {"eth", "ð"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"atilde", "ã"}, +#line 720 "HTMLCharacterReference.gperf" + {"atilde;", "ã"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1602 "HTMLCharacterReference.gperf" + {"nsupset;", "⊃⃒"}, +#line 56 "HTMLCharacterReference.gperf" + {"Bfr;", "𝔅"}, +#line 222 "HTMLCharacterReference.gperf" + {"HumpEqual;", "≏"}, + {""}, +#line 606 "HTMLCharacterReference.gperf" + {"Utilde;", "Ũ"}, + {""}, + {""}, +#line 1012 "HTMLCharacterReference.gperf" + {"ecir;", "≖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 76 "HTMLCharacterReference.gperf" + {"Cfr;", "ℭ"}, + {""}, + {""}, + {""}, +#line 857 "HTMLCharacterReference.gperf" + {"ccupssm;", "⩐"}, + {""}, +#line 1314 "HTMLCharacterReference.gperf" + {"lcub;", "{"}, +#line 2180 "HTMLCharacterReference.gperf" + {"vnsub;", "⊂⃒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1064 "HTMLCharacterReference.gperf" - {"eth;", "ð"}, -#line 1498 "HTMLCharacterReference.gperf" - {"ncup;", "⩂"}, - {""}, - {""}, + {"eth", "ð"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1065 "HTMLCharacterReference.gperf" + {"eth;", "ð"}, +#line 1499 "HTMLCharacterReference.gperf" + {"ncup;", "⩂"}, + {""}, + {""}, +#line 1139 "HTMLCharacterReference.gperf" + {"gl;", "≷"}, + {""}, +#line 43 "HTMLCharacterReference.gperf" + {"Ascr;", "𝒜"}, + {""}, + {""}, +#line 1360 "HTMLCharacterReference.gperf" + {"ll;", "≪"}, + {""}, +#line 101 "HTMLCharacterReference.gperf" + {"DZcy;", "Џ"}, +#line 233 "HTMLCharacterReference.gperf" + {"Igrave", "Ì"}, +#line 234 "HTMLCharacterReference.gperf" + {"Igrave;", "Ì"}, +#line 1026 "HTMLCharacterReference.gperf" + {"el;", "⪙"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1029 "HTMLCharacterReference.gperf" + {"els;", "⪕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2244 "HTMLCharacterReference.gperf" + {"zeetrf;", "ℨ"}, + {""}, +#line 440 "HTMLCharacterReference.gperf" + {"Phi;", "Φ"}, +#line 1383 "HTMLCharacterReference.gperf" + {"looparrowright;", "↬"}, +#line 360 "HTMLCharacterReference.gperf" + {"NotGreater;", "≯"}, +#line 60 "HTMLCharacterReference.gperf" + {"Bumpeq;", "≎"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1141 "HTMLCharacterReference.gperf" + {"gla;", "⪥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 450 "HTMLCharacterReference.gperf" + {"Prime;", "″"}, + {""}, +#line 1247 "HTMLCharacterReference.gperf" + {"isindot;", "⋵"}, + {""}, #line 1138 "HTMLCharacterReference.gperf" - {"gl;", "≷"}, - {""}, -#line 42 "HTMLCharacterReference.gperf" - {"Ascr;", "𝒜"}, - {""}, - {""}, + {"gjcy;", "ѓ"}, + {""}, + {""}, + {""}, + {""}, #line 1359 "HTMLCharacterReference.gperf" - {"ll;", "≪"}, - {""}, -#line 100 "HTMLCharacterReference.gperf" - {"DZcy;", "Џ"}, -#line 232 "HTMLCharacterReference.gperf" - {"Igrave", "Ì"}, -#line 233 "HTMLCharacterReference.gperf" - {"Igrave;", "Ì"}, -#line 1025 "HTMLCharacterReference.gperf" - {"el;", "⪙"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1028 "HTMLCharacterReference.gperf" - {"els;", "⪕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2243 "HTMLCharacterReference.gperf" - {"zeetrf;", "ℨ"}, - {""}, -#line 439 "HTMLCharacterReference.gperf" - {"Phi;", "Φ"}, -#line 1382 "HTMLCharacterReference.gperf" - {"looparrowright;", "↬"}, -#line 359 "HTMLCharacterReference.gperf" - {"NotGreater;", "≯"}, -#line 59 "HTMLCharacterReference.gperf" - {"Bumpeq;", "≎"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1140 "HTMLCharacterReference.gperf" - {"gla;", "⪥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 449 "HTMLCharacterReference.gperf" - {"Prime;", "″"}, - {""}, -#line 1246 "HTMLCharacterReference.gperf" - {"isindot;", "⋵"}, - {""}, -#line 1137 "HTMLCharacterReference.gperf" - {"gjcy;", "ѓ"}, - {""}, - {""}, - {""}, - {""}, -#line 1358 "HTMLCharacterReference.gperf" - {"ljcy;", "љ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ljcy;", "љ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 970 "HTMLCharacterReference.gperf" + {"div;", "÷"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 963 "HTMLCharacterReference.gperf" + {"diam;", "⋄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1598 "HTMLCharacterReference.gperf" + {"nsucceq;", "⪰̸"}, + {""}, + {""}, +#line 1303 "HTMLCharacterReference.gperf" + {"lates;", "⪭︀"}, + {""}, +#line 1293 "HTMLCharacterReference.gperf" + {"larrbfs;", "⤟"}, + {""}, +#line 517 "HTMLCharacterReference.gperf" + {"ShortLeftArrow;", "←"}, +#line 780 "HTMLCharacterReference.gperf" + {"boxDL;", "╗"}, +#line 2195 "HTMLCharacterReference.gperf" + {"weierp;", "℘"}, +#line 1486 "HTMLCharacterReference.gperf" + {"napprox;", "≉"}, +#line 1403 "HTMLCharacterReference.gperf" + {"lsh;", "↰"}, +#line 507 "HTMLCharacterReference.gperf" + {"SHcy;", "Ш"}, + {""}, +#line 338 "HTMLCharacterReference.gperf" + {"Ncaron;", "Ň"}, +#line 207 "HTMLCharacterReference.gperf" + {"GreaterSlantEqual;", "⩾"}, + {""}, +#line 975 "HTMLCharacterReference.gperf" + {"djcy;", "ђ"}, +#line 1400 "HTMLCharacterReference.gperf" + {"lrtri;", "⊿"}, +#line 1227 "HTMLCharacterReference.gperf" + {"incare;", "℅"}, + {""}, +#line 870 "HTMLCharacterReference.gperf" + {"cir;", "○"}, + {""}, #line 969 "HTMLCharacterReference.gperf" - {"div;", "÷"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 962 "HTMLCharacterReference.gperf" - {"diam;", "⋄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1597 "HTMLCharacterReference.gperf" - {"nsucceq;", "⪰̸"}, - {""}, - {""}, -#line 1302 "HTMLCharacterReference.gperf" - {"lates;", "⪭︀"}, - {""}, -#line 1292 "HTMLCharacterReference.gperf" - {"larrbfs;", "⤟"}, - {""}, -#line 516 "HTMLCharacterReference.gperf" - {"ShortLeftArrow;", "←"}, -#line 779 "HTMLCharacterReference.gperf" - {"boxDL;", "╗"}, -#line 2194 "HTMLCharacterReference.gperf" - {"weierp;", "℘"}, -#line 1485 "HTMLCharacterReference.gperf" - {"napprox;", "≉"}, -#line 1402 "HTMLCharacterReference.gperf" - {"lsh;", "↰"}, -#line 506 "HTMLCharacterReference.gperf" - {"SHcy;", "Ш"}, - {""}, -#line 337 "HTMLCharacterReference.gperf" - {"Ncaron;", "Ň"}, -#line 206 "HTMLCharacterReference.gperf" - {"GreaterSlantEqual;", "⩾"}, - {""}, -#line 974 "HTMLCharacterReference.gperf" - {"djcy;", "ђ"}, -#line 1399 "HTMLCharacterReference.gperf" - {"lrtri;", "⊿"}, -#line 1226 "HTMLCharacterReference.gperf" - {"incare;", "℅"}, - {""}, -#line 869 "HTMLCharacterReference.gperf" - {"cir;", "○"}, - {""}, -#line 968 "HTMLCharacterReference.gperf" - {"disin;", "⋲"}, - {""}, - {""}, - {""}, - {""}, -#line 1422 "HTMLCharacterReference.gperf" - {"ltrif;", "◂"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1172 "HTMLCharacterReference.gperf" - {"hairsp;", " "}, - {""}, - {""}, - {""}, -#line 1360 "HTMLCharacterReference.gperf" - {"llarr;", "⇇"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 953 "HTMLCharacterReference.gperf" - {"ddotseq;", "⩷"}, - {""}, -#line 1081 "HTMLCharacterReference.gperf" - {"flat;", "♭"}, - {""}, - {""}, - {""}, - {""}, -#line 2203 "HTMLCharacterReference.gperf" - {"xcup;", "⋃"}, - {""}, -#line 193 "HTMLCharacterReference.gperf" - {"Gbreve;", "Ğ"}, - {""}, - {""}, - {""}, -#line 1114 "HTMLCharacterReference.gperf" - {"gamma;", "γ"}, - {""}, - {""}, - {""}, - {""}, -#line 999 "HTMLCharacterReference.gperf" - {"dtrif;", "▾"}, -#line 1251 "HTMLCharacterReference.gperf" - {"itilde;", "ĩ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 161 "HTMLCharacterReference.gperf" - {"Egrave", "È"}, + {"disin;", "⋲"}, + {""}, + {""}, + {""}, + {""}, +#line 1423 "HTMLCharacterReference.gperf" + {"ltrif;", "◂"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1173 "HTMLCharacterReference.gperf" + {"hairsp;", " "}, + {""}, + {""}, + {""}, +#line 1361 "HTMLCharacterReference.gperf" + {"llarr;", "⇇"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 954 "HTMLCharacterReference.gperf" + {"ddotseq;", "⩷"}, + {""}, +#line 1082 "HTMLCharacterReference.gperf" + {"flat;", "♭"}, + {""}, + {""}, + {""}, + {""}, +#line 2204 "HTMLCharacterReference.gperf" + {"xcup;", "⋃"}, + {""}, +#line 194 "HTMLCharacterReference.gperf" + {"Gbreve;", "Ğ"}, + {""}, + {""}, + {""}, +#line 1115 "HTMLCharacterReference.gperf" + {"gamma;", "γ"}, + {""}, + {""}, + {""}, + {""}, +#line 1000 "HTMLCharacterReference.gperf" + {"dtrif;", "▾"}, +#line 1252 "HTMLCharacterReference.gperf" + {"itilde;", "ĩ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 162 "HTMLCharacterReference.gperf" - {"Egrave;", "È"}, - {""}, - {""}, -#line 629 "HTMLCharacterReference.gperf" - {"Wscr;", "𝒲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2242 "HTMLCharacterReference.gperf" - {"zdot;", "ż"}, - {""}, - {""}, - {""}, - {""}, -#line 1602 "HTMLCharacterReference.gperf" - {"nsupseteq;", "⊉"}, + {"Egrave", "È"}, +#line 163 "HTMLCharacterReference.gperf" + {"Egrave;", "È"}, + {""}, + {""}, +#line 630 "HTMLCharacterReference.gperf" + {"Wscr;", "𝒲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2243 "HTMLCharacterReference.gperf" + {"zdot;", "ż"}, + {""}, + {""}, + {""}, + {""}, #line 1603 "HTMLCharacterReference.gperf" - {"nsupseteqq;", "⫆̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 645 "HTMLCharacterReference.gperf" - {"ZHcy;", "Ж"}, -#line 735 "HTMLCharacterReference.gperf" - {"bcong;", "≌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1212 "HTMLCharacterReference.gperf" - {"ii;", "ⅈ"}, - {""}, - {""}, - {""}, -#line 87 "HTMLCharacterReference.gperf" - {"Conint;", "∯"}, - {""}, -#line 455 "HTMLCharacterReference.gperf" - {"QUOT", "\""}, + {"nsupseteq;", "⊉"}, +#line 1604 "HTMLCharacterReference.gperf" + {"nsupseteqq;", "⫆̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 646 "HTMLCharacterReference.gperf" + {"ZHcy;", "Ж"}, +#line 736 "HTMLCharacterReference.gperf" + {"bcong;", "≌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1213 "HTMLCharacterReference.gperf" + {"ii;", "ⅈ"}, + {""}, + {""}, + {""}, +#line 88 "HTMLCharacterReference.gperf" + {"Conint;", "∯"}, + {""}, #line 456 "HTMLCharacterReference.gperf" - {"QUOT;", "\""}, -#line 1118 "HTMLCharacterReference.gperf" - {"gcirc;", "ĝ"}, - {""}, - {""}, - {""}, - {""}, -#line 2183 "HTMLCharacterReference.gperf" - {"vrtri;", "⊳"}, - {""}, - {""}, - {""}, -#line 1012 "HTMLCharacterReference.gperf" - {"ecirc", "ê"}, + {"QUOT", "\""}, +#line 457 "HTMLCharacterReference.gperf" + {"QUOT;", "\""}, +#line 1119 "HTMLCharacterReference.gperf" + {"gcirc;", "ĝ"}, + {""}, + {""}, + {""}, + {""}, +#line 2184 "HTMLCharacterReference.gperf" + {"vrtri;", "⊳"}, + {""}, + {""}, + {""}, #line 1013 "HTMLCharacterReference.gperf" - {"ecirc;", "ê"}, - {""}, - {""}, - {""}, - {""}, -#line 854 "HTMLCharacterReference.gperf" - {"ccirc;", "ĉ"}, - {""}, - {""}, - {""}, -#line 661 "HTMLCharacterReference.gperf" - {"acirc", "â"}, + {"ecirc", "ê"}, +#line 1014 "HTMLCharacterReference.gperf" + {"ecirc;", "ê"}, + {""}, + {""}, + {""}, + {""}, +#line 855 "HTMLCharacterReference.gperf" + {"ccirc;", "ĉ"}, + {""}, + {""}, + {""}, #line 662 "HTMLCharacterReference.gperf" - {"acirc;", "â"}, -#line 598 "HTMLCharacterReference.gperf" - {"Updownarrow;", "⇕"}, - {""}, - {""}, - {""}, -#line 1255 "HTMLCharacterReference.gperf" - {"jcirc;", "ĵ"}, -#line 892 "HTMLCharacterReference.gperf" - {"compfn;", "∘"}, - {""}, - {""}, -#line 574 "HTMLCharacterReference.gperf" - {"Ucirc", "Û"}, -#line 575 "HTMLCharacterReference.gperf" - {"Ucirc;", "Û"}, - {""}, - {""}, - {""}, -#line 566 "HTMLCharacterReference.gperf" - {"Tscr;", "𝒯"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 788 "HTMLCharacterReference.gperf" - {"boxUL;", "╝"}, -#line 374 "HTMLCharacterReference.gperf" - {"NotLessLess;", "≪̸"}, - {""}, -#line 445 "HTMLCharacterReference.gperf" - {"Precedes;", "≺"}, + {"acirc", "â"}, +#line 663 "HTMLCharacterReference.gperf" + {"acirc;", "â"}, #line 599 "HTMLCharacterReference.gperf" - {"UpperLeftArrow;", "↖"}, - {""}, -#line 706 "HTMLCharacterReference.gperf" - {"apacir;", "⩯"}, - {""}, - {""}, -#line 709 "HTMLCharacterReference.gperf" - {"apos;", "'"}, -#line 1180 "HTMLCharacterReference.gperf" - {"hcirc;", "ĥ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1228 "HTMLCharacterReference.gperf" - {"infintie;", "⧝"}, -#line 453 "HTMLCharacterReference.gperf" - {"Pscr;", "𝒫"}, - {""}, -#line 2175 "HTMLCharacterReference.gperf" - {"verbar;", "|"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2249 "HTMLCharacterReference.gperf" - {"zscr;", "𝓏"}, - {""}, -#line 585 "HTMLCharacterReference.gperf" - {"UnderParenthesis;", "⏝"}, - {""}, + {"Updownarrow;", "⇕"}, + {""}, + {""}, + {""}, +#line 1256 "HTMLCharacterReference.gperf" + {"jcirc;", "ĵ"}, +#line 893 "HTMLCharacterReference.gperf" + {"compfn;", "∘"}, + {""}, + {""}, +#line 575 "HTMLCharacterReference.gperf" + {"Ucirc", "Û"}, +#line 576 "HTMLCharacterReference.gperf" + {"Ucirc;", "Û"}, + {""}, + {""}, + {""}, +#line 567 "HTMLCharacterReference.gperf" + {"Tscr;", "𝒯"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 789 "HTMLCharacterReference.gperf" + {"boxUL;", "╝"}, +#line 375 "HTMLCharacterReference.gperf" + {"NotLessLess;", "≪̸"}, + {""}, +#line 446 "HTMLCharacterReference.gperf" + {"Precedes;", "≺"}, +#line 600 "HTMLCharacterReference.gperf" + {"UpperLeftArrow;", "↖"}, + {""}, +#line 707 "HTMLCharacterReference.gperf" + {"apacir;", "⩯"}, + {""}, + {""}, +#line 710 "HTMLCharacterReference.gperf" + {"apos;", "'"}, +#line 1181 "HTMLCharacterReference.gperf" + {"hcirc;", "ĥ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1229 "HTMLCharacterReference.gperf" + {"infintie;", "⧝"}, +#line 454 "HTMLCharacterReference.gperf" + {"Pscr;", "𝒫"}, + {""}, +#line 2176 "HTMLCharacterReference.gperf" + {"verbar;", "|"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2250 "HTMLCharacterReference.gperf" + {"zscr;", "𝓏"}, + {""}, +#line 586 "HTMLCharacterReference.gperf" + {"UnderParenthesis;", "⏝"}, + {""}, +#line 967 "HTMLCharacterReference.gperf" + {"die;", "¨"}, +#line 872 "HTMLCharacterReference.gperf" + {"circ;", "ˆ"}, + {""}, + {""}, +#line 311 "HTMLCharacterReference.gperf" + {"Ll;", "⋘"}, + {""}, + {""}, #line 966 "HTMLCharacterReference.gperf" - {"die;", "¨"}, -#line 871 "HTMLCharacterReference.gperf" - {"circ;", "ˆ"}, - {""}, - {""}, -#line 310 "HTMLCharacterReference.gperf" - {"Ll;", "⋘"}, - {""}, - {""}, -#line 965 "HTMLCharacterReference.gperf" - {"diams;", "♦"}, -#line 799 "HTMLCharacterReference.gperf" - {"boxbox;", "⧉"}, - {""}, - {""}, -#line 1315 "HTMLCharacterReference.gperf" - {"ldca;", "⤶"}, -#line 767 "HTMLCharacterReference.gperf" - {"blank;", "␣"}, - {""}, - {""}, - {""}, - {""}, -#line 1396 "HTMLCharacterReference.gperf" - {"lrhar;", "⇋"}, - {""}, - {""}, - {""}, -#line 895 "HTMLCharacterReference.gperf" - {"cong;", "≅"}, -#line 1483 "HTMLCharacterReference.gperf" - {"napid;", "≋̸"}, - {""}, - {""}, - {""}, -#line 1322 "HTMLCharacterReference.gperf" - {"leftarrow;", "←"}, - {""}, -#line 1164 "HTMLCharacterReference.gperf" - {"gtrdot;", "⋗"}, - {""}, - {""}, - {""}, -#line 2190 "HTMLCharacterReference.gperf" - {"wcirc;", "ŵ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 923 "HTMLCharacterReference.gperf" - {"cups;", "∪︀"}, -#line 803 "HTMLCharacterReference.gperf" - {"boxdr;", "┌"}, -#line 921 "HTMLCharacterReference.gperf" - {"cupdot;", "⊍"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 27 "HTMLCharacterReference.gperf" - {"Abreve;", "Ă"}, - {""}, - {""}, -#line 280 "HTMLCharacterReference.gperf" - {"LeftArrowRightArrow;", "⇆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1282 "HTMLCharacterReference.gperf" - {"lagran;", "ℒ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 990 "HTMLCharacterReference.gperf" - {"drbkarow;", "⤐"}, - {""}, - {""}, - {""}, -#line 525 "HTMLCharacterReference.gperf" - {"SquareSubset;", "⊏"}, - {""}, -#line 623 "HTMLCharacterReference.gperf" - {"Vscr;", "𝒱"}, -#line 771 "HTMLCharacterReference.gperf" - {"block;", "█"}, - {""}, - {""}, -#line 323 "HTMLCharacterReference.gperf" - {"Lsh;", "↰"}, - {""}, - {""}, -#line 185 "HTMLCharacterReference.gperf" - {"ForAll;", "∀"}, - {""}, - {""}, - {""}, - {""}, -#line 844 "HTMLCharacterReference.gperf" - {"capcap;", "⩋"}, - {""}, - {""}, - {""}, -#line 32 "HTMLCharacterReference.gperf" - {"Agrave", "À"}, + {"diams;", "♦"}, +#line 800 "HTMLCharacterReference.gperf" + {"boxbox;", "⧉"}, + {""}, + {""}, +#line 1316 "HTMLCharacterReference.gperf" + {"ldca;", "⤶"}, +#line 768 "HTMLCharacterReference.gperf" + {"blank;", "␣"}, + {""}, + {""}, + {""}, + {""}, +#line 1397 "HTMLCharacterReference.gperf" + {"lrhar;", "⇋"}, + {""}, + {""}, + {""}, +#line 896 "HTMLCharacterReference.gperf" + {"cong;", "≅"}, +#line 1484 "HTMLCharacterReference.gperf" + {"napid;", "≋̸"}, + {""}, + {""}, + {""}, +#line 1323 "HTMLCharacterReference.gperf" + {"leftarrow;", "←"}, + {""}, +#line 1165 "HTMLCharacterReference.gperf" + {"gtrdot;", "⋗"}, + {""}, + {""}, + {""}, +#line 2191 "HTMLCharacterReference.gperf" + {"wcirc;", "ŵ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 924 "HTMLCharacterReference.gperf" + {"cups;", "∪︀"}, +#line 804 "HTMLCharacterReference.gperf" + {"boxdr;", "┌"}, +#line 922 "HTMLCharacterReference.gperf" + {"cupdot;", "⊍"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 28 "HTMLCharacterReference.gperf" + {"Abreve;", "Ă"}, + {""}, + {""}, +#line 281 "HTMLCharacterReference.gperf" + {"LeftArrowRightArrow;", "⇆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1283 "HTMLCharacterReference.gperf" + {"lagran;", "ℒ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 991 "HTMLCharacterReference.gperf" + {"drbkarow;", "⤐"}, + {""}, + {""}, + {""}, +#line 526 "HTMLCharacterReference.gperf" + {"SquareSubset;", "⊏"}, + {""}, +#line 624 "HTMLCharacterReference.gperf" + {"Vscr;", "𝒱"}, +#line 772 "HTMLCharacterReference.gperf" + {"block;", "█"}, + {""}, + {""}, +#line 324 "HTMLCharacterReference.gperf" + {"Lsh;", "↰"}, + {""}, + {""}, +#line 186 "HTMLCharacterReference.gperf" + {"ForAll;", "∀"}, + {""}, + {""}, + {""}, + {""}, +#line 845 "HTMLCharacterReference.gperf" + {"capcap;", "⩋"}, + {""}, + {""}, + {""}, #line 33 "HTMLCharacterReference.gperf" - {"Agrave;", "À"}, - {""}, - {""}, - {""}, -#line 1001 "HTMLCharacterReference.gperf" - {"duhar;", "⥯"}, -#line 1619 "HTMLCharacterReference.gperf" - {"nvdash;", "⊬"}, - {""}, - {""}, - {""}, -#line 786 "HTMLCharacterReference.gperf" - {"boxHd;", "╤"}, -#line 1115 "HTMLCharacterReference.gperf" - {"gammad;", "ϝ"}, - {""}, -#line 377 "HTMLCharacterReference.gperf" - {"NotNestedGreaterGreater;", "⪢̸"}, - {""}, - {""}, -#line 552 "HTMLCharacterReference.gperf" - {"Tcaron;", "Ť"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1353 "HTMLCharacterReference.gperf" - {"lgE;", "⪑"}, -#line 54 "HTMLCharacterReference.gperf" - {"Beta;", "Β"}, -#line 213 "HTMLCharacterReference.gperf" - {"Hcirc;", "Ĥ"}, - {""}, + {"Agrave", "À"}, +#line 34 "HTMLCharacterReference.gperf" + {"Agrave;", "À"}, + {""}, + {""}, + {""}, +#line 1002 "HTMLCharacterReference.gperf" + {"duhar;", "⥯"}, +#line 1620 "HTMLCharacterReference.gperf" + {"nvdash;", "⊬"}, + {""}, + {""}, + {""}, +#line 787 "HTMLCharacterReference.gperf" + {"boxHd;", "╤"}, +#line 1116 "HTMLCharacterReference.gperf" + {"gammad;", "ϝ"}, + {""}, #line 378 "HTMLCharacterReference.gperf" - {"NotNestedLessLess;", "⪡̸"}, -#line 551 "HTMLCharacterReference.gperf" - {"Tau;", "Τ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 802 "HTMLCharacterReference.gperf" - {"boxdl;", "┐"}, -#line 2172 "HTMLCharacterReference.gperf" - {"veebar;", "⊻"}, -#line 526 "HTMLCharacterReference.gperf" - {"SquareSubsetEqual;", "⊑"}, - {""}, -#line 1202 "HTMLCharacterReference.gperf" - {"icirc", "î"}, -#line 1203 "HTMLCharacterReference.gperf" - {"icirc;", "î"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 529 "HTMLCharacterReference.gperf" - {"SquareUnion;", "⊔"}, - {""}, -#line 1144 "HTMLCharacterReference.gperf" - {"gnapprox;", "⪊"}, -#line 1579 "HTMLCharacterReference.gperf" - {"nsce;", "⪰̸"}, - {""}, - {""}, - {""}, -#line 1369 "HTMLCharacterReference.gperf" - {"lnapprox;", "⪉"}, - {""}, - {""}, -#line 2240 "HTMLCharacterReference.gperf" - {"zcaron;", "ž"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1766 "HTMLCharacterReference.gperf" - {"qint;", "⨌"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 639 "HTMLCharacterReference.gperf" - {"Ycirc;", "Ŷ"}, - {""}, - {""}, - {""}, -#line 2235 "HTMLCharacterReference.gperf" - {"yscr;", "𝓎"}, -#line 1355 "HTMLCharacterReference.gperf" - {"lharu;", "↼"}, - {""}, - {""}, - {""}, - {""}, -#line 700 "HTMLCharacterReference.gperf" - {"angst;", "Å"}, -#line 1229 "HTMLCharacterReference.gperf" - {"inodot;", "ı"}, - {""}, - {""}, + {"NotNestedGreaterGreater;", "⪢̸"}, + {""}, + {""}, +#line 553 "HTMLCharacterReference.gperf" + {"Tcaron;", "Ť"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1354 "HTMLCharacterReference.gperf" + {"lgE;", "⪑"}, +#line 55 "HTMLCharacterReference.gperf" + {"Beta;", "Β"}, +#line 214 "HTMLCharacterReference.gperf" + {"Hcirc;", "Ĥ"}, + {""}, +#line 379 "HTMLCharacterReference.gperf" + {"NotNestedLessLess;", "⪡̸"}, +#line 552 "HTMLCharacterReference.gperf" + {"Tau;", "Τ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 803 "HTMLCharacterReference.gperf" + {"boxdl;", "┐"}, +#line 2173 "HTMLCharacterReference.gperf" + {"veebar;", "⊻"}, #line 527 "HTMLCharacterReference.gperf" - {"SquareSuperset;", "⊐"}, -#line 904 "HTMLCharacterReference.gperf" - {"cross;", "✗"}, - {""}, - {""}, - {""}, -#line 528 "HTMLCharacterReference.gperf" - {"SquareSupersetEqual;", "⊒"}, -#line 1083 "HTMLCharacterReference.gperf" - {"fltns;", "▱"}, - {""}, -#line 631 "HTMLCharacterReference.gperf" - {"Xi;", "Ξ"}, -#line 571 "HTMLCharacterReference.gperf" - {"Uarrocir;", "⥉"}, - {""}, -#line 801 "HTMLCharacterReference.gperf" - {"boxdR;", "╒"}, + {"SquareSubsetEqual;", "⊑"}, + {""}, +#line 1203 "HTMLCharacterReference.gperf" + {"icirc", "î"}, +#line 1204 "HTMLCharacterReference.gperf" + {"icirc;", "î"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 530 "HTMLCharacterReference.gperf" + {"SquareUnion;", "⊔"}, + {""}, +#line 1145 "HTMLCharacterReference.gperf" + {"gnapprox;", "⪊"}, +#line 1580 "HTMLCharacterReference.gperf" + {"nsce;", "⪰̸"}, + {""}, + {""}, + {""}, +#line 1370 "HTMLCharacterReference.gperf" + {"lnapprox;", "⪉"}, + {""}, + {""}, +#line 2241 "HTMLCharacterReference.gperf" + {"zcaron;", "ž"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1767 "HTMLCharacterReference.gperf" + {"qint;", "⨌"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 640 "HTMLCharacterReference.gperf" + {"Ycirc;", "Ŷ"}, + {""}, + {""}, + {""}, +#line 2236 "HTMLCharacterReference.gperf" + {"yscr;", "𝓎"}, #line 1356 "HTMLCharacterReference.gperf" - {"lharul;", "⥪"}, - {""}, -#line 843 "HTMLCharacterReference.gperf" - {"capbrcup;", "⩉"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 40 "HTMLCharacterReference.gperf" - {"Aring", "Å"}, + {"lharu;", "↼"}, + {""}, + {""}, + {""}, + {""}, +#line 701 "HTMLCharacterReference.gperf" + {"angst;", "Å"}, +#line 1230 "HTMLCharacterReference.gperf" + {"inodot;", "ı"}, + {""}, + {""}, +#line 528 "HTMLCharacterReference.gperf" + {"SquareSuperset;", "⊐"}, +#line 905 "HTMLCharacterReference.gperf" + {"cross;", "✗"}, + {""}, + {""}, + {""}, +#line 529 "HTMLCharacterReference.gperf" + {"SquareSupersetEqual;", "⊒"}, +#line 1084 "HTMLCharacterReference.gperf" + {"fltns;", "▱"}, + {""}, +#line 632 "HTMLCharacterReference.gperf" + {"Xi;", "Ξ"}, +#line 572 "HTMLCharacterReference.gperf" + {"Uarrocir;", "⥉"}, + {""}, +#line 802 "HTMLCharacterReference.gperf" + {"boxdR;", "╒"}, +#line 1357 "HTMLCharacterReference.gperf" + {"lharul;", "⥪"}, + {""}, +#line 844 "HTMLCharacterReference.gperf" + {"capbrcup;", "⩉"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 41 "HTMLCharacterReference.gperf" - {"Aring;", "Å"}, - {""}, - {""}, - {""}, - {""}, -#line 1108 "HTMLCharacterReference.gperf" - {"frasl;", "⁄"}, - {""}, - {""}, - {""}, - {""}, -#line 1316 "HTMLCharacterReference.gperf" - {"ldquo;", "“"}, + {"Aring", "Å"}, +#line 42 "HTMLCharacterReference.gperf" + {"Aring;", "Å"}, + {""}, + {""}, + {""}, + {""}, +#line 1109 "HTMLCharacterReference.gperf" + {"frasl;", "⁄"}, + {""}, + {""}, + {""}, + {""}, #line 1317 "HTMLCharacterReference.gperf" - {"ldquor;", "„"}, -#line 1569 "HTMLCharacterReference.gperf" - {"npreceq;", "⪯̸"}, - {""}, -#line 1341 "HTMLCharacterReference.gperf" - {"lesg;", "⋚︀"}, -#line 828 "HTMLCharacterReference.gperf" - {"bsemi;", "⁏"}, -#line 1634 "HTMLCharacterReference.gperf" - {"nwnear;", "⤧"}, -#line 717 "HTMLCharacterReference.gperf" - {"asympeq;", "≍"}, - {""}, - {""}, -#line 818 "HTMLCharacterReference.gperf" - {"boxvL;", "╡"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1385 "HTMLCharacterReference.gperf" - {"loplus;", "⨭"}, - {""}, - {""}, -#line 681 "HTMLCharacterReference.gperf" - {"andd;", "⩜"}, - {""}, -#line 247 "HTMLCharacterReference.gperf" - {"Itilde;", "Ĩ"}, - {""}, - {""}, - {""}, - {""}, -#line 205 "HTMLCharacterReference.gperf" - {"GreaterLess;", "≷"}, - {""}, - {""}, -#line 984 "HTMLCharacterReference.gperf" - {"dotsquare;", "⊡"}, - {""}, -#line 920 "HTMLCharacterReference.gperf" - {"cupcup;", "⩊"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1605 "HTMLCharacterReference.gperf" - {"ntilde", "ñ"}, + {"ldquo;", "“"}, +#line 1318 "HTMLCharacterReference.gperf" + {"ldquor;", "„"}, +#line 1570 "HTMLCharacterReference.gperf" + {"npreceq;", "⪯̸"}, + {""}, +#line 1342 "HTMLCharacterReference.gperf" + {"lesg;", "⋚︀"}, +#line 829 "HTMLCharacterReference.gperf" + {"bsemi;", "⁏"}, +#line 1635 "HTMLCharacterReference.gperf" + {"nwnear;", "⤧"}, +#line 718 "HTMLCharacterReference.gperf" + {"asympeq;", "≍"}, + {""}, + {""}, +#line 819 "HTMLCharacterReference.gperf" + {"boxvL;", "╡"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1386 "HTMLCharacterReference.gperf" + {"loplus;", "⨭"}, + {""}, + {""}, +#line 682 "HTMLCharacterReference.gperf" + {"andd;", "⩜"}, + {""}, +#line 248 "HTMLCharacterReference.gperf" + {"Itilde;", "Ĩ"}, + {""}, + {""}, + {""}, + {""}, +#line 206 "HTMLCharacterReference.gperf" + {"GreaterLess;", "≷"}, + {""}, + {""}, +#line 985 "HTMLCharacterReference.gperf" + {"dotsquare;", "⊡"}, + {""}, +#line 921 "HTMLCharacterReference.gperf" + {"cupcup;", "⩊"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1606 "HTMLCharacterReference.gperf" - {"ntilde;", "ñ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1593 "HTMLCharacterReference.gperf" - {"nsubset;", "⊂⃒"}, - {""}, - {""}, - {""}, -#line 1397 "HTMLCharacterReference.gperf" - {"lrhard;", "⥭"}, - {""}, -#line 1232 "HTMLCharacterReference.gperf" - {"integers;", "ℤ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 557 "HTMLCharacterReference.gperf" - {"Theta;", "Θ"}, - {""}, - {""}, -#line 1267 "HTMLCharacterReference.gperf" - {"kfr;", "𝔨"}, - {""}, - {""}, - {""}, -#line 388 "HTMLCharacterReference.gperf" - {"NotSquareSuperset;", "⊐̸"}, - {""}, - {""}, - {""}, - {""}, + {"ntilde", "ñ"}, +#line 1607 "HTMLCharacterReference.gperf" + {"ntilde;", "ñ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1594 "HTMLCharacterReference.gperf" + {"nsubset;", "⊂⃒"}, + {""}, + {""}, + {""}, +#line 1398 "HTMLCharacterReference.gperf" + {"lrhard;", "⥭"}, + {""}, +#line 1233 "HTMLCharacterReference.gperf" + {"integers;", "ℤ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 558 "HTMLCharacterReference.gperf" + {"Theta;", "Θ"}, + {""}, + {""}, +#line 1268 "HTMLCharacterReference.gperf" + {"kfr;", "𝔨"}, + {""}, + {""}, + {""}, #line 389 "HTMLCharacterReference.gperf" - {"NotSquareSupersetEqual;", "⋣"}, - {""}, -#line 1288 "HTMLCharacterReference.gperf" - {"laquo", "«"}, + {"NotSquareSuperset;", "⊐̸"}, + {""}, + {""}, + {""}, + {""}, +#line 390 "HTMLCharacterReference.gperf" + {"NotSquareSupersetEqual;", "⋣"}, + {""}, #line 1289 "HTMLCharacterReference.gperf" - {"laquo;", "«"}, -#line 872 "HTMLCharacterReference.gperf" - {"circeq;", "≗"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1525 "HTMLCharacterReference.gperf" - {"ni;", "∋"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"laquo", "«"}, +#line 1290 "HTMLCharacterReference.gperf" + {"laquo;", "«"}, +#line 873 "HTMLCharacterReference.gperf" + {"circeq;", "≗"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1526 "HTMLCharacterReference.gperf" - {"nis;", "⋼"}, -#line 301 "HTMLCharacterReference.gperf" - {"Leftarrow;", "⇐"}, - {""}, - {""}, - {""}, -#line 982 "HTMLCharacterReference.gperf" - {"dotminus;", "∸"}, -#line 1462 "HTMLCharacterReference.gperf" - {"mscr;", "𝓂"}, - {""}, - {""}, - {""}, -#line 1433 "HTMLCharacterReference.gperf" - {"map;", "↦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1326 "HTMLCharacterReference.gperf" - {"leftleftarrows;", "⇇"}, - {""}, -#line 1400 "HTMLCharacterReference.gperf" - {"lsaquo;", "‹"}, - {""}, -#line 1528 "HTMLCharacterReference.gperf" - {"niv;", "∋"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 265 "HTMLCharacterReference.gperf" - {"Kscr;", "𝒦"}, - {""}, - {""}, - {""}, - {""}, -#line 363 "HTMLCharacterReference.gperf" - {"NotGreaterLess;", "≹"}, - {""}, -#line 120 "HTMLCharacterReference.gperf" - {"DoubleContourIntegral;", "∯"}, - {""}, -#line 76 "HTMLCharacterReference.gperf" - {"Chi;", "Χ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 515 "HTMLCharacterReference.gperf" - {"ShortDownArrow;", "↓"}, -#line 737 "HTMLCharacterReference.gperf" - {"bdquo;", "„"}, - {""}, - {""}, -#line 809 "HTMLCharacterReference.gperf" - {"boxminus;", "⊟"}, -#line 549 "HTMLCharacterReference.gperf" - {"TScy;", "Ц"}, -#line 1542 "HTMLCharacterReference.gperf" - {"nlsim;", "≴"}, - {""}, -#line 132 "HTMLCharacterReference.gperf" - {"DoubleUpDownArrow;", "⇕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ni;", "∋"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1527 "HTMLCharacterReference.gperf" + {"nis;", "⋼"}, +#line 302 "HTMLCharacterReference.gperf" + {"Leftarrow;", "⇐"}, + {""}, + {""}, + {""}, +#line 983 "HTMLCharacterReference.gperf" + {"dotminus;", "∸"}, +#line 1463 "HTMLCharacterReference.gperf" + {"mscr;", "𝓂"}, + {""}, + {""}, + {""}, +#line 1434 "HTMLCharacterReference.gperf" + {"map;", "↦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1327 "HTMLCharacterReference.gperf" + {"leftleftarrows;", "⇇"}, + {""}, +#line 1401 "HTMLCharacterReference.gperf" + {"lsaquo;", "‹"}, + {""}, #line 1529 "HTMLCharacterReference.gperf" - {"njcy;", "њ"}, -#line 1496 "HTMLCharacterReference.gperf" - {"ncong;", "≇"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2191 "HTMLCharacterReference.gperf" - {"wedbar;", "⩟"}, - {""}, - {""}, -#line 2246 "HTMLCharacterReference.gperf" - {"zhcy;", "ж"}, -#line 57 "HTMLCharacterReference.gperf" - {"Breve;", "˘"}, - {""}, -#line 1111 "HTMLCharacterReference.gperf" - {"gE;", "≧"}, + {"niv;", "∋"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 266 "HTMLCharacterReference.gperf" + {"Kscr;", "𝒦"}, + {""}, + {""}, + {""}, + {""}, +#line 364 "HTMLCharacterReference.gperf" + {"NotGreaterLess;", "≹"}, + {""}, +#line 121 "HTMLCharacterReference.gperf" + {"DoubleContourIntegral;", "∯"}, + {""}, +#line 77 "HTMLCharacterReference.gperf" + {"Chi;", "Χ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 516 "HTMLCharacterReference.gperf" + {"ShortDownArrow;", "↓"}, +#line 738 "HTMLCharacterReference.gperf" + {"bdquo;", "„"}, + {""}, + {""}, +#line 810 "HTMLCharacterReference.gperf" + {"boxminus;", "⊟"}, +#line 550 "HTMLCharacterReference.gperf" + {"TScy;", "Ц"}, #line 1543 "HTMLCharacterReference.gperf" - {"nlt;", "≮"}, -#line 2040 "HTMLCharacterReference.gperf" - {"tbrk;", "⎴"}, - {""}, -#line 730 "HTMLCharacterReference.gperf" - {"barvee;", "⊽"}, -#line 1277 "HTMLCharacterReference.gperf" - {"lE;", "≦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1119 "HTMLCharacterReference.gperf" - {"gcy;", "г"}, - {""}, -#line 251 "HTMLCharacterReference.gperf" - {"Jcirc;", "Ĵ"}, - {""}, - {""}, -#line 1314 "HTMLCharacterReference.gperf" - {"lcy;", "л"}, - {""}, - {""}, - {""}, - {""}, -#line 1015 "HTMLCharacterReference.gperf" - {"ecy;", "э"}, - {""}, - {""}, - {""}, -#line 597 "HTMLCharacterReference.gperf" - {"Uparrow;", "⇑"}, - {""}, -#line 932 "HTMLCharacterReference.gperf" - {"curvearrowleft;", "↶"}, -#line 1575 "HTMLCharacterReference.gperf" - {"nrtri;", "⋫"}, - {""}, - {""}, -#line 665 "HTMLCharacterReference.gperf" - {"acy;", "а"}, - {""}, - {""}, - {""}, - {""}, -#line 1256 "HTMLCharacterReference.gperf" - {"jcy;", "й"}, -#line 2236 "HTMLCharacterReference.gperf" - {"yucy;", "ю"}, - {""}, -#line 1128 "HTMLCharacterReference.gperf" - {"gesdot;", "⪀"}, - {""}, -#line 576 "HTMLCharacterReference.gperf" - {"Ucy;", "У"}, - {""}, -#line 1057 "HTMLCharacterReference.gperf" - {"erDot;", "≓"}, -#line 1338 "HTMLCharacterReference.gperf" - {"lesdot;", "⩿"}, - {""}, - {""}, - {""}, -#line 1532 "HTMLCharacterReference.gperf" - {"nlarr;", "↚"}, - {""}, - {""}, -#line 2067 "HTMLCharacterReference.gperf" - {"top;", "⊤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1178 "HTMLCharacterReference.gperf" - {"harrw;", "↭"}, - {""}, -#line 2208 "HTMLCharacterReference.gperf" - {"xi;", "ξ"}, -#line 949 "HTMLCharacterReference.gperf" - {"dcy;", "д"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 583 "HTMLCharacterReference.gperf" - {"UnderBrace;", "⏟"}, -#line 1627 "HTMLCharacterReference.gperf" - {"nvrArr;", "⤃"}, + {"nlsim;", "≴"}, + {""}, +#line 133 "HTMLCharacterReference.gperf" + {"DoubleUpDownArrow;", "⇕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1530 "HTMLCharacterReference.gperf" + {"njcy;", "њ"}, +#line 1497 "HTMLCharacterReference.gperf" + {"ncong;", "≇"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2192 "HTMLCharacterReference.gperf" + {"wedbar;", "⩟"}, + {""}, + {""}, +#line 2247 "HTMLCharacterReference.gperf" + {"zhcy;", "ж"}, +#line 58 "HTMLCharacterReference.gperf" + {"Breve;", "˘"}, + {""}, +#line 1112 "HTMLCharacterReference.gperf" + {"gE;", "≧"}, +#line 1544 "HTMLCharacterReference.gperf" + {"nlt;", "≮"}, +#line 2041 "HTMLCharacterReference.gperf" + {"tbrk;", "⎴"}, + {""}, +#line 731 "HTMLCharacterReference.gperf" + {"barvee;", "⊽"}, +#line 1278 "HTMLCharacterReference.gperf" + {"lE;", "≦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1120 "HTMLCharacterReference.gperf" + {"gcy;", "г"}, + {""}, +#line 252 "HTMLCharacterReference.gperf" + {"Jcirc;", "Ĵ"}, + {""}, + {""}, +#line 1315 "HTMLCharacterReference.gperf" + {"lcy;", "л"}, + {""}, + {""}, + {""}, + {""}, +#line 1016 "HTMLCharacterReference.gperf" + {"ecy;", "э"}, + {""}, + {""}, + {""}, +#line 598 "HTMLCharacterReference.gperf" + {"Uparrow;", "⇑"}, + {""}, +#line 933 "HTMLCharacterReference.gperf" + {"curvearrowleft;", "↶"}, +#line 1576 "HTMLCharacterReference.gperf" + {"nrtri;", "⋫"}, + {""}, + {""}, +#line 666 "HTMLCharacterReference.gperf" + {"acy;", "а"}, + {""}, + {""}, + {""}, + {""}, +#line 1257 "HTMLCharacterReference.gperf" + {"jcy;", "й"}, +#line 2237 "HTMLCharacterReference.gperf" + {"yucy;", "ю"}, + {""}, +#line 1129 "HTMLCharacterReference.gperf" + {"gesdot;", "⪀"}, + {""}, +#line 577 "HTMLCharacterReference.gperf" + {"Ucy;", "У"}, + {""}, +#line 1058 "HTMLCharacterReference.gperf" + {"erDot;", "≓"}, +#line 1339 "HTMLCharacterReference.gperf" + {"lesdot;", "⩿"}, + {""}, + {""}, + {""}, +#line 1533 "HTMLCharacterReference.gperf" + {"nlarr;", "↚"}, + {""}, + {""}, +#line 2068 "HTMLCharacterReference.gperf" + {"top;", "⊤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1179 "HTMLCharacterReference.gperf" + {"harrw;", "↭"}, + {""}, +#line 2209 "HTMLCharacterReference.gperf" + {"xi;", "ξ"}, +#line 950 "HTMLCharacterReference.gperf" + {"dcy;", "д"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 584 "HTMLCharacterReference.gperf" - {"UnderBracket;", "⎵"}, -#line 1340 "HTMLCharacterReference.gperf" - {"lesdotor;", "⪃"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 512 "HTMLCharacterReference.gperf" - {"Scirc;", "Ŝ"}, -#line 1342 "HTMLCharacterReference.gperf" - {"lesges;", "⪓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 751 "HTMLCharacterReference.gperf" - {"bigoplus;", "⨁"}, - {""}, - {""}, -#line 1477 "HTMLCharacterReference.gperf" - {"nVdash;", "⊮"}, -#line 1771 "HTMLCharacterReference.gperf" - {"quatint;", "⨖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1594 "HTMLCharacterReference.gperf" - {"nsubseteq;", "⊈"}, + {"UnderBrace;", "⏟"}, +#line 1628 "HTMLCharacterReference.gperf" + {"nvrArr;", "⤃"}, +#line 585 "HTMLCharacterReference.gperf" + {"UnderBracket;", "⎵"}, +#line 1341 "HTMLCharacterReference.gperf" + {"lesdotor;", "⪃"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 513 "HTMLCharacterReference.gperf" + {"Scirc;", "Ŝ"}, +#line 1343 "HTMLCharacterReference.gperf" + {"lesges;", "⪓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 752 "HTMLCharacterReference.gperf" + {"bigoplus;", "⨁"}, + {""}, + {""}, +#line 1478 "HTMLCharacterReference.gperf" + {"nVdash;", "⊮"}, +#line 1772 "HTMLCharacterReference.gperf" + {"quatint;", "⨖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1595 "HTMLCharacterReference.gperf" - {"nsubseteqq;", "⫅̸"}, - {""}, - {""}, - {""}, -#line 72 "HTMLCharacterReference.gperf" - {"Cdot;", "Ċ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 914 "HTMLCharacterReference.gperf" - {"cuesc;", "⋟"}, - {""}, - {""}, -#line 1073 "HTMLCharacterReference.gperf" - {"fcy;", "ф"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 762 "HTMLCharacterReference.gperf" - {"blacksquare;", "▪"}, - {""}, - {""}, -#line 227 "HTMLCharacterReference.gperf" - {"Icirc", "Î"}, + {"nsubseteq;", "⊈"}, +#line 1596 "HTMLCharacterReference.gperf" + {"nsubseteqq;", "⫅̸"}, + {""}, + {""}, + {""}, +#line 73 "HTMLCharacterReference.gperf" + {"Cdot;", "Ċ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 915 "HTMLCharacterReference.gperf" + {"cuesc;", "⋟"}, + {""}, + {""}, +#line 1074 "HTMLCharacterReference.gperf" + {"fcy;", "ф"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 763 "HTMLCharacterReference.gperf" + {"blacksquare;", "▪"}, + {""}, + {""}, #line 228 "HTMLCharacterReference.gperf" - {"Icirc;", "Î"}, - {""}, - {""}, -#line 811 "HTMLCharacterReference.gperf" - {"boxtimes;", "⊠"}, - {""}, -#line 794 "HTMLCharacterReference.gperf" - {"boxVL;", "╣"}, - {""}, - {""}, -#line 2169 "HTMLCharacterReference.gperf" - {"vcy;", "в"}, -#line 2057 "HTMLCharacterReference.gperf" - {"thorn", "þ"}, + {"Icirc", "Î"}, +#line 229 "HTMLCharacterReference.gperf" + {"Icirc;", "Î"}, + {""}, + {""}, +#line 812 "HTMLCharacterReference.gperf" + {"boxtimes;", "⊠"}, + {""}, +#line 795 "HTMLCharacterReference.gperf" + {"boxVL;", "╣"}, + {""}, + {""}, +#line 2170 "HTMLCharacterReference.gperf" + {"vcy;", "в"}, #line 2058 "HTMLCharacterReference.gperf" - {"thorn;", "þ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 503 "HTMLCharacterReference.gperf" - {"Rsh;", "↱"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 376 "HTMLCharacterReference.gperf" - {"NotLessTilde;", "≴"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 736 "HTMLCharacterReference.gperf" - {"bcy;", "б"}, - {""}, -#line 404 "HTMLCharacterReference.gperf" - {"Ntilde", "Ñ"}, + {"thorn", "þ"}, +#line 2059 "HTMLCharacterReference.gperf" + {"thorn;", "þ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 504 "HTMLCharacterReference.gperf" + {"Rsh;", "↱"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 377 "HTMLCharacterReference.gperf" + {"NotLessTilde;", "≴"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 737 "HTMLCharacterReference.gperf" + {"bcy;", "б"}, + {""}, #line 405 "HTMLCharacterReference.gperf" - {"Ntilde;", "Ñ"}, - {""}, - {""}, -#line 708 "HTMLCharacterReference.gperf" - {"apid;", "≋"}, - {""}, -#line 1508 "HTMLCharacterReference.gperf" - {"nesear;", "⤨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1003 "HTMLCharacterReference.gperf" - {"dzcy;", "џ"}, - {""}, -#line 1415 "HTMLCharacterReference.gperf" - {"lthree;", "⋋"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 23 "HTMLCharacterReference.gperf" - {"AMP", "&"}, - {""}, - {""}, - {""}, -#line 1438 "HTMLCharacterReference.gperf" - {"marker;", "▮"}, - {""}, + {"Ntilde", "Ñ"}, +#line 406 "HTMLCharacterReference.gperf" + {"Ntilde;", "Ñ"}, + {""}, + {""}, +#line 709 "HTMLCharacterReference.gperf" + {"apid;", "≋"}, + {""}, +#line 1509 "HTMLCharacterReference.gperf" + {"nesear;", "⤨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1004 "HTMLCharacterReference.gperf" + {"dzcy;", "џ"}, + {""}, +#line 1416 "HTMLCharacterReference.gperf" + {"lthree;", "⋋"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 24 "HTMLCharacterReference.gperf" - {"AMP;", "&"}, - {""}, -#line 1772 "HTMLCharacterReference.gperf" - {"quest;", "?"}, - {""}, - {""}, -#line 1534 "HTMLCharacterReference.gperf" - {"nle;", "≰"}, -#line 58 "HTMLCharacterReference.gperf" - {"Bscr;", "ℬ"}, -#line 2210 "HTMLCharacterReference.gperf" - {"xlarr;", "⟵"}, -#line 1024 "HTMLCharacterReference.gperf" - {"egsdot;", "⪘"}, -#line 289 "HTMLCharacterReference.gperf" - {"LeftTee;", "⊣"}, -#line 1278 "HTMLCharacterReference.gperf" - {"lEg;", "⪋"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 963 "HTMLCharacterReference.gperf" - {"diamond;", "⋄"}, -#line 2046 "HTMLCharacterReference.gperf" - {"tfr;", "𝔱"}, -#line 93 "HTMLCharacterReference.gperf" - {"Cscr;", "𝒞"}, - {""}, - {""}, - {""}, -#line 64 "HTMLCharacterReference.gperf" - {"Cap;", "⋒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2222 "HTMLCharacterReference.gperf" - {"xutri;", "△"}, - {""}, - {""}, -#line 180 "HTMLCharacterReference.gperf" - {"Fcy;", "Ф"}, -#line 1182 "HTMLCharacterReference.gperf" - {"heartsuit;", "♥"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 44 "HTMLCharacterReference.gperf" - {"Atilde", "Ã"}, + {"AMP", "&"}, + {""}, + {""}, + {""}, +#line 1439 "HTMLCharacterReference.gperf" + {"marker;", "▮"}, + {""}, +#line 25 "HTMLCharacterReference.gperf" + {"AMP;", "&"}, + {""}, +#line 1773 "HTMLCharacterReference.gperf" + {"quest;", "?"}, + {""}, + {""}, +#line 1535 "HTMLCharacterReference.gperf" + {"nle;", "≰"}, +#line 59 "HTMLCharacterReference.gperf" + {"Bscr;", "ℬ"}, +#line 2211 "HTMLCharacterReference.gperf" + {"xlarr;", "⟵"}, +#line 1025 "HTMLCharacterReference.gperf" + {"egsdot;", "⪘"}, +#line 290 "HTMLCharacterReference.gperf" + {"LeftTee;", "⊣"}, +#line 1279 "HTMLCharacterReference.gperf" + {"lEg;", "⪋"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 964 "HTMLCharacterReference.gperf" + {"diamond;", "⋄"}, +#line 2047 "HTMLCharacterReference.gperf" + {"tfr;", "𝔱"}, +#line 94 "HTMLCharacterReference.gperf" + {"Cscr;", "𝒞"}, + {""}, + {""}, + {""}, +#line 65 "HTMLCharacterReference.gperf" + {"Cap;", "⋒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2223 "HTMLCharacterReference.gperf" + {"xutri;", "△"}, + {""}, + {""}, +#line 181 "HTMLCharacterReference.gperf" + {"Fcy;", "Ф"}, +#line 1183 "HTMLCharacterReference.gperf" + {"heartsuit;", "♥"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 45 "HTMLCharacterReference.gperf" - {"Atilde;", "Ã"}, - {""}, -#line 1204 "HTMLCharacterReference.gperf" - {"icy;", "и"}, - {""}, - {""}, -#line 1197 "HTMLCharacterReference.gperf" - {"hybull;", "⁃"}, - {""}, - {""}, - {""}, -#line 1556 "HTMLCharacterReference.gperf" - {"notni;", "∌"}, - {""}, - {""}, - {""}, -#line 880 "HTMLCharacterReference.gperf" - {"cire;", "≗"}, -#line 191 "HTMLCharacterReference.gperf" - {"Gamma;", "Γ"}, - {""}, - {""}, - {""}, -#line 2072 "HTMLCharacterReference.gperf" - {"tosa;", "⤩"}, -#line 1276 "HTMLCharacterReference.gperf" - {"lBarr;", "⤎"}, - {""}, - {""}, -#line 1497 "HTMLCharacterReference.gperf" - {"ncongdot;", "⩭̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 640 "HTMLCharacterReference.gperf" - {"Ycy;", "Ы"}, - {""}, -#line 1005 "HTMLCharacterReference.gperf" - {"eDDot;", "⩷"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 967 "HTMLCharacterReference.gperf" - {"digamma;", "ϝ"}, - {""}, - {""}, -#line 1273 "HTMLCharacterReference.gperf" - {"lAarr;", "⇚"}, - {""}, - {""}, - {""}, -#line 156 "HTMLCharacterReference.gperf" - {"Ecirc", "Ê"}, -#line 157 "HTMLCharacterReference.gperf" - {"Ecirc;", "Ê"}, - {""}, - {""}, - {""}, -#line 1971 "HTMLCharacterReference.gperf" - {"star;", "☆"}, -#line 1018 "HTMLCharacterReference.gperf" - {"efDot;", "≒"}, - {""}, - {""}, - {""}, + {"Atilde", "Ã"}, +#line 46 "HTMLCharacterReference.gperf" + {"Atilde;", "Ã"}, + {""}, +#line 1205 "HTMLCharacterReference.gperf" + {"icy;", "и"}, + {""}, + {""}, +#line 1198 "HTMLCharacterReference.gperf" + {"hybull;", "⁃"}, + {""}, + {""}, + {""}, +#line 1557 "HTMLCharacterReference.gperf" + {"notni;", "∌"}, + {""}, + {""}, + {""}, +#line 881 "HTMLCharacterReference.gperf" + {"cire;", "≗"}, +#line 192 "HTMLCharacterReference.gperf" + {"Gamma;", "Γ"}, + {""}, + {""}, + {""}, +#line 2073 "HTMLCharacterReference.gperf" + {"tosa;", "⤩"}, +#line 1277 "HTMLCharacterReference.gperf" + {"lBarr;", "⤎"}, + {""}, + {""}, +#line 1498 "HTMLCharacterReference.gperf" + {"ncongdot;", "⩭̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 641 "HTMLCharacterReference.gperf" + {"Ycy;", "Ы"}, + {""}, +#line 1006 "HTMLCharacterReference.gperf" + {"eDDot;", "⩷"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 968 "HTMLCharacterReference.gperf" + {"digamma;", "ϝ"}, + {""}, + {""}, #line 1274 "HTMLCharacterReference.gperf" - {"lArr;", "⇐"}, -#line 2202 "HTMLCharacterReference.gperf" - {"xcirc;", "◯"}, - {""}, - {""}, - {""}, - {""}, -#line 1136 "HTMLCharacterReference.gperf" - {"gimel;", "ℷ"}, - {""}, - {""}, - {""}, -#line 1949 "HTMLCharacterReference.gperf" - {"spar;", "∥"}, -#line 517 "HTMLCharacterReference.gperf" - {"ShortRightArrow;", "→"}, - {""}, - {""}, -#line 276 "HTMLCharacterReference.gperf" - {"Lcy;", "Л"}, - {""}, -#line 195 "HTMLCharacterReference.gperf" - {"Gcirc;", "Ĝ"}, - {""}, - {""}, -#line 2002 "HTMLCharacterReference.gperf" - {"sum;", "∑"}, -#line 2149 "HTMLCharacterReference.gperf" - {"vBar;", "⫨"}, - {""}, -#line 964 "HTMLCharacterReference.gperf" - {"diamondsuit;", "♦"}, -#line 240 "HTMLCharacterReference.gperf" - {"Intersection;", "⋂"}, - {""}, - {""}, + {"lAarr;", "⇚"}, + {""}, + {""}, + {""}, +#line 157 "HTMLCharacterReference.gperf" + {"Ecirc", "Ê"}, +#line 158 "HTMLCharacterReference.gperf" + {"Ecirc;", "Ê"}, + {""}, + {""}, + {""}, +#line 1972 "HTMLCharacterReference.gperf" + {"star;", "☆"}, +#line 1019 "HTMLCharacterReference.gperf" + {"efDot;", "≒"}, + {""}, + {""}, + {""}, +#line 1275 "HTMLCharacterReference.gperf" + {"lArr;", "⇐"}, +#line 2203 "HTMLCharacterReference.gperf" + {"xcirc;", "◯"}, + {""}, + {""}, + {""}, + {""}, +#line 1137 "HTMLCharacterReference.gperf" + {"gimel;", "ℷ"}, + {""}, + {""}, + {""}, +#line 1950 "HTMLCharacterReference.gperf" + {"spar;", "∥"}, +#line 518 "HTMLCharacterReference.gperf" + {"ShortRightArrow;", "→"}, + {""}, + {""}, +#line 277 "HTMLCharacterReference.gperf" + {"Lcy;", "Л"}, + {""}, +#line 196 "HTMLCharacterReference.gperf" + {"Gcirc;", "Ĝ"}, + {""}, + {""}, +#line 2003 "HTMLCharacterReference.gperf" + {"sum;", "∑"}, #line 2150 "HTMLCharacterReference.gperf" - {"vBarv;", "⫩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1615 "HTMLCharacterReference.gperf" - {"numsp;", " "}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 939 "HTMLCharacterReference.gperf" - {"dArr;", "⇓"}, - {""}, -#line 1459 "HTMLCharacterReference.gperf" - {"models;", "⊧"}, -#line 1129 "HTMLCharacterReference.gperf" - {"gesdoto;", "⪂"}, -#line 2010 "HTMLCharacterReference.gperf" - {"sup;", "⊃"}, -#line 1171 "HTMLCharacterReference.gperf" - {"hArr;", "⇔"}, - {""}, -#line 1770 "HTMLCharacterReference.gperf" - {"quaternions;", "ℍ"}, -#line 1339 "HTMLCharacterReference.gperf" - {"lesdoto;", "⪁"}, -#line 1513 "HTMLCharacterReference.gperf" - {"ngE;", "≧̸"}, - {""}, - {""}, - {""}, - {""}, -#line 2004 "HTMLCharacterReference.gperf" - {"sup1", "¹"}, + {"vBar;", "⫨"}, + {""}, +#line 965 "HTMLCharacterReference.gperf" + {"diamondsuit;", "♦"}, +#line 241 "HTMLCharacterReference.gperf" + {"Intersection;", "⋂"}, + {""}, + {""}, +#line 2151 "HTMLCharacterReference.gperf" + {"vBarv;", "⫩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1616 "HTMLCharacterReference.gperf" + {"numsp;", " "}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 940 "HTMLCharacterReference.gperf" + {"dArr;", "⇓"}, + {""}, +#line 1460 "HTMLCharacterReference.gperf" + {"models;", "⊧"}, +#line 1130 "HTMLCharacterReference.gperf" + {"gesdoto;", "⪂"}, +#line 2011 "HTMLCharacterReference.gperf" + {"sup;", "⊃"}, +#line 1172 "HTMLCharacterReference.gperf" + {"hArr;", "⇔"}, + {""}, +#line 1771 "HTMLCharacterReference.gperf" + {"quaternions;", "ℍ"}, +#line 1340 "HTMLCharacterReference.gperf" + {"lesdoto;", "⪁"}, +#line 1514 "HTMLCharacterReference.gperf" + {"ngE;", "≧̸"}, + {""}, + {""}, + {""}, + {""}, #line 2005 "HTMLCharacterReference.gperf" - {"sup1;", "¹"}, -#line 1966 "HTMLCharacterReference.gperf" - {"srarr;", "→"}, - {""}, - {""}, + {"sup1", "¹"}, #line 2006 "HTMLCharacterReference.gperf" - {"sup2", "²"}, + {"sup1;", "¹"}, +#line 1967 "HTMLCharacterReference.gperf" + {"srarr;", "→"}, + {""}, + {""}, #line 2007 "HTMLCharacterReference.gperf" - {"sup2;", "²"}, - {""}, - {""}, - {""}, + {"sup2", "²"}, #line 2008 "HTMLCharacterReference.gperf" - {"sup3", "³"}, + {"sup2;", "²"}, + {""}, + {""}, + {""}, #line 2009 "HTMLCharacterReference.gperf" - {"sup3;", "³"}, - {""}, - {""}, - {""}, -#line 327 "HTMLCharacterReference.gperf" - {"Mcy;", "М"}, - {""}, -#line 2033 "HTMLCharacterReference.gperf" - {"swarr;", "↙"}, - {""}, - {""}, -#line 131 "HTMLCharacterReference.gperf" - {"DoubleUpArrow;", "⇑"}, - {""}, - {""}, -#line 67 "HTMLCharacterReference.gperf" - {"Ccaron;", "Č"}, -#line 1564 "HTMLCharacterReference.gperf" - {"npolint;", "⨔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1387 "HTMLCharacterReference.gperf" - {"lowast;", "∗"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 386 "HTMLCharacterReference.gperf" - {"NotSquareSubset;", "⊏̸"}, - {""}, - {""}, - {""}, -#line 2148 "HTMLCharacterReference.gperf" - {"vArr;", "⇕"}, + {"sup3", "³"}, +#line 2010 "HTMLCharacterReference.gperf" + {"sup3;", "³"}, + {""}, + {""}, + {""}, +#line 328 "HTMLCharacterReference.gperf" + {"Mcy;", "М"}, + {""}, +#line 2034 "HTMLCharacterReference.gperf" + {"swarr;", "↙"}, + {""}, + {""}, +#line 132 "HTMLCharacterReference.gperf" + {"DoubleUpArrow;", "⇑"}, + {""}, + {""}, +#line 68 "HTMLCharacterReference.gperf" + {"Ccaron;", "Č"}, +#line 1565 "HTMLCharacterReference.gperf" + {"npolint;", "⨔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1388 "HTMLCharacterReference.gperf" + {"lowast;", "∗"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 387 "HTMLCharacterReference.gperf" - {"NotSquareSubsetEqual;", "⋢"}, - {""}, - {""}, - {""}, -#line 1537 "HTMLCharacterReference.gperf" - {"nleq;", "≰"}, + {"NotSquareSubset;", "⊏̸"}, + {""}, + {""}, + {""}, +#line 2149 "HTMLCharacterReference.gperf" + {"vArr;", "⇕"}, +#line 388 "HTMLCharacterReference.gperf" + {"NotSquareSubsetEqual;", "⋢"}, + {""}, + {""}, + {""}, #line 1538 "HTMLCharacterReference.gperf" - {"nleqq;", "≦̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 207 "HTMLCharacterReference.gperf" - {"GreaterTilde;", "≳"}, -#line 543 "HTMLCharacterReference.gperf" - {"SupersetEqual;", "⊇"}, - {""}, -#line 884 "HTMLCharacterReference.gperf" - {"clubs;", "♣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 105 "HTMLCharacterReference.gperf" - {"Dcy;", "Д"}, - {""}, - {""}, - {""}, -#line 73 "HTMLCharacterReference.gperf" - {"Cedilla;", "¸"}, -#line 659 "HTMLCharacterReference.gperf" - {"acE;", "∾̳"}, - {""}, - {""}, -#line 624 "HTMLCharacterReference.gperf" - {"Vvdash;", "⊪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 535 "HTMLCharacterReference.gperf" - {"Succeeds;", "≻"}, -#line 1533 "HTMLCharacterReference.gperf" - {"nldr;", "‥"}, - {""}, - {""}, - {""}, - {""}, -#line 258 "HTMLCharacterReference.gperf" - {"KHcy;", "Х"}, -#line 600 "HTMLCharacterReference.gperf" - {"UpperRightArrow;", "↗"}, - {""}, - {""}, - {""}, - {""}, -#line 1214 "HTMLCharacterReference.gperf" - {"iiint;", "∭"}, - {""}, -#line 423 "HTMLCharacterReference.gperf" - {"Or;", "⩔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 211 "HTMLCharacterReference.gperf" - {"Hacek;", "ˇ"}, - {""}, - {""}, -#line 252 "HTMLCharacterReference.gperf" - {"Jcy;", "Й"}, -#line 1084 "HTMLCharacterReference.gperf" - {"fnof;", "ƒ"}, - {""}, -#line 192 "HTMLCharacterReference.gperf" - {"Gammad;", "Ϝ"}, - {""}, - {""}, -#line 2066 "HTMLCharacterReference.gperf" - {"toea;", "⤨"}, - {""}, - {""}, - {""}, -#line 1962 "HTMLCharacterReference.gperf" - {"squ;", "□"}, -#line 28 "HTMLCharacterReference.gperf" - {"Acirc", "Â"}, -#line 29 "HTMLCharacterReference.gperf" - {"Acirc;", "Â"}, -#line 2221 "HTMLCharacterReference.gperf" - {"xuplus;", "⨄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 95 "HTMLCharacterReference.gperf" - {"CupCap;", "≍"}, - {""}, - {""}, - {""}, - {""}, -#line 2047 "HTMLCharacterReference.gperf" - {"there4;", "∴"}, - {""}, - {""}, -#line 1345 "HTMLCharacterReference.gperf" - {"lesseqgtr;", "⋚"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 440 "HTMLCharacterReference.gperf" - {"Pi;", "Π"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1423 "HTMLCharacterReference.gperf" - {"lurdshar;", "⥊"}, -#line 1149 "HTMLCharacterReference.gperf" - {"gopf;", "𝕘"}, - {""}, - {""}, - {""}, -#line 513 "HTMLCharacterReference.gperf" - {"Scy;", "С"}, -#line 1384 "HTMLCharacterReference.gperf" - {"lopf;", "𝕝"}, - {""}, -#line 976 "HTMLCharacterReference.gperf" - {"dlcrop;", "⌍"}, - {""}, - {""}, -#line 1040 "HTMLCharacterReference.gperf" - {"eopf;", "𝕖"}, - {""}, - {""}, - {""}, - {""}, -#line 898 "HTMLCharacterReference.gperf" - {"copf;", "𝕔"}, - {""}, - {""}, - {""}, - {""}, -#line 703 "HTMLCharacterReference.gperf" - {"aopf;", "𝕒"}, -#line 1912 "HTMLCharacterReference.gperf" - {"sharp;", "♯"}, -#line 760 "HTMLCharacterReference.gperf" - {"bkarow;", "⤍"}, - {""}, - {""}, -#line 1259 "HTMLCharacterReference.gperf" - {"jopf;", "𝕛"}, - {""}, - {""}, -#line 362 "HTMLCharacterReference.gperf" - {"NotGreaterGreater;", "≫̸"}, -#line 1910 "HTMLCharacterReference.gperf" - {"sfr;", "𝔰"}, -#line 589 "HTMLCharacterReference.gperf" - {"Uopf;", "𝕌"}, - {""}, -#line 975 "HTMLCharacterReference.gperf" - {"dlcorn;", "⌞"}, -#line 114 "HTMLCharacterReference.gperf" - {"Diamond;", "⋄"}, - {""}, - {""}, -#line 272 "HTMLCharacterReference.gperf" - {"Laplacetrf;", "ℒ"}, - {""}, - {""}, -#line 430 "HTMLCharacterReference.gperf" - {"Ouml", "Ö"}, -#line 431 "HTMLCharacterReference.gperf" - {"Ouml;", "Ö"}, - {""}, -#line 2215 "HTMLCharacterReference.gperf" - {"xoplus;", "⨁"}, - {""}, - {""}, - {""}, -#line 1486 "HTMLCharacterReference.gperf" - {"natur;", "♮"}, + {"nleq;", "≰"}, +#line 1539 "HTMLCharacterReference.gperf" + {"nleqq;", "≦̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 208 "HTMLCharacterReference.gperf" + {"GreaterTilde;", "≳"}, #line 544 "HTMLCharacterReference.gperf" - {"Supset;", "⋑"}, - {""}, -#line 229 "HTMLCharacterReference.gperf" - {"Icy;", "И"}, -#line 978 "HTMLCharacterReference.gperf" - {"dopf;", "𝕕"}, - {""}, -#line 2220 "HTMLCharacterReference.gperf" - {"xsqcup;", "⨆"}, - {""}, -#line 1056 "HTMLCharacterReference.gperf" - {"eqvparsl;", "⧥"}, -#line 1192 "HTMLCharacterReference.gperf" - {"hopf;", "𝕙"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 299 "HTMLCharacterReference.gperf" - {"LeftVector;", "↼"}, -#line 1968 "HTMLCharacterReference.gperf" - {"ssetmn;", "∖"}, -#line 1633 "HTMLCharacterReference.gperf" - {"nwarrow;", "↖"}, - {""}, - {""}, -#line 360 "HTMLCharacterReference.gperf" - {"NotGreaterEqual;", "≱"}, - {""}, - {""}, -#line 1499 "HTMLCharacterReference.gperf" - {"ncy;", "н"}, - {""}, -#line 2021 "HTMLCharacterReference.gperf" - {"supne;", "⊋"}, - {""}, - {""}, - {""}, - {""}, -#line 2192 "HTMLCharacterReference.gperf" - {"wedge;", "∧"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1213 "HTMLCharacterReference.gperf" - {"iiiint;", "⨌"}, - {""}, - {""}, -#line 458 "HTMLCharacterReference.gperf" - {"Qopf;", "ℚ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1975 "HTMLCharacterReference.gperf" - {"strns;", "¯"}, -#line 2073 "HTMLCharacterReference.gperf" - {"tprime;", "‴"}, - {""}, - {""}, -#line 1085 "HTMLCharacterReference.gperf" - {"fopf;", "𝕗"}, - {""}, - {""}, - {""}, -#line 648 "HTMLCharacterReference.gperf" - {"Zcy;", "З"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2196 "HTMLCharacterReference.gperf" - {"wopf;", "𝕨"}, - {""}, - {""}, -#line 896 "HTMLCharacterReference.gperf" - {"congdot;", "⩭"}, - {""}, - {""}, + {"SupersetEqual;", "⊇"}, + {""}, +#line 885 "HTMLCharacterReference.gperf" + {"clubs;", "♣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 106 "HTMLCharacterReference.gperf" + {"Dcy;", "Д"}, + {""}, + {""}, + {""}, +#line 74 "HTMLCharacterReference.gperf" + {"Cedilla;", "¸"}, +#line 660 "HTMLCharacterReference.gperf" + {"acE;", "∾̳"}, + {""}, + {""}, #line 625 "HTMLCharacterReference.gperf" - {"Wcirc;", "Ŵ"}, - {""}, - {""}, - {""}, -#line 2181 "HTMLCharacterReference.gperf" - {"vopf;", "𝕧"}, -#line 785 "HTMLCharacterReference.gperf" - {"boxHU;", "╩"}, -#line 1576 "HTMLCharacterReference.gperf" - {"nrtrie;", "⋭"}, -#line 750 "HTMLCharacterReference.gperf" - {"bigodot;", "⨀"}, - {""}, - {""}, -#line 186 "HTMLCharacterReference.gperf" - {"Fouriertrf;", "ℱ"}, - {""}, - {""}, - {""}, - {""}, -#line 1216 "HTMLCharacterReference.gperf" - {"iiota;", "℩"}, - {""}, - {""}, -#line 1281 "HTMLCharacterReference.gperf" - {"laemptyv;", "⦴"}, -#line 1284 "HTMLCharacterReference.gperf" - {"lang;", "⟨"}, - {""}, -#line 699 "HTMLCharacterReference.gperf" - {"angsph;", "∢"}, - {""}, - {""}, -#line 134 "HTMLCharacterReference.gperf" - {"DownArrow;", "↓"}, -#line 970 "HTMLCharacterReference.gperf" - {"divide", "÷"}, -#line 971 "HTMLCharacterReference.gperf" - {"divide;", "÷"}, - {""}, -#line 725 "HTMLCharacterReference.gperf" - {"backcong;", "≌"}, -#line 775 "HTMLCharacterReference.gperf" - {"bopf;", "𝕓"}, -#line 451 "HTMLCharacterReference.gperf" - {"Proportion;", "∷"}, - {""}, - {""}, -#line 1089 "HTMLCharacterReference.gperf" - {"fpartint;", "⨍"}, -#line 1539 "HTMLCharacterReference.gperf" - {"nleqslant;", "⩽̸"}, - {""}, -#line 1293 "HTMLCharacterReference.gperf" - {"larrfs;", "⤝"}, -#line 135 "HTMLCharacterReference.gperf" - {"DownArrowBar;", "⤓"}, - {""}, -#line 1036 "HTMLCharacterReference.gperf" - {"emsp;", " "}, - {""}, - {""}, -#line 677 "HTMLCharacterReference.gperf" - {"amp", "&"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 678 "HTMLCharacterReference.gperf" - {"amp;", "&"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 60 "HTMLCharacterReference.gperf" - {"CHcy;", "Ч"}, - {""}, -#line 1035 "HTMLCharacterReference.gperf" - {"emsp14;", " "}, - {""}, - {""}, + {"Vvdash;", "⊪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 536 "HTMLCharacterReference.gperf" + {"Succeeds;", "≻"}, +#line 1534 "HTMLCharacterReference.gperf" + {"nldr;", "‥"}, + {""}, + {""}, + {""}, + {""}, +#line 259 "HTMLCharacterReference.gperf" + {"KHcy;", "Х"}, +#line 601 "HTMLCharacterReference.gperf" + {"UpperRightArrow;", "↗"}, + {""}, + {""}, + {""}, + {""}, +#line 1215 "HTMLCharacterReference.gperf" + {"iiint;", "∭"}, + {""}, +#line 424 "HTMLCharacterReference.gperf" + {"Or;", "⩔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 212 "HTMLCharacterReference.gperf" + {"Hacek;", "ˇ"}, + {""}, + {""}, +#line 253 "HTMLCharacterReference.gperf" + {"Jcy;", "Й"}, +#line 1085 "HTMLCharacterReference.gperf" + {"fnof;", "ƒ"}, + {""}, +#line 193 "HTMLCharacterReference.gperf" + {"Gammad;", "Ϝ"}, + {""}, + {""}, +#line 2067 "HTMLCharacterReference.gperf" + {"toea;", "⤨"}, + {""}, + {""}, + {""}, +#line 1963 "HTMLCharacterReference.gperf" + {"squ;", "□"}, +#line 29 "HTMLCharacterReference.gperf" + {"Acirc", "Â"}, +#line 30 "HTMLCharacterReference.gperf" + {"Acirc;", "Â"}, +#line 2222 "HTMLCharacterReference.gperf" + {"xuplus;", "⨄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 96 "HTMLCharacterReference.gperf" + {"CupCap;", "≍"}, + {""}, + {""}, + {""}, + {""}, #line 2048 "HTMLCharacterReference.gperf" - {"therefore;", "∴"}, - {""}, -#line 2193 "HTMLCharacterReference.gperf" - {"wedgeq;", "≙"}, -#line 1553 "HTMLCharacterReference.gperf" - {"notinva;", "∉"}, - {""}, -#line 1068 "HTMLCharacterReference.gperf" - {"excl;", "!"}, - {""}, - {""}, - {""}, - {""}, -#line 1909 "HTMLCharacterReference.gperf" - {"sext;", "✶"}, - {""}, -#line 505 "HTMLCharacterReference.gperf" - {"SHCHcy;", "Щ"}, - {""}, -#line 469 "HTMLCharacterReference.gperf" - {"Rcy;", "Р"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2020 "HTMLCharacterReference.gperf" - {"supnE;", "⫌"}, - {""}, - {""}, -#line 158 "HTMLCharacterReference.gperf" - {"Ecy;", "Э"}, -#line 216 "HTMLCharacterReference.gperf" - {"Hopf;", "ℍ"}, - {""}, - {""}, - {""}, - {""}, -#line 184 "HTMLCharacterReference.gperf" - {"Fopf;", "𝔽"}, - {""}, - {""}, - {""}, - {""}, -#line 1905 "HTMLCharacterReference.gperf" - {"semi;", ";"}, - {""}, -#line 1034 "HTMLCharacterReference.gperf" - {"emsp13;", " "}, - {""}, - {""}, -#line 1238 "HTMLCharacterReference.gperf" - {"iopf;", "𝕚"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 196 "HTMLCharacterReference.gperf" - {"Gcy;", "Г"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1272 "HTMLCharacterReference.gperf" - {"kscr;", "𝓀"}, -#line 812 "HTMLCharacterReference.gperf" - {"boxuL;", "╛"}, - {""}, -#line 1862 "HTMLCharacterReference.gperf" - {"rpar;", ")"}, -#line 1361 "HTMLCharacterReference.gperf" - {"llcorner;", "⌞"}, -#line 642 "HTMLCharacterReference.gperf" - {"Yopf;", "𝕐"}, - {""}, -#line 1189 "HTMLCharacterReference.gperf" - {"homtht;", "∻"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 847 "HTMLCharacterReference.gperf" - {"caps;", "∩︀"}, -#line 2157 "HTMLCharacterReference.gperf" - {"varpi;", "ϖ"}, -#line 846 "HTMLCharacterReference.gperf" - {"capdot;", "⩀"}, - {""}, - {""}, - {""}, - {""}, -#line 614 "HTMLCharacterReference.gperf" - {"Verbar;", "‖"}, - {""}, -#line 414 "HTMLCharacterReference.gperf" - {"Ofr;", "𝔒"}, - {""}, - {""}, - {""}, - {""}, -#line 682 "HTMLCharacterReference.gperf" - {"andslope;", "⩘"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1570 "HTMLCharacterReference.gperf" - {"nrArr;", "⇏"}, - {""}, - {""}, - {""}, - {""}, -#line 1901 "HTMLCharacterReference.gperf" - {"searr;", "↘"}, -#line 1409 "HTMLCharacterReference.gperf" - {"lstrok;", "ł"}, -#line 2022 "HTMLCharacterReference.gperf" - {"supplus;", "⫀"}, - {""}, -#line 319 "HTMLCharacterReference.gperf" - {"Lopf;", "𝕃"}, -#line 1908 "HTMLCharacterReference.gperf" - {"setmn;", "∖"}, - {""}, - {""}, - {""}, - {""}, -#line 1630 "HTMLCharacterReference.gperf" - {"nwArr;", "⇖"}, - {""}, -#line 1874 "HTMLCharacterReference.gperf" - {"rtri;", "▹"}, -#line 1865 "HTMLCharacterReference.gperf" - {"rrarr;", "⇉"}, -#line 49 "HTMLCharacterReference.gperf" - {"Barv;", "⫧"}, -#line 886 "HTMLCharacterReference.gperf" - {"colon;", ":"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 550 "HTMLCharacterReference.gperf" - {"Tab;", "\t"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1300 "HTMLCharacterReference.gperf" - {"latail;", "⤙"}, - {""}, -#line 1806 "HTMLCharacterReference.gperf" - {"rbarr;", "⤍"}, -#line 1767 "HTMLCharacterReference.gperf" - {"qopf;", "𝕢"}, - {""}, - {""}, -#line 163 "HTMLCharacterReference.gperf" - {"Element;", "∈"}, - {""}, - {""}, - {""}, -#line 1970 "HTMLCharacterReference.gperf" - {"sstarf;", "⋆"}, - {""}, - {""}, - {""}, - {""}, -#line 996 "HTMLCharacterReference.gperf" - {"dstrok;", "đ"}, - {""}, - {""}, - {""}, - {""}, -#line 1196 "HTMLCharacterReference.gperf" - {"hstrok;", "ħ"}, - {""}, - {""}, -#line 834 "HTMLCharacterReference.gperf" - {"bull;", "•"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 332 "HTMLCharacterReference.gperf" - {"Mopf;", "𝕄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1350 "HTMLCharacterReference.gperf" - {"lfloor;", "⌊"}, - {""}, -#line 339 "HTMLCharacterReference.gperf" - {"Ncy;", "Н"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2068 "HTMLCharacterReference.gperf" - {"topbot;", "⌶"}, - {""}, - {""}, - {""}, -#line 1030 "HTMLCharacterReference.gperf" - {"emacr;", "ē"}, -#line 1051 "HTMLCharacterReference.gperf" - {"eqslantless;", "⪕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 291 "HTMLCharacterReference.gperf" - {"LeftTeeVector;", "⥚"}, -#line 804 "HTMLCharacterReference.gperf" - {"boxh;", "─"}, -#line 675 "HTMLCharacterReference.gperf" - {"amacr;", "ā"}, -#line 1836 "HTMLCharacterReference.gperf" - {"rho;", "ρ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1071 "HTMLCharacterReference.gperf" - {"exponentiale;", "ⅇ"}, - {""}, - {""}, -#line 581 "HTMLCharacterReference.gperf" - {"Umacr;", "Ū"}, - {""}, - {""}, -#line 2154 "HTMLCharacterReference.gperf" - {"varkappa;", "ϰ"}, - {""}, - {""}, -#line 1417 "HTMLCharacterReference.gperf" - {"ltlarr;", "⥶"}, - {""}, - {""}, - {""}, - {""}, -#line 1198 "HTMLCharacterReference.gperf" - {"hyphen;", "‐"}, - {""}, - {""}, - {""}, -#line 2228 "HTMLCharacterReference.gperf" - {"ycirc;", "ŷ"}, -#line 1283 "HTMLCharacterReference.gperf" - {"lambda;", "λ"}, - {""}, - {""}, - {""}, - {""}, -#line 941 "HTMLCharacterReference.gperf" - {"dagger;", "†"}, - {""}, - {""}, -#line 271 "HTMLCharacterReference.gperf" - {"Lang;", "⟪"}, -#line 460 "HTMLCharacterReference.gperf" - {"RBarr;", "⤐"}, - {""}, - {""}, -#line 833 "HTMLCharacterReference.gperf" - {"bsolhsub;", "⟈"}, -#line 224 "HTMLCharacterReference.gperf" - {"IOcy;", "Ё"}, -#line 2217 "HTMLCharacterReference.gperf" - {"xrArr;", "⟹"}, -#line 747 "HTMLCharacterReference.gperf" - {"bigcap;", "⋂"}, - {""}, -#line 30 "HTMLCharacterReference.gperf" - {"Acy;", "А"}, -#line 116 "HTMLCharacterReference.gperf" - {"Dopf;", "𝔻"}, - {""}, - {""}, - {""}, -#line 1856 "HTMLCharacterReference.gperf" - {"roarr;", "⇾"}, - {""}, - {""}, - {""}, - {""}, -#line 1319 "HTMLCharacterReference.gperf" - {"ldrushar;", "⥋"}, -#line 90 "HTMLCharacterReference.gperf" - {"Coproduct;", "∐"}, + {"there4;", "∴"}, + {""}, + {""}, #line 1346 "HTMLCharacterReference.gperf" - {"lesseqqgtr;", "⪋"}, -#line 1964 "HTMLCharacterReference.gperf" - {"squarf;", "▪"}, - {""}, - {""}, - {""}, -#line 558 "HTMLCharacterReference.gperf" - {"ThickSpace;", "  "}, -#line 1248 "HTMLCharacterReference.gperf" - {"isinsv;", "⋳"}, - {""}, -#line 448 "HTMLCharacterReference.gperf" - {"PrecedesTilde;", "≾"}, - {""}, - {""}, -#line 973 "HTMLCharacterReference.gperf" - {"divonx;", "⋇"}, - {""}, -#line 2130 "HTMLCharacterReference.gperf" - {"upsi;", "υ"}, -#line 2044 "HTMLCharacterReference.gperf" - {"tdot;", "⃛"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1522 "HTMLCharacterReference.gperf" - {"nhArr;", "⇎"}, -#line 845 "HTMLCharacterReference.gperf" - {"capcup;", "⩇"}, - {""}, - {""}, -#line 1170 "HTMLCharacterReference.gperf" - {"gvnE;", "≩︀"}, - {""}, -#line 915 "HTMLCharacterReference.gperf" - {"cularr;", "↶"}, - {""}, - {""}, -#line 1426 "HTMLCharacterReference.gperf" - {"lvnE;", "≨︀"}, - {""}, -#line 379 "HTMLCharacterReference.gperf" - {"NotPrecedes;", "⊀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1233 "HTMLCharacterReference.gperf" - {"intercal;", "⊺"}, -#line 254 "HTMLCharacterReference.gperf" - {"Jopf;", "𝕁"}, - {""}, - {""}, - {""}, -#line 1428 "HTMLCharacterReference.gperf" - {"macr", "¯"}, -#line 1429 "HTMLCharacterReference.gperf" - {"macr;", "¯"}, - {""}, -#line 219 "HTMLCharacterReference.gperf" - {"Hstrok;", "Ħ"}, - {""}, + {"lesseqgtr;", "⋚"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 441 "HTMLCharacterReference.gperf" + {"Pi;", "Π"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1424 "HTMLCharacterReference.gperf" + {"lurdshar;", "⥊"}, +#line 1150 "HTMLCharacterReference.gperf" + {"gopf;", "𝕘"}, + {""}, + {""}, + {""}, +#line 514 "HTMLCharacterReference.gperf" + {"Scy;", "С"}, +#line 1385 "HTMLCharacterReference.gperf" + {"lopf;", "𝕝"}, + {""}, +#line 977 "HTMLCharacterReference.gperf" + {"dlcrop;", "⌍"}, + {""}, + {""}, +#line 1041 "HTMLCharacterReference.gperf" + {"eopf;", "𝕖"}, + {""}, + {""}, + {""}, + {""}, +#line 899 "HTMLCharacterReference.gperf" + {"copf;", "𝕔"}, + {""}, + {""}, + {""}, + {""}, +#line 704 "HTMLCharacterReference.gperf" + {"aopf;", "𝕒"}, +#line 1913 "HTMLCharacterReference.gperf" + {"sharp;", "♯"}, +#line 761 "HTMLCharacterReference.gperf" + {"bkarow;", "⤍"}, + {""}, + {""}, +#line 1260 "HTMLCharacterReference.gperf" + {"jopf;", "𝕛"}, + {""}, + {""}, +#line 363 "HTMLCharacterReference.gperf" + {"NotGreaterGreater;", "≫̸"}, +#line 1911 "HTMLCharacterReference.gperf" + {"sfr;", "𝔰"}, +#line 590 "HTMLCharacterReference.gperf" + {"Uopf;", "𝕌"}, + {""}, +#line 976 "HTMLCharacterReference.gperf" + {"dlcorn;", "⌞"}, +#line 115 "HTMLCharacterReference.gperf" + {"Diamond;", "⋄"}, + {""}, + {""}, +#line 273 "HTMLCharacterReference.gperf" + {"Laplacetrf;", "ℒ"}, + {""}, + {""}, +#line 431 "HTMLCharacterReference.gperf" + {"Ouml", "Ö"}, +#line 432 "HTMLCharacterReference.gperf" + {"Ouml;", "Ö"}, + {""}, +#line 2216 "HTMLCharacterReference.gperf" + {"xoplus;", "⨁"}, + {""}, + {""}, + {""}, +#line 1487 "HTMLCharacterReference.gperf" + {"natur;", "♮"}, +#line 545 "HTMLCharacterReference.gperf" + {"Supset;", "⋑"}, + {""}, +#line 230 "HTMLCharacterReference.gperf" + {"Icy;", "И"}, +#line 979 "HTMLCharacterReference.gperf" + {"dopf;", "𝕕"}, + {""}, +#line 2221 "HTMLCharacterReference.gperf" + {"xsqcup;", "⨆"}, + {""}, +#line 1057 "HTMLCharacterReference.gperf" + {"eqvparsl;", "⧥"}, +#line 1193 "HTMLCharacterReference.gperf" + {"hopf;", "𝕙"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 300 "HTMLCharacterReference.gperf" + {"LeftVector;", "↼"}, +#line 1969 "HTMLCharacterReference.gperf" + {"ssetmn;", "∖"}, +#line 1634 "HTMLCharacterReference.gperf" + {"nwarrow;", "↖"}, + {""}, + {""}, +#line 361 "HTMLCharacterReference.gperf" + {"NotGreaterEqual;", "≱"}, + {""}, + {""}, +#line 1500 "HTMLCharacterReference.gperf" + {"ncy;", "н"}, + {""}, +#line 2022 "HTMLCharacterReference.gperf" + {"supne;", "⊋"}, + {""}, + {""}, + {""}, + {""}, +#line 2193 "HTMLCharacterReference.gperf" + {"wedge;", "∧"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1214 "HTMLCharacterReference.gperf" + {"iiiint;", "⨌"}, + {""}, + {""}, +#line 459 "HTMLCharacterReference.gperf" + {"Qopf;", "ℚ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1976 "HTMLCharacterReference.gperf" + {"strns;", "¯"}, +#line 2074 "HTMLCharacterReference.gperf" + {"tprime;", "‴"}, + {""}, + {""}, +#line 1086 "HTMLCharacterReference.gperf" + {"fopf;", "𝕗"}, + {""}, + {""}, + {""}, +#line 649 "HTMLCharacterReference.gperf" + {"Zcy;", "З"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2197 "HTMLCharacterReference.gperf" + {"wopf;", "𝕨"}, + {""}, + {""}, +#line 897 "HTMLCharacterReference.gperf" + {"congdot;", "⩭"}, + {""}, + {""}, +#line 626 "HTMLCharacterReference.gperf" + {"Wcirc;", "Ŵ"}, + {""}, + {""}, + {""}, +#line 2182 "HTMLCharacterReference.gperf" + {"vopf;", "𝕧"}, +#line 786 "HTMLCharacterReference.gperf" + {"boxHU;", "╩"}, +#line 1577 "HTMLCharacterReference.gperf" + {"nrtrie;", "⋭"}, +#line 751 "HTMLCharacterReference.gperf" + {"bigodot;", "⨀"}, + {""}, + {""}, +#line 187 "HTMLCharacterReference.gperf" + {"Fouriertrf;", "ℱ"}, + {""}, + {""}, + {""}, + {""}, +#line 1217 "HTMLCharacterReference.gperf" + {"iiota;", "℩"}, + {""}, + {""}, +#line 1282 "HTMLCharacterReference.gperf" + {"laemptyv;", "⦴"}, +#line 1285 "HTMLCharacterReference.gperf" + {"lang;", "⟨"}, + {""}, +#line 700 "HTMLCharacterReference.gperf" + {"angsph;", "∢"}, + {""}, + {""}, +#line 135 "HTMLCharacterReference.gperf" + {"DownArrow;", "↓"}, +#line 971 "HTMLCharacterReference.gperf" + {"divide", "÷"}, +#line 972 "HTMLCharacterReference.gperf" + {"divide;", "÷"}, + {""}, +#line 726 "HTMLCharacterReference.gperf" + {"backcong;", "≌"}, +#line 776 "HTMLCharacterReference.gperf" + {"bopf;", "𝕓"}, +#line 452 "HTMLCharacterReference.gperf" + {"Proportion;", "∷"}, + {""}, + {""}, +#line 1090 "HTMLCharacterReference.gperf" + {"fpartint;", "⨍"}, +#line 1540 "HTMLCharacterReference.gperf" + {"nleqslant;", "⩽̸"}, + {""}, +#line 1294 "HTMLCharacterReference.gperf" + {"larrfs;", "⤝"}, +#line 136 "HTMLCharacterReference.gperf" + {"DownArrowBar;", "⤓"}, + {""}, +#line 1037 "HTMLCharacterReference.gperf" + {"emsp;", " "}, + {""}, + {""}, +#line 678 "HTMLCharacterReference.gperf" + {"amp", "&"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 679 "HTMLCharacterReference.gperf" + {"amp;", "&"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 61 "HTMLCharacterReference.gperf" + {"CHcy;", "Ч"}, + {""}, +#line 1036 "HTMLCharacterReference.gperf" + {"emsp14;", " "}, + {""}, + {""}, +#line 2049 "HTMLCharacterReference.gperf" + {"therefore;", "∴"}, + {""}, +#line 2194 "HTMLCharacterReference.gperf" + {"wedgeq;", "≙"}, +#line 1554 "HTMLCharacterReference.gperf" + {"notinva;", "∉"}, + {""}, +#line 1069 "HTMLCharacterReference.gperf" + {"excl;", "!"}, + {""}, + {""}, + {""}, + {""}, +#line 1910 "HTMLCharacterReference.gperf" + {"sext;", "✶"}, + {""}, +#line 506 "HTMLCharacterReference.gperf" + {"SHCHcy;", "Щ"}, + {""}, +#line 470 "HTMLCharacterReference.gperf" + {"Rcy;", "Р"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2021 "HTMLCharacterReference.gperf" + {"supnE;", "⫌"}, + {""}, + {""}, +#line 159 "HTMLCharacterReference.gperf" + {"Ecy;", "Э"}, +#line 217 "HTMLCharacterReference.gperf" + {"Hopf;", "ℍ"}, + {""}, + {""}, + {""}, + {""}, +#line 185 "HTMLCharacterReference.gperf" + {"Fopf;", "𝔽"}, + {""}, + {""}, + {""}, + {""}, +#line 1906 "HTMLCharacterReference.gperf" + {"semi;", ";"}, + {""}, +#line 1035 "HTMLCharacterReference.gperf" + {"emsp13;", " "}, + {""}, + {""}, +#line 1239 "HTMLCharacterReference.gperf" + {"iopf;", "𝕚"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 197 "HTMLCharacterReference.gperf" + {"Gcy;", "Г"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1273 "HTMLCharacterReference.gperf" + {"kscr;", "𝓀"}, +#line 813 "HTMLCharacterReference.gperf" + {"boxuL;", "╛"}, + {""}, +#line 1863 "HTMLCharacterReference.gperf" + {"rpar;", ")"}, +#line 1362 "HTMLCharacterReference.gperf" + {"llcorner;", "⌞"}, +#line 643 "HTMLCharacterReference.gperf" + {"Yopf;", "𝕐"}, + {""}, +#line 1190 "HTMLCharacterReference.gperf" + {"homtht;", "∻"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 848 "HTMLCharacterReference.gperf" + {"caps;", "∩︀"}, +#line 2158 "HTMLCharacterReference.gperf" + {"varpi;", "ϖ"}, +#line 847 "HTMLCharacterReference.gperf" + {"capdot;", "⩀"}, + {""}, + {""}, + {""}, + {""}, +#line 615 "HTMLCharacterReference.gperf" + {"Verbar;", "‖"}, + {""}, +#line 415 "HTMLCharacterReference.gperf" + {"Ofr;", "𝔒"}, + {""}, + {""}, + {""}, + {""}, +#line 683 "HTMLCharacterReference.gperf" + {"andslope;", "⩘"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1571 "HTMLCharacterReference.gperf" + {"nrArr;", "⇏"}, + {""}, + {""}, + {""}, + {""}, +#line 1902 "HTMLCharacterReference.gperf" + {"searr;", "↘"}, +#line 1410 "HTMLCharacterReference.gperf" + {"lstrok;", "ł"}, +#line 2023 "HTMLCharacterReference.gperf" + {"supplus;", "⫀"}, + {""}, +#line 320 "HTMLCharacterReference.gperf" + {"Lopf;", "𝕃"}, +#line 1909 "HTMLCharacterReference.gperf" + {"setmn;", "∖"}, + {""}, + {""}, + {""}, + {""}, +#line 1631 "HTMLCharacterReference.gperf" + {"nwArr;", "⇖"}, + {""}, #line 1875 "HTMLCharacterReference.gperf" - {"rtrie;", "⊵"}, -#line 1518 "HTMLCharacterReference.gperf" - {"nges;", "⩾̸"}, - {""}, - {""}, + {"rtri;", "▹"}, +#line 1866 "HTMLCharacterReference.gperf" + {"rrarr;", "⇉"}, +#line 50 "HTMLCharacterReference.gperf" + {"Barv;", "⫧"}, +#line 887 "HTMLCharacterReference.gperf" + {"colon;", ":"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 551 "HTMLCharacterReference.gperf" + {"Tab;", "\t"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1301 "HTMLCharacterReference.gperf" + {"latail;", "⤙"}, + {""}, +#line 1807 "HTMLCharacterReference.gperf" + {"rbarr;", "⤍"}, +#line 1768 "HTMLCharacterReference.gperf" + {"qopf;", "𝕢"}, + {""}, + {""}, +#line 164 "HTMLCharacterReference.gperf" + {"Element;", "∈"}, + {""}, + {""}, + {""}, +#line 1971 "HTMLCharacterReference.gperf" + {"sstarf;", "⋆"}, + {""}, + {""}, + {""}, + {""}, +#line 997 "HTMLCharacterReference.gperf" + {"dstrok;", "đ"}, + {""}, + {""}, + {""}, + {""}, +#line 1197 "HTMLCharacterReference.gperf" + {"hstrok;", "ħ"}, + {""}, + {""}, +#line 835 "HTMLCharacterReference.gperf" + {"bull;", "•"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 333 "HTMLCharacterReference.gperf" + {"Mopf;", "𝕄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1351 "HTMLCharacterReference.gperf" + {"lfloor;", "⌊"}, + {""}, +#line 340 "HTMLCharacterReference.gperf" + {"Ncy;", "Н"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2069 "HTMLCharacterReference.gperf" + {"topbot;", "⌶"}, + {""}, + {""}, + {""}, +#line 1031 "HTMLCharacterReference.gperf" + {"emacr;", "ē"}, +#line 1052 "HTMLCharacterReference.gperf" + {"eqslantless;", "⪕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 292 "HTMLCharacterReference.gperf" + {"LeftTeeVector;", "⥚"}, +#line 805 "HTMLCharacterReference.gperf" + {"boxh;", "─"}, +#line 676 "HTMLCharacterReference.gperf" + {"amacr;", "ā"}, +#line 1837 "HTMLCharacterReference.gperf" + {"rho;", "ρ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1072 "HTMLCharacterReference.gperf" + {"exponentiale;", "ⅇ"}, + {""}, + {""}, +#line 582 "HTMLCharacterReference.gperf" + {"Umacr;", "Ū"}, + {""}, + {""}, +#line 2155 "HTMLCharacterReference.gperf" + {"varkappa;", "ϰ"}, + {""}, + {""}, +#line 1418 "HTMLCharacterReference.gperf" + {"ltlarr;", "⥶"}, + {""}, + {""}, + {""}, + {""}, +#line 1199 "HTMLCharacterReference.gperf" + {"hyphen;", "‐"}, + {""}, + {""}, + {""}, +#line 2229 "HTMLCharacterReference.gperf" + {"ycirc;", "ŷ"}, +#line 1284 "HTMLCharacterReference.gperf" + {"lambda;", "λ"}, + {""}, + {""}, + {""}, + {""}, +#line 942 "HTMLCharacterReference.gperf" + {"dagger;", "†"}, + {""}, + {""}, +#line 272 "HTMLCharacterReference.gperf" + {"Lang;", "⟪"}, #line 461 "HTMLCharacterReference.gperf" - {"REG", "®"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"RBarr;", "⤐"}, + {""}, + {""}, +#line 834 "HTMLCharacterReference.gperf" + {"bsolhsub;", "⟈"}, +#line 225 "HTMLCharacterReference.gperf" + {"IOcy;", "Ё"}, +#line 2218 "HTMLCharacterReference.gperf" + {"xrArr;", "⟹"}, +#line 748 "HTMLCharacterReference.gperf" + {"bigcap;", "⋂"}, + {""}, +#line 31 "HTMLCharacterReference.gperf" + {"Acy;", "А"}, +#line 117 "HTMLCharacterReference.gperf" + {"Dopf;", "𝔻"}, + {""}, + {""}, + {""}, +#line 1857 "HTMLCharacterReference.gperf" + {"roarr;", "⇾"}, + {""}, + {""}, + {""}, + {""}, +#line 1320 "HTMLCharacterReference.gperf" + {"ldrushar;", "⥋"}, +#line 91 "HTMLCharacterReference.gperf" + {"Coproduct;", "∐"}, +#line 1347 "HTMLCharacterReference.gperf" + {"lesseqqgtr;", "⪋"}, +#line 1965 "HTMLCharacterReference.gperf" + {"squarf;", "▪"}, + {""}, + {""}, + {""}, +#line 559 "HTMLCharacterReference.gperf" + {"ThickSpace;", "  "}, +#line 1249 "HTMLCharacterReference.gperf" + {"isinsv;", "⋳"}, + {""}, +#line 449 "HTMLCharacterReference.gperf" + {"PrecedesTilde;", "≾"}, + {""}, + {""}, +#line 974 "HTMLCharacterReference.gperf" + {"divonx;", "⋇"}, + {""}, +#line 2131 "HTMLCharacterReference.gperf" + {"upsi;", "υ"}, +#line 2045 "HTMLCharacterReference.gperf" + {"tdot;", "⃛"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1523 "HTMLCharacterReference.gperf" + {"nhArr;", "⇎"}, +#line 846 "HTMLCharacterReference.gperf" + {"capcup;", "⩇"}, + {""}, + {""}, +#line 1171 "HTMLCharacterReference.gperf" + {"gvnE;", "≩︀"}, + {""}, +#line 916 "HTMLCharacterReference.gperf" + {"cularr;", "↶"}, + {""}, + {""}, +#line 1427 "HTMLCharacterReference.gperf" + {"lvnE;", "≨︀"}, + {""}, +#line 380 "HTMLCharacterReference.gperf" + {"NotPrecedes;", "⊀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1234 "HTMLCharacterReference.gperf" + {"intercal;", "⊺"}, +#line 255 "HTMLCharacterReference.gperf" + {"Jopf;", "𝕁"}, + {""}, + {""}, + {""}, +#line 1429 "HTMLCharacterReference.gperf" + {"macr", "¯"}, +#line 1430 "HTMLCharacterReference.gperf" + {"macr;", "¯"}, + {""}, +#line 220 "HTMLCharacterReference.gperf" + {"Hstrok;", "Ħ"}, + {""}, +#line 1876 "HTMLCharacterReference.gperf" + {"rtrie;", "⊵"}, +#line 1519 "HTMLCharacterReference.gperf" + {"nges;", "⩾̸"}, + {""}, + {""}, #line 462 "HTMLCharacterReference.gperf" - {"REG;", "®"}, -#line 632 "HTMLCharacterReference.gperf" - {"Xopf;", "𝕏"}, - {""}, - {""}, - {""}, -#line 1672 "HTMLCharacterReference.gperf" - {"or;", "∨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1810 "HTMLCharacterReference.gperf" - {"rbrke;", "⦌"}, -#line 1191 "HTMLCharacterReference.gperf" - {"hookrightarrow;", "↪"}, - {""}, -#line 2187 "HTMLCharacterReference.gperf" - {"vsupnE;", "⫌︀"}, - {""}, - {""}, - {""}, -#line 935 "HTMLCharacterReference.gperf" - {"cuwed;", "⋏"}, - {""}, -#line 1344 "HTMLCharacterReference.gperf" - {"lessdot;", "⋖"}, -#line 446 "HTMLCharacterReference.gperf" - {"PrecedesEqual;", "⪯"}, - {""}, - {""}, -#line 2152 "HTMLCharacterReference.gperf" - {"vangrt;", "⦜"}, - {""}, - {""}, - {""}, - {""}, -#line 1832 "HTMLCharacterReference.gperf" - {"rfr;", "𝔯"}, - {""}, - {""}, -#line 1684 "HTMLCharacterReference.gperf" - {"orv;", "⩛"}, - {""}, -#line 758 "HTMLCharacterReference.gperf" - {"bigvee;", "⋁"}, -#line 1505 "HTMLCharacterReference.gperf" - {"nearrow;", "↗"}, -#line 2142 "HTMLCharacterReference.gperf" - {"utri;", "▵"}, - {""}, - {""}, - {""}, -#line 2145 "HTMLCharacterReference.gperf" - {"uuml", "ü"}, -#line 2146 "HTMLCharacterReference.gperf" - {"uuml;", "ü"}, -#line 521 "HTMLCharacterReference.gperf" - {"Sopf;", "𝕊"}, -#line 1682 "HTMLCharacterReference.gperf" - {"oror;", "⩖"}, -#line 1566 "HTMLCharacterReference.gperf" - {"nprcue;", "⋠"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1780 "HTMLCharacterReference.gperf" - {"rHar;", "⥤"}, - {""}, - {""}, - {""}, -#line 874 "HTMLCharacterReference.gperf" - {"circlearrowright;", "↻"}, - {""}, - {""}, -#line 2089 "HTMLCharacterReference.gperf" - {"tscr;", "𝓉"}, - {""}, - {""}, - {""}, -#line 876 "HTMLCharacterReference.gperf" - {"circledS;", "Ⓢ"}, -#line 1391 "HTMLCharacterReference.gperf" - {"lozf;", "⧫"}, -#line 1669 "HTMLCharacterReference.gperf" - {"opar;", "⦷"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 324 "HTMLCharacterReference.gperf" - {"Lstrok;", "Ł"}, -#line 1773 "HTMLCharacterReference.gperf" - {"questeq;", "≟"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1026 "HTMLCharacterReference.gperf" - {"elinters;", "⏧"}, -#line 2212 "HTMLCharacterReference.gperf" - {"xnis;", "⋻"}, -#line 1379 "HTMLCharacterReference.gperf" - {"longmapsto;", "⟼"}, - {""}, - {""}, - {""}, -#line 2144 "HTMLCharacterReference.gperf" - {"uuarr;", "⇈"}, -#line 1218 "HTMLCharacterReference.gperf" - {"imacr;", "ī"}, - {""}, -#line 297 "HTMLCharacterReference.gperf" - {"LeftUpVector;", "↿"}, - {""}, -#line 244 "HTMLCharacterReference.gperf" - {"Iopf;", "𝕀"}, -#line 260 "HTMLCharacterReference.gperf" - {"Kappa;", "Κ"}, - {""}, - {""}, -#line 1122 "HTMLCharacterReference.gperf" - {"gel;", "⋛"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2014 "HTMLCharacterReference.gperf" - {"supe;", "⊇"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2206 "HTMLCharacterReference.gperf" - {"xhArr;", "⟺"}, -#line 1969 "HTMLCharacterReference.gperf" - {"ssmile;", "⌣"}, - {""}, - {""}, -#line 1547 "HTMLCharacterReference.gperf" - {"nopf;", "𝕟"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"REG", "®"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 463 "HTMLCharacterReference.gperf" + {"REG;", "®"}, +#line 633 "HTMLCharacterReference.gperf" + {"Xopf;", "𝕏"}, + {""}, + {""}, + {""}, #line 1673 "HTMLCharacterReference.gperf" - {"orarr;", "↻"}, - {""}, - {""}, -#line 1693 "HTMLCharacterReference.gperf" - {"ouml", "ö"}, + {"or;", "∨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1811 "HTMLCharacterReference.gperf" + {"rbrke;", "⦌"}, +#line 1192 "HTMLCharacterReference.gperf" + {"hookrightarrow;", "↪"}, + {""}, +#line 2188 "HTMLCharacterReference.gperf" + {"vsupnE;", "⫌︀"}, + {""}, + {""}, + {""}, +#line 936 "HTMLCharacterReference.gperf" + {"cuwed;", "⋏"}, + {""}, +#line 1345 "HTMLCharacterReference.gperf" + {"lessdot;", "⋖"}, +#line 447 "HTMLCharacterReference.gperf" + {"PrecedesEqual;", "⪯"}, + {""}, + {""}, +#line 2153 "HTMLCharacterReference.gperf" + {"vangrt;", "⦜"}, + {""}, + {""}, + {""}, + {""}, +#line 1833 "HTMLCharacterReference.gperf" + {"rfr;", "𝔯"}, + {""}, + {""}, +#line 1685 "HTMLCharacterReference.gperf" + {"orv;", "⩛"}, + {""}, +#line 759 "HTMLCharacterReference.gperf" + {"bigvee;", "⋁"}, +#line 1506 "HTMLCharacterReference.gperf" + {"nearrow;", "↗"}, +#line 2143 "HTMLCharacterReference.gperf" + {"utri;", "▵"}, + {""}, + {""}, + {""}, +#line 2146 "HTMLCharacterReference.gperf" + {"uuml", "ü"}, +#line 2147 "HTMLCharacterReference.gperf" + {"uuml;", "ü"}, +#line 522 "HTMLCharacterReference.gperf" + {"Sopf;", "𝕊"}, +#line 1683 "HTMLCharacterReference.gperf" + {"oror;", "⩖"}, +#line 1567 "HTMLCharacterReference.gperf" + {"nprcue;", "⋠"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1781 "HTMLCharacterReference.gperf" + {"rHar;", "⥤"}, + {""}, + {""}, + {""}, +#line 875 "HTMLCharacterReference.gperf" + {"circlearrowright;", "↻"}, + {""}, + {""}, +#line 2090 "HTMLCharacterReference.gperf" + {"tscr;", "𝓉"}, + {""}, + {""}, + {""}, +#line 877 "HTMLCharacterReference.gperf" + {"circledS;", "Ⓢ"}, +#line 1392 "HTMLCharacterReference.gperf" + {"lozf;", "⧫"}, +#line 1670 "HTMLCharacterReference.gperf" + {"opar;", "⦷"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 325 "HTMLCharacterReference.gperf" + {"Lstrok;", "Ł"}, +#line 1774 "HTMLCharacterReference.gperf" + {"questeq;", "≟"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1027 "HTMLCharacterReference.gperf" + {"elinters;", "⏧"}, +#line 2213 "HTMLCharacterReference.gperf" + {"xnis;", "⋻"}, +#line 1380 "HTMLCharacterReference.gperf" + {"longmapsto;", "⟼"}, + {""}, + {""}, + {""}, +#line 2145 "HTMLCharacterReference.gperf" + {"uuarr;", "⇈"}, +#line 1219 "HTMLCharacterReference.gperf" + {"imacr;", "ī"}, + {""}, +#line 298 "HTMLCharacterReference.gperf" + {"LeftUpVector;", "↿"}, + {""}, +#line 245 "HTMLCharacterReference.gperf" + {"Iopf;", "𝕀"}, +#line 261 "HTMLCharacterReference.gperf" + {"Kappa;", "Κ"}, + {""}, + {""}, +#line 1123 "HTMLCharacterReference.gperf" + {"gel;", "⋛"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2015 "HTMLCharacterReference.gperf" + {"supe;", "⊇"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2207 "HTMLCharacterReference.gperf" + {"xhArr;", "⟺"}, +#line 1970 "HTMLCharacterReference.gperf" + {"ssmile;", "⌣"}, + {""}, + {""}, +#line 1548 "HTMLCharacterReference.gperf" + {"nopf;", "𝕟"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1674 "HTMLCharacterReference.gperf" + {"orarr;", "↻"}, + {""}, + {""}, #line 1694 "HTMLCharacterReference.gperf" - {"ouml;", "ö"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ouml", "ö"}, +#line 1695 "HTMLCharacterReference.gperf" + {"ouml;", "ö"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1270 "HTMLCharacterReference.gperf" + {"khcy;", "х"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 520 "HTMLCharacterReference.gperf" + {"Sigma;", "Σ"}, + {""}, +#line 2086 "HTMLCharacterReference.gperf" + {"triplus;", "⨹"}, +#line 1469 "HTMLCharacterReference.gperf" + {"nGt;", "≫⃒"}, +#line 2228 "HTMLCharacterReference.gperf" + {"yacy;", "я"}, + {""}, +#line 2055 "HTMLCharacterReference.gperf" + {"thinsp;", " "}, + {""}, + {""}, +#line 654 "HTMLCharacterReference.gperf" + {"Zopf;", "ℤ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1071 "HTMLCharacterReference.gperf" + {"expectation;", "ℰ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1689 "HTMLCharacterReference.gperf" + {"osol;", "⊘"}, + {""}, + {""}, + {""}, +#line 987 "HTMLCharacterReference.gperf" + {"downarrow;", "↓"}, + {""}, + {""}, + {""}, +#line 555 "HTMLCharacterReference.gperf" + {"Tcy;", "Т"}, + {""}, +#line 948 "HTMLCharacterReference.gperf" + {"dblac;", "˝"}, +#line 1110 "HTMLCharacterReference.gperf" + {"frown;", "⌢"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 235 "HTMLCharacterReference.gperf" + {"Im;", "ℑ"}, +#line 1859 "HTMLCharacterReference.gperf" + {"ropar;", "⦆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 271 "HTMLCharacterReference.gperf" + {"Lambda;", "Λ"}, + {""}, +#line 438 "HTMLCharacterReference.gperf" + {"Pcy;", "П"}, + {""}, +#line 1344 "HTMLCharacterReference.gperf" + {"lessapprox;", "⪅"}, + {""}, + {""}, +#line 1636 "HTMLCharacterReference.gperf" + {"oS;", "Ⓢ"}, + {""}, + {""}, + {""}, + {""}, +#line 2242 "HTMLCharacterReference.gperf" + {"zcy;", "з"}, +#line 1657 "HTMLCharacterReference.gperf" + {"ohm;", "Ω"}, +#line 821 "HTMLCharacterReference.gperf" + {"boxvh;", "┼"}, +#line 150 "HTMLCharacterReference.gperf" + {"Dstrok;", "Đ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2115 "HTMLCharacterReference.gperf" + {"uharr;", "↾"}, + {""}, +#line 2042 "HTMLCharacterReference.gperf" + {"tcaron;", "ť"}, + {""}, +#line 886 "HTMLCharacterReference.gperf" + {"clubsuit;", "♣"}, + {""}, + {""}, +#line 1307 "HTMLCharacterReference.gperf" + {"lbrack;", "["}, + {""}, + {""}, +#line 500 "HTMLCharacterReference.gperf" + {"Ropf;", "ℝ"}, + {""}, +#line 1459 "HTMLCharacterReference.gperf" + {"mnplus;", "∓"}, + {""}, +#line 2040 "HTMLCharacterReference.gperf" + {"tau;", "τ"}, + {""}, + {""}, +#line 578 "HTMLCharacterReference.gperf" + {"Udblac;", "Ű"}, + {""}, + {""}, +#line 1481 "HTMLCharacterReference.gperf" + {"nang;", "∠⃒"}, + {""}, + {""}, + {""}, + {""}, +#line 169 "HTMLCharacterReference.gperf" + {"Eopf;", "𝔼"}, +#line 2205 "HTMLCharacterReference.gperf" + {"xdtri;", "▽"}, + {""}, + {""}, +#line 62 "HTMLCharacterReference.gperf" + {"COPY", "©"}, +#line 63 "HTMLCharacterReference.gperf" + {"COPY;", "©"}, + {""}, +#line 836 "HTMLCharacterReference.gperf" + {"bullet;", "•"}, + {""}, + {""}, +#line 2215 "HTMLCharacterReference.gperf" + {"xopf;", "𝕩"}, + {""}, #line 1269 "HTMLCharacterReference.gperf" - {"khcy;", "х"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 519 "HTMLCharacterReference.gperf" - {"Sigma;", "Σ"}, - {""}, -#line 2085 "HTMLCharacterReference.gperf" - {"triplus;", "⨹"}, + {"kgreen;", "ĸ"}, +#line 1824 "HTMLCharacterReference.gperf" + {"real;", "ℜ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1140 "HTMLCharacterReference.gperf" + {"glE;", "⪒"}, + {""}, + {""}, + {""}, + {""}, +#line 1917 "HTMLCharacterReference.gperf" + {"shortparallel;", "∥"}, +#line 201 "HTMLCharacterReference.gperf" + {"Gopf;", "𝔾"}, +#line 1503 "HTMLCharacterReference.gperf" + {"neArr;", "⇗"}, + {""}, +#line 2111 "HTMLCharacterReference.gperf" + {"ufr;", "𝔲"}, #line 1468 "HTMLCharacterReference.gperf" - {"nGt;", "≫⃒"}, -#line 2227 "HTMLCharacterReference.gperf" - {"yacy;", "я"}, - {""}, -#line 2054 "HTMLCharacterReference.gperf" - {"thinsp;", " "}, - {""}, - {""}, -#line 653 "HTMLCharacterReference.gperf" - {"Zopf;", "ℤ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1070 "HTMLCharacterReference.gperf" - {"expectation;", "ℰ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1688 "HTMLCharacterReference.gperf" - {"osol;", "⊘"}, - {""}, - {""}, - {""}, -#line 986 "HTMLCharacterReference.gperf" - {"downarrow;", "↓"}, - {""}, - {""}, - {""}, -#line 554 "HTMLCharacterReference.gperf" - {"Tcy;", "Т"}, - {""}, -#line 947 "HTMLCharacterReference.gperf" - {"dblac;", "˝"}, -#line 1109 "HTMLCharacterReference.gperf" - {"frown;", "⌢"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 234 "HTMLCharacterReference.gperf" - {"Im;", "ℑ"}, -#line 1858 "HTMLCharacterReference.gperf" - {"ropar;", "⦆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 270 "HTMLCharacterReference.gperf" - {"Lambda;", "Λ"}, - {""}, -#line 437 "HTMLCharacterReference.gperf" - {"Pcy;", "П"}, - {""}, -#line 1343 "HTMLCharacterReference.gperf" - {"lessapprox;", "⪅"}, - {""}, - {""}, -#line 1635 "HTMLCharacterReference.gperf" - {"oS;", "Ⓢ"}, - {""}, - {""}, - {""}, - {""}, -#line 2241 "HTMLCharacterReference.gperf" - {"zcy;", "з"}, -#line 1656 "HTMLCharacterReference.gperf" - {"ohm;", "Ω"}, -#line 820 "HTMLCharacterReference.gperf" - {"boxvh;", "┼"}, -#line 149 "HTMLCharacterReference.gperf" - {"Dstrok;", "Đ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"nGg;", "⋙̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1286 "HTMLCharacterReference.gperf" + {"langd;", "⦑"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 745 "HTMLCharacterReference.gperf" + {"beth;", "ℶ"}, + {""}, + {""}, + {""}, +#line 2098 "HTMLCharacterReference.gperf" + {"uHar;", "⥣"}, + {""}, + {""}, +#line 102 "HTMLCharacterReference.gperf" + {"Dagger;", "‡"}, +#line 917 "HTMLCharacterReference.gperf" + {"cularrp;", "⤽"}, +#line 611 "HTMLCharacterReference.gperf" + {"Vcy;", "В"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2124 "HTMLCharacterReference.gperf" + {"uogon;", "ų"}, + {""}, + {""}, + {""}, + {""}, #line 2114 "HTMLCharacterReference.gperf" - {"uharr;", "↾"}, - {""}, -#line 2041 "HTMLCharacterReference.gperf" - {"tcaron;", "ť"}, - {""}, -#line 885 "HTMLCharacterReference.gperf" - {"clubsuit;", "♣"}, - {""}, - {""}, -#line 1306 "HTMLCharacterReference.gperf" - {"lbrack;", "["}, - {""}, - {""}, -#line 499 "HTMLCharacterReference.gperf" - {"Ropf;", "ℝ"}, - {""}, -#line 1458 "HTMLCharacterReference.gperf" - {"mnplus;", "∓"}, - {""}, -#line 2039 "HTMLCharacterReference.gperf" - {"tau;", "τ"}, - {""}, - {""}, -#line 577 "HTMLCharacterReference.gperf" - {"Udblac;", "Ű"}, - {""}, - {""}, -#line 1480 "HTMLCharacterReference.gperf" - {"nang;", "∠⃒"}, - {""}, - {""}, - {""}, - {""}, -#line 168 "HTMLCharacterReference.gperf" - {"Eopf;", "𝔼"}, -#line 2204 "HTMLCharacterReference.gperf" - {"xdtri;", "▽"}, - {""}, - {""}, -#line 61 "HTMLCharacterReference.gperf" - {"COPY", "©"}, -#line 62 "HTMLCharacterReference.gperf" - {"COPY;", "©"}, - {""}, -#line 835 "HTMLCharacterReference.gperf" - {"bullet;", "•"}, - {""}, - {""}, -#line 2214 "HTMLCharacterReference.gperf" - {"xopf;", "𝕩"}, - {""}, -#line 1268 "HTMLCharacterReference.gperf" - {"kgreen;", "ĸ"}, -#line 1823 "HTMLCharacterReference.gperf" - {"real;", "ℜ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1139 "HTMLCharacterReference.gperf" - {"glE;", "⪒"}, - {""}, - {""}, - {""}, - {""}, -#line 1916 "HTMLCharacterReference.gperf" - {"shortparallel;", "∥"}, -#line 200 "HTMLCharacterReference.gperf" - {"Gopf;", "𝔾"}, -#line 1502 "HTMLCharacterReference.gperf" - {"neArr;", "⇗"}, - {""}, -#line 2110 "HTMLCharacterReference.gperf" - {"ufr;", "𝔲"}, -#line 1467 "HTMLCharacterReference.gperf" - {"nGg;", "⋙̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1285 "HTMLCharacterReference.gperf" - {"langd;", "⦑"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 744 "HTMLCharacterReference.gperf" - {"beth;", "ℶ"}, - {""}, - {""}, - {""}, -#line 2097 "HTMLCharacterReference.gperf" - {"uHar;", "⥣"}, - {""}, - {""}, -#line 101 "HTMLCharacterReference.gperf" - {"Dagger;", "‡"}, -#line 916 "HTMLCharacterReference.gperf" - {"cularrp;", "⤽"}, -#line 610 "HTMLCharacterReference.gperf" - {"Vcy;", "В"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2123 "HTMLCharacterReference.gperf" - {"uogon;", "ų"}, - {""}, - {""}, - {""}, - {""}, -#line 2113 "HTMLCharacterReference.gperf" - {"uharl;", "↿"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1447 "HTMLCharacterReference.gperf" - {"mid;", "∣"}, -#line 1896 "HTMLCharacterReference.gperf" - {"sdot;", "⋅"}, -#line 70 "HTMLCharacterReference.gperf" - {"Ccirc;", "Ĉ"}, - {""}, - {""}, - {""}, -#line 545 "HTMLCharacterReference.gperf" - {"THORN", "Þ"}, + {"uharl;", "↿"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1448 "HTMLCharacterReference.gperf" + {"mid;", "∣"}, +#line 1897 "HTMLCharacterReference.gperf" + {"sdot;", "⋅"}, +#line 71 "HTMLCharacterReference.gperf" + {"Ccirc;", "Ĉ"}, + {""}, + {""}, + {""}, #line 546 "HTMLCharacterReference.gperf" - {"THORN;", "Þ"}, -#line 1439 "HTMLCharacterReference.gperf" - {"mcomma;", "⨩"}, - {""}, - {""}, -#line 559 "HTMLCharacterReference.gperf" - {"ThinSpace;", " "}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 572 "HTMLCharacterReference.gperf" - {"Ubrcy;", "Ў"}, - {""}, - {""}, -#line 1650 "HTMLCharacterReference.gperf" - {"ofr;", "𝔬"}, - {""}, -#line 1551 "HTMLCharacterReference.gperf" - {"notinE;", "⋹̸"}, - {""}, - {""}, -#line 2090 "HTMLCharacterReference.gperf" - {"tscy;", "ц"}, - {""}, - {""}, - {""}, - {""}, -#line 464 "HTMLCharacterReference.gperf" - {"Rang;", "⟫"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1828 "HTMLCharacterReference.gperf" - {"reg", "®"}, - {""}, - {""}, - {""}, -#line 1457 "HTMLCharacterReference.gperf" - {"mldr;", "…"}, - {""}, + {"THORN", "Þ"}, +#line 547 "HTMLCharacterReference.gperf" + {"THORN;", "Þ"}, +#line 1440 "HTMLCharacterReference.gperf" + {"mcomma;", "⨩"}, + {""}, + {""}, +#line 560 "HTMLCharacterReference.gperf" + {"ThinSpace;", " "}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 573 "HTMLCharacterReference.gperf" + {"Ubrcy;", "Ў"}, + {""}, + {""}, +#line 1651 "HTMLCharacterReference.gperf" + {"ofr;", "𝔬"}, + {""}, +#line 1552 "HTMLCharacterReference.gperf" + {"notinE;", "⋹̸"}, + {""}, + {""}, +#line 2091 "HTMLCharacterReference.gperf" + {"tscy;", "ц"}, + {""}, + {""}, + {""}, + {""}, +#line 465 "HTMLCharacterReference.gperf" + {"Rang;", "⟫"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1829 "HTMLCharacterReference.gperf" - {"reg;", "®"}, - {""}, - {""}, - {""}, -#line 88 "HTMLCharacterReference.gperf" - {"ContourIntegral;", "∮"}, - {""}, - {""}, - {""}, - {""}, -#line 2049 "HTMLCharacterReference.gperf" - {"theta;", "θ"}, - {""}, - {""}, -#line 1854 "HTMLCharacterReference.gperf" - {"rnmid;", "⫮"}, - {""}, -#line 800 "HTMLCharacterReference.gperf" - {"boxdL;", "╕"}, -#line 1670 "HTMLCharacterReference.gperf" - {"operp;", "⦹"}, -#line 697 "HTMLCharacterReference.gperf" - {"angrtvb;", "⊾"}, -#line 2229 "HTMLCharacterReference.gperf" - {"ycy;", "ы"}, - {""}, -#line 1478 "HTMLCharacterReference.gperf" - {"nabla;", "∇"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1963 "HTMLCharacterReference.gperf" - {"square;", "□"}, - {""}, - {""}, -#line 350 "HTMLCharacterReference.gperf" - {"Nopf;", "ℕ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1347 "HTMLCharacterReference.gperf" - {"lessgtr;", "≶"}, - {""}, - {""}, - {""}, -#line 1388 "HTMLCharacterReference.gperf" - {"lowbar;", "_"}, -#line 1390 "HTMLCharacterReference.gperf" - {"lozenge;", "◊"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1625 "HTMLCharacterReference.gperf" - {"nvlt;", "<⃒"}, - {""}, -#line 1286 "HTMLCharacterReference.gperf" - {"langle;", "⟨"}, - {""}, - {""}, -#line 2211 "HTMLCharacterReference.gperf" - {"xmap;", "⟼"}, - {""}, - {""}, -#line 1869 "HTMLCharacterReference.gperf" - {"rsqb;", "]"}, - {""}, -#line 1967 "HTMLCharacterReference.gperf" - {"sscr;", "𝓈"}, - {""}, -#line 938 "HTMLCharacterReference.gperf" - {"cylcty;", "⌭"}, - {""}, -#line 1377 "HTMLCharacterReference.gperf" - {"longleftarrow;", "⟵"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2140 "HTMLCharacterReference.gperf" - {"utdot;", "⋰"}, - {""}, -#line 887 "HTMLCharacterReference.gperf" - {"colone;", "≔"}, - {""}, - {""}, -#line 2083 "HTMLCharacterReference.gperf" - {"trie;", "≜"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 235 "HTMLCharacterReference.gperf" - {"Imacr;", "Ī"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 972 "HTMLCharacterReference.gperf" - {"divideontimes;", "⋇"}, - {""}, -#line 787 "HTMLCharacterReference.gperf" - {"boxHu;", "╧"}, - {""}, -#line 518 "HTMLCharacterReference.gperf" - {"ShortUpArrow;", "↑"}, - {""}, -#line 38 "HTMLCharacterReference.gperf" - {"Aopf;", "𝔸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1826 "HTMLCharacterReference.gperf" - {"reals;", "ℝ"}, - {""}, - {""}, -#line 1175 "HTMLCharacterReference.gperf" - {"hardcy;", "ъ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 429 "HTMLCharacterReference.gperf" - {"Otimes;", "⨷"}, -#line 1837 "HTMLCharacterReference.gperf" - {"rhov;", "ϱ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 796 "HTMLCharacterReference.gperf" - {"boxVh;", "╫"}, - {""}, -#line 292 "HTMLCharacterReference.gperf" - {"LeftTriangle;", "⊲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1674 "HTMLCharacterReference.gperf" - {"ord;", "⩝"}, -#line 676 "HTMLCharacterReference.gperf" - {"amalg;", "⨿"}, - {""}, -#line 1882 "HTMLCharacterReference.gperf" - {"sc;", "≻"}, - {""}, -#line 1679 "HTMLCharacterReference.gperf" - {"ordm", "º"}, + {"reg", "®"}, + {""}, + {""}, + {""}, +#line 1458 "HTMLCharacterReference.gperf" + {"mldr;", "…"}, + {""}, +#line 1830 "HTMLCharacterReference.gperf" + {"reg;", "®"}, + {""}, + {""}, + {""}, +#line 89 "HTMLCharacterReference.gperf" + {"ContourIntegral;", "∮"}, + {""}, + {""}, + {""}, + {""}, +#line 2050 "HTMLCharacterReference.gperf" + {"theta;", "θ"}, + {""}, + {""}, +#line 1855 "HTMLCharacterReference.gperf" + {"rnmid;", "⫮"}, + {""}, +#line 801 "HTMLCharacterReference.gperf" + {"boxdL;", "╕"}, +#line 1671 "HTMLCharacterReference.gperf" + {"operp;", "⦹"}, +#line 698 "HTMLCharacterReference.gperf" + {"angrtvb;", "⊾"}, +#line 2230 "HTMLCharacterReference.gperf" + {"ycy;", "ы"}, + {""}, +#line 1479 "HTMLCharacterReference.gperf" + {"nabla;", "∇"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1964 "HTMLCharacterReference.gperf" + {"square;", "□"}, + {""}, + {""}, +#line 351 "HTMLCharacterReference.gperf" + {"Nopf;", "ℕ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1348 "HTMLCharacterReference.gperf" + {"lessgtr;", "≶"}, + {""}, + {""}, + {""}, +#line 1389 "HTMLCharacterReference.gperf" + {"lowbar;", "_"}, +#line 1391 "HTMLCharacterReference.gperf" + {"lozenge;", "◊"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1626 "HTMLCharacterReference.gperf" + {"nvlt;", "<⃒"}, + {""}, +#line 1287 "HTMLCharacterReference.gperf" + {"langle;", "⟨"}, + {""}, + {""}, +#line 2212 "HTMLCharacterReference.gperf" + {"xmap;", "⟼"}, + {""}, + {""}, +#line 1870 "HTMLCharacterReference.gperf" + {"rsqb;", "]"}, + {""}, +#line 1968 "HTMLCharacterReference.gperf" + {"sscr;", "𝓈"}, + {""}, +#line 939 "HTMLCharacterReference.gperf" + {"cylcty;", "⌭"}, + {""}, +#line 1378 "HTMLCharacterReference.gperf" + {"longleftarrow;", "⟵"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2141 "HTMLCharacterReference.gperf" + {"utdot;", "⋰"}, + {""}, +#line 888 "HTMLCharacterReference.gperf" + {"colone;", "≔"}, + {""}, + {""}, +#line 2084 "HTMLCharacterReference.gperf" + {"trie;", "≜"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 236 "HTMLCharacterReference.gperf" + {"Imacr;", "Ī"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 973 "HTMLCharacterReference.gperf" + {"divideontimes;", "⋇"}, + {""}, +#line 788 "HTMLCharacterReference.gperf" + {"boxHu;", "╧"}, + {""}, +#line 519 "HTMLCharacterReference.gperf" + {"ShortUpArrow;", "↑"}, + {""}, +#line 39 "HTMLCharacterReference.gperf" + {"Aopf;", "𝔸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1827 "HTMLCharacterReference.gperf" + {"reals;", "ℝ"}, + {""}, + {""}, +#line 1176 "HTMLCharacterReference.gperf" + {"hardcy;", "ъ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 430 "HTMLCharacterReference.gperf" + {"Otimes;", "⨷"}, +#line 1838 "HTMLCharacterReference.gperf" + {"rhov;", "ϱ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 797 "HTMLCharacterReference.gperf" + {"boxVh;", "╫"}, + {""}, +#line 293 "HTMLCharacterReference.gperf" + {"LeftTriangle;", "⊲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1675 "HTMLCharacterReference.gperf" + {"ord;", "⩝"}, +#line 677 "HTMLCharacterReference.gperf" + {"amalg;", "⨿"}, + {""}, +#line 1883 "HTMLCharacterReference.gperf" + {"sc;", "≻"}, + {""}, #line 1680 "HTMLCharacterReference.gperf" - {"ordm;", "º"}, - {""}, - {""}, - {""}, - {""}, -#line 1898 "HTMLCharacterReference.gperf" - {"sdote;", "⩦"}, - {""}, - {""}, -#line 106 "HTMLCharacterReference.gperf" - {"Del;", "∇"}, - {""}, - {""}, - {""}, - {""}, -#line 1440 "HTMLCharacterReference.gperf" - {"mcy;", "м"}, - {""}, -#line 807 "HTMLCharacterReference.gperf" - {"boxhd;", "┬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 147 "HTMLCharacterReference.gperf" - {"Downarrow;", "⇓"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1894 "HTMLCharacterReference.gperf" - {"scsim;", "≿"}, - {""}, - {""}, -#line 262 "HTMLCharacterReference.gperf" - {"Kcy;", "К"}, -#line 1994 "HTMLCharacterReference.gperf" - {"succ;", "≻"}, - {""}, - {""}, -#line 294 "HTMLCharacterReference.gperf" - {"LeftTriangleEqual;", "⊴"}, - {""}, - {""}, -#line 364 "HTMLCharacterReference.gperf" - {"NotGreaterSlantEqual;", "⩾̸"}, - {""}, - {""}, - {""}, - {""}, -#line 1812 "HTMLCharacterReference.gperf" - {"rbrkslu;", "⦐"}, -#line 210 "HTMLCharacterReference.gperf" - {"HARDcy;", "Ъ"}, - {""}, -#line 1833 "HTMLCharacterReference.gperf" - {"rhard;", "⇁"}, - {""}, - {""}, -#line 738 "HTMLCharacterReference.gperf" - {"becaus;", "∵"}, - {""}, -#line 1976 "HTMLCharacterReference.gperf" - {"sub;", "⊂"}, - {""}, - {""}, -#line 2132 "HTMLCharacterReference.gperf" - {"upsilon;", "υ"}, - {""}, - {""}, - {""}, -#line 92 "HTMLCharacterReference.gperf" - {"Cross;", "⨯"}, - {""}, - {""}, -#line 2250 "HTMLCharacterReference.gperf" - {"zwj;", "‍"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1363 "HTMLCharacterReference.gperf" - {"lltri;", "◺"}, - {""}, - {""}, - {""}, -#line 361 "HTMLCharacterReference.gperf" - {"NotGreaterFullEqual;", "≧̸"}, - {""}, + {"ordm", "º"}, +#line 1681 "HTMLCharacterReference.gperf" + {"ordm;", "º"}, + {""}, + {""}, + {""}, + {""}, +#line 1899 "HTMLCharacterReference.gperf" + {"sdote;", "⩦"}, + {""}, + {""}, +#line 107 "HTMLCharacterReference.gperf" + {"Del;", "∇"}, + {""}, + {""}, + {""}, + {""}, +#line 1441 "HTMLCharacterReference.gperf" + {"mcy;", "м"}, + {""}, +#line 808 "HTMLCharacterReference.gperf" + {"boxhd;", "┬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 148 "HTMLCharacterReference.gperf" + {"Downarrow;", "⇓"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1895 "HTMLCharacterReference.gperf" + {"scsim;", "≿"}, + {""}, + {""}, +#line 263 "HTMLCharacterReference.gperf" + {"Kcy;", "К"}, +#line 1995 "HTMLCharacterReference.gperf" + {"succ;", "≻"}, + {""}, + {""}, +#line 295 "HTMLCharacterReference.gperf" + {"LeftTriangleEqual;", "⊴"}, + {""}, + {""}, +#line 365 "HTMLCharacterReference.gperf" + {"NotGreaterSlantEqual;", "⩾̸"}, + {""}, + {""}, + {""}, + {""}, +#line 1813 "HTMLCharacterReference.gperf" + {"rbrkslu;", "⦐"}, +#line 211 "HTMLCharacterReference.gperf" + {"HARDcy;", "Ъ"}, + {""}, +#line 1834 "HTMLCharacterReference.gperf" + {"rhard;", "⇁"}, + {""}, + {""}, +#line 739 "HTMLCharacterReference.gperf" + {"becaus;", "∵"}, + {""}, +#line 1977 "HTMLCharacterReference.gperf" + {"sub;", "⊂"}, + {""}, + {""}, +#line 2133 "HTMLCharacterReference.gperf" + {"upsilon;", "υ"}, + {""}, + {""}, + {""}, +#line 93 "HTMLCharacterReference.gperf" + {"Cross;", "⨯"}, + {""}, + {""}, +#line 2251 "HTMLCharacterReference.gperf" + {"zwj;", "‍"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1364 "HTMLCharacterReference.gperf" + {"lltri;", "◺"}, + {""}, + {""}, + {""}, +#line 362 "HTMLCharacterReference.gperf" + {"NotGreaterFullEqual;", "≧̸"}, + {""}, +#line 1886 "HTMLCharacterReference.gperf" + {"scaron;", "š"}, + {""}, +#line 876 "HTMLCharacterReference.gperf" + {"circledR;", "®"}, #line 1885 "HTMLCharacterReference.gperf" - {"scaron;", "š"}, - {""}, -#line 875 "HTMLCharacterReference.gperf" - {"circledR;", "®"}, -#line 1884 "HTMLCharacterReference.gperf" - {"scap;", "⪸"}, -#line 626 "HTMLCharacterReference.gperf" - {"Wedge;", "⋀"}, - {""}, - {""}, -#line 757 "HTMLCharacterReference.gperf" - {"biguplus;", "⨄"}, - {""}, - {""}, -#line 2185 "HTMLCharacterReference.gperf" - {"vsubnE;", "⫋︀"}, - {""}, -#line 1683 "HTMLCharacterReference.gperf" - {"orslope;", "⩗"}, - {""}, -#line 164 "HTMLCharacterReference.gperf" - {"Emacr;", "Ē"}, - {""}, - {""}, -#line 239 "HTMLCharacterReference.gperf" - {"Integral;", "∫"}, -#line 48 "HTMLCharacterReference.gperf" - {"Backslash;", "∖"}, - {""}, - {""}, - {""}, - {""}, -#line 126 "HTMLCharacterReference.gperf" - {"DoubleLongLeftArrow;", "⟸"}, - {""}, - {""}, - {""}, -#line 1472 "HTMLCharacterReference.gperf" - {"nLl;", "⋘̸"}, + {"scap;", "⪸"}, +#line 627 "HTMLCharacterReference.gperf" + {"Wedge;", "⋀"}, + {""}, + {""}, +#line 758 "HTMLCharacterReference.gperf" + {"biguplus;", "⨄"}, + {""}, + {""}, +#line 2186 "HTMLCharacterReference.gperf" + {"vsubnE;", "⫋︀"}, + {""}, +#line 1684 "HTMLCharacterReference.gperf" + {"orslope;", "⩗"}, + {""}, +#line 165 "HTMLCharacterReference.gperf" + {"Emacr;", "Ē"}, + {""}, + {""}, +#line 240 "HTMLCharacterReference.gperf" + {"Integral;", "∫"}, +#line 49 "HTMLCharacterReference.gperf" + {"Backslash;", "∖"}, + {""}, + {""}, + {""}, + {""}, #line 127 "HTMLCharacterReference.gperf" - {"DoubleLongLeftRightArrow;", "⟺"}, -#line 123 "HTMLCharacterReference.gperf" - {"DoubleLeftArrow;", "⇐"}, - {""}, - {""}, -#line 1125 "HTMLCharacterReference.gperf" - {"geqslant;", "⩾"}, - {""}, - {""}, -#line 1113 "HTMLCharacterReference.gperf" - {"gacute;", "ǵ"}, - {""}, -#line 1335 "HTMLCharacterReference.gperf" - {"leqslant;", "⩽"}, -#line 628 "HTMLCharacterReference.gperf" - {"Wopf;", "𝕎"}, - {""}, -#line 1280 "HTMLCharacterReference.gperf" - {"lacute;", "ĺ"}, - {""}, - {""}, - {""}, -#line 1007 "HTMLCharacterReference.gperf" - {"eacute", "é"}, + {"DoubleLongLeftArrow;", "⟸"}, + {""}, + {""}, + {""}, +#line 1473 "HTMLCharacterReference.gperf" + {"nLl;", "⋘̸"}, +#line 128 "HTMLCharacterReference.gperf" + {"DoubleLongLeftRightArrow;", "⟺"}, +#line 124 "HTMLCharacterReference.gperf" + {"DoubleLeftArrow;", "⇐"}, + {""}, + {""}, +#line 1126 "HTMLCharacterReference.gperf" + {"geqslant;", "⩾"}, + {""}, + {""}, +#line 1114 "HTMLCharacterReference.gperf" + {"gacute;", "ǵ"}, + {""}, +#line 1336 "HTMLCharacterReference.gperf" + {"leqslant;", "⩽"}, +#line 629 "HTMLCharacterReference.gperf" + {"Wopf;", "𝕎"}, + {""}, +#line 1281 "HTMLCharacterReference.gperf" + {"lacute;", "ĺ"}, + {""}, + {""}, + {""}, #line 1008 "HTMLCharacterReference.gperf" - {"eacute;", "é"}, - {""}, - {""}, - {""}, - {""}, -#line 840 "HTMLCharacterReference.gperf" - {"cacute;", "ć"}, - {""}, - {""}, - {""}, -#line 655 "HTMLCharacterReference.gperf" - {"aacute", "á"}, + {"eacute", "é"}, +#line 1009 "HTMLCharacterReference.gperf" + {"eacute;", "é"}, + {""}, + {""}, + {""}, + {""}, +#line 841 "HTMLCharacterReference.gperf" + {"cacute;", "ć"}, + {""}, + {""}, + {""}, #line 656 "HTMLCharacterReference.gperf" - {"aacute;", "á"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 568 "HTMLCharacterReference.gperf" - {"Uacute", "Ú"}, + {"aacute", "á"}, +#line 657 "HTMLCharacterReference.gperf" + {"aacute;", "á"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 569 "HTMLCharacterReference.gperf" - {"Uacute;", "Ú"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 424 "HTMLCharacterReference.gperf" - {"Oscr;", "𝒪"}, - {""}, - {""}, - {""}, -#line 936 "HTMLCharacterReference.gperf" - {"cwconint;", "∲"}, - {""}, - {""}, - {""}, - {""}, -#line 722 "HTMLCharacterReference.gperf" - {"awconint;", "∳"}, -#line 345 "HTMLCharacterReference.gperf" - {"NestedLessLess;", "≪"}, -#line 769 "HTMLCharacterReference.gperf" - {"blk14;", "░"}, - {""}, - {""}, -#line 398 "HTMLCharacterReference.gperf" - {"NotTilde;", "≁"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"Uacute", "Ú"}, +#line 570 "HTMLCharacterReference.gperf" + {"Uacute;", "Ú"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 425 "HTMLCharacterReference.gperf" + {"Oscr;", "𝒪"}, + {""}, + {""}, + {""}, +#line 937 "HTMLCharacterReference.gperf" + {"cwconint;", "∲"}, + {""}, + {""}, + {""}, + {""}, +#line 723 "HTMLCharacterReference.gperf" + {"awconint;", "∳"}, +#line 346 "HTMLCharacterReference.gperf" + {"NestedLessLess;", "≪"}, #line 770 "HTMLCharacterReference.gperf" - {"blk34;", "▓"}, - {""}, - {""}, - {""}, -#line 1654 "HTMLCharacterReference.gperf" - {"ogt;", "⧁"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2178 "HTMLCharacterReference.gperf" - {"vltri;", "⊲"}, - {""}, - {""}, - {""}, -#line 564 "HTMLCharacterReference.gperf" - {"Topf;", "𝕋"}, -#line 1950 "HTMLCharacterReference.gperf" - {"sqcap;", "⊓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1736 "HTMLCharacterReference.gperf" - {"pr;", "≺"}, - {""}, - {""}, - {""}, - {""}, -#line 316 "HTMLCharacterReference.gperf" - {"Longleftarrow;", "⟸"}, - {""}, -#line 768 "HTMLCharacterReference.gperf" - {"blk12;", "▒"}, -#line 1029 "HTMLCharacterReference.gperf" - {"elsdot;", "⪗"}, - {""}, - {""}, -#line 1320 "HTMLCharacterReference.gperf" - {"ldsh;", "↲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 888 "HTMLCharacterReference.gperf" - {"coloneq;", "≔"}, - {""}, -#line 443 "HTMLCharacterReference.gperf" - {"Popf;", "ℙ"}, - {""}, - {""}, - {""}, - {""}, -#line 1469 "HTMLCharacterReference.gperf" - {"nGtv;", "≫̸"}, - {""}, - {""}, -#line 911 "HTMLCharacterReference.gperf" - {"cudarrl;", "⤸"}, - {""}, -#line 2248 "HTMLCharacterReference.gperf" - {"zopf;", "𝕫"}, - {""}, -#line 2224 "HTMLCharacterReference.gperf" - {"xwedge;", "⋀"}, - {""}, - {""}, -#line 1873 "HTMLCharacterReference.gperf" - {"rtimes;", "⋊"}, -#line 1651 "HTMLCharacterReference.gperf" - {"ogon;", "˛"}, -#line 1760 "HTMLCharacterReference.gperf" - {"prsim;", "≾"}, - {""}, - {""}, -#line 1270 "HTMLCharacterReference.gperf" - {"kjcy;", "ќ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"blk14;", "░"}, + {""}, + {""}, +#line 399 "HTMLCharacterReference.gperf" + {"NotTilde;", "≁"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 771 "HTMLCharacterReference.gperf" + {"blk34;", "▓"}, + {""}, + {""}, + {""}, +#line 1655 "HTMLCharacterReference.gperf" + {"ogt;", "⧁"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2179 "HTMLCharacterReference.gperf" + {"vltri;", "⊲"}, + {""}, + {""}, + {""}, +#line 565 "HTMLCharacterReference.gperf" + {"Topf;", "𝕋"}, #line 1951 "HTMLCharacterReference.gperf" - {"sqcaps;", "⊓︀"}, - {""}, -#line 1887 "HTMLCharacterReference.gperf" - {"sce;", "⪰"}, -#line 86 "HTMLCharacterReference.gperf" - {"Congruent;", "≡"}, -#line 1427 "HTMLCharacterReference.gperf" - {"mDDot;", "∺"}, - {""}, -#line 761 "HTMLCharacterReference.gperf" - {"blacklozenge;", "⧫"}, -#line 1855 "HTMLCharacterReference.gperf" - {"roang;", "⟭"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1076 "HTMLCharacterReference.gperf" - {"fflig;", "ff"}, - {""}, -#line 1555 "HTMLCharacterReference.gperf" - {"notinvc;", "⋶"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1863 "HTMLCharacterReference.gperf" - {"rpargt;", "⦔"}, -#line 1758 "HTMLCharacterReference.gperf" - {"prop;", "∝"}, - {""}, - {""}, -#line 51 "HTMLCharacterReference.gperf" - {"Bcy;", "Б"}, - {""}, -#line 1881 "HTMLCharacterReference.gperf" - {"sbquo;", "‚"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1738 "HTMLCharacterReference.gperf" - {"prap;", "⪷"}, - {""}, - {""}, - {""}, -#line 634 "HTMLCharacterReference.gperf" - {"YAcy;", "Я"}, - {""}, -#line 2160 "HTMLCharacterReference.gperf" - {"varrho;", "ϱ"}, - {""}, -#line 1903 "HTMLCharacterReference.gperf" - {"sect", "§"}, + {"sqcap;", "⊓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1737 "HTMLCharacterReference.gperf" + {"pr;", "≺"}, + {""}, + {""}, + {""}, + {""}, +#line 317 "HTMLCharacterReference.gperf" + {"Longleftarrow;", "⟸"}, + {""}, +#line 769 "HTMLCharacterReference.gperf" + {"blk12;", "▒"}, +#line 1030 "HTMLCharacterReference.gperf" + {"elsdot;", "⪗"}, + {""}, + {""}, +#line 1321 "HTMLCharacterReference.gperf" + {"ldsh;", "↲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 889 "HTMLCharacterReference.gperf" + {"coloneq;", "≔"}, + {""}, +#line 444 "HTMLCharacterReference.gperf" + {"Popf;", "ℙ"}, + {""}, + {""}, + {""}, + {""}, +#line 1470 "HTMLCharacterReference.gperf" + {"nGtv;", "≫̸"}, + {""}, + {""}, +#line 912 "HTMLCharacterReference.gperf" + {"cudarrl;", "⤸"}, + {""}, +#line 2249 "HTMLCharacterReference.gperf" + {"zopf;", "𝕫"}, + {""}, +#line 2225 "HTMLCharacterReference.gperf" + {"xwedge;", "⋀"}, + {""}, + {""}, +#line 1874 "HTMLCharacterReference.gperf" + {"rtimes;", "⋊"}, +#line 1652 "HTMLCharacterReference.gperf" + {"ogon;", "˛"}, +#line 1761 "HTMLCharacterReference.gperf" + {"prsim;", "≾"}, + {""}, + {""}, +#line 1271 "HTMLCharacterReference.gperf" + {"kjcy;", "ќ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1952 "HTMLCharacterReference.gperf" + {"sqcaps;", "⊓︀"}, + {""}, +#line 1888 "HTMLCharacterReference.gperf" + {"sce;", "⪰"}, +#line 87 "HTMLCharacterReference.gperf" + {"Congruent;", "≡"}, +#line 1428 "HTMLCharacterReference.gperf" + {"mDDot;", "∺"}, + {""}, +#line 762 "HTMLCharacterReference.gperf" + {"blacklozenge;", "⧫"}, +#line 1856 "HTMLCharacterReference.gperf" + {"roang;", "⟭"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1077 "HTMLCharacterReference.gperf" + {"fflig;", "ff"}, + {""}, +#line 1556 "HTMLCharacterReference.gperf" + {"notinvc;", "⋶"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1864 "HTMLCharacterReference.gperf" + {"rpargt;", "⦔"}, +#line 1759 "HTMLCharacterReference.gperf" + {"prop;", "∝"}, + {""}, + {""}, +#line 52 "HTMLCharacterReference.gperf" + {"Bcy;", "Б"}, + {""}, +#line 1882 "HTMLCharacterReference.gperf" + {"sbquo;", "‚"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1739 "HTMLCharacterReference.gperf" + {"prap;", "⪷"}, + {""}, + {""}, + {""}, +#line 635 "HTMLCharacterReference.gperf" + {"YAcy;", "Я"}, + {""}, +#line 2161 "HTMLCharacterReference.gperf" + {"varrho;", "ϱ"}, + {""}, #line 1904 "HTMLCharacterReference.gperf" - {"sect;", "§"}, - {""}, - {""}, -#line 145 "HTMLCharacterReference.gperf" - {"DownTee;", "⊤"}, - {""}, -#line 1914 "HTMLCharacterReference.gperf" - {"shcy;", "ш"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1628 "HTMLCharacterReference.gperf" - {"nvrtrie;", "⊵⃒"}, -#line 538 "HTMLCharacterReference.gperf" - {"SucceedsTilde;", "≿"}, - {""}, -#line 1897 "HTMLCharacterReference.gperf" - {"sdotb;", "⊡"}, -#line 1942 "HTMLCharacterReference.gperf" - {"softcy;", "ь"}, - {""}, - {""}, - {""}, -#line 35 "HTMLCharacterReference.gperf" - {"Amacr;", "Ā"}, -#line 533 "HTMLCharacterReference.gperf" - {"Subset;", "⋐"}, - {""}, - {""}, -#line 622 "HTMLCharacterReference.gperf" - {"Vopf;", "𝕍"}, -#line 1861 "HTMLCharacterReference.gperf" - {"rotimes;", "⨵"}, - {""}, - {""}, - {""}, - {""}, -#line 1811 "HTMLCharacterReference.gperf" - {"rbrksld;", "⦎"}, -#line 1997 "HTMLCharacterReference.gperf" - {"succeq;", "⪰"}, -#line 2018 "HTMLCharacterReference.gperf" - {"suplarr;", "⥻"}, -#line 442 "HTMLCharacterReference.gperf" - {"Poincareplane;", "ℌ"}, -#line 944 "HTMLCharacterReference.gperf" - {"dash;", "‐"}, -#line 1199 "HTMLCharacterReference.gperf" - {"iacute", "í"}, -#line 1200 "HTMLCharacterReference.gperf" - {"iacute;", "í"}, - {""}, - {""}, - {""}, + {"sect", "§"}, +#line 1905 "HTMLCharacterReference.gperf" + {"sect;", "§"}, + {""}, + {""}, +#line 146 "HTMLCharacterReference.gperf" + {"DownTee;", "⊤"}, + {""}, +#line 1915 "HTMLCharacterReference.gperf" + {"shcy;", "ш"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1629 "HTMLCharacterReference.gperf" + {"nvrtrie;", "⊵⃒"}, +#line 539 "HTMLCharacterReference.gperf" + {"SucceedsTilde;", "≿"}, + {""}, +#line 1898 "HTMLCharacterReference.gperf" + {"sdotb;", "⊡"}, +#line 1943 "HTMLCharacterReference.gperf" + {"softcy;", "ь"}, + {""}, + {""}, + {""}, +#line 36 "HTMLCharacterReference.gperf" + {"Amacr;", "Ā"}, +#line 534 "HTMLCharacterReference.gperf" + {"Subset;", "⋐"}, + {""}, + {""}, +#line 623 "HTMLCharacterReference.gperf" + {"Vopf;", "𝕍"}, +#line 1862 "HTMLCharacterReference.gperf" + {"rotimes;", "⨵"}, + {""}, + {""}, + {""}, + {""}, +#line 1812 "HTMLCharacterReference.gperf" + {"rbrksld;", "⦎"}, +#line 1998 "HTMLCharacterReference.gperf" + {"succeq;", "⪰"}, +#line 2019 "HTMLCharacterReference.gperf" + {"suplarr;", "⥻"}, +#line 443 "HTMLCharacterReference.gperf" + {"Poincareplane;", "ℌ"}, #line 945 "HTMLCharacterReference.gperf" - {"dashv;", "⊣"}, - {""}, - {""}, -#line 734 "HTMLCharacterReference.gperf" - {"bbrktbrk;", "⎶"}, - {""}, -#line 1983 "HTMLCharacterReference.gperf" - {"subne;", "⊊"}, -#line 882 "HTMLCharacterReference.gperf" - {"cirmid;", "⫯"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1759 "HTMLCharacterReference.gperf" - {"propto;", "∝"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1531 "HTMLCharacterReference.gperf" - {"nlE;", "≦̸"}, - {""}, -#line 933 "HTMLCharacterReference.gperf" - {"curvearrowright;", "↷"}, - {""}, - {""}, - {""}, - {""}, -#line 637 "HTMLCharacterReference.gperf" - {"Yacute", "Ý"}, -#line 638 "HTMLCharacterReference.gperf" - {"Yacute;", "Ý"}, - {""}, -#line 1608 "HTMLCharacterReference.gperf" - {"ntriangleleft;", "⋪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1958 "HTMLCharacterReference.gperf" - {"sqsup;", "⊐"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 536 "HTMLCharacterReference.gperf" - {"SucceedsEqual;", "⪰"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 269 "HTMLCharacterReference.gperf" - {"Lacute;", "Ĺ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2234 "HTMLCharacterReference.gperf" - {"yopf;", "𝕪"}, - {""}, -#line 1160 "HTMLCharacterReference.gperf" - {"gtlPar;", "⦕"}, -#line 1917 "HTMLCharacterReference.gperf" - {"shy", "­"}, - {""}, - {""}, -#line 1263 "HTMLCharacterReference.gperf" - {"kappa;", "κ"}, - {""}, -#line 1867 "HTMLCharacterReference.gperf" - {"rscr;", "𝓇"}, + {"dash;", "‐"}, +#line 1200 "HTMLCharacterReference.gperf" + {"iacute", "í"}, +#line 1201 "HTMLCharacterReference.gperf" + {"iacute;", "í"}, + {""}, + {""}, + {""}, +#line 946 "HTMLCharacterReference.gperf" + {"dashv;", "⊣"}, + {""}, + {""}, +#line 735 "HTMLCharacterReference.gperf" + {"bbrktbrk;", "⎶"}, + {""}, +#line 1984 "HTMLCharacterReference.gperf" + {"subne;", "⊊"}, +#line 883 "HTMLCharacterReference.gperf" + {"cirmid;", "⫯"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1760 "HTMLCharacterReference.gperf" + {"propto;", "∝"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1532 "HTMLCharacterReference.gperf" + {"nlE;", "≦̸"}, + {""}, +#line 934 "HTMLCharacterReference.gperf" + {"curvearrowright;", "↷"}, + {""}, + {""}, + {""}, + {""}, +#line 638 "HTMLCharacterReference.gperf" + {"Yacute", "Ý"}, +#line 639 "HTMLCharacterReference.gperf" + {"Yacute;", "Ý"}, + {""}, +#line 1609 "HTMLCharacterReference.gperf" + {"ntriangleleft;", "⋪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1959 "HTMLCharacterReference.gperf" + {"sqsup;", "⊐"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 537 "HTMLCharacterReference.gperf" + {"SucceedsEqual;", "⪰"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 270 "HTMLCharacterReference.gperf" + {"Lacute;", "Ĺ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2235 "HTMLCharacterReference.gperf" + {"yopf;", "𝕪"}, + {""}, +#line 1161 "HTMLCharacterReference.gperf" + {"gtlPar;", "⦕"}, #line 1918 "HTMLCharacterReference.gperf" - {"shy;", "­"}, -#line 1327 "HTMLCharacterReference.gperf" - {"leftrightarrow;", "↔"}, + {"shy", "­"}, + {""}, + {""}, +#line 1264 "HTMLCharacterReference.gperf" + {"kappa;", "κ"}, + {""}, +#line 1868 "HTMLCharacterReference.gperf" + {"rscr;", "𝓇"}, +#line 1919 "HTMLCharacterReference.gperf" + {"shy;", "­"}, #line 1328 "HTMLCharacterReference.gperf" - {"leftrightarrows;", "⇆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 666 "HTMLCharacterReference.gperf" - {"aelig", "æ"}, + {"leftrightarrow;", "↔"}, +#line 1329 "HTMLCharacterReference.gperf" + {"leftrightarrows;", "⇆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 667 "HTMLCharacterReference.gperf" - {"aelig;", "æ"}, - {""}, - {""}, - {""}, -#line 1808 "HTMLCharacterReference.gperf" - {"rbrace;", "}"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1168 "HTMLCharacterReference.gperf" - {"gtrsim;", "≳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 977 "HTMLCharacterReference.gperf" - {"dollar;", "$"}, - {""}, -#line 1804 "HTMLCharacterReference.gperf" - {"ratio;", "∶"}, -#line 1740 "HTMLCharacterReference.gperf" - {"pre;", "⪯"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 473 "HTMLCharacterReference.gperf" - {"ReverseUpEquilibrium;", "⥯"}, - {""}, -#line 1554 "HTMLCharacterReference.gperf" - {"notinvb;", "⋷"}, - {""}, -#line 222 "HTMLCharacterReference.gperf" - {"IEcy;", "Е"}, -#line 1982 "HTMLCharacterReference.gperf" - {"subnE;", "⫋"}, -#line 567 "HTMLCharacterReference.gperf" - {"Tstrok;", "Ŧ"}, - {""}, - {""}, -#line 1445 "HTMLCharacterReference.gperf" - {"micro", "µ"}, + {"aelig", "æ"}, +#line 668 "HTMLCharacterReference.gperf" + {"aelig;", "æ"}, + {""}, + {""}, + {""}, +#line 1809 "HTMLCharacterReference.gperf" + {"rbrace;", "}"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1169 "HTMLCharacterReference.gperf" + {"gtrsim;", "≳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 978 "HTMLCharacterReference.gperf" + {"dollar;", "$"}, + {""}, +#line 1805 "HTMLCharacterReference.gperf" + {"ratio;", "∶"}, +#line 1741 "HTMLCharacterReference.gperf" + {"pre;", "⪯"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 474 "HTMLCharacterReference.gperf" + {"ReverseUpEquilibrium;", "⥯"}, + {""}, +#line 1555 "HTMLCharacterReference.gperf" + {"notinvb;", "⋷"}, + {""}, +#line 223 "HTMLCharacterReference.gperf" + {"IEcy;", "Е"}, +#line 1983 "HTMLCharacterReference.gperf" + {"subnE;", "⫋"}, +#line 568 "HTMLCharacterReference.gperf" + {"Tstrok;", "Ŧ"}, + {""}, + {""}, #line 1446 "HTMLCharacterReference.gperf" - {"micro;", "µ"}, - {""}, - {""}, - {""}, -#line 1610 "HTMLCharacterReference.gperf" - {"ntriangleright;", "⋫"}, - {""}, + {"micro", "µ"}, +#line 1447 "HTMLCharacterReference.gperf" + {"micro;", "µ"}, + {""}, + {""}, + {""}, #line 1611 "HTMLCharacterReference.gperf" - {"ntrianglerighteq;", "⋭"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1891 "HTMLCharacterReference.gperf" - {"scnap;", "⪺"}, - {""}, -#line 1791 "HTMLCharacterReference.gperf" - {"rarr;", "→"}, - {""}, - {""}, - {""}, -#line 1448 "HTMLCharacterReference.gperf" - {"midast;", "*"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1456 "HTMLCharacterReference.gperf" - {"mlcp;", "⫛"}, - {""}, -#line 1195 "HTMLCharacterReference.gperf" - {"hslash;", "ℏ"}, - {""}, - {""}, - {""}, -#line 368 "HTMLCharacterReference.gperf" - {"NotLeftTriangle;", "⋪"}, - {""}, - {""}, + {"ntriangleright;", "⋫"}, + {""}, +#line 1612 "HTMLCharacterReference.gperf" + {"ntrianglerighteq;", "⋭"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1892 "HTMLCharacterReference.gperf" + {"scnap;", "⪺"}, + {""}, +#line 1792 "HTMLCharacterReference.gperf" + {"rarr;", "→"}, + {""}, + {""}, + {""}, +#line 1449 "HTMLCharacterReference.gperf" + {"midast;", "*"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1457 "HTMLCharacterReference.gperf" + {"mlcp;", "⫛"}, + {""}, +#line 1196 "HTMLCharacterReference.gperf" + {"hslash;", "ℏ"}, + {""}, + {""}, + {""}, #line 369 "HTMLCharacterReference.gperf" - {"NotLeftTriangleBar;", "⧏̸"}, - {""}, + {"NotLeftTriangle;", "⋪"}, + {""}, + {""}, #line 370 "HTMLCharacterReference.gperf" - {"NotLeftTriangleEqual;", "⋬"}, -#line 1362 "HTMLCharacterReference.gperf" - {"llhard;", "⥫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 300 "HTMLCharacterReference.gperf" - {"LeftVectorBar;", "⥒"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1801 "HTMLCharacterReference.gperf" - {"rarrtl;", "↣"}, -#line 415 "HTMLCharacterReference.gperf" - {"Ograve", "Ò"}, + {"NotLeftTriangleBar;", "⧏̸"}, + {""}, +#line 371 "HTMLCharacterReference.gperf" + {"NotLeftTriangleEqual;", "⋬"}, +#line 1363 "HTMLCharacterReference.gperf" + {"llhard;", "⥫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 301 "HTMLCharacterReference.gperf" + {"LeftVectorBar;", "⥒"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1802 "HTMLCharacterReference.gperf" + {"rarrtl;", "↣"}, #line 416 "HTMLCharacterReference.gperf" - {"Ograve;", "Ò"}, -#line 1329 "HTMLCharacterReference.gperf" - {"leftrightharpoons;", "⇋"}, - {""}, -#line 1709 "HTMLCharacterReference.gperf" - {"pfr;", "𝔭"}, -#line 877 "HTMLCharacterReference.gperf" - {"circledast;", "⊛"}, -#line 1616 "HTMLCharacterReference.gperf" - {"nvDash;", "⊭"}, - {""}, - {""}, -#line 1460 "HTMLCharacterReference.gperf" - {"mopf;", "𝕞"}, - {""}, -#line 328 "HTMLCharacterReference.gperf" - {"MediumSpace;", " "}, -#line 1691 "HTMLCharacterReference.gperf" - {"otimes;", "⊗"}, - {""}, -#line 1527 "HTMLCharacterReference.gperf" - {"nisd;", "⋺"}, - {""}, - {""}, -#line 1984 "HTMLCharacterReference.gperf" - {"subplus;", "⪿"}, -#line 1323 "HTMLCharacterReference.gperf" - {"leftarrowtail;", "↢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1807 "HTMLCharacterReference.gperf" - {"rbbrk;", "❳"}, -#line 264 "HTMLCharacterReference.gperf" - {"Kopf;", "𝕂"}, - {""}, - {""}, - {""}, - {""}, -#line 1813 "HTMLCharacterReference.gperf" - {"rcaron;", "ř"}, -#line 171 "HTMLCharacterReference.gperf" - {"EqualTilde;", "≂"}, - {""}, -#line 739 "HTMLCharacterReference.gperf" - {"because;", "∵"}, - {""}, - {""}, -#line 1609 "HTMLCharacterReference.gperf" - {"ntrianglelefteq;", "⋬"}, - {""}, - {""}, - {""}, - {""}, -#line 2136 "HTMLCharacterReference.gperf" - {"urcrop;", "⌎"}, -#line 1911 "HTMLCharacterReference.gperf" - {"sfrown;", "⌢"}, - {""}, - {""}, - {""}, -#line 1166 "HTMLCharacterReference.gperf" - {"gtreqqless;", "⪌"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 381 "HTMLCharacterReference.gperf" - {"NotPrecedesSlantEqual;", "⋠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2015 "HTMLCharacterReference.gperf" - {"supedot;", "⫄"}, - {""}, -#line 1799 "HTMLCharacterReference.gperf" - {"rarrpl;", "⥅"}, -#line 2134 "HTMLCharacterReference.gperf" - {"urcorn;", "⌝"}, - {""}, - {""}, - {""}, -#line 2233 "HTMLCharacterReference.gperf" - {"yicy;", "ї"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1646 "HTMLCharacterReference.gperf" - {"odot;", "⊙"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2065 "HTMLCharacterReference.gperf" - {"tint;", "∭"}, -#line 1741 "HTMLCharacterReference.gperf" - {"prec;", "≺"}, - {""}, - {""}, - {""}, -#line 2106 "HTMLCharacterReference.gperf" - {"udarr;", "⇅"}, - {""}, -#line 1578 "HTMLCharacterReference.gperf" - {"nsccue;", "⋡"}, -#line 1297 "HTMLCharacterReference.gperf" - {"larrsim;", "⥳"}, - {""}, -#line 1798 "HTMLCharacterReference.gperf" - {"rarrlp;", "↬"}, - {""}, - {""}, -#line 926 "HTMLCharacterReference.gperf" - {"curlyeqprec;", "⋞"}, - {""}, - {""}, - {""}, -#line 508 "HTMLCharacterReference.gperf" - {"Sacute;", "Ś"}, -#line 1761 "HTMLCharacterReference.gperf" - {"prurel;", "⊰"}, -#line 2139 "HTMLCharacterReference.gperf" - {"uscr;", "𝓊"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 348 "HTMLCharacterReference.gperf" - {"NoBreak;", "⁠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1544 "HTMLCharacterReference.gperf" - {"nltri;", "⋪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1960 "HTMLCharacterReference.gperf" - {"sqsupset;", "⊐"}, + {"Ograve", "Ò"}, +#line 417 "HTMLCharacterReference.gperf" + {"Ograve;", "Ò"}, +#line 1330 "HTMLCharacterReference.gperf" + {"leftrightharpoons;", "⇋"}, + {""}, +#line 1710 "HTMLCharacterReference.gperf" + {"pfr;", "𝔭"}, +#line 878 "HTMLCharacterReference.gperf" + {"circledast;", "⊛"}, +#line 1617 "HTMLCharacterReference.gperf" + {"nvDash;", "⊭"}, + {""}, + {""}, +#line 1461 "HTMLCharacterReference.gperf" + {"mopf;", "𝕞"}, + {""}, +#line 329 "HTMLCharacterReference.gperf" + {"MediumSpace;", " "}, #line 1692 "HTMLCharacterReference.gperf" - {"otimesas;", "⨶"}, + {"otimes;", "⊗"}, + {""}, +#line 1528 "HTMLCharacterReference.gperf" + {"nisd;", "⋺"}, + {""}, + {""}, +#line 1985 "HTMLCharacterReference.gperf" + {"subplus;", "⪿"}, +#line 1324 "HTMLCharacterReference.gperf" + {"leftarrowtail;", "↢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1808 "HTMLCharacterReference.gperf" + {"rbbrk;", "❳"}, +#line 265 "HTMLCharacterReference.gperf" + {"Kopf;", "𝕂"}, + {""}, + {""}, + {""}, + {""}, +#line 1814 "HTMLCharacterReference.gperf" + {"rcaron;", "ř"}, +#line 172 "HTMLCharacterReference.gperf" + {"EqualTilde;", "≂"}, + {""}, +#line 740 "HTMLCharacterReference.gperf" + {"because;", "∵"}, + {""}, + {""}, +#line 1610 "HTMLCharacterReference.gperf" + {"ntrianglelefteq;", "⋬"}, + {""}, + {""}, + {""}, + {""}, +#line 2137 "HTMLCharacterReference.gperf" + {"urcrop;", "⌎"}, +#line 1912 "HTMLCharacterReference.gperf" + {"sfrown;", "⌢"}, + {""}, + {""}, + {""}, +#line 1167 "HTMLCharacterReference.gperf" + {"gtreqqless;", "⪌"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 382 "HTMLCharacterReference.gperf" + {"NotPrecedesSlantEqual;", "⋠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2016 "HTMLCharacterReference.gperf" + {"supedot;", "⫄"}, + {""}, +#line 1800 "HTMLCharacterReference.gperf" + {"rarrpl;", "⥅"}, +#line 2135 "HTMLCharacterReference.gperf" + {"urcorn;", "⌝"}, + {""}, + {""}, + {""}, +#line 2234 "HTMLCharacterReference.gperf" + {"yicy;", "ї"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1647 "HTMLCharacterReference.gperf" + {"odot;", "⊙"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2066 "HTMLCharacterReference.gperf" + {"tint;", "∭"}, +#line 1742 "HTMLCharacterReference.gperf" + {"prec;", "≺"}, + {""}, + {""}, + {""}, +#line 2107 "HTMLCharacterReference.gperf" + {"udarr;", "⇅"}, + {""}, +#line 1579 "HTMLCharacterReference.gperf" + {"nsccue;", "⋡"}, +#line 1298 "HTMLCharacterReference.gperf" + {"larrsim;", "⥳"}, + {""}, +#line 1799 "HTMLCharacterReference.gperf" + {"rarrlp;", "↬"}, + {""}, + {""}, +#line 927 "HTMLCharacterReference.gperf" + {"curlyeqprec;", "⋞"}, + {""}, + {""}, + {""}, +#line 509 "HTMLCharacterReference.gperf" + {"Sacute;", "Ś"}, +#line 1762 "HTMLCharacterReference.gperf" + {"prurel;", "⊰"}, +#line 2140 "HTMLCharacterReference.gperf" + {"uscr;", "𝓊"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 349 "HTMLCharacterReference.gperf" + {"NoBreak;", "⁠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1545 "HTMLCharacterReference.gperf" + {"nltri;", "⋪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1961 "HTMLCharacterReference.gperf" - {"sqsupseteq;", "⊒"}, -#line 1713 "HTMLCharacterReference.gperf" - {"phone;", "☎"}, - {""}, -#line 1857 "HTMLCharacterReference.gperf" - {"robrk;", "⟧"}, - {""}, -#line 1638 "HTMLCharacterReference.gperf" - {"oast;", "⊛"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1752 "HTMLCharacterReference.gperf" - {"prnap;", "⪹"}, - {""}, - {""}, - {""}, -#line 225 "HTMLCharacterReference.gperf" - {"Iacute", "Í"}, + {"sqsupset;", "⊐"}, +#line 1693 "HTMLCharacterReference.gperf" + {"otimesas;", "⨶"}, +#line 1962 "HTMLCharacterReference.gperf" + {"sqsupseteq;", "⊒"}, +#line 1714 "HTMLCharacterReference.gperf" + {"phone;", "☎"}, + {""}, +#line 1858 "HTMLCharacterReference.gperf" + {"robrk;", "⟧"}, + {""}, +#line 1639 "HTMLCharacterReference.gperf" + {"oast;", "⊛"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1753 "HTMLCharacterReference.gperf" + {"prnap;", "⪹"}, + {""}, + {""}, + {""}, #line 226 "HTMLCharacterReference.gperf" - {"Iacute;", "Í"}, - {""}, - {""}, -#line 302 "HTMLCharacterReference.gperf" - {"Leftrightarrow;", "⇔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 749 "HTMLCharacterReference.gperf" - {"bigcup;", "⋃"}, - {""}, -#line 1130 "HTMLCharacterReference.gperf" - {"gesdotol;", "⪄"}, - {""}, -#line 103 "HTMLCharacterReference.gperf" - {"Dashv;", "⫤"}, - {""}, -#line 2247 "HTMLCharacterReference.gperf" - {"zigrarr;", "⇝"}, - {""}, -#line 1624 "HTMLCharacterReference.gperf" - {"nvle;", "≤⃒"}, -#line 2074 "HTMLCharacterReference.gperf" - {"trade;", "™"}, -#line 1479 "HTMLCharacterReference.gperf" - {"nacute;", "ń"}, - {""}, -#line 698 "HTMLCharacterReference.gperf" - {"angrtvbd;", "⦝"}, - {""}, - {""}, -#line 726 "HTMLCharacterReference.gperf" - {"backepsilon;", "϶"}, - {""}, -#line 125 "HTMLCharacterReference.gperf" - {"DoubleLeftTee;", "⫤"}, - {""}, - {""}, - {""}, - {""}, -#line 2100 "HTMLCharacterReference.gperf" - {"uarr;", "↑"}, - {""}, -#line 1685 "HTMLCharacterReference.gperf" - {"oscr;", "ℴ"}, - {""}, -#line 927 "HTMLCharacterReference.gperf" - {"curlyeqsucc;", "⋟"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1795 "HTMLCharacterReference.gperf" - {"rarrc;", "⤳"}, -#line 373 "HTMLCharacterReference.gperf" - {"NotLessGreater;", "≸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 879 "HTMLCharacterReference.gperf" - {"circleddash;", "⊝"}, - {""}, - {""}, - {""}, - {""}, -#line 646 "HTMLCharacterReference.gperf" - {"Zacute;", "Ź"}, - {""}, - {""}, - {""}, -#line 956 "HTMLCharacterReference.gperf" - {"delta;", "δ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 296 "HTMLCharacterReference.gperf" - {"LeftUpTeeVector;", "⥠"}, - {""}, - {""}, - {""}, - {""}, -#line 1954 "HTMLCharacterReference.gperf" - {"sqsub;", "⊏"}, - {""}, - {""}, - {""}, - {""}, -#line 298 "HTMLCharacterReference.gperf" - {"LeftUpVectorBar;", "⥘"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 320 "HTMLCharacterReference.gperf" - {"LowerLeftArrow;", "↙"}, - {""}, - {""}, - {""}, -#line 1999 "HTMLCharacterReference.gperf" - {"succneqq;", "⪶"}, -#line 587 "HTMLCharacterReference.gperf" - {"UnionPlus;", "⊎"}, - {""}, - {""}, -#line 1827 "HTMLCharacterReference.gperf" - {"rect;", "▭"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 121 "HTMLCharacterReference.gperf" - {"DoubleDot;", "¨"}, -#line 1224 "HTMLCharacterReference.gperf" - {"imped;", "Ƶ"}, - {""}, -#line 1177 "HTMLCharacterReference.gperf" - {"harrcir;", "⥈"}, - {""}, - {""}, - {""}, - {""}, -#line 1764 "HTMLCharacterReference.gperf" - {"puncsp;", " "}, - {""}, -#line 56 "HTMLCharacterReference.gperf" - {"Bopf;", "𝔹"}, - {""}, - {""}, -#line 951 "HTMLCharacterReference.gperf" - {"ddagger;", "‡"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 266 "HTMLCharacterReference.gperf" - {"LJcy;", "Љ"}, - {""}, - {""}, - {""}, - {""}, -#line 89 "HTMLCharacterReference.gperf" - {"Copf;", "ℂ"}, -#line 1080 "HTMLCharacterReference.gperf" - {"fjlig;", "fj"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1186 "HTMLCharacterReference.gperf" - {"hksearow;", "⤥"}, -#line 353 "HTMLCharacterReference.gperf" - {"NotCupCap;", "≭"}, - {""}, -#line 463 "HTMLCharacterReference.gperf" - {"Racute;", "Ŕ"}, - {""}, - {""}, - {""}, -#line 1707 "HTMLCharacterReference.gperf" - {"perp;", "⊥"}, - {""}, - {""}, -#line 1870 "HTMLCharacterReference.gperf" - {"rsquo;", "’"}, -#line 1871 "HTMLCharacterReference.gperf" - {"rsquor;", "’"}, - {""}, - {""}, - {""}, - {""}, -#line 287 "HTMLCharacterReference.gperf" - {"LeftRightArrow;", "↔"}, -#line 153 "HTMLCharacterReference.gperf" - {"Eacute", "É"}, -#line 154 "HTMLCharacterReference.gperf" - {"Eacute;", "É"}, - {""}, - {""}, - {""}, - {""}, -#line 1675 "HTMLCharacterReference.gperf" - {"order;", "ℴ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1979 "HTMLCharacterReference.gperf" - {"sube;", "⊆"}, - {""}, -#line 1434 "HTMLCharacterReference.gperf" - {"mapsto;", "↦"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2135 "HTMLCharacterReference.gperf" - {"urcorner;", "⌝"}, -#line 1266 "HTMLCharacterReference.gperf" - {"kcy;", "к"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1043 "HTMLCharacterReference.gperf" - {"eplus;", "⩱"}, - {""}, - {""}, -#line 1922 "HTMLCharacterReference.gperf" - {"sim;", "∼"}, - {""}, -#line 741 "HTMLCharacterReference.gperf" - {"bepsi;", "϶"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2069 "HTMLCharacterReference.gperf" - {"topcir;", "⫱"}, - {""}, -#line 1378 "HTMLCharacterReference.gperf" - {"longleftrightarrow;", "⟷"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 701 "HTMLCharacterReference.gperf" - {"angzarr;", "⍼"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 946 "HTMLCharacterReference.gperf" - {"dbkarow;", "⤏"}, -#line 1815 "HTMLCharacterReference.gperf" - {"rceil;", "⌉"}, - {""}, - {""}, -#line 1476 "HTMLCharacterReference.gperf" - {"nVDash;", "⊯"}, - {""}, - {""}, - {""}, -#line 1972 "HTMLCharacterReference.gperf" - {"starf;", "★"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2147 "HTMLCharacterReference.gperf" - {"uwangle;", "⦧"}, - {""}, - {""}, - {""}, -#line 784 "HTMLCharacterReference.gperf" - {"boxHD;", "╦"}, - {""}, -#line 1744 "HTMLCharacterReference.gperf" - {"preceq;", "⪯"}, - {""}, -#line 1928 "HTMLCharacterReference.gperf" - {"siml;", "⪝"}, - {""}, -#line 1649 "HTMLCharacterReference.gperf" - {"ofcir;", "⦿"}, - {""}, -#line 447 "HTMLCharacterReference.gperf" - {"PrecedesSlantEqual;", "≼"}, -#line 81 "HTMLCharacterReference.gperf" - {"ClockwiseContourIntegral;", "∲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 97 "HTMLCharacterReference.gperf" - {"DDotrahd;", "⤑"}, -#line 1482 "HTMLCharacterReference.gperf" - {"napE;", "⩰̸"}, -#line 1217 "HTMLCharacterReference.gperf" - {"ijlig;", "ij"}, - {""}, - {""}, - {""}, -#line 1581 "HTMLCharacterReference.gperf" - {"nshortmid;", "∤"}, - {""}, -#line 878 "HTMLCharacterReference.gperf" - {"circledcirc;", "⊚"}, - {""}, - {""}, - {""}, -#line 806 "HTMLCharacterReference.gperf" - {"boxhU;", "╨"}, - {""}, - {""}, - {""}, + {"Iacute", "Í"}, +#line 227 "HTMLCharacterReference.gperf" + {"Iacute;", "Í"}, + {""}, + {""}, +#line 303 "HTMLCharacterReference.gperf" + {"Leftrightarrow;", "⇔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 750 "HTMLCharacterReference.gperf" + {"bigcup;", "⋃"}, + {""}, +#line 1131 "HTMLCharacterReference.gperf" + {"gesdotol;", "⪄"}, + {""}, +#line 104 "HTMLCharacterReference.gperf" + {"Dashv;", "⫤"}, + {""}, +#line 2248 "HTMLCharacterReference.gperf" + {"zigrarr;", "⇝"}, + {""}, +#line 1625 "HTMLCharacterReference.gperf" + {"nvle;", "≤⃒"}, +#line 2075 "HTMLCharacterReference.gperf" + {"trade;", "™"}, +#line 1480 "HTMLCharacterReference.gperf" + {"nacute;", "ń"}, + {""}, +#line 699 "HTMLCharacterReference.gperf" + {"angrtvbd;", "⦝"}, + {""}, + {""}, +#line 727 "HTMLCharacterReference.gperf" + {"backepsilon;", "϶"}, + {""}, +#line 126 "HTMLCharacterReference.gperf" + {"DoubleLeftTee;", "⫤"}, + {""}, + {""}, + {""}, + {""}, +#line 2101 "HTMLCharacterReference.gperf" + {"uarr;", "↑"}, + {""}, +#line 1686 "HTMLCharacterReference.gperf" + {"oscr;", "ℴ"}, + {""}, +#line 928 "HTMLCharacterReference.gperf" + {"curlyeqsucc;", "⋟"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1796 "HTMLCharacterReference.gperf" + {"rarrc;", "⤳"}, +#line 374 "HTMLCharacterReference.gperf" + {"NotLessGreater;", "≸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 880 "HTMLCharacterReference.gperf" + {"circleddash;", "⊝"}, + {""}, + {""}, + {""}, + {""}, +#line 647 "HTMLCharacterReference.gperf" + {"Zacute;", "Ź"}, + {""}, + {""}, + {""}, +#line 957 "HTMLCharacterReference.gperf" + {"delta;", "δ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 297 "HTMLCharacterReference.gperf" + {"LeftUpTeeVector;", "⥠"}, + {""}, + {""}, + {""}, + {""}, +#line 1955 "HTMLCharacterReference.gperf" + {"sqsub;", "⊏"}, + {""}, + {""}, + {""}, + {""}, +#line 299 "HTMLCharacterReference.gperf" + {"LeftUpVectorBar;", "⥘"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 321 "HTMLCharacterReference.gperf" + {"LowerLeftArrow;", "↙"}, + {""}, + {""}, + {""}, +#line 2000 "HTMLCharacterReference.gperf" + {"succneqq;", "⪶"}, +#line 588 "HTMLCharacterReference.gperf" + {"UnionPlus;", "⊎"}, + {""}, + {""}, +#line 1828 "HTMLCharacterReference.gperf" + {"rect;", "▭"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 122 "HTMLCharacterReference.gperf" + {"DoubleDot;", "¨"}, +#line 1225 "HTMLCharacterReference.gperf" + {"imped;", "Ƶ"}, + {""}, +#line 1178 "HTMLCharacterReference.gperf" + {"harrcir;", "⥈"}, + {""}, + {""}, + {""}, + {""}, +#line 1765 "HTMLCharacterReference.gperf" + {"puncsp;", " "}, + {""}, +#line 57 "HTMLCharacterReference.gperf" + {"Bopf;", "𝔹"}, + {""}, + {""}, +#line 952 "HTMLCharacterReference.gperf" + {"ddagger;", "‡"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 267 "HTMLCharacterReference.gperf" + {"LJcy;", "Љ"}, + {""}, + {""}, + {""}, + {""}, +#line 90 "HTMLCharacterReference.gperf" + {"Copf;", "ℂ"}, +#line 1081 "HTMLCharacterReference.gperf" + {"fjlig;", "fj"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1187 "HTMLCharacterReference.gperf" + {"hksearow;", "⤥"}, +#line 354 "HTMLCharacterReference.gperf" + {"NotCupCap;", "≭"}, + {""}, +#line 464 "HTMLCharacterReference.gperf" + {"Racute;", "Ŕ"}, + {""}, + {""}, + {""}, +#line 1708 "HTMLCharacterReference.gperf" + {"perp;", "⊥"}, + {""}, + {""}, +#line 1871 "HTMLCharacterReference.gperf" + {"rsquo;", "’"}, +#line 1872 "HTMLCharacterReference.gperf" + {"rsquor;", "’"}, + {""}, + {""}, + {""}, + {""}, +#line 288 "HTMLCharacterReference.gperf" + {"LeftRightArrow;", "↔"}, +#line 154 "HTMLCharacterReference.gperf" + {"Eacute", "É"}, +#line 155 "HTMLCharacterReference.gperf" + {"Eacute;", "É"}, + {""}, + {""}, + {""}, + {""}, +#line 1676 "HTMLCharacterReference.gperf" + {"order;", "ℴ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1980 "HTMLCharacterReference.gperf" + {"sube;", "⊆"}, + {""}, +#line 1435 "HTMLCharacterReference.gperf" + {"mapsto;", "↦"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2136 "HTMLCharacterReference.gperf" + {"urcorner;", "⌝"}, +#line 1267 "HTMLCharacterReference.gperf" + {"kcy;", "к"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1044 "HTMLCharacterReference.gperf" + {"eplus;", "⩱"}, + {""}, + {""}, +#line 1923 "HTMLCharacterReference.gperf" + {"sim;", "∼"}, + {""}, +#line 742 "HTMLCharacterReference.gperf" + {"bepsi;", "϶"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2070 "HTMLCharacterReference.gperf" + {"topcir;", "⫱"}, + {""}, +#line 1379 "HTMLCharacterReference.gperf" + {"longleftrightarrow;", "⟷"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 702 "HTMLCharacterReference.gperf" + {"angzarr;", "⍼"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 947 "HTMLCharacterReference.gperf" + {"dbkarow;", "⤏"}, +#line 1816 "HTMLCharacterReference.gperf" + {"rceil;", "⌉"}, + {""}, + {""}, +#line 1477 "HTMLCharacterReference.gperf" + {"nVDash;", "⊯"}, + {""}, + {""}, + {""}, +#line 1973 "HTMLCharacterReference.gperf" + {"starf;", "★"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2148 "HTMLCharacterReference.gperf" + {"uwangle;", "⦧"}, + {""}, + {""}, + {""}, +#line 785 "HTMLCharacterReference.gperf" + {"boxHD;", "╦"}, + {""}, +#line 1745 "HTMLCharacterReference.gperf" + {"preceq;", "⪯"}, + {""}, +#line 1929 "HTMLCharacterReference.gperf" + {"siml;", "⪝"}, + {""}, +#line 1650 "HTMLCharacterReference.gperf" + {"ofcir;", "⦿"}, + {""}, +#line 448 "HTMLCharacterReference.gperf" + {"PrecedesSlantEqual;", "≼"}, +#line 82 "HTMLCharacterReference.gperf" + {"ClockwiseContourIntegral;", "∲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 98 "HTMLCharacterReference.gperf" - {"DJcy;", "Ђ"}, -#line 122 "HTMLCharacterReference.gperf" - {"DoubleDownArrow;", "⇓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2153 "HTMLCharacterReference.gperf" - {"varepsilon;", "ϵ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2168 "HTMLCharacterReference.gperf" - {"vartriangleright;", "⊳"}, - {""}, -#line 1793 "HTMLCharacterReference.gperf" - {"rarrb;", "⇥"}, - {""}, -#line 1933 "HTMLCharacterReference.gperf" - {"slarr;", "←"}, - {""}, -#line 1055 "HTMLCharacterReference.gperf" - {"equivDD;", "⩸"}, - {""}, -#line 2115 "HTMLCharacterReference.gperf" - {"uhblk;", "▀"}, -#line 2102 "HTMLCharacterReference.gperf" - {"ubreve;", "ŭ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1647 "HTMLCharacterReference.gperf" - {"odsold;", "⦼"}, - {""}, - {""}, - {""}, -#line 336 "HTMLCharacterReference.gperf" - {"Nacute;", "Ń"}, - {""}, -#line 1915 "HTMLCharacterReference.gperf" - {"shortmid;", "∣"}, - {""}, - {""}, - {""}, - {""}, -#line 1141 "HTMLCharacterReference.gperf" - {"glj;", "⪤"}, -#line 204 "HTMLCharacterReference.gperf" - {"GreaterGreater;", "⪢"}, -#line 547 "HTMLCharacterReference.gperf" - {"TRADE;", "™"}, -#line 1959 "HTMLCharacterReference.gperf" - {"sqsupe;", "⊒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2111 "HTMLCharacterReference.gperf" - {"ugrave", "ù"}, + {"DDotrahd;", "⤑"}, +#line 1483 "HTMLCharacterReference.gperf" + {"napE;", "⩰̸"}, +#line 1218 "HTMLCharacterReference.gperf" + {"ijlig;", "ij"}, + {""}, + {""}, + {""}, +#line 1582 "HTMLCharacterReference.gperf" + {"nshortmid;", "∤"}, + {""}, +#line 879 "HTMLCharacterReference.gperf" + {"circledcirc;", "⊚"}, + {""}, + {""}, + {""}, +#line 807 "HTMLCharacterReference.gperf" + {"boxhU;", "╨"}, + {""}, + {""}, + {""}, +#line 99 "HTMLCharacterReference.gperf" + {"DJcy;", "Ђ"}, +#line 123 "HTMLCharacterReference.gperf" + {"DoubleDownArrow;", "⇓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2154 "HTMLCharacterReference.gperf" + {"varepsilon;", "ϵ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2169 "HTMLCharacterReference.gperf" + {"vartriangleright;", "⊳"}, + {""}, +#line 1794 "HTMLCharacterReference.gperf" + {"rarrb;", "⇥"}, + {""}, +#line 1934 "HTMLCharacterReference.gperf" + {"slarr;", "←"}, + {""}, +#line 1056 "HTMLCharacterReference.gperf" + {"equivDD;", "⩸"}, + {""}, +#line 2116 "HTMLCharacterReference.gperf" + {"uhblk;", "▀"}, +#line 2103 "HTMLCharacterReference.gperf" + {"ubreve;", "ŭ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1648 "HTMLCharacterReference.gperf" + {"odsold;", "⦼"}, + {""}, + {""}, + {""}, +#line 337 "HTMLCharacterReference.gperf" + {"Nacute;", "Ń"}, + {""}, +#line 1916 "HTMLCharacterReference.gperf" + {"shortmid;", "∣"}, + {""}, + {""}, + {""}, + {""}, +#line 1142 "HTMLCharacterReference.gperf" + {"glj;", "⪤"}, +#line 205 "HTMLCharacterReference.gperf" + {"GreaterGreater;", "⪢"}, +#line 548 "HTMLCharacterReference.gperf" + {"TRADE;", "™"}, +#line 1960 "HTMLCharacterReference.gperf" + {"sqsupe;", "⊒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2112 "HTMLCharacterReference.gperf" - {"ugrave;", "ù"}, - {""}, - {""}, - {""}, - {""}, -#line 2055 "HTMLCharacterReference.gperf" - {"thkap;", "≈"}, - {""}, - {""}, - {""}, -#line 1540 "HTMLCharacterReference.gperf" - {"nles;", "⩽̸"}, -#line 427 "HTMLCharacterReference.gperf" - {"Otilde", "Õ"}, + {"ugrave", "ù"}, +#line 2113 "HTMLCharacterReference.gperf" + {"ugrave;", "ù"}, + {""}, + {""}, + {""}, + {""}, +#line 2056 "HTMLCharacterReference.gperf" + {"thkap;", "≈"}, + {""}, + {""}, + {""}, +#line 1541 "HTMLCharacterReference.gperf" + {"nles;", "⩽̸"}, #line 428 "HTMLCharacterReference.gperf" - {"Otilde;", "Õ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1705 "HTMLCharacterReference.gperf" - {"period;", "."}, - {""}, -#line 2133 "HTMLCharacterReference.gperf" - {"upuparrows;", "⇈"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 25 "HTMLCharacterReference.gperf" - {"Aacute", "Á"}, + {"Otilde", "Õ"}, +#line 429 "HTMLCharacterReference.gperf" + {"Otilde;", "Õ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1706 "HTMLCharacterReference.gperf" + {"period;", "."}, + {""}, +#line 2134 "HTMLCharacterReference.gperf" + {"upuparrows;", "⇈"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 26 "HTMLCharacterReference.gperf" - {"Aacute;", "Á"}, - {""}, -#line 1956 "HTMLCharacterReference.gperf" - {"sqsubset;", "⊏"}, -#line 2003 "HTMLCharacterReference.gperf" - {"sung;", "♪"}, + {"Aacute", "Á"}, +#line 27 "HTMLCharacterReference.gperf" + {"Aacute;", "Á"}, + {""}, #line 1957 "HTMLCharacterReference.gperf" - {"sqsubseteq;", "⊑"}, - {""}, - {""}, - {""}, -#line 1330 "HTMLCharacterReference.gperf" - {"leftrightsquigarrow;", "↭"}, -#line 1889 "HTMLCharacterReference.gperf" - {"scirc;", "ŝ"}, -#line 929 "HTMLCharacterReference.gperf" - {"curlywedge;", "⋏"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1365 "HTMLCharacterReference.gperf" - {"lmoust;", "⎰"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1437 "HTMLCharacterReference.gperf" - {"mapstoup;", "↥"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1763 "HTMLCharacterReference.gperf" - {"psi;", "ψ"}, -#line 84 "HTMLCharacterReference.gperf" - {"Colon;", "∷"}, -#line 303 "HTMLCharacterReference.gperf" - {"LessEqualGreater;", "⋚"}, - {""}, - {""}, - {""}, - {""}, -#line 1652 "HTMLCharacterReference.gperf" - {"ograve", "ò"}, + {"sqsubset;", "⊏"}, +#line 2004 "HTMLCharacterReference.gperf" + {"sung;", "♪"}, +#line 1958 "HTMLCharacterReference.gperf" + {"sqsubseteq;", "⊑"}, + {""}, + {""}, + {""}, +#line 1331 "HTMLCharacterReference.gperf" + {"leftrightsquigarrow;", "↭"}, +#line 1890 "HTMLCharacterReference.gperf" + {"scirc;", "ŝ"}, +#line 930 "HTMLCharacterReference.gperf" + {"curlywedge;", "⋏"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1366 "HTMLCharacterReference.gperf" + {"lmoust;", "⎰"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1438 "HTMLCharacterReference.gperf" + {"mapstoup;", "↥"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1764 "HTMLCharacterReference.gperf" + {"psi;", "ψ"}, +#line 85 "HTMLCharacterReference.gperf" + {"Colon;", "∷"}, +#line 304 "HTMLCharacterReference.gperf" + {"LessEqualGreater;", "⋚"}, + {""}, + {""}, + {""}, + {""}, #line 1653 "HTMLCharacterReference.gperf" - {"ograve;", "ò"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 365 "HTMLCharacterReference.gperf" - {"NotGreaterTilde;", "≵"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 778 "HTMLCharacterReference.gperf" - {"bowtie;", "⋈"}, - {""}, -#line 1783 "HTMLCharacterReference.gperf" - {"radic;", "√"}, - {""}, -#line 107 "HTMLCharacterReference.gperf" - {"Delta;", "Δ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1275 "HTMLCharacterReference.gperf" - {"lAtail;", "⤛"}, - {""}, - {""}, -#line 2137 "HTMLCharacterReference.gperf" - {"uring;", "ů"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1947 "HTMLCharacterReference.gperf" - {"spades;", "♠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1930 "HTMLCharacterReference.gperf" - {"simne;", "≆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 317 "HTMLCharacterReference.gperf" - {"Longleftrightarrow;", "⟺"}, - {""}, - {""}, -#line 1075 "HTMLCharacterReference.gperf" - {"ffilig;", "ffi"}, - {""}, - {""}, - {""}, - {""}, -#line 2052 "HTMLCharacterReference.gperf" - {"thickapprox;", "≈"}, - {""}, -#line 2043 "HTMLCharacterReference.gperf" - {"tcy;", "т"}, - {""}, -#line 293 "HTMLCharacterReference.gperf" - {"LeftTriangleBar;", "⧏"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2012 "HTMLCharacterReference.gperf" - {"supdot;", "⪾"}, - {""}, - {""}, -#line 1710 "HTMLCharacterReference.gperf" - {"phi;", "φ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 396 "HTMLCharacterReference.gperf" - {"NotSuperset;", "⊃⃒"}, - {""}, - {""}, - {""}, - {""}, -#line 1749 "HTMLCharacterReference.gperf" - {"prime;", "′"}, -#line 342 "HTMLCharacterReference.gperf" - {"NegativeThinSpace;", "​"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1452 "HTMLCharacterReference.gperf" - {"minus;", "−"}, - {""}, - {""}, - {""}, - {""}, -#line 1995 "HTMLCharacterReference.gperf" - {"succapprox;", "⪸"}, - {""}, - {""}, -#line 753 "HTMLCharacterReference.gperf" - {"bigsqcup;", "⨆"}, - {""}, - {""}, - {""}, -#line 1704 "HTMLCharacterReference.gperf" - {"percnt;", "%"}, - {""}, - {""}, -#line 1929 "HTMLCharacterReference.gperf" - {"simlE;", "⪟"}, - {""}, - {""}, - {""}, - {""}, -#line 1069 "HTMLCharacterReference.gperf" - {"exist;", "∃"}, - {""}, - {""}, - {""}, -#line 74 "HTMLCharacterReference.gperf" - {"CenterDot;", "·"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 548 "HTMLCharacterReference.gperf" - {"TSHcy;", "Ћ"}, - {""}, - {""}, - {""}, -#line 1541 "HTMLCharacterReference.gperf" - {"nless;", "≮"}, - {""}, + {"ograve", "ò"}, +#line 1654 "HTMLCharacterReference.gperf" + {"ograve;", "ò"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 366 "HTMLCharacterReference.gperf" + {"NotGreaterTilde;", "≵"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 779 "HTMLCharacterReference.gperf" + {"bowtie;", "⋈"}, + {""}, +#line 1784 "HTMLCharacterReference.gperf" + {"radic;", "√"}, + {""}, +#line 108 "HTMLCharacterReference.gperf" + {"Delta;", "Δ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1276 "HTMLCharacterReference.gperf" + {"lAtail;", "⤛"}, + {""}, + {""}, +#line 2138 "HTMLCharacterReference.gperf" + {"uring;", "ů"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1948 "HTMLCharacterReference.gperf" + {"spades;", "♠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1931 "HTMLCharacterReference.gperf" + {"simne;", "≆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 318 "HTMLCharacterReference.gperf" + {"Longleftrightarrow;", "⟺"}, + {""}, + {""}, +#line 1076 "HTMLCharacterReference.gperf" + {"ffilig;", "ffi"}, + {""}, + {""}, + {""}, + {""}, +#line 2053 "HTMLCharacterReference.gperf" + {"thickapprox;", "≈"}, + {""}, +#line 2044 "HTMLCharacterReference.gperf" + {"tcy;", "т"}, + {""}, +#line 294 "HTMLCharacterReference.gperf" + {"LeftTriangleBar;", "⧏"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2013 "HTMLCharacterReference.gperf" + {"supdot;", "⪾"}, + {""}, + {""}, +#line 1711 "HTMLCharacterReference.gperf" + {"phi;", "φ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 397 "HTMLCharacterReference.gperf" + {"NotSuperset;", "⊃⃒"}, + {""}, + {""}, + {""}, + {""}, #line 1750 "HTMLCharacterReference.gperf" - {"primes;", "ℙ"}, - {""}, - {""}, - {""}, -#line 1825 "HTMLCharacterReference.gperf" - {"realpart;", "ℜ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 66 "HTMLCharacterReference.gperf" - {"Cayleys;", "ℭ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1734 "HTMLCharacterReference.gperf" - {"pound", "£"}, + {"prime;", "′"}, +#line 343 "HTMLCharacterReference.gperf" + {"NegativeThinSpace;", "​"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1453 "HTMLCharacterReference.gperf" + {"minus;", "−"}, + {""}, + {""}, + {""}, + {""}, +#line 1996 "HTMLCharacterReference.gperf" + {"succapprox;", "⪸"}, + {""}, + {""}, +#line 754 "HTMLCharacterReference.gperf" + {"bigsqcup;", "⨆"}, + {""}, + {""}, + {""}, +#line 1705 "HTMLCharacterReference.gperf" + {"percnt;", "%"}, + {""}, + {""}, +#line 1930 "HTMLCharacterReference.gperf" + {"simlE;", "⪟"}, + {""}, + {""}, + {""}, + {""}, +#line 1070 "HTMLCharacterReference.gperf" + {"exist;", "∃"}, + {""}, + {""}, + {""}, +#line 75 "HTMLCharacterReference.gperf" + {"CenterDot;", "·"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 549 "HTMLCharacterReference.gperf" + {"TSHcy;", "Ћ"}, + {""}, + {""}, + {""}, +#line 1542 "HTMLCharacterReference.gperf" + {"nless;", "≮"}, + {""}, +#line 1751 "HTMLCharacterReference.gperf" + {"primes;", "ℙ"}, + {""}, + {""}, + {""}, +#line 1826 "HTMLCharacterReference.gperf" + {"realpart;", "ℜ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 67 "HTMLCharacterReference.gperf" + {"Cayleys;", "ℭ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1735 "HTMLCharacterReference.gperf" - {"pound;", "£"}, - {""}, - {""}, -#line 188 "HTMLCharacterReference.gperf" - {"GJcy;", "Ѓ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1655 "HTMLCharacterReference.gperf" - {"ohbar;", "⦵"}, - {""}, -#line 1027 "HTMLCharacterReference.gperf" - {"ell;", "ℓ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1545 "HTMLCharacterReference.gperf" - {"nltrie;", "⋬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 410 "HTMLCharacterReference.gperf" - {"Ocirc", "Ô"}, + {"pound", "£"}, +#line 1736 "HTMLCharacterReference.gperf" + {"pound;", "£"}, + {""}, + {""}, +#line 189 "HTMLCharacterReference.gperf" + {"GJcy;", "Ѓ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1656 "HTMLCharacterReference.gperf" + {"ohbar;", "⦵"}, + {""}, +#line 1028 "HTMLCharacterReference.gperf" + {"ell;", "ℓ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1546 "HTMLCharacterReference.gperf" + {"nltrie;", "⋬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 411 "HTMLCharacterReference.gperf" - {"Ocirc;", "Ô"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 306 "HTMLCharacterReference.gperf" - {"LessLess;", "⪡"}, - {""}, -#line 673 "HTMLCharacterReference.gperf" - {"aleph;", "ℵ"}, -#line 1695 "HTMLCharacterReference.gperf" - {"ovbar;", "⌽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 452 "HTMLCharacterReference.gperf" - {"Proportional;", "∝"}, - {""}, - {""}, -#line 873 "HTMLCharacterReference.gperf" - {"circlearrowleft;", "↺"}, -#line 2239 "HTMLCharacterReference.gperf" - {"zacute;", "ź"}, -#line 1816 "HTMLCharacterReference.gperf" - {"rcub;", "}"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 471 "HTMLCharacterReference.gperf" - {"ReverseElement;", "∋"}, - {""}, - {""}, -#line 731 "HTMLCharacterReference.gperf" - {"barwed;", "⌅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 343 "HTMLCharacterReference.gperf" - {"NegativeVeryThinSpace;", "​"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1931 "HTMLCharacterReference.gperf" - {"simplus;", "⨤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1746 "HTMLCharacterReference.gperf" - {"precneqq;", "⪵"}, - {""}, - {""}, - {""}, - {""}, -#line 870 "HTMLCharacterReference.gperf" - {"cirE;", "⧃"}, - {""}, - {""}, - {""}, - {""}, -#line 1561 "HTMLCharacterReference.gperf" - {"nparallel;", "∦"}, - {""}, -#line 1851 "HTMLCharacterReference.gperf" - {"rlm;", "‏"}, -#line 71 "HTMLCharacterReference.gperf" - {"Cconint;", "∰"}, - {""}, - {""}, - {""}, - {""}, -#line 1557 "HTMLCharacterReference.gperf" - {"notniva;", "∌"}, - {""}, -#line 1271 "HTMLCharacterReference.gperf" - {"kopf;", "𝕜"}, - {""}, -#line 1955 "HTMLCharacterReference.gperf" - {"sqsube;", "⊑"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 290 "HTMLCharacterReference.gperf" - {"LeftTeeArrow;", "↤"}, - {""}, -#line 335 "HTMLCharacterReference.gperf" - {"NJcy;", "Њ"}, - {""}, - {""}, - {""}, -#line 745 "HTMLCharacterReference.gperf" - {"between;", "≬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1762 "HTMLCharacterReference.gperf" - {"pscr;", "𝓅"}, - {""}, - {""}, - {""}, -#line 130 "HTMLCharacterReference.gperf" - {"DoubleRightTee;", "⊨"}, - {""}, - {""}, -#line 590 "HTMLCharacterReference.gperf" - {"UpArrow;", "↑"}, - {""}, -#line 565 "HTMLCharacterReference.gperf" - {"TripleDot;", "⃛"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1794 "HTMLCharacterReference.gperf" - {"rarrbfs;", "⤠"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1868 "HTMLCharacterReference.gperf" - {"rsh;", "↱"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1530 "HTMLCharacterReference.gperf" - {"nlArr;", "⇍"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1876 "HTMLCharacterReference.gperf" - {"rtrif;", "▸"}, - {""}, - {""}, -#line 1454 "HTMLCharacterReference.gperf" - {"minusd;", "∸"}, - {""}, - {""}, - {""}, -#line 355 "HTMLCharacterReference.gperf" - {"NotElement;", "∉"}, - {""}, - {""}, -#line 1849 "HTMLCharacterReference.gperf" - {"rlarr;", "⇄"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"Ocirc", "Ô"}, +#line 412 "HTMLCharacterReference.gperf" + {"Ocirc;", "Ô"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 307 "HTMLCharacterReference.gperf" + {"LessLess;", "⪡"}, + {""}, +#line 674 "HTMLCharacterReference.gperf" + {"aleph;", "ℵ"}, #line 1696 "HTMLCharacterReference.gperf" - {"par;", "∥"}, -#line 1702 "HTMLCharacterReference.gperf" - {"part;", "∂"}, - {""}, - {""}, - {""}, - {""}, -#line 1952 "HTMLCharacterReference.gperf" - {"sqcup;", "⊔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1435 "HTMLCharacterReference.gperf" - {"mapstodown;", "↧"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2225 "HTMLCharacterReference.gperf" - {"yacute", "ý"}, -#line 2226 "HTMLCharacterReference.gperf" - {"yacute;", "ý"}, - {""}, - {""}, - {""}, -#line 1470 "HTMLCharacterReference.gperf" - {"nLeftarrow;", "⇍"}, - {""}, - {""}, - {""}, -#line 2060 "HTMLCharacterReference.gperf" - {"times", "×"}, -#line 2061 "HTMLCharacterReference.gperf" - {"times;", "×"}, -#line 2082 "HTMLCharacterReference.gperf" - {"tridot;", "◬"}, - {""}, -#line 620 "HTMLCharacterReference.gperf" - {"VeryThinSpace;", " "}, -#line 39 "HTMLCharacterReference.gperf" - {"ApplyFunction;", "⁡"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2141 "HTMLCharacterReference.gperf" - {"utilde;", "ũ"}, - {""}, -#line 2034 "HTMLCharacterReference.gperf" - {"swarrow;", "↙"}, - {""}, - {""}, - {""}, + {"ovbar;", "⌽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 453 "HTMLCharacterReference.gperf" + {"Proportional;", "∝"}, + {""}, + {""}, +#line 874 "HTMLCharacterReference.gperf" + {"circlearrowleft;", "↺"}, +#line 2240 "HTMLCharacterReference.gperf" + {"zacute;", "ź"}, +#line 1817 "HTMLCharacterReference.gperf" + {"rcub;", "}"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 472 "HTMLCharacterReference.gperf" + {"ReverseElement;", "∋"}, + {""}, + {""}, +#line 732 "HTMLCharacterReference.gperf" + {"barwed;", "⌅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 344 "HTMLCharacterReference.gperf" + {"NegativeVeryThinSpace;", "​"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1932 "HTMLCharacterReference.gperf" + {"simplus;", "⨤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1747 "HTMLCharacterReference.gperf" + {"precneqq;", "⪵"}, + {""}, + {""}, + {""}, + {""}, +#line 871 "HTMLCharacterReference.gperf" + {"cirE;", "⧃"}, + {""}, + {""}, + {""}, + {""}, +#line 1562 "HTMLCharacterReference.gperf" + {"nparallel;", "∦"}, + {""}, +#line 1852 "HTMLCharacterReference.gperf" + {"rlm;", "‏"}, +#line 72 "HTMLCharacterReference.gperf" + {"Cconint;", "∰"}, + {""}, + {""}, + {""}, + {""}, +#line 1558 "HTMLCharacterReference.gperf" + {"notniva;", "∌"}, + {""}, +#line 1272 "HTMLCharacterReference.gperf" + {"kopf;", "𝕜"}, + {""}, +#line 1956 "HTMLCharacterReference.gperf" + {"sqsube;", "⊑"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 291 "HTMLCharacterReference.gperf" + {"LeftTeeArrow;", "↤"}, + {""}, +#line 336 "HTMLCharacterReference.gperf" + {"NJcy;", "Њ"}, + {""}, + {""}, + {""}, +#line 746 "HTMLCharacterReference.gperf" + {"between;", "≬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1763 "HTMLCharacterReference.gperf" + {"pscr;", "𝓅"}, + {""}, + {""}, + {""}, +#line 131 "HTMLCharacterReference.gperf" + {"DoubleRightTee;", "⊨"}, + {""}, + {""}, +#line 591 "HTMLCharacterReference.gperf" + {"UpArrow;", "↑"}, + {""}, +#line 566 "HTMLCharacterReference.gperf" + {"TripleDot;", "⃛"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1795 "HTMLCharacterReference.gperf" + {"rarrbfs;", "⤠"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1869 "HTMLCharacterReference.gperf" + {"rsh;", "↱"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1531 "HTMLCharacterReference.gperf" + {"nlArr;", "⇍"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1877 "HTMLCharacterReference.gperf" + {"rtrif;", "▸"}, + {""}, + {""}, +#line 1455 "HTMLCharacterReference.gperf" + {"minusd;", "∸"}, + {""}, + {""}, + {""}, +#line 356 "HTMLCharacterReference.gperf" + {"NotElement;", "∉"}, + {""}, + {""}, +#line 1850 "HTMLCharacterReference.gperf" + {"rlarr;", "⇄"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1697 "HTMLCharacterReference.gperf" + {"par;", "∥"}, +#line 1703 "HTMLCharacterReference.gperf" + {"part;", "∂"}, + {""}, + {""}, + {""}, + {""}, #line 1953 "HTMLCharacterReference.gperf" - {"sqcups;", "⊔︀"}, -#line 2019 "HTMLCharacterReference.gperf" - {"supmult;", "⫂"}, -#line 1895 "HTMLCharacterReference.gperf" - {"scy;", "с"}, -#line 985 "HTMLCharacterReference.gperf" - {"doublebarwedge;", "⌆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1311 "HTMLCharacterReference.gperf" - {"lcedil;", "ļ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 401 "HTMLCharacterReference.gperf" - {"NotTildeTilde;", "≉"}, - {""}, -#line 852 "HTMLCharacterReference.gperf" - {"ccedil", "ç"}, + {"sqcup;", "⊔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1436 "HTMLCharacterReference.gperf" + {"mapstodown;", "↧"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2226 "HTMLCharacterReference.gperf" + {"yacute", "ý"}, +#line 2227 "HTMLCharacterReference.gperf" + {"yacute;", "ý"}, + {""}, + {""}, + {""}, +#line 1471 "HTMLCharacterReference.gperf" + {"nLeftarrow;", "⇍"}, + {""}, + {""}, + {""}, +#line 2061 "HTMLCharacterReference.gperf" + {"times", "×"}, +#line 2062 "HTMLCharacterReference.gperf" + {"times;", "×"}, +#line 2083 "HTMLCharacterReference.gperf" + {"tridot;", "◬"}, + {""}, +#line 621 "HTMLCharacterReference.gperf" + {"VeryThinSpace;", " "}, +#line 40 "HTMLCharacterReference.gperf" + {"ApplyFunction;", "⁡"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2142 "HTMLCharacterReference.gperf" + {"utilde;", "ũ"}, + {""}, +#line 2035 "HTMLCharacterReference.gperf" + {"swarrow;", "↙"}, + {""}, + {""}, + {""}, +#line 1954 "HTMLCharacterReference.gperf" + {"sqcups;", "⊔︀"}, +#line 2020 "HTMLCharacterReference.gperf" + {"supmult;", "⫂"}, +#line 1896 "HTMLCharacterReference.gperf" + {"scy;", "с"}, +#line 986 "HTMLCharacterReference.gperf" + {"doublebarwedge;", "⌆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1312 "HTMLCharacterReference.gperf" + {"lcedil;", "ļ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 402 "HTMLCharacterReference.gperf" + {"NotTildeTilde;", "≉"}, + {""}, #line 853 "HTMLCharacterReference.gperf" - {"ccedil;", "ç"}, -#line 1985 "HTMLCharacterReference.gperf" - {"subrarr;", "⥹"}, - {""}, - {""}, -#line 1879 "HTMLCharacterReference.gperf" - {"rx;", "℞"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 172 "HTMLCharacterReference.gperf" - {"Equilibrium;", "⇌"}, - {""}, - {""}, - {""}, -#line 2151 "HTMLCharacterReference.gperf" - {"vDash;", "⊨"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2023 "HTMLCharacterReference.gperf" - {"supset;", "⊃"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2209 "HTMLCharacterReference.gperf" - {"xlArr;", "⟸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1689 "HTMLCharacterReference.gperf" - {"otilde", "õ"}, + {"ccedil", "ç"}, +#line 854 "HTMLCharacterReference.gperf" + {"ccedil;", "ç"}, +#line 1986 "HTMLCharacterReference.gperf" + {"subrarr;", "⥹"}, + {""}, + {""}, +#line 1880 "HTMLCharacterReference.gperf" + {"rx;", "℞"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 173 "HTMLCharacterReference.gperf" + {"Equilibrium;", "⇌"}, + {""}, + {""}, + {""}, +#line 2152 "HTMLCharacterReference.gperf" + {"vDash;", "⊨"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2024 "HTMLCharacterReference.gperf" + {"supset;", "⊃"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2210 "HTMLCharacterReference.gperf" + {"xlArr;", "⟸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1690 "HTMLCharacterReference.gperf" - {"otilde;", "õ"}, - {""}, -#line 1792 "HTMLCharacterReference.gperf" - {"rarrap;", "⥵"}, -#line 344 "HTMLCharacterReference.gperf" - {"NestedGreaterGreater;", "≫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1639 "HTMLCharacterReference.gperf" - {"ocir;", "⊚"}, - {""}, - {""}, -#line 399 "HTMLCharacterReference.gperf" - {"NotTildeEqual;", "≄"}, - {""}, - {""}, - {""}, -#line 1589 "HTMLCharacterReference.gperf" - {"nsqsupe;", "⋣"}, - {""}, -#line 987 "HTMLCharacterReference.gperf" - {"downdownarrows;", "⇊"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 321 "HTMLCharacterReference.gperf" - {"LowerRightArrow;", "↘"}, - {""}, -#line 1818 "HTMLCharacterReference.gperf" - {"rdca;", "⤷"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2084 "HTMLCharacterReference.gperf" - {"triminus;", "⨺"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1004 "HTMLCharacterReference.gperf" - {"dzigrarr;", "⟿"}, -#line 1924 "HTMLCharacterReference.gperf" - {"sime;", "≃"}, + {"otilde", "õ"}, +#line 1691 "HTMLCharacterReference.gperf" + {"otilde;", "õ"}, + {""}, +#line 1793 "HTMLCharacterReference.gperf" + {"rarrap;", "⥵"}, +#line 345 "HTMLCharacterReference.gperf" + {"NestedGreaterGreater;", "≫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1640 "HTMLCharacterReference.gperf" + {"ocir;", "⊚"}, + {""}, + {""}, +#line 400 "HTMLCharacterReference.gperf" + {"NotTildeEqual;", "≄"}, + {""}, + {""}, + {""}, +#line 1590 "HTMLCharacterReference.gperf" + {"nsqsupe;", "⋣"}, + {""}, +#line 988 "HTMLCharacterReference.gperf" + {"downdownarrows;", "⇊"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 322 "HTMLCharacterReference.gperf" + {"LowerRightArrow;", "↘"}, + {""}, +#line 1819 "HTMLCharacterReference.gperf" + {"rdca;", "⤷"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2085 "HTMLCharacterReference.gperf" + {"triminus;", "⨺"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1005 "HTMLCharacterReference.gperf" + {"dzigrarr;", "⟿"}, #line 1925 "HTMLCharacterReference.gperf" - {"simeq;", "≃"}, - {""}, - {""}, - {""}, -#line 307 "HTMLCharacterReference.gperf" - {"LessSlantEqual;", "⩽"}, -#line 2155 "HTMLCharacterReference.gperf" - {"varnothing;", "∅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2138 "HTMLCharacterReference.gperf" - {"urtri;", "◹"}, -#line 1471 "HTMLCharacterReference.gperf" - {"nLeftrightarrow;", "⇎"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2143 "HTMLCharacterReference.gperf" - {"utrif;", "▴"}, - {""}, - {""}, - {""}, - {""}, -#line 2070 "HTMLCharacterReference.gperf" - {"topf;", "𝕥"}, - {""}, - {""}, - {""}, -#line 1325 "HTMLCharacterReference.gperf" - {"leftharpoonup;", "↼"}, - {""}, -#line 1219 "HTMLCharacterReference.gperf" - {"image;", "ℑ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1697 "HTMLCharacterReference.gperf" - {"para", "¶"}, + {"sime;", "≃"}, +#line 1926 "HTMLCharacterReference.gperf" + {"simeq;", "≃"}, + {""}, + {""}, + {""}, +#line 308 "HTMLCharacterReference.gperf" + {"LessSlantEqual;", "⩽"}, +#line 2156 "HTMLCharacterReference.gperf" + {"varnothing;", "∅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2139 "HTMLCharacterReference.gperf" + {"urtri;", "◹"}, +#line 1472 "HTMLCharacterReference.gperf" + {"nLeftrightarrow;", "⇎"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2144 "HTMLCharacterReference.gperf" + {"utrif;", "▴"}, + {""}, + {""}, + {""}, + {""}, +#line 2071 "HTMLCharacterReference.gperf" + {"topf;", "𝕥"}, + {""}, + {""}, + {""}, +#line 1326 "HTMLCharacterReference.gperf" + {"leftharpoonup;", "↼"}, + {""}, +#line 1220 "HTMLCharacterReference.gperf" + {"image;", "ℑ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1698 "HTMLCharacterReference.gperf" - {"para;", "¶"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 85 "HTMLCharacterReference.gperf" - {"Colone;", "⩴"}, - {""}, - {""}, -#line 1662 "HTMLCharacterReference.gperf" - {"olt;", "⧀"}, - {""}, - {""}, -#line 1712 "HTMLCharacterReference.gperf" - {"phmmat;", "ℳ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1998 "HTMLCharacterReference.gperf" - {"succnapprox;", "⪺"}, - {""}, - {""}, -#line 1331 "HTMLCharacterReference.gperf" - {"leftthreetimes;", "⋋"}, - {""}, - {""}, - {""}, -#line 756 "HTMLCharacterReference.gperf" - {"bigtriangleup;", "△"}, -#line 140 "HTMLCharacterReference.gperf" - {"DownLeftVector;", "↽"}, - {""}, - {""}, + {"para", "¶"}, +#line 1699 "HTMLCharacterReference.gperf" + {"para;", "¶"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 86 "HTMLCharacterReference.gperf" + {"Colone;", "⩴"}, + {""}, + {""}, +#line 1663 "HTMLCharacterReference.gperf" + {"olt;", "⧀"}, + {""}, + {""}, +#line 1713 "HTMLCharacterReference.gperf" + {"phmmat;", "ℳ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1999 "HTMLCharacterReference.gperf" + {"succnapprox;", "⪺"}, + {""}, + {""}, +#line 1332 "HTMLCharacterReference.gperf" + {"leftthreetimes;", "⋋"}, + {""}, + {""}, + {""}, +#line 757 "HTMLCharacterReference.gperf" + {"bigtriangleup;", "△"}, #line 141 "HTMLCharacterReference.gperf" - {"DownLeftVectorBar;", "⥖"}, -#line 1907 "HTMLCharacterReference.gperf" - {"setminus;", "∖"}, -#line 1380 "HTMLCharacterReference.gperf" - {"longrightarrow;", "⟶"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2031 "HTMLCharacterReference.gperf" - {"swArr;", "⇙"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2064 "HTMLCharacterReference.gperf" - {"timesd;", "⨰"}, - {""}, - {""}, - {""}, -#line 808 "HTMLCharacterReference.gperf" - {"boxhu;", "┴"}, - {""}, - {""}, -#line 412 "HTMLCharacterReference.gperf" - {"Ocy;", "О"}, - {""}, -#line 1711 "HTMLCharacterReference.gperf" - {"phiv;", "ϕ"}, - {""}, -#line 728 "HTMLCharacterReference.gperf" - {"backsim;", "∽"}, - {""}, - {""}, - {""}, -#line 1658 "HTMLCharacterReference.gperf" - {"olarr;", "↺"}, -#line 220 "HTMLCharacterReference.gperf" - {"HumpDownHump;", "≎"}, -#line 537 "HTMLCharacterReference.gperf" - {"SucceedsSlantEqual;", "≽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2126 "HTMLCharacterReference.gperf" - {"updownarrow;", "↕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2103 "HTMLCharacterReference.gperf" - {"ucirc", "û"}, + {"DownLeftVector;", "↽"}, + {""}, + {""}, +#line 142 "HTMLCharacterReference.gperf" + {"DownLeftVectorBar;", "⥖"}, +#line 1908 "HTMLCharacterReference.gperf" + {"setminus;", "∖"}, +#line 1381 "HTMLCharacterReference.gperf" + {"longrightarrow;", "⟶"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2032 "HTMLCharacterReference.gperf" + {"swArr;", "⇙"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2065 "HTMLCharacterReference.gperf" + {"timesd;", "⨰"}, + {""}, + {""}, + {""}, +#line 809 "HTMLCharacterReference.gperf" + {"boxhu;", "┴"}, + {""}, + {""}, +#line 413 "HTMLCharacterReference.gperf" + {"Ocy;", "О"}, + {""}, +#line 1712 "HTMLCharacterReference.gperf" + {"phiv;", "ϕ"}, + {""}, +#line 729 "HTMLCharacterReference.gperf" + {"backsim;", "∽"}, + {""}, + {""}, + {""}, +#line 1659 "HTMLCharacterReference.gperf" + {"olarr;", "↺"}, +#line 221 "HTMLCharacterReference.gperf" + {"HumpDownHump;", "≎"}, +#line 538 "HTMLCharacterReference.gperf" + {"SucceedsSlantEqual;", "≽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2127 "HTMLCharacterReference.gperf" + {"updownarrow;", "↕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2104 "HTMLCharacterReference.gperf" - {"ucirc;", "û"}, -#line 1657 "HTMLCharacterReference.gperf" - {"oint;", "∮"}, - {""}, - {""}, -#line 1676 "HTMLCharacterReference.gperf" - {"orderof;", "ℴ"}, - {""}, - {""}, - {""}, - {""}, -#line 1834 "HTMLCharacterReference.gperf" - {"rharu;", "⇀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1742 "HTMLCharacterReference.gperf" - {"precapprox;", "⪷"}, - {""}, - {""}, -#line 1431 "HTMLCharacterReference.gperf" - {"malt;", "✠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ucirc", "û"}, +#line 2105 "HTMLCharacterReference.gperf" + {"ucirc;", "û"}, +#line 1658 "HTMLCharacterReference.gperf" + {"oint;", "∮"}, + {""}, + {""}, +#line 1677 "HTMLCharacterReference.gperf" + {"orderof;", "ℴ"}, + {""}, + {""}, + {""}, + {""}, #line 1835 "HTMLCharacterReference.gperf" - {"rharul;", "⥬"}, - {""}, -#line 275 "HTMLCharacterReference.gperf" - {"Lcedil;", "Ļ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 752 "HTMLCharacterReference.gperf" - {"bigotimes;", "⨂"}, - {""}, - {""}, - {""}, -#line 1820 "HTMLCharacterReference.gperf" - {"rdquo;", "”"}, + {"rharu;", "⇀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1743 "HTMLCharacterReference.gperf" + {"precapprox;", "⪷"}, + {""}, + {""}, +#line 1432 "HTMLCharacterReference.gperf" + {"malt;", "✠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1836 "HTMLCharacterReference.gperf" + {"rharul;", "⥬"}, + {""}, +#line 276 "HTMLCharacterReference.gperf" + {"Lcedil;", "Ļ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 753 "HTMLCharacterReference.gperf" + {"bigotimes;", "⨂"}, + {""}, + {""}, + {""}, #line 1821 "HTMLCharacterReference.gperf" - {"rdquor;", "”"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 313 "HTMLCharacterReference.gperf" - {"LongLeftArrow;", "⟵"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1860 "HTMLCharacterReference.gperf" - {"roplus;", "⨮"}, - {""}, - {""}, -#line 1980 "HTMLCharacterReference.gperf" - {"subedot;", "⫃"}, - {""}, - {""}, - {""}, - {""}, -#line 748 "HTMLCharacterReference.gperf" - {"bigcirc;", "◯"}, - {""}, -#line 1607 "HTMLCharacterReference.gperf" - {"ntlg;", "≸"}, -#line 1640 "HTMLCharacterReference.gperf" - {"ocirc", "ô"}, + {"rdquo;", "”"}, +#line 1822 "HTMLCharacterReference.gperf" + {"rdquor;", "”"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 314 "HTMLCharacterReference.gperf" + {"LongLeftArrow;", "⟵"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1861 "HTMLCharacterReference.gperf" + {"roplus;", "⨮"}, + {""}, + {""}, +#line 1981 "HTMLCharacterReference.gperf" + {"subedot;", "⫃"}, + {""}, + {""}, + {""}, + {""}, +#line 749 "HTMLCharacterReference.gperf" + {"bigcirc;", "◯"}, + {""}, +#line 1608 "HTMLCharacterReference.gperf" + {"ntlg;", "≸"}, #line 1641 "HTMLCharacterReference.gperf" - {"ocirc;", "ô"}, - {""}, -#line 2024 "HTMLCharacterReference.gperf" - {"supseteq;", "⊇"}, + {"ocirc", "ô"}, +#line 1642 "HTMLCharacterReference.gperf" + {"ocirc;", "ô"}, + {""}, #line 2025 "HTMLCharacterReference.gperf" - {"supseteqq;", "⫆"}, - {""}, -#line 1183 "HTMLCharacterReference.gperf" - {"hellip;", "…"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1623 "HTMLCharacterReference.gperf" - {"nvlArr;", "⤂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1877 "HTMLCharacterReference.gperf" - {"rtriltri;", "⧎"}, -#line 1789 "HTMLCharacterReference.gperf" - {"raquo", "»"}, -#line 1790 "HTMLCharacterReference.gperf" - {"raquo;", "»"}, - {""}, - {""}, -#line 63 "HTMLCharacterReference.gperf" - {"Cacute;", "Ć"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1112 "HTMLCharacterReference.gperf" - {"gEl;", "⪌"}, - {""}, - {""}, -#line 1262 "HTMLCharacterReference.gperf" - {"jukcy;", "є"}, - {""}, - {""}, - {""}, - {""}, -#line 2174 "HTMLCharacterReference.gperf" - {"vellip;", "⋮"}, - {""}, -#line 1883 "HTMLCharacterReference.gperf" - {"scE;", "⪴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1455 "HTMLCharacterReference.gperf" - {"minusdu;", "⨪"}, - {""}, - {""}, - {""}, -#line 942 "HTMLCharacterReference.gperf" - {"daleth;", "ℸ"}, - {""}, -#line 119 "HTMLCharacterReference.gperf" - {"DotEqual;", "≐"}, -#line 1866 "HTMLCharacterReference.gperf" - {"rsaquo;", "›"}, -#line 128 "HTMLCharacterReference.gperf" - {"DoubleLongRightArrow;", "⟹"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 137 "HTMLCharacterReference.gperf" - {"DownBreve;", "̑"}, - {""}, -#line 2092 "HTMLCharacterReference.gperf" - {"tstrok;", "ŧ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2087 "HTMLCharacterReference.gperf" - {"tritime;", "⨻"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 729 "HTMLCharacterReference.gperf" - {"backsimeq;", "⋍"}, - {""}, - {""}, -#line 1902 "HTMLCharacterReference.gperf" - {"searrow;", "↘"}, - {""}, - {""}, -#line 1645 "HTMLCharacterReference.gperf" - {"odiv;", "⨸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2086 "HTMLCharacterReference.gperf" - {"trisb;", "⧍"}, -#line 178 "HTMLCharacterReference.gperf" - {"Exists;", "∃"}, -#line 282 "HTMLCharacterReference.gperf" - {"LeftDoubleBracket;", "⟦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1802 "HTMLCharacterReference.gperf" - {"rarrw;", "↝"}, -#line 732 "HTMLCharacterReference.gperf" - {"barwedge;", "⌅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1817 "HTMLCharacterReference.gperf" - {"rcy;", "р"}, - {""}, - {""}, -#line 318 "HTMLCharacterReference.gperf" - {"Longrightarrow;", "⟹"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1946 "HTMLCharacterReference.gperf" - {"sopf;", "𝕤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 511 "HTMLCharacterReference.gperf" - {"Scedil;", "Ş"}, - {""}, - {""}, - {""}, - {""}, -#line 295 "HTMLCharacterReference.gperf" - {"LeftUpDownVector;", "⥑"}, - {""}, - {""}, -#line 259 "HTMLCharacterReference.gperf" - {"KJcy;", "Ќ"}, - {""}, -#line 380 "HTMLCharacterReference.gperf" - {"NotPrecedesEqual;", "⪯̸"}, - {""}, -#line 2166 "HTMLCharacterReference.gperf" - {"vartheta;", "ϑ"}, - {""}, - {""}, - {""}, - {""}, -#line 539 "HTMLCharacterReference.gperf" - {"SuchThat;", "∋"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 773 "HTMLCharacterReference.gperf" - {"bnequiv;", "≡⃥"}, - {""}, - {""}, - {""}, -#line 1252 "HTMLCharacterReference.gperf" - {"iukcy;", "і"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1965 "HTMLCharacterReference.gperf" - {"squf;", "▪"}, - {""}, -#line 1495 "HTMLCharacterReference.gperf" - {"ncedil;", "ņ"}, - {""}, - {""}, -#line 1737 "HTMLCharacterReference.gperf" - {"prE;", "⪳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 136 "HTMLCharacterReference.gperf" - {"DownArrowUpArrow;", "⇵"}, - {""}, - {""}, - {""}, -#line 1919 "HTMLCharacterReference.gperf" - {"sigma;", "σ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1079 "HTMLCharacterReference.gperf" - {"filig;", "fi"}, - {""}, - {""}, - {""}, -#line 315 "HTMLCharacterReference.gperf" - {"LongRightArrow;", "⟶"}, - {""}, -#line 1449 "HTMLCharacterReference.gperf" - {"midcir;", "⫰"}, - {""}, - {""}, -#line 1872 "HTMLCharacterReference.gperf" - {"rthree;", "⋌"}, - {""}, -#line 2038 "HTMLCharacterReference.gperf" - {"target;", "⌖"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1424 "HTMLCharacterReference.gperf" - {"luruhar;", "⥦"}, - {""}, - {""}, -#line 1082 "HTMLCharacterReference.gperf" - {"fllig;", "fl"}, - {""}, - {""}, - {""}, - {""}, -#line 1450 "HTMLCharacterReference.gperf" - {"middot", "·"}, -#line 1451 "HTMLCharacterReference.gperf" - {"middot;", "·"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1348 "HTMLCharacterReference.gperf" - {"lesssim;", "≲"}, - {""}, - {""}, - {""}, - {""}, -#line 754 "HTMLCharacterReference.gperf" - {"bigstar;", "★"}, -#line 1939 "HTMLCharacterReference.gperf" - {"smt;", "⪪"}, + {"supseteq;", "⊇"}, #line 2026 "HTMLCharacterReference.gperf" - {"supsetneq;", "⊋"}, -#line 2027 "HTMLCharacterReference.gperf" - {"supsetneqq;", "⫌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1899 "HTMLCharacterReference.gperf" - {"seArr;", "⇘"}, - {""}, -#line 52 "HTMLCharacterReference.gperf" - {"Because;", "∵"}, - {""}, - {""}, - {""}, - {""}, -#line 450 "HTMLCharacterReference.gperf" - {"Product;", "∏"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 329 "HTMLCharacterReference.gperf" - {"Mellintrf;", "ℳ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2125 "HTMLCharacterReference.gperf" - {"uparrow;", "↑"}, - {""}, - {""}, -#line 390 "HTMLCharacterReference.gperf" - {"NotSubset;", "⊂⃒"}, - {""}, -#line 2051 "HTMLCharacterReference.gperf" - {"thetav;", "ϑ"}, - {""}, -#line 1779 "HTMLCharacterReference.gperf" - {"rBarr;", "⤏"}, - {""}, -#line 288 "HTMLCharacterReference.gperf" - {"LeftRightVector;", "⥎"}, -#line 468 "HTMLCharacterReference.gperf" - {"Rcedil;", "Ŗ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2105 "HTMLCharacterReference.gperf" - {"ucy;", "у"}, - {""}, -#line 2011 "HTMLCharacterReference.gperf" - {"supE;", "⫆"}, - {""}, - {""}, -#line 133 "HTMLCharacterReference.gperf" - {"DoubleVerticalBar;", "∥"}, -#line 524 "HTMLCharacterReference.gperf" - {"SquareIntersection;", "⊓"}, - {""}, - {""}, - {""}, -#line 1781 "HTMLCharacterReference.gperf" - {"race;", "∽̱"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1776 "HTMLCharacterReference.gperf" - {"rAarr;", "⇛"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1364 "HTMLCharacterReference.gperf" - {"lmidot;", "ŀ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1777 "HTMLCharacterReference.gperf" - {"rArr;", "⇒"}, - {""}, - {""}, - {""}, -#line 194 "HTMLCharacterReference.gperf" - {"Gcedil;", "Ģ"}, - {""}, -#line 1943 "HTMLCharacterReference.gperf" - {"sol;", "/"}, -#line 420 "HTMLCharacterReference.gperf" - {"Oopf;", "𝕆"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 124 "HTMLCharacterReference.gperf" - {"DoubleLeftRightArrow;", "⇔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 477 "HTMLCharacterReference.gperf" - {"RightArrow;", "→"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1453 "HTMLCharacterReference.gperf" - {"minusb;", "⊟"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1745 "HTMLCharacterReference.gperf" - {"precnapprox;", "⪹"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1642 "HTMLCharacterReference.gperf" - {"ocy;", "о"}, -#line 1258 "HTMLCharacterReference.gperf" - {"jmath;", "ȷ"}, -#line 1920 "HTMLCharacterReference.gperf" - {"sigmaf;", "ς"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1714 "HTMLCharacterReference.gperf" - {"pi;", "π"}, - {""}, - {""}, - {""}, -#line 2164 "HTMLCharacterReference.gperf" - {"varsupsetneq;", "⊋︀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 672 "HTMLCharacterReference.gperf" - {"alefsym;", "ℵ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1754 "HTMLCharacterReference.gperf" - {"prod;", "∏"}, - {""}, -#line 1932 "HTMLCharacterReference.gperf" - {"simrarr;", "⥲"}, - {""}, -#line 1716 "HTMLCharacterReference.gperf" - {"piv;", "ϖ"}, - {""}, -#line 257 "HTMLCharacterReference.gperf" - {"Jukcy;", "Є"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 372 "HTMLCharacterReference.gperf" - {"NotLessEqual;", "≰"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 400 "HTMLCharacterReference.gperf" - {"NotTildeFullEqual;", "≇"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 356 "HTMLCharacterReference.gperf" - {"NotEqual;", "≠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1366 "HTMLCharacterReference.gperf" - {"lmoustache;", "⎰"}, -#line 338 "HTMLCharacterReference.gperf" - {"Ncedil;", "Ņ"}, - {""}, -#line 1234 "HTMLCharacterReference.gperf" - {"intlarhk;", "⨗"}, - {""}, - {""}, -#line 507 "HTMLCharacterReference.gperf" - {"SOFTcy;", "Ь"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1978 "HTMLCharacterReference.gperf" - {"subdot;", "⪽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 727 "HTMLCharacterReference.gperf" - {"backprime;", "‵"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 674 "HTMLCharacterReference.gperf" - {"alpha;", "α"}, - {""}, + {"supseteqq;", "⫆"}, + {""}, +#line 1184 "HTMLCharacterReference.gperf" + {"hellip;", "…"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1624 "HTMLCharacterReference.gperf" + {"nvlArr;", "⤂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1878 "HTMLCharacterReference.gperf" + {"rtriltri;", "⧎"}, +#line 1790 "HTMLCharacterReference.gperf" + {"raquo", "»"}, +#line 1791 "HTMLCharacterReference.gperf" + {"raquo;", "»"}, + {""}, + {""}, +#line 64 "HTMLCharacterReference.gperf" + {"Cacute;", "Ć"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1113 "HTMLCharacterReference.gperf" + {"gEl;", "⪌"}, + {""}, + {""}, +#line 1263 "HTMLCharacterReference.gperf" + {"jukcy;", "є"}, + {""}, + {""}, + {""}, + {""}, +#line 2175 "HTMLCharacterReference.gperf" + {"vellip;", "⋮"}, + {""}, +#line 1884 "HTMLCharacterReference.gperf" + {"scE;", "⪴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1456 "HTMLCharacterReference.gperf" + {"minusdu;", "⨪"}, + {""}, + {""}, + {""}, +#line 943 "HTMLCharacterReference.gperf" + {"daleth;", "ℸ"}, + {""}, +#line 120 "HTMLCharacterReference.gperf" + {"DotEqual;", "≐"}, +#line 1867 "HTMLCharacterReference.gperf" + {"rsaquo;", "›"}, +#line 129 "HTMLCharacterReference.gperf" + {"DoubleLongRightArrow;", "⟹"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 138 "HTMLCharacterReference.gperf" + {"DownBreve;", "̑"}, + {""}, +#line 2093 "HTMLCharacterReference.gperf" + {"tstrok;", "ŧ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2088 "HTMLCharacterReference.gperf" + {"tritime;", "⨻"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 730 "HTMLCharacterReference.gperf" + {"backsimeq;", "⋍"}, + {""}, + {""}, +#line 1903 "HTMLCharacterReference.gperf" + {"searrow;", "↘"}, + {""}, + {""}, +#line 1646 "HTMLCharacterReference.gperf" + {"odiv;", "⨸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2087 "HTMLCharacterReference.gperf" + {"trisb;", "⧍"}, #line 179 "HTMLCharacterReference.gperf" - {"ExponentialE;", "ⅇ"}, - {""}, - {""}, -#line 2170 "HTMLCharacterReference.gperf" - {"vdash;", "⊢"}, - {""}, - {""}, - {""}, - {""}, -#line 1824 "HTMLCharacterReference.gperf" - {"realine;", "ℛ"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"Exists;", "∃"}, +#line 283 "HTMLCharacterReference.gperf" + {"LeftDoubleBracket;", "⟦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1803 "HTMLCharacterReference.gperf" + {"rarrw;", "↝"}, +#line 733 "HTMLCharacterReference.gperf" + {"barwedge;", "⌅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1818 "HTMLCharacterReference.gperf" + {"rcy;", "р"}, + {""}, + {""}, +#line 319 "HTMLCharacterReference.gperf" + {"Longrightarrow;", "⟹"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1947 "HTMLCharacterReference.gperf" + {"sopf;", "𝕤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 512 "HTMLCharacterReference.gperf" + {"Scedil;", "Ş"}, + {""}, + {""}, + {""}, + {""}, +#line 296 "HTMLCharacterReference.gperf" + {"LeftUpDownVector;", "⥑"}, + {""}, + {""}, +#line 260 "HTMLCharacterReference.gperf" + {"KJcy;", "Ќ"}, + {""}, +#line 381 "HTMLCharacterReference.gperf" + {"NotPrecedesEqual;", "⪯̸"}, + {""}, +#line 2167 "HTMLCharacterReference.gperf" + {"vartheta;", "ϑ"}, + {""}, + {""}, + {""}, + {""}, +#line 540 "HTMLCharacterReference.gperf" + {"SuchThat;", "∋"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 774 "HTMLCharacterReference.gperf" + {"bnequiv;", "≡⃥"}, + {""}, + {""}, + {""}, +#line 1253 "HTMLCharacterReference.gperf" + {"iukcy;", "і"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1966 "HTMLCharacterReference.gperf" + {"squf;", "▪"}, + {""}, +#line 1496 "HTMLCharacterReference.gperf" + {"ncedil;", "ņ"}, + {""}, + {""}, +#line 1738 "HTMLCharacterReference.gperf" + {"prE;", "⪳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 137 "HTMLCharacterReference.gperf" + {"DownArrowUpArrow;", "⇵"}, + {""}, + {""}, + {""}, +#line 1920 "HTMLCharacterReference.gperf" + {"sigma;", "σ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1080 "HTMLCharacterReference.gperf" + {"filig;", "fi"}, + {""}, + {""}, + {""}, +#line 316 "HTMLCharacterReference.gperf" + {"LongRightArrow;", "⟶"}, + {""}, +#line 1450 "HTMLCharacterReference.gperf" + {"midcir;", "⫰"}, + {""}, + {""}, +#line 1873 "HTMLCharacterReference.gperf" + {"rthree;", "⋌"}, + {""}, +#line 2039 "HTMLCharacterReference.gperf" + {"target;", "⌖"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1425 "HTMLCharacterReference.gperf" + {"luruhar;", "⥦"}, + {""}, + {""}, +#line 1083 "HTMLCharacterReference.gperf" + {"fllig;", "fl"}, + {""}, + {""}, + {""}, + {""}, +#line 1451 "HTMLCharacterReference.gperf" + {"middot", "·"}, +#line 1452 "HTMLCharacterReference.gperf" + {"middot;", "·"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1349 "HTMLCharacterReference.gperf" - {"lfisht;", "⥼"}, -#line 1559 "HTMLCharacterReference.gperf" - {"notnivc;", "⋽"}, - {""}, - {""}, - {""}, -#line 203 "HTMLCharacterReference.gperf" - {"GreaterFullEqual;", "≧"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 248 "HTMLCharacterReference.gperf" - {"Iukcy;", "І"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 138 "HTMLCharacterReference.gperf" - {"DownLeftRightVector;", "⥐"}, - {""}, - {""}, - {""}, - {""}, -#line 1223 "HTMLCharacterReference.gperf" - {"imof;", "⊷"}, -#line 1324 "HTMLCharacterReference.gperf" - {"leftharpoondown;", "↽"}, -#line 958 "HTMLCharacterReference.gperf" - {"dfisht;", "⥿"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 346 "HTMLCharacterReference.gperf" - {"NewLine;", "\n"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2096 "HTMLCharacterReference.gperf" - {"uArr;", "⇑"}, - {""}, -#line 1222 "HTMLCharacterReference.gperf" - {"imath;", "ı"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 650 "HTMLCharacterReference.gperf" - {"ZeroWidthSpace;", "​"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"lesssim;", "≲"}, + {""}, + {""}, + {""}, + {""}, #line 755 "HTMLCharacterReference.gperf" - {"bigtriangledown;", "▽"}, - {""}, -#line 1859 "HTMLCharacterReference.gperf" - {"ropf;", "𝕣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 312 "HTMLCharacterReference.gperf" - {"Lmidot;", "Ŀ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1432 "HTMLCharacterReference.gperf" - {"maltese;", "✠"}, - {""}, - {""}, - {""}, -#line 534 "HTMLCharacterReference.gperf" - {"SubsetEqual;", "⊆"}, -#line 2127 "HTMLCharacterReference.gperf" - {"upharpoonleft;", "↿"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 354 "HTMLCharacterReference.gperf" - {"NotDoubleVerticalBar;", "∦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1430 "HTMLCharacterReference.gperf" - {"male;", "♂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"bigstar;", "★"}, +#line 1940 "HTMLCharacterReference.gperf" + {"smt;", "⪪"}, +#line 2027 "HTMLCharacterReference.gperf" + {"supsetneq;", "⊋"}, +#line 2028 "HTMLCharacterReference.gperf" + {"supsetneqq;", "⫌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1900 "HTMLCharacterReference.gperf" + {"seArr;", "⇘"}, + {""}, +#line 53 "HTMLCharacterReference.gperf" + {"Because;", "∵"}, + {""}, + {""}, + {""}, + {""}, +#line 451 "HTMLCharacterReference.gperf" + {"Product;", "∏"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 330 "HTMLCharacterReference.gperf" + {"Mellintrf;", "ℳ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2126 "HTMLCharacterReference.gperf" + {"uparrow;", "↑"}, + {""}, + {""}, +#line 391 "HTMLCharacterReference.gperf" + {"NotSubset;", "⊂⃒"}, + {""}, +#line 2052 "HTMLCharacterReference.gperf" + {"thetav;", "ϑ"}, + {""}, +#line 1780 "HTMLCharacterReference.gperf" + {"rBarr;", "⤏"}, + {""}, +#line 289 "HTMLCharacterReference.gperf" + {"LeftRightVector;", "⥎"}, +#line 469 "HTMLCharacterReference.gperf" + {"Rcedil;", "Ŗ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2106 "HTMLCharacterReference.gperf" + {"ucy;", "у"}, + {""}, +#line 2012 "HTMLCharacterReference.gperf" + {"supE;", "⫆"}, + {""}, + {""}, +#line 134 "HTMLCharacterReference.gperf" + {"DoubleVerticalBar;", "∥"}, +#line 525 "HTMLCharacterReference.gperf" + {"SquareIntersection;", "⊓"}, + {""}, + {""}, + {""}, +#line 1782 "HTMLCharacterReference.gperf" + {"race;", "∽̱"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1777 "HTMLCharacterReference.gperf" + {"rAarr;", "⇛"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1365 "HTMLCharacterReference.gperf" + {"lmidot;", "ŀ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1778 "HTMLCharacterReference.gperf" + {"rArr;", "⇒"}, + {""}, + {""}, + {""}, +#line 195 "HTMLCharacterReference.gperf" + {"Gcedil;", "Ģ"}, + {""}, +#line 1944 "HTMLCharacterReference.gperf" + {"sol;", "/"}, +#line 421 "HTMLCharacterReference.gperf" + {"Oopf;", "𝕆"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 125 "HTMLCharacterReference.gperf" + {"DoubleLeftRightArrow;", "⇔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 478 "HTMLCharacterReference.gperf" + {"RightArrow;", "→"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1454 "HTMLCharacterReference.gperf" + {"minusb;", "⊟"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1746 "HTMLCharacterReference.gperf" + {"precnapprox;", "⪹"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1643 "HTMLCharacterReference.gperf" + {"ocy;", "о"}, +#line 1259 "HTMLCharacterReference.gperf" + {"jmath;", "ȷ"}, +#line 1921 "HTMLCharacterReference.gperf" + {"sigmaf;", "ς"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1715 "HTMLCharacterReference.gperf" + {"pi;", "π"}, + {""}, + {""}, + {""}, #line 2165 "HTMLCharacterReference.gperf" - {"varsupsetneqq;", "⫌︀"}, - {""}, - {""}, -#line 2062 "HTMLCharacterReference.gperf" - {"timesb;", "⊠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2131 "HTMLCharacterReference.gperf" - {"upsih;", "ϒ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1546 "HTMLCharacterReference.gperf" - {"nmid;", "∤"}, - {""}, - {""}, -#line 201 "HTMLCharacterReference.gperf" - {"GreaterEqual;", "≥"}, - {""}, - {""}, -#line 417 "HTMLCharacterReference.gperf" - {"Omacr;", "Ō"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1558 "HTMLCharacterReference.gperf" - {"notnivb;", "⋾"}, + {"varsupsetneq;", "⊋︀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 673 "HTMLCharacterReference.gperf" + {"alefsym;", "ℵ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1755 "HTMLCharacterReference.gperf" + {"prod;", "∏"}, + {""}, +#line 1933 "HTMLCharacterReference.gperf" + {"simrarr;", "⥲"}, + {""}, +#line 1717 "HTMLCharacterReference.gperf" + {"piv;", "ϖ"}, + {""}, +#line 258 "HTMLCharacterReference.gperf" + {"Jukcy;", "Є"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 373 "HTMLCharacterReference.gperf" + {"NotLessEqual;", "≰"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 401 "HTMLCharacterReference.gperf" + {"NotTildeFullEqual;", "≇"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 357 "HTMLCharacterReference.gperf" + {"NotEqual;", "≠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1367 "HTMLCharacterReference.gperf" + {"lmoustache;", "⎰"}, +#line 339 "HTMLCharacterReference.gperf" + {"Ncedil;", "Ņ"}, + {""}, +#line 1235 "HTMLCharacterReference.gperf" + {"intlarhk;", "⨗"}, + {""}, + {""}, +#line 508 "HTMLCharacterReference.gperf" + {"SOFTcy;", "Ь"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1979 "HTMLCharacterReference.gperf" + {"subdot;", "⪽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 728 "HTMLCharacterReference.gperf" + {"backprime;", "‵"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 675 "HTMLCharacterReference.gperf" + {"alpha;", "α"}, + {""}, +#line 180 "HTMLCharacterReference.gperf" + {"ExponentialE;", "ⅇ"}, + {""}, + {""}, +#line 2171 "HTMLCharacterReference.gperf" + {"vdash;", "⊢"}, + {""}, + {""}, + {""}, + {""}, +#line 1825 "HTMLCharacterReference.gperf" + {"realine;", "ℛ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1350 "HTMLCharacterReference.gperf" + {"lfisht;", "⥼"}, +#line 1560 "HTMLCharacterReference.gperf" + {"notnivc;", "⋽"}, + {""}, + {""}, + {""}, +#line 204 "HTMLCharacterReference.gperf" + {"GreaterFullEqual;", "≧"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 249 "HTMLCharacterReference.gperf" + {"Iukcy;", "І"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 139 "HTMLCharacterReference.gperf" + {"DownLeftRightVector;", "⥐"}, + {""}, + {""}, + {""}, + {""}, +#line 1224 "HTMLCharacterReference.gperf" + {"imof;", "⊷"}, +#line 1325 "HTMLCharacterReference.gperf" + {"leftharpoondown;", "↽"}, +#line 959 "HTMLCharacterReference.gperf" + {"dfisht;", "⥿"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 347 "HTMLCharacterReference.gperf" + {"NewLine;", "\n"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2097 "HTMLCharacterReference.gperf" + {"uArr;", "⇑"}, + {""}, +#line 1223 "HTMLCharacterReference.gperf" + {"imath;", "ı"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 651 "HTMLCharacterReference.gperf" + {"ZeroWidthSpace;", "​"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 756 "HTMLCharacterReference.gperf" + {"bigtriangledown;", "▽"}, + {""}, +#line 1860 "HTMLCharacterReference.gperf" + {"ropf;", "𝕣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 313 "HTMLCharacterReference.gperf" + {"Lmidot;", "Ŀ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1433 "HTMLCharacterReference.gperf" + {"maltese;", "✠"}, + {""}, + {""}, + {""}, +#line 535 "HTMLCharacterReference.gperf" + {"SubsetEqual;", "⊆"}, +#line 2128 "HTMLCharacterReference.gperf" + {"upharpoonleft;", "↿"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 355 "HTMLCharacterReference.gperf" + {"NotDoubleVerticalBar;", "∦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1431 "HTMLCharacterReference.gperf" + {"male;", "♂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2166 "HTMLCharacterReference.gperf" + {"varsupsetneqq;", "⫌︀"}, + {""}, + {""}, #line 2063 "HTMLCharacterReference.gperf" - {"timesbar;", "⨱"}, - {""}, - {""}, - {""}, -#line 1805 "HTMLCharacterReference.gperf" - {"rationals;", "ℚ"}, - {""}, - {""}, - {""}, - {""}, -#line 1681 "HTMLCharacterReference.gperf" - {"origof;", "⊶"}, -#line 341 "HTMLCharacterReference.gperf" - {"NegativeThickSpace;", "​"}, - {""}, - {""}, -#line 1784 "HTMLCharacterReference.gperf" - {"raemptyv;", "⦳"}, + {"timesb;", "⊠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2132 "HTMLCharacterReference.gperf" + {"upsih;", "ϒ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1547 "HTMLCharacterReference.gperf" + {"nmid;", "∤"}, + {""}, + {""}, +#line 202 "HTMLCharacterReference.gperf" + {"GreaterEqual;", "≥"}, + {""}, + {""}, +#line 418 "HTMLCharacterReference.gperf" + {"Omacr;", "Ō"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1559 "HTMLCharacterReference.gperf" + {"notnivb;", "⋾"}, +#line 2064 "HTMLCharacterReference.gperf" + {"timesbar;", "⨱"}, + {""}, + {""}, + {""}, +#line 1806 "HTMLCharacterReference.gperf" + {"rationals;", "ℚ"}, + {""}, + {""}, + {""}, + {""}, +#line 1682 "HTMLCharacterReference.gperf" + {"origof;", "⊶"}, +#line 342 "HTMLCharacterReference.gperf" + {"NegativeThickSpace;", "​"}, + {""}, + {""}, #line 1785 "HTMLCharacterReference.gperf" - {"rang;", "⟩"}, - {""}, - {""}, - {""}, -#line 616 "HTMLCharacterReference.gperf" - {"VerticalBar;", "∣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2128 "HTMLCharacterReference.gperf" - {"upharpoonright;", "↾"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1796 "HTMLCharacterReference.gperf" - {"rarrfs;", "⤞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1864 "HTMLCharacterReference.gperf" - {"rppolint;", "⨒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 553 "HTMLCharacterReference.gperf" - {"Tcedil;", "Ţ"}, - {""}, - {""}, - {""}, -#line 805 "HTMLCharacterReference.gperf" - {"boxhD;", "╥"}, - {""}, -#line 1588 "HTMLCharacterReference.gperf" - {"nsqsube;", "⋢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2118 "HTMLCharacterReference.gperf" - {"ulcrop;", "⌏"}, - {""}, - {""}, - {""}, - {""}, -#line 2167 "HTMLCharacterReference.gperf" - {"vartriangleleft;", "⊲"}, -#line 1661 "HTMLCharacterReference.gperf" - {"oline;", "‾"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 608 "HTMLCharacterReference.gperf" - {"VDash;", "⊫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2116 "HTMLCharacterReference.gperf" - {"ulcorn;", "⌜"}, - {""}, -#line 2013 "HTMLCharacterReference.gperf" - {"supdsub;", "⫘"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2124 "HTMLCharacterReference.gperf" - {"uopf;", "𝕦"}, - {""}, - {""}, -#line 1264 "HTMLCharacterReference.gperf" - {"kappav;", "ϰ"}, -#line 1981 "HTMLCharacterReference.gperf" - {"submult;", "⫁"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 479 "HTMLCharacterReference.gperf" - {"RightArrowLeftArrow;", "⇄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1507 "HTMLCharacterReference.gperf" - {"nequiv;", "≢"}, - {""}, - {""}, -#line 928 "HTMLCharacterReference.gperf" - {"curlyvee;", "⋎"}, -#line 1886 "HTMLCharacterReference.gperf" - {"sccue;", "≽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1986 "HTMLCharacterReference.gperf" - {"subset;", "⊂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1659 "HTMLCharacterReference.gperf" - {"olcir;", "⦾"}, -#line 237 "HTMLCharacterReference.gperf" - {"Implies;", "⇒"}, - {""}, -#line 284 "HTMLCharacterReference.gperf" - {"LeftDownVector;", "⇃"}, - {""}, - {""}, -#line 285 "HTMLCharacterReference.gperf" - {"LeftDownVectorBar;", "⥙"}, -#line 766 "HTMLCharacterReference.gperf" - {"blacktriangleright;", "▸"}, -#line 1803 "HTMLCharacterReference.gperf" - {"ratail;", "⤚"}, - {""}, -#line 1996 "HTMLCharacterReference.gperf" - {"succcurlyeq;", "≽"}, - {""}, - {""}, - {""}, -#line 1668 "HTMLCharacterReference.gperf" - {"oopf;", "𝕠"}, -#line 281 "HTMLCharacterReference.gperf" - {"LeftCeiling;", "⌈"}, - {""}, -#line 1787 "HTMLCharacterReference.gperf" - {"range;", "⦥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1831 "HTMLCharacterReference.gperf" - {"rfloor;", "⌋"}, - {""}, - {""}, + {"raemptyv;", "⦳"}, +#line 1786 "HTMLCharacterReference.gperf" + {"rang;", "⟩"}, + {""}, + {""}, + {""}, #line 617 "HTMLCharacterReference.gperf" - {"VerticalLine;", "|"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1944 "HTMLCharacterReference.gperf" - {"solb;", "⧄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1500 "HTMLCharacterReference.gperf" - {"ndash;", "–"}, -#line 1574 "HTMLCharacterReference.gperf" - {"nrightarrow;", "↛"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1631 "HTMLCharacterReference.gperf" - {"nwarhk;", "⤣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 402 "HTMLCharacterReference.gperf" - {"NotVerticalBar;", "∤"}, -#line 311 "HTMLCharacterReference.gperf" - {"Lleftarrow;", "⇚"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2045 "HTMLCharacterReference.gperf" - {"telrec;", "⌕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2108 "HTMLCharacterReference.gperf" - {"udhar;", "⥮"}, - {""}, - {""}, -#line 1706 "HTMLCharacterReference.gperf" - {"permil;", "‰"}, - {""}, - {""}, - {""}, -#line 413 "HTMLCharacterReference.gperf" - {"Odblac;", "Ő"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 50 "HTMLCharacterReference.gperf" - {"Barwed;", "⌆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1934 "HTMLCharacterReference.gperf" - {"smallsetminus;", "∖"}, -#line 1940 "HTMLCharacterReference.gperf" - {"smte;", "⪬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 392 "HTMLCharacterReference.gperf" - {"NotSucceeds;", "⊁"}, - {""}, - {""}, - {""}, - {""}, -#line 1031 "HTMLCharacterReference.gperf" - {"empty;", "∅"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 215 "HTMLCharacterReference.gperf" - {"HilbertSpace;", "ℋ"}, -#line 1221 "HTMLCharacterReference.gperf" - {"imagpart;", "ℑ"}, - {""}, - {""}, -#line 1739 "HTMLCharacterReference.gperf" - {"prcue;", "≼"}, + {"VerticalBar;", "∣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2129 "HTMLCharacterReference.gperf" + {"upharpoonright;", "↾"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1797 "HTMLCharacterReference.gperf" + {"rarrfs;", "⤞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1865 "HTMLCharacterReference.gperf" + {"rppolint;", "⨒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 554 "HTMLCharacterReference.gperf" + {"Tcedil;", "Ţ"}, + {""}, + {""}, + {""}, +#line 806 "HTMLCharacterReference.gperf" + {"boxhD;", "╥"}, + {""}, +#line 1589 "HTMLCharacterReference.gperf" + {"nsqsube;", "⋢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2119 "HTMLCharacterReference.gperf" + {"ulcrop;", "⌏"}, + {""}, + {""}, + {""}, + {""}, +#line 2168 "HTMLCharacterReference.gperf" + {"vartriangleleft;", "⊲"}, +#line 1662 "HTMLCharacterReference.gperf" + {"oline;", "‾"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 609 "HTMLCharacterReference.gperf" + {"VDash;", "⊫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2117 "HTMLCharacterReference.gperf" - {"ulcorner;", "⌜"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1703 "HTMLCharacterReference.gperf" - {"pcy;", "п"}, - {""}, - {""}, -#line 146 "HTMLCharacterReference.gperf" - {"DownTeeArrow;", "↧"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1926 "HTMLCharacterReference.gperf" - {"simg;", "⪞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 501 "HTMLCharacterReference.gperf" - {"Rrightarrow;", "⇛"}, - {""}, -#line 1465 "HTMLCharacterReference.gperf" - {"multimap;", "⊸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 472 "HTMLCharacterReference.gperf" - {"ReverseEquilibrium;", "⇋"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 759 "HTMLCharacterReference.gperf" - {"bigwedge;", "⋀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 261 "HTMLCharacterReference.gperf" - {"Kcedil;", "Ķ"}, -#line 1622 "HTMLCharacterReference.gperf" - {"nvinfin;", "⧞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 763 "HTMLCharacterReference.gperf" - {"blacktriangle;", "▴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ulcorn;", "⌜"}, + {""}, +#line 2014 "HTMLCharacterReference.gperf" + {"supdsub;", "⫘"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2125 "HTMLCharacterReference.gperf" + {"uopf;", "𝕦"}, + {""}, + {""}, +#line 1265 "HTMLCharacterReference.gperf" + {"kappav;", "ϰ"}, +#line 1982 "HTMLCharacterReference.gperf" + {"submult;", "⫁"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 480 "HTMLCharacterReference.gperf" + {"RightArrowLeftArrow;", "⇄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1508 "HTMLCharacterReference.gperf" + {"nequiv;", "≢"}, + {""}, + {""}, +#line 929 "HTMLCharacterReference.gperf" + {"curlyvee;", "⋎"}, +#line 1887 "HTMLCharacterReference.gperf" + {"sccue;", "≽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1987 "HTMLCharacterReference.gperf" - {"subseteq;", "⊆"}, + {"subset;", "⊂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1660 "HTMLCharacterReference.gperf" + {"olcir;", "⦾"}, +#line 238 "HTMLCharacterReference.gperf" + {"Implies;", "⇒"}, + {""}, +#line 285 "HTMLCharacterReference.gperf" + {"LeftDownVector;", "⇃"}, + {""}, + {""}, +#line 286 "HTMLCharacterReference.gperf" + {"LeftDownVectorBar;", "⥙"}, +#line 767 "HTMLCharacterReference.gperf" + {"blacktriangleright;", "▸"}, +#line 1804 "HTMLCharacterReference.gperf" + {"ratail;", "⤚"}, + {""}, +#line 1997 "HTMLCharacterReference.gperf" + {"succcurlyeq;", "≽"}, + {""}, + {""}, + {""}, +#line 1669 "HTMLCharacterReference.gperf" + {"oopf;", "𝕠"}, +#line 282 "HTMLCharacterReference.gperf" + {"LeftCeiling;", "⌈"}, + {""}, +#line 1788 "HTMLCharacterReference.gperf" + {"range;", "⦥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1832 "HTMLCharacterReference.gperf" + {"rfloor;", "⌋"}, + {""}, + {""}, +#line 618 "HTMLCharacterReference.gperf" + {"VerticalLine;", "|"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1945 "HTMLCharacterReference.gperf" + {"solb;", "⧄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1501 "HTMLCharacterReference.gperf" + {"ndash;", "–"}, +#line 1575 "HTMLCharacterReference.gperf" + {"nrightarrow;", "↛"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1632 "HTMLCharacterReference.gperf" + {"nwarhk;", "⤣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 403 "HTMLCharacterReference.gperf" + {"NotVerticalBar;", "∤"}, +#line 312 "HTMLCharacterReference.gperf" + {"Lleftarrow;", "⇚"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2046 "HTMLCharacterReference.gperf" + {"telrec;", "⌕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2109 "HTMLCharacterReference.gperf" + {"udhar;", "⥮"}, + {""}, + {""}, +#line 1707 "HTMLCharacterReference.gperf" + {"permil;", "‰"}, + {""}, + {""}, + {""}, +#line 414 "HTMLCharacterReference.gperf" + {"Odblac;", "Ő"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 51 "HTMLCharacterReference.gperf" + {"Barwed;", "⌆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1935 "HTMLCharacterReference.gperf" + {"smallsetminus;", "∖"}, +#line 1941 "HTMLCharacterReference.gperf" + {"smte;", "⪬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 393 "HTMLCharacterReference.gperf" + {"NotSucceeds;", "⊁"}, + {""}, + {""}, + {""}, + {""}, +#line 1032 "HTMLCharacterReference.gperf" + {"empty;", "∅"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 216 "HTMLCharacterReference.gperf" + {"HilbertSpace;", "ℋ"}, +#line 1222 "HTMLCharacterReference.gperf" + {"imagpart;", "ℑ"}, + {""}, + {""}, +#line 1740 "HTMLCharacterReference.gperf" + {"prcue;", "≼"}, +#line 2118 "HTMLCharacterReference.gperf" + {"ulcorner;", "⌜"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1704 "HTMLCharacterReference.gperf" + {"pcy;", "п"}, + {""}, + {""}, +#line 147 "HTMLCharacterReference.gperf" + {"DownTeeArrow;", "↧"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1927 "HTMLCharacterReference.gperf" + {"simg;", "⪞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 502 "HTMLCharacterReference.gperf" + {"Rrightarrow;", "⇛"}, + {""}, +#line 1466 "HTMLCharacterReference.gperf" + {"multimap;", "⊸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 473 "HTMLCharacterReference.gperf" + {"ReverseEquilibrium;", "⇋"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 760 "HTMLCharacterReference.gperf" + {"bigwedge;", "⋀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 262 "HTMLCharacterReference.gperf" + {"Kcedil;", "Ķ"}, +#line 1623 "HTMLCharacterReference.gperf" + {"nvinfin;", "⧞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 764 "HTMLCharacterReference.gperf" + {"blacktriangle;", "▴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1988 "HTMLCharacterReference.gperf" - {"subseteqq;", "⫅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1660 "HTMLCharacterReference.gperf" - {"olcross;", "⦻"}, - {""}, - {""}, -#line 202 "HTMLCharacterReference.gperf" - {"GreaterEqualLess;", "⋛"}, - {""}, - {""}, -#line 2120 "HTMLCharacterReference.gperf" - {"umacr;", "ū"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1880 "HTMLCharacterReference.gperf" - {"sacute;", "ś"}, - {""}, - {""}, -#line 1677 "HTMLCharacterReference.gperf" - {"ordf", "ª"}, + {"subseteq;", "⊆"}, +#line 1989 "HTMLCharacterReference.gperf" + {"subseteqq;", "⫅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1661 "HTMLCharacterReference.gperf" + {"olcross;", "⦻"}, + {""}, + {""}, +#line 203 "HTMLCharacterReference.gperf" + {"GreaterEqualLess;", "⋛"}, + {""}, + {""}, +#line 2121 "HTMLCharacterReference.gperf" + {"umacr;", "ū"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1881 "HTMLCharacterReference.gperf" + {"sacute;", "ś"}, + {""}, + {""}, #line 1678 "HTMLCharacterReference.gperf" - {"ordf;", "ª"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 129 "HTMLCharacterReference.gperf" - {"DoubleRightArrow;", "⇒"}, - {""}, - {""}, - {""}, -#line 1938 "HTMLCharacterReference.gperf" - {"smile;", "⌣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1941 "HTMLCharacterReference.gperf" - {"smtes;", "⪬︀"}, -#line 1663 "HTMLCharacterReference.gperf" - {"omacr;", "ō"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1923 "HTMLCharacterReference.gperf" - {"simdot;", "⩪"}, - {""}, - {""}, - {""}, -#line 79 "HTMLCharacterReference.gperf" - {"CirclePlus;", "⊕"}, - {""}, - {""}, - {""}, -#line 1809 "HTMLCharacterReference.gperf" - {"rbrack;", "]"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1535 "HTMLCharacterReference.gperf" - {"nleftarrow;", "↚"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ordf", "ª"}, +#line 1679 "HTMLCharacterReference.gperf" + {"ordf;", "ª"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 130 "HTMLCharacterReference.gperf" + {"DoubleRightArrow;", "⇒"}, + {""}, + {""}, + {""}, +#line 1939 "HTMLCharacterReference.gperf" + {"smile;", "⌣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1942 "HTMLCharacterReference.gperf" + {"smtes;", "⪬︀"}, +#line 1664 "HTMLCharacterReference.gperf" + {"omacr;", "ō"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1924 "HTMLCharacterReference.gperf" + {"simdot;", "⩪"}, + {""}, + {""}, + {""}, #line 80 "HTMLCharacterReference.gperf" - {"CircleTimes;", "⊗"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 593 "HTMLCharacterReference.gperf" - {"UpDownArrow;", "↕"}, - {""}, -#line 1786 "HTMLCharacterReference.gperf" - {"rangd;", "⦒"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1032 "HTMLCharacterReference.gperf" - {"emptyset;", "∅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 68 "HTMLCharacterReference.gperf" - {"Ccedil", "Ç"}, + {"CirclePlus;", "⊕"}, + {""}, + {""}, + {""}, +#line 1810 "HTMLCharacterReference.gperf" + {"rbrack;", "]"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1536 "HTMLCharacterReference.gperf" + {"nleftarrow;", "↚"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 81 "HTMLCharacterReference.gperf" + {"CircleTimes;", "⊗"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 594 "HTMLCharacterReference.gperf" + {"UpDownArrow;", "↕"}, + {""}, +#line 1787 "HTMLCharacterReference.gperf" + {"rangd;", "⦒"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1033 "HTMLCharacterReference.gperf" + {"emptyset;", "∅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 69 "HTMLCharacterReference.gperf" - {"Ccedil;", "Ç"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1927 "HTMLCharacterReference.gperf" - {"simgE;", "⪠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 34 "HTMLCharacterReference.gperf" - {"Alpha;", "Α"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 408 "HTMLCharacterReference.gperf" - {"Oacute", "Ó"}, + {"Ccedil", "Ç"}, +#line 70 "HTMLCharacterReference.gperf" + {"Ccedil;", "Ç"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1928 "HTMLCharacterReference.gperf" + {"simgE;", "⪠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 35 "HTMLCharacterReference.gperf" + {"Alpha;", "Α"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 409 "HTMLCharacterReference.gperf" - {"Oacute;", "Ó"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1503 "HTMLCharacterReference.gperf" - {"nearhk;", "⤤"}, - {""}, -#line 142 "HTMLCharacterReference.gperf" - {"DownRightTeeVector;", "⥟"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1708 "HTMLCharacterReference.gperf" - {"pertenk;", "‱"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2162 "HTMLCharacterReference.gperf" - {"varsubsetneq;", "⊊︀"}, - {""}, - {""}, -#line 1536 "HTMLCharacterReference.gperf" - {"nleftrightarrow;", "↮"}, -#line 2156 "HTMLCharacterReference.gperf" - {"varphi;", "ϕ"}, -#line 1743 "HTMLCharacterReference.gperf" - {"preccurlyeq;", "≼"}, - {""}, -#line 1788 "HTMLCharacterReference.gperf" - {"rangle;", "⟩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1989 "HTMLCharacterReference.gperf" - {"subsetneq;", "⊊"}, + {"Oacute", "Ó"}, +#line 410 "HTMLCharacterReference.gperf" + {"Oacute;", "Ó"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1504 "HTMLCharacterReference.gperf" + {"nearhk;", "⤤"}, + {""}, +#line 143 "HTMLCharacterReference.gperf" + {"DownRightTeeVector;", "⥟"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1709 "HTMLCharacterReference.gperf" + {"pertenk;", "‱"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2163 "HTMLCharacterReference.gperf" + {"varsubsetneq;", "⊊︀"}, + {""}, + {""}, +#line 1537 "HTMLCharacterReference.gperf" + {"nleftrightarrow;", "↮"}, +#line 2157 "HTMLCharacterReference.gperf" + {"varphi;", "ϕ"}, +#line 1744 "HTMLCharacterReference.gperf" + {"preccurlyeq;", "≼"}, + {""}, +#line 1789 "HTMLCharacterReference.gperf" + {"rangle;", "⟩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1990 "HTMLCharacterReference.gperf" - {"subsetneqq;", "⫋"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2107 "HTMLCharacterReference.gperf" - {"udblac;", "ű"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 486 "HTMLCharacterReference.gperf" - {"RightTee;", "⊢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 217 "HTMLCharacterReference.gperf" - {"HorizontalLine;", "─"}, -#line 2028 "HTMLCharacterReference.gperf" - {"supsim;", "⫈"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 488 "HTMLCharacterReference.gperf" - {"RightTeeVector;", "⥛"}, - {""}, - {""}, - {""}, - {""}, -#line 1948 "HTMLCharacterReference.gperf" - {"spadesuit;", "♠"}, - {""}, - {""}, - {""}, - {""}, -#line 1173 "HTMLCharacterReference.gperf" - {"half;", "½"}, - {""}, - {""}, - {""}, -#line 1893 "HTMLCharacterReference.gperf" - {"scpolint;", "⨓"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1977 "HTMLCharacterReference.gperf" - {"subE;", "⫅"}, - {""}, -#line 1215 "HTMLCharacterReference.gperf" - {"iinfin;", "⧜"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1644 "HTMLCharacterReference.gperf" - {"odblac;", "ő"}, - {""}, - {""}, - {""}, -#line 989 "HTMLCharacterReference.gperf" - {"downharpoonright;", "⇂"}, - {""}, - {""}, - {""}, -#line 1733 "HTMLCharacterReference.gperf" - {"popf;", "𝕡"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2030 "HTMLCharacterReference.gperf" - {"supsup;", "⫖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 433 "HTMLCharacterReference.gperf" - {"OverBrace;", "⏞"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2101 "HTMLCharacterReference.gperf" - {"ubrcy;", "ў"}, -#line 1294 "HTMLCharacterReference.gperf" - {"larrhk;", "↩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 498 "HTMLCharacterReference.gperf" - {"Rightarrow;", "⇒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1890 "HTMLCharacterReference.gperf" - {"scnE;", "⪶"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 139 "HTMLCharacterReference.gperf" - {"DownLeftTeeVector;", "⥞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 77 "HTMLCharacterReference.gperf" - {"CircleDot;", "⊙"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 611 "HTMLCharacterReference.gperf" - {"Vdash;", "⊩"}, - {""}, - {""}, -#line 1731 "HTMLCharacterReference.gperf" - {"pm;", "±"}, - {""}, - {""}, -#line 1475 "HTMLCharacterReference.gperf" - {"nRightarrow;", "⇏"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1847 "HTMLCharacterReference.gperf" - {"ring;", "˚"}, - {""}, -#line 1782 "HTMLCharacterReference.gperf" - {"racute;", "ŕ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"subsetneq;", "⊊"}, +#line 1991 "HTMLCharacterReference.gperf" + {"subsetneqq;", "⫋"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2108 "HTMLCharacterReference.gperf" + {"udblac;", "ű"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 487 "HTMLCharacterReference.gperf" + {"RightTee;", "⊢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 218 "HTMLCharacterReference.gperf" + {"HorizontalLine;", "─"}, +#line 2029 "HTMLCharacterReference.gperf" + {"supsim;", "⫈"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 489 "HTMLCharacterReference.gperf" + {"RightTeeVector;", "⥛"}, + {""}, + {""}, + {""}, + {""}, +#line 1949 "HTMLCharacterReference.gperf" + {"spadesuit;", "♠"}, + {""}, + {""}, + {""}, + {""}, +#line 1174 "HTMLCharacterReference.gperf" + {"half;", "½"}, + {""}, + {""}, + {""}, +#line 1894 "HTMLCharacterReference.gperf" + {"scpolint;", "⨓"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1978 "HTMLCharacterReference.gperf" + {"subE;", "⫅"}, + {""}, +#line 1216 "HTMLCharacterReference.gperf" + {"iinfin;", "⧜"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1645 "HTMLCharacterReference.gperf" + {"odblac;", "ő"}, + {""}, + {""}, + {""}, +#line 990 "HTMLCharacterReference.gperf" + {"downharpoonright;", "⇂"}, + {""}, + {""}, + {""}, +#line 1734 "HTMLCharacterReference.gperf" + {"popf;", "𝕡"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2031 "HTMLCharacterReference.gperf" + {"supsup;", "⫖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 434 "HTMLCharacterReference.gperf" + {"OverBrace;", "⏞"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2102 "HTMLCharacterReference.gperf" + {"ubrcy;", "ў"}, +#line 1295 "HTMLCharacterReference.gperf" + {"larrhk;", "↩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 499 "HTMLCharacterReference.gperf" + {"Rightarrow;", "⇒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1891 "HTMLCharacterReference.gperf" + {"scnE;", "⪶"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 140 "HTMLCharacterReference.gperf" + {"DownLeftTeeVector;", "⥞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 78 "HTMLCharacterReference.gperf" + {"CircleDot;", "⊙"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 612 "HTMLCharacterReference.gperf" - {"Vdashl;", "⫦"}, -#line 1626 "HTMLCharacterReference.gperf" - {"nvltrie;", "⊴⃒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 494 "HTMLCharacterReference.gperf" - {"RightUpVector;", "↾"}, -#line 21 "HTMLCharacterReference.gperf" - {"AElig", "Æ"}, + {"Vdash;", "⊩"}, + {""}, + {""}, +#line 1732 "HTMLCharacterReference.gperf" + {"pm;", "±"}, + {""}, + {""}, +#line 1476 "HTMLCharacterReference.gperf" + {"nRightarrow;", "⇏"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1848 "HTMLCharacterReference.gperf" + {"ring;", "˚"}, + {""}, +#line 1783 "HTMLCharacterReference.gperf" + {"racute;", "ŕ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 613 "HTMLCharacterReference.gperf" + {"Vdashl;", "⫦"}, +#line 1627 "HTMLCharacterReference.gperf" + {"nvltrie;", "⊴⃒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 495 "HTMLCharacterReference.gperf" + {"RightUpVector;", "↾"}, #line 22 "HTMLCharacterReference.gperf" - {"AElig;", "Æ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2163 "HTMLCharacterReference.gperf" - {"varsubsetneqq;", "⫋︀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2093 "HTMLCharacterReference.gperf" - {"twixt;", "≬"}, -#line 2001 "HTMLCharacterReference.gperf" - {"succsim;", "≿"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 425 "HTMLCharacterReference.gperf" - {"Oslash", "Ø"}, + {"AElig", "Æ"}, +#line 23 "HTMLCharacterReference.gperf" + {"AElig;", "Æ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2164 "HTMLCharacterReference.gperf" + {"varsubsetneqq;", "⫋︀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2094 "HTMLCharacterReference.gperf" + {"twixt;", "≬"}, +#line 2002 "HTMLCharacterReference.gperf" + {"succsim;", "≿"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 426 "HTMLCharacterReference.gperf" - {"Oslash;", "Ø"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1822 "HTMLCharacterReference.gperf" - {"rdsh;", "↳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 520 "HTMLCharacterReference.gperf" - {"SmallCircle;", "∘"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 478 "HTMLCharacterReference.gperf" - {"RightArrowBar;", "⇥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 53 "HTMLCharacterReference.gperf" - {"Bernoullis;", "ℬ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 619 "HTMLCharacterReference.gperf" - {"VerticalTilde;", "≀"}, - {""}, - {""}, - {""}, - {""}, -#line 357 "HTMLCharacterReference.gperf" - {"NotEqualTilde;", "≂̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 397 "HTMLCharacterReference.gperf" - {"NotSupersetEqual;", "⊉"}, - {""}, - {""}, - {""}, -#line 1751 "HTMLCharacterReference.gperf" - {"prnE;", "⪵"}, - {""}, - {""}, -#line 1850 "HTMLCharacterReference.gperf" - {"rlhar;", "⇌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1077 "HTMLCharacterReference.gperf" - {"ffllig;", "ffl"}, -#line 2035 "HTMLCharacterReference.gperf" - {"swnwar;", "⤪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2053 "HTMLCharacterReference.gperf" - {"thicksim;", "∼"}, - {""}, - {""}, - {""}, -#line 2095 "HTMLCharacterReference.gperf" - {"twoheadrightarrow;", "↠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2119 "HTMLCharacterReference.gperf" - {"ultri;", "◸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 434 "HTMLCharacterReference.gperf" - {"OverBracket;", "⎴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1318 "HTMLCharacterReference.gperf" - {"ldrdhar;", "⥧"}, - {""}, - {""}, -#line 1441 "HTMLCharacterReference.gperf" - {"mdash;", "—"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1187 "HTMLCharacterReference.gperf" - {"hkswarow;", "⤦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 143 "HTMLCharacterReference.gperf" - {"DownRightVector;", "⇁"}, - {""}, -#line 419 "HTMLCharacterReference.gperf" - {"Omicron;", "Ο"}, + {"Oslash", "Ø"}, +#line 427 "HTMLCharacterReference.gperf" + {"Oslash;", "Ø"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1823 "HTMLCharacterReference.gperf" + {"rdsh;", "↳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 521 "HTMLCharacterReference.gperf" + {"SmallCircle;", "∘"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 479 "HTMLCharacterReference.gperf" + {"RightArrowBar;", "⇥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 54 "HTMLCharacterReference.gperf" + {"Bernoullis;", "ℬ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 620 "HTMLCharacterReference.gperf" + {"VerticalTilde;", "≀"}, + {""}, + {""}, + {""}, + {""}, +#line 358 "HTMLCharacterReference.gperf" + {"NotEqualTilde;", "≂̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 398 "HTMLCharacterReference.gperf" + {"NotSupersetEqual;", "⊉"}, + {""}, + {""}, + {""}, +#line 1752 "HTMLCharacterReference.gperf" + {"prnE;", "⪵"}, + {""}, + {""}, +#line 1851 "HTMLCharacterReference.gperf" + {"rlhar;", "⇌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1078 "HTMLCharacterReference.gperf" + {"ffllig;", "ffl"}, +#line 2036 "HTMLCharacterReference.gperf" + {"swnwar;", "⤪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2054 "HTMLCharacterReference.gperf" + {"thicksim;", "∼"}, + {""}, + {""}, + {""}, +#line 2096 "HTMLCharacterReference.gperf" + {"twoheadrightarrow;", "↠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2120 "HTMLCharacterReference.gperf" + {"ultri;", "◸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 435 "HTMLCharacterReference.gperf" + {"OverBracket;", "⎴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1319 "HTMLCharacterReference.gperf" + {"ldrdhar;", "⥧"}, + {""}, + {""}, +#line 1442 "HTMLCharacterReference.gperf" + {"mdash;", "—"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1188 "HTMLCharacterReference.gperf" + {"hkswarow;", "⤦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 144 "HTMLCharacterReference.gperf" - {"DownRightVectorBar;", "⥗"}, -#line 2098 "HTMLCharacterReference.gperf" - {"uacute", "ú"}, + {"DownRightVector;", "⇁"}, + {""}, +#line 420 "HTMLCharacterReference.gperf" + {"Omicron;", "Ο"}, +#line 145 "HTMLCharacterReference.gperf" + {"DownRightVectorBar;", "⥗"}, #line 2099 "HTMLCharacterReference.gperf" - {"uacute;", "ú"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 487 "HTMLCharacterReference.gperf" - {"RightTeeArrow;", "↦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 432 "HTMLCharacterReference.gperf" - {"OverBar;", "‾"}, -#line 1488 "HTMLCharacterReference.gperf" - {"naturals;", "ℕ"}, - {""}, - {""}, -#line 1265 "HTMLCharacterReference.gperf" - {"kcedil;", "ķ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 493 "HTMLCharacterReference.gperf" - {"RightUpTeeVector;", "⥜"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 764 "HTMLCharacterReference.gperf" - {"blacktriangledown;", "▾"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 358 "HTMLCharacterReference.gperf" - {"NotExists;", "∄"}, -#line 223 "HTMLCharacterReference.gperf" - {"IJlig;", "IJ"}, -#line 305 "HTMLCharacterReference.gperf" - {"LessGreater;", "≶"}, - {""}, - {""}, - {""}, - {""}, -#line 1636 "HTMLCharacterReference.gperf" - {"oacute", "ó"}, + {"uacute", "ú"}, +#line 2100 "HTMLCharacterReference.gperf" + {"uacute;", "ú"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 488 "HTMLCharacterReference.gperf" + {"RightTeeArrow;", "↦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 433 "HTMLCharacterReference.gperf" + {"OverBar;", "‾"}, +#line 1489 "HTMLCharacterReference.gperf" + {"naturals;", "ℕ"}, + {""}, + {""}, +#line 1266 "HTMLCharacterReference.gperf" + {"kcedil;", "ķ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 494 "HTMLCharacterReference.gperf" + {"RightUpTeeVector;", "⥜"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 765 "HTMLCharacterReference.gperf" + {"blacktriangledown;", "▾"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 359 "HTMLCharacterReference.gperf" + {"NotExists;", "∄"}, +#line 224 "HTMLCharacterReference.gperf" + {"IJlig;", "IJ"}, +#line 306 "HTMLCharacterReference.gperf" + {"LessGreater;", "≶"}, + {""}, + {""}, + {""}, + {""}, #line 1637 "HTMLCharacterReference.gperf" - {"oacute;", "ó"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1757 "HTMLCharacterReference.gperf" - {"profsurf;", "⌓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1701 "HTMLCharacterReference.gperf" - {"parsl;", "⫽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 277 "HTMLCharacterReference.gperf" - {"LeftAngleBracket;", "⟨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1945 "HTMLCharacterReference.gperf" - {"solbar;", "⌿"}, - {""}, - {""}, - {""}, - {""}, -#line 78 "HTMLCharacterReference.gperf" - {"CircleMinus;", "⊖"}, - {""}, - {""}, - {""}, - {""}, -#line 91 "HTMLCharacterReference.gperf" - {"CounterClockwiseContourIntegral;", "∳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2017 "HTMLCharacterReference.gperf" - {"suphsub;", "⫗"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 883 "HTMLCharacterReference.gperf" - {"cirscir;", "⧂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1487 "HTMLCharacterReference.gperf" - {"natural;", "♮"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 110 "HTMLCharacterReference.gperf" - {"DiacriticalDot;", "˙"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 236 "HTMLCharacterReference.gperf" - {"ImaginaryI;", "ⅈ"}, - {""}, - {""}, - {""}, - {""}, -#line 591 "HTMLCharacterReference.gperf" - {"UpArrowBar;", "⤒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 394 "HTMLCharacterReference.gperf" - {"NotSucceedsSlantEqual;", "⋡"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1906 "HTMLCharacterReference.gperf" - {"seswar;", "⤩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 422 "HTMLCharacterReference.gperf" - {"OpenCurlyQuote;", "‘"}, - {""}, - {""}, -#line 2071 "HTMLCharacterReference.gperf" - {"topfork;", "⫚"}, - {""}, - {""}, -#line 435 "HTMLCharacterReference.gperf" - {"OverParenthesis;", "⏜"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"oacute", "ó"}, +#line 1638 "HTMLCharacterReference.gperf" + {"oacute;", "ó"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1758 "HTMLCharacterReference.gperf" + {"profsurf;", "⌓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1702 "HTMLCharacterReference.gperf" + {"parsl;", "⫽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 278 "HTMLCharacterReference.gperf" + {"LeftAngleBracket;", "⟨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1946 "HTMLCharacterReference.gperf" + {"solbar;", "⌿"}, + {""}, + {""}, + {""}, + {""}, +#line 79 "HTMLCharacterReference.gperf" + {"CircleMinus;", "⊖"}, + {""}, + {""}, + {""}, + {""}, +#line 92 "HTMLCharacterReference.gperf" + {"CounterClockwiseContourIntegral;", "∳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2018 "HTMLCharacterReference.gperf" + {"suphsub;", "⫗"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 884 "HTMLCharacterReference.gperf" + {"cirscir;", "⧂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1488 "HTMLCharacterReference.gperf" + {"natural;", "♮"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 111 "HTMLCharacterReference.gperf" - {"DiacriticalDoubleAcute;", "˝"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1800 "HTMLCharacterReference.gperf" - {"rarrsim;", "⥴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2042 "HTMLCharacterReference.gperf" - {"tcedil;", "ţ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1848 "HTMLCharacterReference.gperf" - {"risingdotseq;", "≓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1648 "HTMLCharacterReference.gperf" - {"oelig;", "œ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 331 "HTMLCharacterReference.gperf" - {"MinusPlus;", "∓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1913 "HTMLCharacterReference.gperf" - {"shchcy;", "щ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1699 "HTMLCharacterReference.gperf" - {"parallel;", "∥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 476 "HTMLCharacterReference.gperf" - {"RightAngleBracket;", "⟩"}, - {""}, - {""}, - {""}, -#line 1686 "HTMLCharacterReference.gperf" - {"oslash", "ø"}, -#line 1687 "HTMLCharacterReference.gperf" - {"oslash;", "ø"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1748 "HTMLCharacterReference.gperf" - {"precsim;", "≾"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1582 "HTMLCharacterReference.gperf" - {"nshortparallel;", "∦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"DiacriticalDot;", "˙"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 237 "HTMLCharacterReference.gperf" + {"ImaginaryI;", "ⅈ"}, + {""}, + {""}, + {""}, + {""}, #line 592 "HTMLCharacterReference.gperf" - {"UpArrowDownArrow;", "⇅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2000 "HTMLCharacterReference.gperf" - {"succnsim;", "⋩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1665 "HTMLCharacterReference.gperf" - {"omicron;", "ο"}, - {""}, - {""}, - {""}, - {""}, -#line 881 "HTMLCharacterReference.gperf" - {"cirfnint;", "⨐"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 391 "HTMLCharacterReference.gperf" - {"NotSubsetEqual;", "⊈"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2036 "HTMLCharacterReference.gperf" - {"szlig", "ß"}, + {"UpArrowBar;", "⤒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 395 "HTMLCharacterReference.gperf" + {"NotSucceedsSlantEqual;", "⋡"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1907 "HTMLCharacterReference.gperf" + {"seswar;", "⤩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 423 "HTMLCharacterReference.gperf" + {"OpenCurlyQuote;", "‘"}, + {""}, + {""}, +#line 2072 "HTMLCharacterReference.gperf" + {"topfork;", "⫚"}, + {""}, + {""}, +#line 436 "HTMLCharacterReference.gperf" + {"OverParenthesis;", "⏜"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 112 "HTMLCharacterReference.gperf" + {"DiacriticalDoubleAcute;", "˝"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1801 "HTMLCharacterReference.gperf" + {"rarrsim;", "⥴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2043 "HTMLCharacterReference.gperf" + {"tcedil;", "ţ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1849 "HTMLCharacterReference.gperf" + {"risingdotseq;", "≓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1649 "HTMLCharacterReference.gperf" + {"oelig;", "œ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 332 "HTMLCharacterReference.gperf" + {"MinusPlus;", "∓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1914 "HTMLCharacterReference.gperf" + {"shchcy;", "щ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1700 "HTMLCharacterReference.gperf" + {"parallel;", "∥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 477 "HTMLCharacterReference.gperf" + {"RightAngleBracket;", "⟩"}, + {""}, + {""}, + {""}, +#line 1687 "HTMLCharacterReference.gperf" + {"oslash", "ø"}, +#line 1688 "HTMLCharacterReference.gperf" + {"oslash;", "ø"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1749 "HTMLCharacterReference.gperf" + {"precsim;", "≾"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1583 "HTMLCharacterReference.gperf" + {"nshortparallel;", "∦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 593 "HTMLCharacterReference.gperf" + {"UpArrowDownArrow;", "⇅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2001 "HTMLCharacterReference.gperf" + {"succnsim;", "⋩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1666 "HTMLCharacterReference.gperf" + {"omicron;", "ο"}, + {""}, + {""}, + {""}, + {""}, +#line 882 "HTMLCharacterReference.gperf" + {"cirfnint;", "⨐"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 392 "HTMLCharacterReference.gperf" + {"NotSubsetEqual;", "⊈"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2037 "HTMLCharacterReference.gperf" - {"szlig;", "ß"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1921 "HTMLCharacterReference.gperf" - {"sigmav;", "ς"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1755 "HTMLCharacterReference.gperf" - {"profalar;", "⌮"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1732 "HTMLCharacterReference.gperf" - {"pointint;", "⨕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1888 "HTMLCharacterReference.gperf" - {"scedil;", "ş"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 314 "HTMLCharacterReference.gperf" - {"LongLeftRightArrow;", "⟷"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1852 "HTMLCharacterReference.gperf" - {"rmoust;", "⎱"}, - {""}, -#line 2091 "HTMLCharacterReference.gperf" - {"tshcy;", "ћ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2129 "HTMLCharacterReference.gperf" - {"uplus;", "⊎"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1778 "HTMLCharacterReference.gperf" - {"rAtail;", "⤜"}, - {""}, -#line 2029 "HTMLCharacterReference.gperf" - {"supsub;", "⫔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1072 "HTMLCharacterReference.gperf" - {"fallingdotseq;", "≒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 65 "HTMLCharacterReference.gperf" - {"CapitalDifferentialD;", "ⅅ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1671 "HTMLCharacterReference.gperf" - {"oplus;", "⊕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 283 "HTMLCharacterReference.gperf" - {"LeftDownTeeVector;", "⥡"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1991 "HTMLCharacterReference.gperf" - {"subsim;", "⫇"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 560 "HTMLCharacterReference.gperf" - {"Tilde;", "∼"}, - {""}, -#line 618 "HTMLCharacterReference.gperf" - {"VerticalSeparator;", "❘"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1436 "HTMLCharacterReference.gperf" - {"mapstoleft;", "↤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 492 "HTMLCharacterReference.gperf" - {"RightUpDownVector;", "⥏"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1993 "HTMLCharacterReference.gperf" - {"subsup;", "⫓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1892 "HTMLCharacterReference.gperf" - {"scnsim;", "⋩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1719 "HTMLCharacterReference.gperf" - {"plankv;", "ℏ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2050 "HTMLCharacterReference.gperf" - {"thetasym;", "ϑ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 115 "HTMLCharacterReference.gperf" - {"DifferentialD;", "ⅆ"}, - {""}, -#line 366 "HTMLCharacterReference.gperf" - {"NotHumpDownHump;", "≎̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2161 "HTMLCharacterReference.gperf" - {"varsigma;", "ς"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"szlig", "ß"}, +#line 2038 "HTMLCharacterReference.gperf" + {"szlig;", "ß"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1922 "HTMLCharacterReference.gperf" + {"sigmav;", "ς"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1756 "HTMLCharacterReference.gperf" + {"profalar;", "⌮"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1733 "HTMLCharacterReference.gperf" + {"pointint;", "⨕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1889 "HTMLCharacterReference.gperf" + {"scedil;", "ş"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 315 "HTMLCharacterReference.gperf" + {"LongLeftRightArrow;", "⟷"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1853 "HTMLCharacterReference.gperf" + {"rmoust;", "⎱"}, + {""}, +#line 2092 "HTMLCharacterReference.gperf" + {"tshcy;", "ћ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2130 "HTMLCharacterReference.gperf" + {"uplus;", "⊎"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1779 "HTMLCharacterReference.gperf" + {"rAtail;", "⤜"}, + {""}, +#line 2030 "HTMLCharacterReference.gperf" + {"supsub;", "⫔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1073 "HTMLCharacterReference.gperf" + {"fallingdotseq;", "≒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 66 "HTMLCharacterReference.gperf" + {"CapitalDifferentialD;", "ⅅ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1672 "HTMLCharacterReference.gperf" + {"oplus;", "⊕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 284 "HTMLCharacterReference.gperf" + {"LeftDownTeeVector;", "⥡"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1992 "HTMLCharacterReference.gperf" + {"subsim;", "⫇"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 561 "HTMLCharacterReference.gperf" + {"Tilde;", "∼"}, + {""}, +#line 619 "HTMLCharacterReference.gperf" + {"VerticalSeparator;", "❘"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1437 "HTMLCharacterReference.gperf" + {"mapstoleft;", "↤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 493 "HTMLCharacterReference.gperf" + {"RightUpDownVector;", "⥏"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1994 "HTMLCharacterReference.gperf" + {"subsup;", "⫓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1893 "HTMLCharacterReference.gperf" + {"scnsim;", "⋩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1720 "HTMLCharacterReference.gperf" - {"plus;", "+"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1727 "HTMLCharacterReference.gperf" - {"plusmn", "±"}, + {"plankv;", "ℏ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2051 "HTMLCharacterReference.gperf" + {"thetasym;", "ϑ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 116 "HTMLCharacterReference.gperf" + {"DifferentialD;", "ⅆ"}, + {""}, +#line 367 "HTMLCharacterReference.gperf" + {"NotHumpDownHump;", "≎̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2162 "HTMLCharacterReference.gperf" + {"varsigma;", "ς"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1721 "HTMLCharacterReference.gperf" + {"plus;", "+"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1728 "HTMLCharacterReference.gperf" - {"plusmn;", "±"}, - {""}, -#line 1747 "HTMLCharacterReference.gperf" - {"precnsim;", "⋨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 765 "HTMLCharacterReference.gperf" - {"blacktriangleleft;", "◂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1753 "HTMLCharacterReference.gperf" - {"prnsim;", "⋨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1814 "HTMLCharacterReference.gperf" - {"rcedil;", "ŗ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1937 "HTMLCharacterReference.gperf" - {"smid;", "∣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 482 "HTMLCharacterReference.gperf" - {"RightDownTeeVector;", "⥝"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1726 "HTMLCharacterReference.gperf" - {"pluse;", "⩲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1730 "HTMLCharacterReference.gperf" - {"plustwo;", "⨧"}, - {""}, - {""}, - {""}, - {""}, -#line 1845 "HTMLCharacterReference.gperf" - {"rightsquigarrow;", "↝"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 436 "HTMLCharacterReference.gperf" - {"PartialD;", "∂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"plusmn", "±"}, +#line 1729 "HTMLCharacterReference.gperf" + {"plusmn;", "±"}, + {""}, +#line 1748 "HTMLCharacterReference.gperf" + {"precnsim;", "⋨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 766 "HTMLCharacterReference.gperf" + {"blacktriangleleft;", "◂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1754 "HTMLCharacterReference.gperf" + {"prnsim;", "⋨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1815 "HTMLCharacterReference.gperf" + {"rcedil;", "ŗ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1938 "HTMLCharacterReference.gperf" + {"smid;", "∣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 483 "HTMLCharacterReference.gperf" + {"RightDownTeeVector;", "⥝"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1727 "HTMLCharacterReference.gperf" + {"pluse;", "⩲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1731 "HTMLCharacterReference.gperf" + {"plustwo;", "⨧"}, + {""}, + {""}, + {""}, + {""}, +#line 1846 "HTMLCharacterReference.gperf" + {"rightsquigarrow;", "↝"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 437 "HTMLCharacterReference.gperf" + {"PartialD;", "∂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 84 "HTMLCharacterReference.gperf" + {"CloseCurlyQuote;", "’"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 989 "HTMLCharacterReference.gperf" + {"downharpoonleft;", "⇃"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2057 "HTMLCharacterReference.gperf" + {"thksim;", "∼"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1034 "HTMLCharacterReference.gperf" + {"emptyv;", "∅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2033 "HTMLCharacterReference.gperf" + {"swarhk;", "⤦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 350 "HTMLCharacterReference.gperf" + {"NonBreakingSpace;", " "}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 83 "HTMLCharacterReference.gperf" - {"CloseCurlyQuote;", "’"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 988 "HTMLCharacterReference.gperf" - {"downharpoonleft;", "⇃"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2056 "HTMLCharacterReference.gperf" - {"thksim;", "∼"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1033 "HTMLCharacterReference.gperf" - {"emptyv;", "∅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2032 "HTMLCharacterReference.gperf" - {"swarhk;", "⤦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 349 "HTMLCharacterReference.gperf" - {"NonBreakingSpace;", " "}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 82 "HTMLCharacterReference.gperf" - {"CloseCurlyDoubleQuote;", "”"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1722 "HTMLCharacterReference.gperf" - {"plusb;", "⊞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1220 "HTMLCharacterReference.gperf" - {"imagline;", "ℐ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 383 "HTMLCharacterReference.gperf" - {"NotRightTriangle;", "⋫"}, - {""}, - {""}, + {"CloseCurlyDoubleQuote;", "”"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1723 "HTMLCharacterReference.gperf" + {"plusb;", "⊞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1221 "HTMLCharacterReference.gperf" + {"imagline;", "ℐ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 384 "HTMLCharacterReference.gperf" - {"NotRightTriangleBar;", "⧐̸"}, - {""}, + {"NotRightTriangle;", "⋫"}, + {""}, + {""}, #line 385 "HTMLCharacterReference.gperf" - {"NotRightTriangleEqual;", "⋭"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2075 "HTMLCharacterReference.gperf" - {"triangle;", "▵"}, -#line 2079 "HTMLCharacterReference.gperf" - {"triangleq;", "≜"}, - {""}, - {""}, -#line 2077 "HTMLCharacterReference.gperf" - {"triangleleft;", "◃"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"NotRightTriangleBar;", "⧐̸"}, + {""}, +#line 386 "HTMLCharacterReference.gperf" + {"NotRightTriangleEqual;", "⋭"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2076 "HTMLCharacterReference.gperf" - {"triangledown;", "▿"}, -#line 1842 "HTMLCharacterReference.gperf" - {"rightleftarrows;", "⇄"}, - {""}, - {""}, -#line 496 "HTMLCharacterReference.gperf" - {"RightVector;", "⇀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"triangle;", "▵"}, +#line 2080 "HTMLCharacterReference.gperf" + {"triangleq;", "≜"}, + {""}, + {""}, #line 2078 "HTMLCharacterReference.gperf" - {"trianglelefteq;", "⊴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 483 "HTMLCharacterReference.gperf" - {"RightDownVector;", "⇂"}, - {""}, - {""}, -#line 484 "HTMLCharacterReference.gperf" - {"RightDownVectorBar;", "⥕"}, - {""}, - {""}, - {""}, -#line 1725 "HTMLCharacterReference.gperf" - {"plusdu;", "⨥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 393 "HTMLCharacterReference.gperf" - {"NotSucceedsEqual;", "⪰̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1724 "HTMLCharacterReference.gperf" - {"plusdo;", "∔"}, - {""}, - {""}, - {""}, - {""}, -#line 382 "HTMLCharacterReference.gperf" - {"NotReverseElement;", "∌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 395 "HTMLCharacterReference.gperf" - {"NotSucceedsTilde;", "≿̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"triangleleft;", "◃"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2077 "HTMLCharacterReference.gperf" + {"triangledown;", "▿"}, #line 1843 "HTMLCharacterReference.gperf" - {"rightleftharpoons;", "⇌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1936 "HTMLCharacterReference.gperf" - {"smeparsl;", "⧤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 421 "HTMLCharacterReference.gperf" - {"OpenCurlyDoubleQuote;", "“"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1974 "HTMLCharacterReference.gperf" - {"straightphi;", "ϕ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1900 "HTMLCharacterReference.gperf" - {"searhk;", "⤥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1841 "HTMLCharacterReference.gperf" - {"rightharpoonup;", "⇀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1666 "HTMLCharacterReference.gperf" - {"omid;", "⦶"}, - {""}, - {""}, - {""}, - {""}, -#line 418 "HTMLCharacterReference.gperf" - {"Omega;", "Ω"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1992 "HTMLCharacterReference.gperf" - {"subsub;", "⫕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 367 "HTMLCharacterReference.gperf" - {"NotHumpEqual;", "≏̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1853 "HTMLCharacterReference.gperf" - {"rmoustache;", "⎱"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1715 "HTMLCharacterReference.gperf" - {"pitchfork;", "⋔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2080 "HTMLCharacterReference.gperf" - {"triangleright;", "▹"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1830 "HTMLCharacterReference.gperf" - {"rfisht;", "⥽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1840 "HTMLCharacterReference.gperf" - {"rightharpoondown;", "⇁"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 407 "HTMLCharacterReference.gperf" - {"OElig;", "Œ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 304 "HTMLCharacterReference.gperf" - {"LessFullEqual;", "≦"}, - {""}, + {"rightleftarrows;", "⇄"}, + {""}, + {""}, +#line 497 "HTMLCharacterReference.gperf" + {"RightVector;", "⇀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2079 "HTMLCharacterReference.gperf" + {"trianglelefteq;", "⊴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 484 "HTMLCharacterReference.gperf" + {"RightDownVector;", "⇂"}, + {""}, + {""}, #line 485 "HTMLCharacterReference.gperf" - {"RightFloor;", "⌋"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1700 "HTMLCharacterReference.gperf" - {"parsim;", "⫳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1643 "HTMLCharacterReference.gperf" - {"odash;", "⊝"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1717 "HTMLCharacterReference.gperf" - {"planck;", "ℏ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2081 "HTMLCharacterReference.gperf" - {"trianglerighteq;", "⊵"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2109 "HTMLCharacterReference.gperf" - {"ufisht;", "⥾"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2016 "HTMLCharacterReference.gperf" - {"suphsol;", "⟉"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1442 "HTMLCharacterReference.gperf" - {"measuredangle;", "∡"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2059 "HTMLCharacterReference.gperf" - {"tilde;", "˜"}, - {""}, + {"RightDownVectorBar;", "⥕"}, + {""}, + {""}, + {""}, +#line 1726 "HTMLCharacterReference.gperf" + {"plusdu;", "⨥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 394 "HTMLCharacterReference.gperf" + {"NotSucceedsEqual;", "⪰̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1725 "HTMLCharacterReference.gperf" + {"plusdo;", "∔"}, + {""}, + {""}, + {""}, + {""}, +#line 383 "HTMLCharacterReference.gperf" + {"NotReverseElement;", "∌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 396 "HTMLCharacterReference.gperf" + {"NotSucceedsTilde;", "≿̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1844 "HTMLCharacterReference.gperf" + {"rightleftharpoons;", "⇌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1937 "HTMLCharacterReference.gperf" + {"smeparsl;", "⧤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 422 "HTMLCharacterReference.gperf" + {"OpenCurlyDoubleQuote;", "“"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1975 "HTMLCharacterReference.gperf" + {"straightphi;", "ϕ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1901 "HTMLCharacterReference.gperf" + {"searhk;", "⤥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1842 "HTMLCharacterReference.gperf" + {"rightharpoonup;", "⇀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1667 "HTMLCharacterReference.gperf" - {"ominus;", "⊖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2121 "HTMLCharacterReference.gperf" - {"uml", "¨"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"omid;", "⦶"}, + {""}, + {""}, + {""}, + {""}, +#line 419 "HTMLCharacterReference.gperf" + {"Omega;", "Ω"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1993 "HTMLCharacterReference.gperf" + {"subsub;", "⫕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 368 "HTMLCharacterReference.gperf" + {"NotHumpEqual;", "≏̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1854 "HTMLCharacterReference.gperf" + {"rmoustache;", "⎱"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1716 "HTMLCharacterReference.gperf" + {"pitchfork;", "⋔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2081 "HTMLCharacterReference.gperf" + {"triangleright;", "▹"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1831 "HTMLCharacterReference.gperf" + {"rfisht;", "⥽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1841 "HTMLCharacterReference.gperf" + {"rightharpoondown;", "⇁"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 408 "HTMLCharacterReference.gperf" + {"OElig;", "Œ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 305 "HTMLCharacterReference.gperf" + {"LessFullEqual;", "≦"}, + {""}, +#line 486 "HTMLCharacterReference.gperf" + {"RightFloor;", "⌋"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1701 "HTMLCharacterReference.gperf" + {"parsim;", "⫳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1644 "HTMLCharacterReference.gperf" + {"odash;", "⊝"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1718 "HTMLCharacterReference.gperf" + {"planck;", "ℏ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2082 "HTMLCharacterReference.gperf" + {"trianglerighteq;", "⊵"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2110 "HTMLCharacterReference.gperf" + {"ufisht;", "⥾"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2017 "HTMLCharacterReference.gperf" + {"suphsol;", "⟉"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1443 "HTMLCharacterReference.gperf" + {"measuredangle;", "∡"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2060 "HTMLCharacterReference.gperf" + {"tilde;", "˜"}, + {""}, +#line 1668 "HTMLCharacterReference.gperf" + {"ominus;", "⊖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2122 "HTMLCharacterReference.gperf" - {"uml;", "¨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 165 "HTMLCharacterReference.gperf" - {"EmptySmallSquare;", "◻"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 495 "HTMLCharacterReference.gperf" - {"RightUpVectorBar;", "⥔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 182 "HTMLCharacterReference.gperf" - {"FilledSmallSquare;", "◼"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1838 "HTMLCharacterReference.gperf" - {"rightarrow;", "→"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1664 "HTMLCharacterReference.gperf" - {"omega;", "ω"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2189 "HTMLCharacterReference.gperf" - {"vzigzag;", "⦚"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1844 "HTMLCharacterReference.gperf" - {"rightrightarrows;", "⇉"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"uml", "¨"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2123 "HTMLCharacterReference.gperf" + {"uml;", "¨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 166 "HTMLCharacterReference.gperf" + {"EmptySmallSquare;", "◻"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 496 "HTMLCharacterReference.gperf" + {"RightUpVectorBar;", "⥔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 183 "HTMLCharacterReference.gperf" + {"FilledSmallSquare;", "◼"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1839 "HTMLCharacterReference.gperf" + {"rightarrow;", "→"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1665 "HTMLCharacterReference.gperf" + {"omega;", "ω"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2190 "HTMLCharacterReference.gperf" + {"vzigzag;", "⦚"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1845 "HTMLCharacterReference.gperf" + {"rightrightarrows;", "⇉"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 243 "HTMLCharacterReference.gperf" + {"InvisibleTimes;", "⁢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 341 "HTMLCharacterReference.gperf" + {"NegativeMediumSpace;", "​"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 442 "HTMLCharacterReference.gperf" + {"PlusMinus;", "±"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 114 "HTMLCharacterReference.gperf" + {"DiacriticalTilde;", "˜"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 110 "HTMLCharacterReference.gperf" + {"DiacriticalAcute;", "´"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 309 "HTMLCharacterReference.gperf" + {"LessTilde;", "≲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1798 "HTMLCharacterReference.gperf" + {"rarrhk;", "↪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2095 "HTMLCharacterReference.gperf" + {"twoheadleftarrow;", "↞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1757 "HTMLCharacterReference.gperf" + {"profline;", "⌒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1722 "HTMLCharacterReference.gperf" + {"plusacir;", "⨣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 490 "HTMLCharacterReference.gperf" + {"RightTriangle;", "⊳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1936 "HTMLCharacterReference.gperf" + {"smashp;", "⨳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 242 "HTMLCharacterReference.gperf" - {"InvisibleTimes;", "⁢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 340 "HTMLCharacterReference.gperf" - {"NegativeMediumSpace;", "​"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 441 "HTMLCharacterReference.gperf" - {"PlusMinus;", "±"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 113 "HTMLCharacterReference.gperf" - {"DiacriticalTilde;", "˜"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 109 "HTMLCharacterReference.gperf" - {"DiacriticalAcute;", "´"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 308 "HTMLCharacterReference.gperf" - {"LessTilde;", "≲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1797 "HTMLCharacterReference.gperf" - {"rarrhk;", "↪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2094 "HTMLCharacterReference.gperf" - {"twoheadleftarrow;", "↞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1756 "HTMLCharacterReference.gperf" - {"profline;", "⌒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1721 "HTMLCharacterReference.gperf" - {"plusacir;", "⨣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 489 "HTMLCharacterReference.gperf" - {"RightTriangle;", "⊳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1935 "HTMLCharacterReference.gperf" - {"smashp;", "⨳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 241 "HTMLCharacterReference.gperf" - {"InvisibleComma;", "⁣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1973 "HTMLCharacterReference.gperf" - {"straightepsilon;", "ϵ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 480 "HTMLCharacterReference.gperf" - {"RightCeiling;", "⌉"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 561 "HTMLCharacterReference.gperf" - {"TildeEqual;", "≃"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 497 "HTMLCharacterReference.gperf" - {"RightVectorBar;", "⥓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 563 "HTMLCharacterReference.gperf" - {"TildeTilde;", "≈"}, - {""}, - {""}, + {"InvisibleComma;", "⁣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1974 "HTMLCharacterReference.gperf" + {"straightepsilon;", "ϵ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 481 "HTMLCharacterReference.gperf" - {"RightDoubleBracket;", "⟧"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 112 "HTMLCharacterReference.gperf" - {"DiacriticalGrave;", "`"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 183 "HTMLCharacterReference.gperf" - {"FilledVerySmallSquare;", "▪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1718 "HTMLCharacterReference.gperf" - {"planckh;", "ℎ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1729 "HTMLCharacterReference.gperf" - {"plussim;", "⨦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1723 "HTMLCharacterReference.gperf" - {"pluscir;", "⨢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 166 "HTMLCharacterReference.gperf" - {"EmptyVerySmallSquare;", "▫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1878 "HTMLCharacterReference.gperf" - {"ruluhar;", "⥨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 594 "HTMLCharacterReference.gperf" - {"UpEquilibrium;", "⥮"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 504 "HTMLCharacterReference.gperf" - {"RuleDelayed;", "⧴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"RightCeiling;", "⌉"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 562 "HTMLCharacterReference.gperf" - {"TildeFullEqual;", "≅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1839 "HTMLCharacterReference.gperf" - {"rightarrowtail;", "↣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"TildeEqual;", "≃"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 498 "HTMLCharacterReference.gperf" + {"RightVectorBar;", "⥓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 564 "HTMLCharacterReference.gperf" + {"TildeTilde;", "≈"}, + {""}, + {""}, +#line 482 "HTMLCharacterReference.gperf" + {"RightDoubleBracket;", "⟧"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 113 "HTMLCharacterReference.gperf" + {"DiacriticalGrave;", "`"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 184 "HTMLCharacterReference.gperf" + {"FilledVerySmallSquare;", "▪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1719 "HTMLCharacterReference.gperf" + {"planckh;", "ℎ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1730 "HTMLCharacterReference.gperf" + {"plussim;", "⨦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1724 "HTMLCharacterReference.gperf" + {"pluscir;", "⨢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 167 "HTMLCharacterReference.gperf" + {"EmptyVerySmallSquare;", "▫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1879 "HTMLCharacterReference.gperf" + {"ruluhar;", "⥨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 595 "HTMLCharacterReference.gperf" + {"UpEquilibrium;", "⥮"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 505 "HTMLCharacterReference.gperf" + {"RuleDelayed;", "⧴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 563 "HTMLCharacterReference.gperf" + {"TildeFullEqual;", "≅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1840 "HTMLCharacterReference.gperf" + {"rightarrowtail;", "↣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 492 "HTMLCharacterReference.gperf" + {"RightTriangleEqual;", "⊵"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1847 "HTMLCharacterReference.gperf" + {"rightthreetimes;", "⋌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 491 "HTMLCharacterReference.gperf" - {"RightTriangleEqual;", "⊵"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1846 "HTMLCharacterReference.gperf" - {"rightthreetimes;", "⋌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 490 "HTMLCharacterReference.gperf" - {"RightTriangleBar;", "⧐"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2088 "HTMLCharacterReference.gperf" - {"trpezium;", "⏢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1819 "HTMLCharacterReference.gperf" - {"rdldhar;", "⥩"}}; + {"RightTriangleBar;", "⧐"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2089 "HTMLCharacterReference.gperf" + {"trpezium;", "⏢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1820 "HTMLCharacterReference.gperf" + {"rdldhar;", "⥩"}}; +const struct NameAndGlyph * HTMLCharacterHash::Lookup(const char * str, size_t len) +{ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { unsigned int key = hash(str, len); @@ -17872,6 +17861,29 @@ const struct NameAndGlyph * HTMLCharacterHash::Lookup(const char * str, size_t l } return 0; } -#line 2252 "HTMLCharacterReference.gperf" +#line 2253 "HTMLCharacterReference.gperf" + + +[[maybe_unused]] static constexpr bool html_entity_expansion_within_6_5 = []() constexpr +{ + for (const auto & entry : wordlist) + { + if (entry.glyph == nullptr) + continue; + size_t name_len = 0; + while (entry.name[name_len] != '\0') + ++name_len; + size_t glyph_len = 0; + while (entry.glyph[glyph_len] != '\0') + ++glyph_len; + if (glyph_len * 5 > (name_len + 1) * 6) + return false; + } + return true; +}(); +static_assert( + html_entity_expansion_within_6_5, + "An HTML entity decodes to more than 6/5 of its byte length; " + "update the output buffer size in decodeHTMLComponent.cpp"); // NOLINTEND(google-runtime-int,hicpp-use-nullptr,modernize-use-nullptr,modernize-macro-to-enum) diff --git a/src/Functions/HTMLCharacterReference.gperf b/src/Functions/HTMLCharacterReference.gperf index c2ff4505832c..36c3e0785c7d 100644 --- a/src/Functions/HTMLCharacterReference.gperf +++ b/src/Functions/HTMLCharacterReference.gperf @@ -4,6 +4,7 @@ %readonly-tables %includes %compare-strncmp +%global-table %{ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" @@ -2250,4 +2251,27 @@ const char *glyph; "zwj;", "‍" "zwnj;", "‌" %% + +[[maybe_unused]] static constexpr bool html_entity_expansion_within_6_5 = []() constexpr +{ + for (const auto & entry : wordlist) + { + if (entry.glyph == nullptr) + continue; + size_t name_len = 0; + while (entry.name[name_len] != '\0') + ++name_len; + size_t glyph_len = 0; + while (entry.glyph[glyph_len] != '\0') + ++glyph_len; + if (glyph_len * 5 > (name_len + 1) * 6) + return false; + } + return true; +}(); +static_assert( + html_entity_expansion_within_6_5, + "An HTML entity decodes to more than 6/5 of its byte length; " + "update the output buffer size in decodeHTMLComponent.cpp"); + // NOLINTEND(google-runtime-int,hicpp-use-nullptr,modernize-use-nullptr,modernize-macro-to-enum) diff --git a/src/Functions/HTMLCharacterReference.sh b/src/Functions/HTMLCharacterReference.sh index 3d90a90b6bcb..76259b5cbc8d 100755 --- a/src/Functions/HTMLCharacterReference.sh +++ b/src/Functions/HTMLCharacterReference.sh @@ -6,6 +6,7 @@ echo '%language=C++ %readonly-tables %includes %compare-strncmp +%global-table %{ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" @@ -24,4 +25,35 @@ const char *glyph; # character reference as available at https://html.spec.whatwg.org/multipage/named-characters.html curl -X GET https://html.spec.whatwg.org/entities.json | jq -r 'keys[] as $k | "\"\($k)\", \(.[$k] | .characters|tojson)"' | sed 's/^"&/"/' >> HTMLCharacterReference.gperf echo '%%' >> HTMLCharacterReference.gperf + +# decodeHTMLComponent sizes its output buffer assuming an entity decodes to at most 6/5 of the bytes +# it occupies in the input ('&' + name, where name includes the trailing ';'). `≫⃒`/`≪⃒` +# (5 bytes -> 6-byte UTF-8) hit that bound exactly. Verify it at compile time over the whole table so +# a newer entity list cannot silently break the buffer sizing. (`%global-table` puts `wordlist` at +# file scope so this can reference it; the CMake target makes it `constexpr`.) +cat >> HTMLCharacterReference.gperf <<'CPP' + +[[maybe_unused]] static constexpr bool html_entity_expansion_within_6_5 = []() constexpr +{ + for (const auto & entry : wordlist) + { + if (entry.glyph == nullptr) + continue; + size_t name_len = 0; + while (entry.name[name_len] != '\0') + ++name_len; + size_t glyph_len = 0; + while (entry.glyph[glyph_len] != '\0') + ++glyph_len; + if (glyph_len * 5 > (name_len + 1) * 6) + return false; + } + return true; +}(); +static_assert( + html_entity_expansion_within_6_5, + "An HTML entity decodes to more than 6/5 of its byte length; " + "update the output buffer size in decodeHTMLComponent.cpp"); +CPP + echo '// NOLINTEND(google-runtime-int,hicpp-use-nullptr,modernize-use-nullptr,modernize-macro-to-enum)' >> HTMLCharacterReference.gperf diff --git a/src/Functions/array/arrayIndex.h b/src/Functions/array/arrayIndex.h index 162fd90d7bec..4459f82fd5e7 100644 --- a/src/Functions/array/arrayIndex.h +++ b/src/Functions/array/arrayIndex.h @@ -865,6 +865,15 @@ class FunctionArrayIndex : public IFunction arguments_copy[0].type = std::move(array_type); arguments_copy[0].name = arguments[0].name; + /// executeImpl strips LowCardinality before executeArrayImpl, but the Map path bypasses it. + /// Strip here too so executeArrayImpl sees a ColumnNullable lookup column and fills null_map_item, + /// keeping null-needle semantics identical to the plain array path. + for (auto & argument : arguments_copy) + { + argument.column = recursiveRemoveLowCardinality(argument.column); + argument.type = recursiveRemoveLowCardinality(argument.type); + } + return executeArrayImpl(arguments_copy, result_type); } diff --git a/src/Functions/decodeHTMLComponent.cpp b/src/Functions/decodeHTMLComponent.cpp index 0212d448c3ec..9e4e8bd39b9a 100644 --- a/src/Functions/decodeHTMLComponent.cpp +++ b/src/Functions/decodeHTMLComponent.cpp @@ -31,10 +31,13 @@ namespace ColumnString::Offsets & res_offsets, size_t input_rows_count) { - /// The size of result is always not more than the size of source. - /// Because entities decodes to the shorter byte sequence. - /// Example: &#xx... &#xx... will decode to UTF-8 byte sequence not longer than 4 bytes. - res_data.resize(data.size()); + /// Most entities decode to a byte sequence not longer than the entity itself, but a few + /// expand: `≫⃒` and `≪⃒` are 5 bytes and decode to a 6-byte UTF-8 sequence + /// (U+226B/U+226A followed by the combining U+20D2). That is the largest expansion among + /// all entities, so the worst case is 6/5 of the input. Size the buffer accordingly (plus + /// a small constant for the up-to-15-byte overwrite of memcpySmallAllowReadWriteOverflow15 + /// at the end of the buffer) to avoid a heap buffer overflow. + res_data.resize(data.size() + data.size() / 5 + 64); res_offsets.resize(input_rows_count); diff --git a/src/Functions/geometryConverters.h b/src/Functions/geometryConverters.h index c812c58db4e3..5565ef689972 100644 --- a/src/Functions/geometryConverters.h +++ b/src/Functions/geometryConverters.h @@ -28,20 +28,24 @@ namespace ErrorCodes extern const int ILLEGAL_TYPE_OF_ARGUMENT; } +/// Use AllocatorWithMemoryTracking so that building geometries (in particular parsing untrusted +/// WKB/WKT, where element counts come straight off the wire) charges the MemoryTracker through its +/// throwing path. Otherwise a declared-but-absent element count drives a large `reserve` that +/// `max_memory_usage` does not bound (the default container tracking is non-throwing). template -using LineString = boost::geometry::model::linestring; +using LineString = boost::geometry::model::linestring; template -using MultiLineString = boost::geometry::model::multi_linestring>; +using MultiLineString = boost::geometry::model::multi_linestring, std::vector, AllocatorWithMemoryTracking>; template -using Ring = boost::geometry::model::ring; +using Ring = boost::geometry::model::ring; template -using Polygon = boost::geometry::model::polygon; +using Polygon = boost::geometry::model::polygon; template -using MultiPolygon = boost::geometry::model::multi_polygon>; +using MultiPolygon = boost::geometry::model::multi_polygon, std::vector, AllocatorWithMemoryTracking>; using CartesianPoint = boost::geometry::model::d2::point_xy; using CartesianLineString = LineString; diff --git a/src/IO/S3/Client.cpp b/src/IO/S3/Client.cpp index e4f8757d4968..a730d36c26fc 100644 --- a/src/IO/S3/Client.cpp +++ b/src/IO/S3/Client.cpp @@ -338,7 +338,6 @@ Client::~Client() catch (...) { tryLogCurrentException(log); - throw; } } @@ -1185,7 +1184,7 @@ std::unique_ptr ClientFactory::create( // NOLINT if (!credentials_configuration.role_arn.empty()) credentials_provider = std::make_shared(credentials_configuration.role_arn, - credentials_configuration.role_session_name, credentials_configuration.expiration_window_seconds, + credentials_configuration.role_session_name, credentials_configuration.external_id, credentials_configuration.expiration_window_seconds, std::move(credentials_provider), client_configuration, credentials_configuration.sts_endpoint_override); /// Disable per-thread retry loops if global retry coordination is in use. diff --git a/src/IO/S3/Credentials.cpp b/src/IO/S3/Credentials.cpp index aed33b800c87..85e69ce81827 100644 --- a/src/IO/S3/Credentials.cpp +++ b/src/IO/S3/Credentials.cpp @@ -851,8 +851,8 @@ S3CredentialsProviderChain::S3CredentialsProviderChain( AddProvider(std::make_shared()); } -AssumeRoleRequest::AssumeRoleRequest(std::string role_arn_, std::string role_session_name_) - : role_arn(std::move(role_arn_)), role_session_name(std::move(role_session_name_)) +AssumeRoleRequest::AssumeRoleRequest(std::string role_arn_, std::string role_session_name_, std::string external_id_) + : role_arn(std::move(role_arn_)), role_session_name(std::move(role_session_name_)), external_id(std::move(external_id_)) { } @@ -865,6 +865,8 @@ void AssumeRoleRequest::AddQueryStringParameters(Aws::Http::URI & uri) const { uri.AddQueryStringParameter("RoleArn", role_arn); uri.AddQueryStringParameter("RoleSessionName", role_session_name); + if (!external_id.empty()) + uri.AddQueryStringParameter("ExternalId", external_id); } AssumeRoleResult::AssumeRoleResult(Aws::AmazonWebServiceResult result) @@ -951,12 +953,14 @@ AssumeRoleOutcome AWSAssumeRoleClient::assumeRole(const AssumeRoleRequest & requ AwsAuthSTSAssumeRoleCredentialsProvider::AwsAuthSTSAssumeRoleCredentialsProvider( std::string role_arn_, std::string session_name_, + std::string external_id_, uint64_t expiration_window_seconds_, std::shared_ptr credentials_provider, DB::S3::PocoHTTPClientConfiguration & client_configuration, const std::string & sts_endpoint_override) : role_arn(std::move(role_arn_)) , session_name(session_name_.empty() ? "ClickHouseSession" : std::move(session_name_)) + , external_id(std::move(external_id_)) , expiration_window_seconds(expiration_window_seconds_) , client(std::make_shared(credentials_provider, client_configuration, sts_endpoint_override)) , logger(getLogger("AwsAuthSTSAssumeRoleCredentialsProvider")) @@ -973,7 +977,7 @@ void AwsAuthSTSAssumeRoleCredentialsProvider::Reload() { LOG_INFO(logger, "Credentials are empty or expired, attempting to renew with AssumeRole"); - AssumeRoleRequest request(role_arn, session_name); + AssumeRoleRequest request(role_arn, session_name, external_id); auto outcome = client->assumeRole(request); if (!outcome.IsSuccess()) { diff --git a/src/IO/S3/Credentials.h b/src/IO/S3/Credentials.h index 0444446d0fdb..78dfeb65ad61 100644 --- a/src/IO/S3/Credentials.h +++ b/src/IO/S3/Credentials.h @@ -185,6 +185,7 @@ struct CredentialsConfiguration bool no_sign_request = false; std::string role_arn{}; std::string role_session_name{}; + std::string external_id{}; std::string sts_endpoint_override{}; std::string kms_role_arn{}; }; @@ -201,7 +202,7 @@ class S3CredentialsProviderChain : public Aws::Auth::AWSCredentialsProviderChain class AssumeRoleRequest : public Aws::AmazonSerializableWebServiceRequest { public: - AssumeRoleRequest(std::string role_arn_, std::string role_session_name_); + AssumeRoleRequest(std::string role_arn_, std::string role_session_name_, std::string external_id_); Aws::Http::HeaderValueCollection GetHeaders() const override; @@ -214,6 +215,7 @@ class AssumeRoleRequest : public Aws::AmazonSerializableWebServiceRequest private: std::string role_arn; std::string role_session_name; + std::string external_id; }; class AssumeRoleResult { @@ -259,6 +261,7 @@ class AwsAuthSTSAssumeRoleCredentialsProvider : public Aws::Auth::AWSCredentials AwsAuthSTSAssumeRoleCredentialsProvider( std::string role_arn_, std::string session_name_, + std::string external_id_, uint64_t expiration_window_seconds_, std::shared_ptr credentials_provider, DB::S3::PocoHTTPClientConfiguration & client_configuration, @@ -273,6 +276,7 @@ class AwsAuthSTSAssumeRoleCredentialsProvider : public Aws::Auth::AWSCredentials std::string role_arn; std::string session_name; + std::string external_id; uint64_t expiration_window_seconds; std::shared_ptr client; Aws::Auth::AWSCredentials credentials; diff --git a/src/IO/S3AuthSettings.cpp b/src/IO/S3AuthSettings.cpp index 708909712364..07a4d620ccec 100644 --- a/src/IO/S3AuthSettings.cpp +++ b/src/IO/S3AuthSettings.cpp @@ -41,6 +41,7 @@ namespace ErrorCodes DECLARE(String, server_side_encryption_customer_key_base64, "", "", 0) \ DECLARE(String, role_arn, "", "", 0) \ DECLARE(String, role_session_name, "", "", 0) \ + DECLARE(String, external_id, "", "", 0) \ DECLARE(String, http_client, "", "", 0) \ DECLARE(String, service_account, "", "", 0) \ DECLARE(String, metadata_service, "", "", 0) \ diff --git a/src/IO/parseDateTimeBestEffort.cpp b/src/IO/parseDateTimeBestEffort.cpp index 694dca66a262..8c2e2fe43d6d 100644 --- a/src/IO/parseDateTimeBestEffort.cpp +++ b/src/IO/parseDateTimeBestEffort.cpp @@ -110,6 +110,7 @@ ReturnType parseDateTimeBestEffortImpl( UInt8 second = 0; bool has_time = false; + bool has_fractional = false; bool has_time_zone_offset = false; bool time_zone_offset_negative = false; @@ -519,6 +520,9 @@ ReturnType parseDateTimeBestEffortImpl( { if (!has_time) return on_error(ErrorCodes::CANNOT_PARSE_DATETIME, "Cannot read DateTime: unexpected point symbol"); + if (has_fractional) + return on_error(ErrorCodes::CANNOT_PARSE_DATETIME, "Cannot read DateTime: duplicate fractional part"); + has_fractional = true; ++in.position(); num_digits = readDigits(digits, sizeof(digits), in); diff --git a/src/Interpreters/Context.cpp b/src/Interpreters/Context.cpp index b9bf16c27672..7bf12f8e4ffb 100644 --- a/src/Interpreters/Context.cpp +++ b/src/Interpreters/Context.cpp @@ -513,6 +513,7 @@ struct ContextSharedPart : boost::noncopyable mutable OnceFlag build_vector_similarity_index_threadpool_initialized; mutable std::unique_ptr build_vector_similarity_index_threadpool; /// Threadpool for vector-similarity index creation. mutable UncompressedCachePtr index_uncompressed_cache TSA_GUARDED_BY(mutex); /// The cache of decompressed blocks for MergeTree indices. + mutable bool index_uncompressed_cache_enabled TSA_GUARDED_BY(mutex) = false; /// Whether index_uncompressed_cache should be used. mutable VectorSimilarityIndexCachePtr vector_similarity_index_cache TSA_GUARDED_BY(mutex); /// Cache of deserialized secondary index granules. mutable QueryConditionCachePtr query_condition_cache TSA_GUARDED_BY(mutex); /// Cache of matching marks for predicates mutable QueryResultCachePtr query_result_cache TSA_GUARDED_BY(mutex); /// Cache of query results. @@ -3703,6 +3704,7 @@ void Context::setIndexUncompressedCache(const String & cache_policy, size_t max_ throw Exception(ErrorCodes::LOGICAL_ERROR, "Index uncompressed cache has been already created."); shared->index_uncompressed_cache = std::make_shared(cache_policy, CurrentMetrics::IndexUncompressedCacheBytes, CurrentMetrics::IndexUncompressedCacheCells, max_size_in_bytes, size_ratio); + shared->index_uncompressed_cache_enabled = shared->index_uncompressed_cache->maxSizeInBytes() != 0; } void Context::updateIndexUncompressedCacheConfiguration(const Poco::Util::AbstractConfiguration & config) @@ -3714,11 +3716,14 @@ void Context::updateIndexUncompressedCacheConfiguration(const Poco::Util::Abstra size_t max_size_in_bytes = config.getUInt64("index_uncompressed_cache_size", DEFAULT_INDEX_UNCOMPRESSED_CACHE_MAX_SIZE); shared->index_uncompressed_cache->setMaxSizeInBytes(max_size_in_bytes); + shared->index_uncompressed_cache_enabled = shared->index_uncompressed_cache->maxSizeInBytes() != 0; } -UncompressedCachePtr Context::getIndexUncompressedCache() const +UncompressedCachePtr Context::getIndexUncompressedCache(bool only_if_enabled) const { SharedLockGuard lock(shared->mutex); + if (only_if_enabled && !shared->index_uncompressed_cache_enabled) + return nullptr; return shared->index_uncompressed_cache; } diff --git a/src/Interpreters/Context.h b/src/Interpreters/Context.h index ca563151caa6..abd47e8dddea 100644 --- a/src/Interpreters/Context.h +++ b/src/Interpreters/Context.h @@ -1256,7 +1256,7 @@ class Context: public ContextData, public std::enable_shared_from_this void setIndexUncompressedCache(const String & cache_policy, size_t max_size_in_bytes, double size_ratio); void updateIndexUncompressedCacheConfiguration(const Poco::Util::AbstractConfiguration & config); - std::shared_ptr getIndexUncompressedCache() const; + std::shared_ptr getIndexUncompressedCache(bool only_if_enabled = true) const; void clearIndexUncompressedCache() const; void setIndexMarkCache(const String & cache_policy, size_t max_cache_size_in_bytes, double size_ratio); diff --git a/src/Interpreters/InterpreterInsertQuery.cpp b/src/Interpreters/InterpreterInsertQuery.cpp index 0d59042499d2..78053834bd5f 100644 --- a/src/Interpreters/InterpreterInsertQuery.cpp +++ b/src/Interpreters/InterpreterInsertQuery.cpp @@ -727,7 +727,11 @@ QueryPipeline InterpreterInsertQuery::buildInsertPipeline(ASTInsertQuery & query QueryPipeline pipeline = QueryPipeline(std::move(chain)); - pipeline.setNumThreads(max_threads); + /// When materialized views are attached, their inner SELECT queries benefit + /// from full parallelism, so we use max_threads. Without MVs the insert + /// pipeline is 1-wide and requesting max_threads would only waste + /// ConcurrencyControl slots and spawn unnecessary threads (see #102947). + pipeline.setNumThreads(insert_dependencies->isViewsInvolved() ? max_threads : max_insert_threads); pipeline.setConcurrencyControl(settings[Setting::use_concurrency_control]); if (query.hasInlinedData() && !async_insert) diff --git a/src/Interpreters/PreparedSets.cpp b/src/Interpreters/PreparedSets.cpp index 3eedfb308820..279da8eeb849 100644 --- a/src/Interpreters/PreparedSets.cpp +++ b/src/Interpreters/PreparedSets.cpp @@ -108,30 +108,28 @@ FutureSetFromTuple::FutureSetFromTuple( DataTypes FutureSetFromTuple::getTypes() const { return set->getElementsTypes(); } FutureSet::Hash FutureSetFromTuple::getHash() const { return hash; } -Columns FutureSetFromTuple::getKeyColumns() +void FutureSetFromTuple::fillSetElementsOnce() { - if (!set->hasExplicitSetElements()) + callOnce(fill_set_elements_once, [this] { set->fillSetElements(); set->appendSetElements(set_key_columns); - } + }); +} +Columns FutureSetFromTuple::getKeyColumns() +{ + fillSetElementsOnce(); return set->getSetElements(); } SetPtr FutureSetFromTuple::buildOrderedSetInplace(const ContextPtr & context) { - if (set->hasExplicitSetElements()) - return set; - const auto & settings = context->getSettingsRef(); size_t max_values = settings[Setting::use_index_for_in_with_subqueries_max_values]; bool too_many_values = max_values && max_values < set->getTotalRowCount(); if (!too_many_values) - { - set->fillSetElements(); - set->appendSetElements(set_key_columns); - } + fillSetElementsOnce(); return set; } diff --git a/src/Interpreters/PreparedSets.h b/src/Interpreters/PreparedSets.h index cfd7435833f8..473bd83a9b2f 100644 --- a/src/Interpreters/PreparedSets.h +++ b/src/Interpreters/PreparedSets.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -106,10 +107,13 @@ class FutureSetFromTuple final : public FutureSet ASTPtr getSourceAST() const override { return ast; } Columns getKeyColumns(); private: + void fillSetElementsOnce(); + Hash hash; ASTPtr ast; SetPtr set; SetKeyColumns set_key_columns; + OnceFlag fill_set_elements_once; }; using FutureSetFromTuplePtr = std::shared_ptr; diff --git a/src/Interpreters/convertFieldToType.cpp b/src/Interpreters/convertFieldToType.cpp index 91d6faf9526f..7ef720e425ec 100644 --- a/src/Interpreters/convertFieldToType.cpp +++ b/src/Interpreters/convertFieldToType.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -695,6 +696,8 @@ Field tryConvertFieldToType(const Field & from_value, const IDataType & to_type, Field convertFieldToType(const Field & from_value, const IDataType & to_type, const IDataType * from_type_hint, const FormatSettings & format_settings) { + checkStackSize(); + if (from_value.isNull()) return from_value; diff --git a/src/Interpreters/getColumnFromBlock.cpp b/src/Interpreters/getColumnFromBlock.cpp index 450808befa48..a4438fa1fe5e 100644 --- a/src/Interpreters/getColumnFromBlock.cpp +++ b/src/Interpreters/getColumnFromBlock.cpp @@ -45,7 +45,7 @@ ColumnPtr tryGetSubcolumnFromBlock(const Block & block, const DataTypePtr & requ /// extract the subcolumn, because the data of dynamic subcolumn can change after cast. if ((elem->type->hasDynamicSubcolumns() || requested_column_type->hasDynamicSubcolumns()) && !elem->type->equals(*requested_column_type)) { - auto cast_column = castColumn({elem->column, elem->type, ""}, requested_column_type); + auto cast_column = castColumn({elem->column->decompress(), elem->type, ""}, requested_column_type); auto elem_column = requested_column_type->tryGetSubcolumn(subcolumn_name, cast_column); auto elem_type = requested_column_type->tryGetSubcolumnType(subcolumn_name); diff --git a/src/Parsers/ASTFunctionWithKeyValueArguments.cpp b/src/Parsers/ASTFunctionWithKeyValueArguments.cpp index ecd4aa424654..f3eb658573d3 100644 --- a/src/Parsers/ASTFunctionWithKeyValueArguments.cpp +++ b/src/Parsers/ASTFunctionWithKeyValueArguments.cpp @@ -59,7 +59,7 @@ void ASTPair::formatImpl(WriteBuffer & ostr, const FormatSettings & settings, Fo bool ASTPair::hasSecretParts() const { - return first == "password"; + return (first == "password") || second->hasSecretParts(); } diff --git a/src/Parsers/ASTLiteral.cpp b/src/Parsers/ASTLiteral.cpp index 319fbebfb031..b7181e17a6ec 100644 --- a/src/Parsers/ASTLiteral.cpp +++ b/src/Parsers/ASTLiteral.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -46,6 +47,8 @@ class FieldVisitorToColumnName : public StaticVisitor template<> String FieldVisitorToColumnName::operator() (const Tuple & x) const { + checkStackSize(); + WriteBufferFromOwnString wb; wb << "tuple("; diff --git a/src/Parsers/ExpressionElementParsers.cpp b/src/Parsers/ExpressionElementParsers.cpp index 54937bd3cf9f..84219a8ce02e 100644 --- a/src/Parsers/ExpressionElementParsers.cpp +++ b/src/Parsers/ExpressionElementParsers.cpp @@ -1349,7 +1349,11 @@ bool ParserCollectionOfLiterals::parseImpl(Pos & pos, ASTPtr & node, return true; } - layers.back().arr.push_back(literal->value); + /// Move the just-finished nested collection into its parent instead of copying it. + /// `literal` is a local that is discarded right after (only the outermost layer is + /// kept as `node`), so moving its value out is safe. Copying here made parsing a + /// deeply nested literal such as `[[[ ... ]]]` quadratic in its depth. + layers.back().arr.push_back(std::move(literal->value)); continue; } if (pos->type == TokenType::Comma) diff --git a/src/Parsers/IAST.cpp b/src/Parsers/IAST.cpp index 7cb64bd931a2..113d5e204577 100644 --- a/src/Parsers/IAST.cpp +++ b/src/Parsers/IAST.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -99,6 +100,7 @@ size_t IAST::size() const size_t IAST::checkSize(size_t max_size) const { + checkStackSize(); size_t res = 1; for (const auto & child : children) res += child->checkSize(max_size); @@ -120,6 +122,7 @@ IASTHash IAST::getTreeHash(bool ignore_aliases) const void IAST::updateTreeHash(SipHash & hash_state, bool ignore_aliases) const { + checkStackSize(); updateTreeHashImpl(hash_state, ignore_aliases); hash_state.update(children.size()); for (const auto & child : children) @@ -225,6 +228,8 @@ String IAST::formatWithSecretsMultiLine() const bool IAST::childrenHaveSecretParts() const { + checkStackSize(); + for (const auto & child : children) { if (child->hasSecretParts()) @@ -235,6 +240,7 @@ bool IAST::childrenHaveSecretParts() const void IAST::cloneChildren() { + checkStackSize(); for (auto & child : children) child = child->clone(); } @@ -316,6 +322,7 @@ void IAST::FormatSettings::checkIdentifier(const String & name) const void IAST::dumpTree(WriteBuffer & ostr, size_t indent) const { + checkStackSize(); String indent_str(indent, '-'); ostr << indent_str << getID() << ", "; writePointerHex(this, ostr); diff --git a/src/Parsers/IAST.h b/src/Parsers/IAST.h index 598920439f96..4c3e6ede290d 100644 --- a/src/Parsers/IAST.h +++ b/src/Parsers/IAST.h @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -261,6 +262,7 @@ class IAST : public std::enable_shared_from_this, public TypePromotion, public TypePromotionengine || (storage->engine->name != "SharedSet" && storage->engine->name != "SharedJoin")) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Storage engine {} does not inner UUID", storage->engine->name); + { + const String engine_name = (storage && storage->engine) ? storage->engine->name : "(no engine)"; + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Storage engine {} does not support inner UUID", engine_name); + } if (targets) throw Exception(ErrorCodes::BAD_ARGUMENTS, "targets are already defined {}", targets->formatForErrorMessage()); diff --git a/src/Parsers/ParserSetQuery.cpp b/src/Parsers/ParserSetQuery.cpp index cb9ba5909f70..ac597941b4de 100644 --- a/src/Parsers/ParserSetQuery.cpp +++ b/src/Parsers/ParserSetQuery.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include namespace DB @@ -39,6 +40,7 @@ class ParameterFieldVisitorToString : public StaticVisitor String operator() (const Array & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << '['; @@ -55,6 +57,7 @@ class ParameterFieldVisitorToString : public StaticVisitor String operator() (const Map & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << '{'; @@ -81,6 +84,7 @@ class ParameterFieldVisitorToString : public StaticVisitor String operator() (const Tuple & x) const { + checkStackSize(); WriteBufferFromOwnString wb; wb << '('; diff --git a/src/Planner/PlannerActionsVisitor.cpp b/src/Planner/PlannerActionsVisitor.cpp index 3527f275d6ee..1d3812516d6d 100644 --- a/src/Planner/PlannerActionsVisitor.cpp +++ b/src/Planner/PlannerActionsVisitor.cpp @@ -130,6 +130,13 @@ class ActionNodeNameHelper case QueryTreeNodeType::CONSTANT: { const auto & constant_node = node->as(); + /// A masked secret must be named by its placeholder, never by its value or source expression, + /// identically on initiator and secondary servers so distributed headers still match. + if (constant_node.isMasked()) + { + result = calculateActionNodeNameWithCastIfNeeded(constant_node); + break; + } /* To ensure that headers match during distributed query we need to simulate action node naming on * secondary servers. If we don't do that headers will mismatch due to constant folding. * @@ -795,6 +802,11 @@ PlannerActionsVisitorImpl::NodeNameAndNodeMinLevel PlannerActionsVisitorImpl::vi auto constant_node_name = !override_column_name.empty() ? override_column_name : [&]() { + /// A masked secret must be named by its placeholder, never by its value or source expression, + /// identically on initiator and secondary servers so distributed headers still match. + if (constant_node.isMasked()) + return calculateActionNodeNameWithCastIfNeeded(constant_node); + /* To ensure that headers match during distributed query we need to simulate action node naming on * secondary servers. If we don't do that headers will mismatch due to constant folding. * diff --git a/src/Planner/PlannerJoinTree.cpp b/src/Planner/PlannerJoinTree.cpp index c947e73a06fd..cb0763e343c7 100644 --- a/src/Planner/PlannerJoinTree.cpp +++ b/src/Planner/PlannerJoinTree.cpp @@ -265,6 +265,22 @@ NameAndTypePair chooseSmallestColumnToReadFromStorage(const StoragePtr & storage return result; } +/// Returns the effective row policy filter for the table, or nullptr if the +/// table has no row policies for the current user or the combined filter is +/// always-true. Mirrors the effective-filter check used by +/// buildRowPolicyFilterIfNeeded. +RowPolicyFilterPtr getEffectiveRowPolicyFilter(const StoragePtr & storage, const ContextPtr & query_context) +{ + auto storage_id = storage->getStorageID(); + if (!storage_id.hasDatabase()) + return nullptr; + auto row_policy_filter = query_context->getRowPolicyFilter( + storage_id.getDatabaseName(), storage_id.getTableName(), RowPolicyFilterType::SELECT_FILTER); + if (!row_policy_filter || row_policy_filter->empty()) + return nullptr; + return row_policy_filter; +} + bool applyTrivialCountIfPossible( QueryPlan & query_plan, SelectQueryInfo & select_query_info, @@ -283,12 +299,8 @@ bool applyTrivialCountIfPossible( table_node ? table_node->getStorageSnapshot() : table_function_node->getStorageSnapshot(), query_context)) return false; - auto storage_id = storage->getStorageID(); - auto row_policy_filter = query_context->getRowPolicyFilter(storage_id.getDatabaseName(), - storage_id.getTableName(), - RowPolicyFilterType::SELECT_FILTER); - if (row_policy_filter) - return {}; + if (getEffectiveRowPolicyFilter(storage, query_context)) + return false; if (select_query_info.additional_filter_ast) return false; @@ -523,11 +535,10 @@ std::optional buildRowPolicyFilterIfNeeded(const StoragePtr & sto PlannerContextPtr & planner_context, std::set & used_row_policies) { - auto storage_id = storage->getStorageID(); const auto & query_context = planner_context->getQueryContext(); - auto row_policy_filter = query_context->getRowPolicyFilter(storage_id.getDatabaseName(), storage_id.getTableName(), RowPolicyFilterType::SELECT_FILTER); - if (!row_policy_filter || row_policy_filter->empty()) + auto row_policy_filter = getEffectiveRowPolicyFilter(storage, query_context); + if (!row_policy_filter) return {}; for (const auto & row_policy : row_policy_filter->policies) @@ -572,23 +583,24 @@ std::optional buildCustomKeyFilterIfNeeded(const StoragePtr & sto return buildFilterInfo(parallel_replicas_custom_filter_ast, table_expression_query_info.table_expression, planner_context); } -/// Apply filters from additional_table_filters setting -std::optional buildAdditionalFiltersIfNeeded(const StoragePtr & storage, +/// Parse `additional_table_filters` for this table expression and assign the AST into +/// `table_expression_query_info.additional_filter_ast`. This is the pure, side-effect-free +/// part of `buildAdditionalFiltersIfNeeded` — no planner-context mutation, no prewhere +/// touch — so it can be called early (before prewhere / row-policy / trivial-count / +/// trivial-limit decisions) and later consumers can simply read the parsed AST. +void parseAdditionalFilterAstIfNeeded(const StoragePtr & storage, const String & table_expression_alias, SelectQueryInfo & table_expression_query_info, - const PrewhereInfoPtr & prewhere_info, - PlannerContextPtr & planner_context) + const ContextPtr & query_context) { - const auto & query_context = planner_context->getQueryContext(); const auto & settings = query_context->getSettingsRef(); auto const & additional_filters = settings[Setting::additional_table_filters].value; if (additional_filters.empty()) - return {}; + return; auto const & storage_id = storage->getStorageID(); - ASTPtr additional_filter_ast; for (const auto & additional_filter : additional_filters) { const auto & tuple = additional_filter.safeGet(); @@ -600,7 +612,7 @@ std::optional buildAdditionalFiltersIfNeeded(const StoragePtr & s (table == storage_id.getFullNameNotQuoted())) { ParserExpression parser; - additional_filter_ast = parseQuery( + table_expression_query_info.additional_filter_ast = parseQuery( parser, filter.data(), filter.data() + filter.size(), @@ -608,14 +620,23 @@ std::optional buildAdditionalFiltersIfNeeded(const StoragePtr & s settings[Setting::max_query_size], settings[Setting::max_parser_depth], settings[Setting::max_parser_backtracks]); - break; + return; } } +} +/// Apply filters from additional_table_filters setting. Expects +/// `parseAdditionalFilterAstIfNeeded` to have been called earlier so +/// `table_expression_query_info.additional_filter_ast` is populated. +std::optional buildAdditionalFiltersIfNeeded( + SelectQueryInfo & table_expression_query_info, + const PrewhereInfoPtr & prewhere_info, + PlannerContextPtr & planner_context) +{ + const auto & additional_filter_ast = table_expression_query_info.additional_filter_ast; if (!additional_filter_ast) return {}; - table_expression_query_info.additional_filter_ast = additional_filter_ast; auto filter_info = buildFilterInfo(additional_filter_ast, table_expression_query_info.table_expression, planner_context); if (prewhere_info) { @@ -755,6 +776,15 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres if (const auto & filter_actions = table_expression_data.getFilterActions()) table_expression_query_info.filter_actions_dag = std::make_shared(filter_actions->clone()); + /// Parse additional_table_filters early so that later decisions (trivial-count, + /// trivial-limit) can see `additional_filter_ast` before the actual filter DAG + /// is built further down + /// + /// Skip under `only_analyze`, since we may not have the database in case of Distributed. + if (!select_query_options.only_analyze) + parseAdditionalFilterAstIfNeeded( + storage, table_expression->getOriginalAlias(), table_expression_query_info, query_context); + size_t max_streams = settings[Setting::max_threads]; size_t max_threads_execute_query = settings[Setting::max_threads]; @@ -779,14 +809,20 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres UInt64 max_block_size = settings[Setting::max_block_size]; UInt64 max_block_size_limited = 0; - if (is_single_table_expression) + if (is_single_table_expression && !select_query_options.only_analyze) { /** If not specified DISTINCT, WHERE, GROUP BY, HAVING, ORDER BY, JOIN, LIMIT BY, LIMIT WITH TIES * but LIMIT is specified, and limit + offset < max_block_size, * then as the block size we will use limit + offset (not to read more from the table than requested), * and also set the number of threads to 1. */ - max_block_size_limited = mainQueryNodeBlockSizeByLimit(select_query_info); + /// Use the same effective-filter checks as the row-policy / additional-filter + /// planning further down: the trivial-LIMIT optimization must be disabled + /// whenever those filters actually apply, so the flags must agree. + bool has_additional_filters = !!table_expression_query_info.additional_filter_ast + || !!getEffectiveRowPolicyFilter(storage, query_context); + if (!has_additional_filters) + max_block_size_limited = mainQueryNodeBlockSizeByLimit(select_query_info); if (max_block_size_limited) { if (max_block_size_limited < max_block_size) @@ -859,7 +895,7 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres /// Apply trivial_count optimization if possible bool is_trivial_count_applied = !select_query_options.only_analyze && !select_query_options.build_logical_plan && is_single_table_expression - && (table_node || table_function_node) && select_query_info.has_aggregates && settings[Setting::additional_table_filters].value.empty() + && (table_node || table_function_node) && select_query_info.has_aggregates && applyTrivialCountIfPossible( query_plan, table_expression_query_info, @@ -886,11 +922,49 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres if (prewhere_actions && select_query_options.build_logical_plan) { + /// Collect columns needed by row policy and additional filters + NameSet columns_needed_by_other_filters; + + /// Pre-build additional table filter to know what columns it needs + auto additional_filters_info_temp = buildAdditionalFiltersIfNeeded( + table_expression_query_info, prewhere_info, planner_context); + if (additional_filters_info_temp) + { + for (const auto * input : additional_filters_info_temp->actions.getInputs()) + columns_needed_by_other_filters.insert(input->result_name); + } + + /// Clone prewhere actions and add required columns to outputs + auto prewhere_actions_clone = prewhere_actions->clone(); + const auto prewhere_column_name = prewhere_actions_clone.getOutputs().at(0)->result_name; + + /// Add columns needed by other filters to prewhere outputs + auto & prewhere_outputs = prewhere_actions_clone.getOutputs(); + + /// Build set of existing outputs for fast lookup + std::unordered_set existing_outputs( + prewhere_outputs.begin(), prewhere_outputs.end()); + + /// Iterate inputs in deterministic order and add missing nodes + for (const auto * input : prewhere_actions_clone.getInputs()) + { + if (columns_needed_by_other_filters.contains(input->result_name) + && !existing_outputs.contains(input)) + { + prewhere_outputs.push_back(input); + } + } + + /// Check if prewhere filter column should be removed + const bool keep_for_query = std::ranges::contains(columns_names, prewhere_column_name); + const bool keep_for_filters = columns_needed_by_other_filters.contains(prewhere_column_name); + const bool remove_prewhere_column = !keep_for_query && !keep_for_filters; + where_filters.emplace_back( FilterDAGInfo{ - prewhere_actions->clone(), - prewhere_actions->getOutputs().at(0)->result_name, - true}, + std::move(prewhere_actions_clone), + prewhere_column_name, + remove_prewhere_column}, "Prewhere"); } else if (prewhere_actions) @@ -937,8 +1011,7 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres } } - const auto & table_expression_alias = table_expression->getOriginalAlias(); - if (auto additional_filters_info = buildAdditionalFiltersIfNeeded(storage, table_expression_alias, table_expression_query_info, prewhere_info, planner_context)) + if (auto additional_filters_info = buildAdditionalFiltersIfNeeded(table_expression_query_info, prewhere_info, planner_context)) { appendSetsFromActionsDAG(additional_filters_info->actions, useful_sets); where_filters.emplace_back(std::move(*additional_filters_info), "additional filter"); diff --git a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp index fbd7dae07f73..28741ed62f44 100644 --- a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp @@ -90,6 +90,11 @@ Chunk ArrowBlockInputFormat::read() throw Exception(ErrorCodes::CANNOT_READ_ALL_DATA, "Error while reading batch of Arrow data: {}", batch_result.status().ToString()); + /// Validate validity bitmaps before building the table: Table::FromRecordBatches computes + /// each column's null_count, and Arrow derives an unknown FieldNode null_count by scanning + /// the bitmap over the declared length, which reads out of bounds on a truncated bitmap. + ArrowColumnToCHColumn::checkRecordBatchValidityBitmaps(**batch_result); + auto table_result = arrow::Table::FromRecordBatches({*batch_result}); if (!table_result.ok()) throw Exception(ErrorCodes::CANNOT_READ_ALL_DATA, @@ -100,7 +105,8 @@ Chunk ArrowBlockInputFormat::read() /// If defaults_for_omitted_fields is true, calculate the default values from default expression for omitted fields. /// Otherwise fill the missing columns with zero values of its type. BlockMissingValues * block_missing_values_ptr = format_settings.defaults_for_omitted_fields ? &block_missing_values : nullptr; - res = arrow_column_to_ch_column->arrowTableToCHChunk(*table_result, (*table_result)->num_rows(), file_reader ? file_reader->metadata() : nullptr, block_missing_values_ptr); + auto schema_metadata = stream ? stream_reader->schema()->metadata() : file_reader->schema()->metadata(); + res = arrow_column_to_ch_column->arrowTableToCHChunk(*table_result, (*table_result)->num_rows(), schema_metadata, block_missing_values_ptr); /// There is no easy way to get original record batch size from Arrow metadata. /// Let's just use the number of bytes read from read buffer. @@ -223,7 +229,7 @@ NamesAndTypesList ArrowSchemaReader::readSchema() auto header = ArrowColumnToCHColumn::arrowSchemaToCHHeader( *schema, - file_reader ? file_reader->metadata() : nullptr, + schema->metadata(), stream ? "ArrowStream" : "Arrow", format_settings, format_settings.arrow.skip_columns_with_unsupported_types_in_schema_inference, diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp index 4dae97e0d58b..c8f9846cad98 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp @@ -80,6 +80,225 @@ namespace ErrorCodes extern const int INCORRECT_DATA; } +namespace +{ + +/// Validate that the validity bitmap (buffers[0]) covers all declared rows. +/// We deliberately do NOT gate on null_count(): for an array produced by Arrow's +/// Slice/Flatten the null count is kUnknownNullCount, and calling null_count() +/// triggers a CountSetBits scan over buffers[0] across [offset, offset+length), +/// which reads out of bounds when the bitmap is truncated, the very thing we are +/// trying to validate. Instead we validate the buffer size whenever a bitmap is +/// present (a present-but-undersized bitmap is always malformed), and skip when it +/// is absent (Arrow reports null_count == 0 for a missing bitmap without scanning). +/// This must run before any null_count()/IsNull()/IsValid() call, including the +/// implicit null_count() in arrow::ChunkedArray's constructor. +void checkValidityBitmap(const arrow::Array & chunk, const String & column_name) +{ + if (unlikely(chunk.length() < 0 || chunk.offset() < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow array has negative length or offset for column '{}': length={}, offset={}", + column_name, chunk.length(), chunk.offset()); + const auto & buffer = chunk.data()->buffers[0]; + if (!buffer) + return; + const size_t buffer_size = static_cast(buffer->size()); + const size_t count = static_cast(chunk.offset()) + static_cast(chunk.length()); + const size_t required = count / 8 + (count % 8 != 0 ? 1 : 0); + if (unlikely(buffer_size < required)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow validity bitmap too small for column '{}': {} bytes available, {} required", + column_name, buffer_size, required); +} + +/// Validate that buffers[1] of an Arrow array chunk is large enough to hold +/// elem_size * (offset + length) bytes, then throw INCORRECT_DATA if not. +/// All readers that access buffers[1] directly must call one of these helpers +/// before touching any raw pointer, so the check can never be silently omitted. +void checkArrowBuffer(const arrow::Array & chunk, size_t elem_size, const String & column_name) +{ + if (unlikely(chunk.length() < 0 || chunk.offset() < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow array has negative length or offset for column '{}': length={}, offset={}", + column_name, chunk.length(), chunk.offset()); + const auto & buffer = chunk.data()->buffers[1]; + const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; + const size_t count = static_cast(chunk.offset()) + static_cast(chunk.length()); + size_t required = 0; + if (unlikely(__builtin_mul_overflow(elem_size, count, &required))) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow buffer size overflow for column '{}': element size {} × {} elements", + column_name, elem_size, count); + if (unlikely(buffer_size < required)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow buffer too small for column '{}': {} bytes available, {} required", + column_name, buffer_size, required); + checkValidityBitmap(chunk, column_name); +} + +/// Typed wrapper: validates and returns a pointer to the first element at chunk.offset(). +/// Use for bulk-copy readers. Per-element Value() readers call this for the validation +/// side-effect only (discarding the returned pointer). +template +const T * getValidatedBuffer(const arrow::Array & chunk, const String & column_name) +{ + checkArrowBuffer(chunk, sizeof(T), column_name); + const auto * buf = chunk.data()->buffers[1].get(); + if (!buf) + return nullptr; /// empty chunk (offset == 0, length == 0); no elements will be accessed + return reinterpret_cast(buf->data()) + chunk.offset(); +} + +/// Boolean arrays pack 8 values per byte starting at bit chunk.offset(), so the +/// required byte count uses ceiling division rather than a simple multiply. +void checkBooleanBuffer(const arrow::BooleanArray & chunk, const String & column_name) +{ + if (unlikely(chunk.length() < 0 || chunk.offset() < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow array has negative length or offset for column '{}': length={}, offset={}", + column_name, chunk.length(), chunk.offset()); + const auto & buffer = chunk.data()->buffers[1]; + const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; + const size_t count = static_cast(chunk.offset()) + static_cast(chunk.length()); + const size_t required = count / 8 + (count % 8 != 0 ? 1 : 0); /// overflow-safe ceiling division + if (unlikely(buffer_size < required)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow buffer too small for column '{}': {} bytes available, {} required", + column_name, buffer_size, required); + checkValidityBitmap(chunk, column_name); +} + +/// Cast array to ArrowNumericArray and validate the data buffer is large enough +/// for all declared rows. Element size is derived from ArrowNumericArray::value_type, +/// so this only compiles for typed numeric arrays (Date32, Date64, Timestamp, +/// Time32/64, HalfFloat, and the plain numeric types). +/// Use checkedCastFixedSizeBinary for FixedSizeBinary arrays, checkedCastBool for BooleanArray. +template +const ArrowNumericArray & checkedCast(const arrow::Array & array, const String & column_name) +{ + static_assert( + requires { typename ArrowNumericArray::value_type; }, + "use checkedCastFixedSizeBinary for FixedSizeBinary arrays or checkedCastBool for BooleanArray"); + const auto & typed = assert_cast(array); + checkArrowBuffer(typed, sizeof(typename ArrowNumericArray::value_type), column_name); + return typed; +} + +/// Cast to a view array type (StringViewArray or BinaryViewArray) and validate +/// that the view-struct buffer (buffers[1]) has enough 16-byte view structs for +/// all declared rows. The actual string bytes live in variadic buffers[2..N] +/// and are validated individually via GetView(). +template +const ArrowViewArray & checkedCastView(const arrow::Array & array, const String & column_name) +{ + const auto & typed = assert_cast(array); + checkArrowBuffer(typed, sizeof(arrow::BinaryViewType::c_type), column_name); + return typed; +} + +/// Validate that the validity bitmap (buffers[0]) covers all declared rows. +/// Validate that the offsets buffer (buffers[1]) of a BinaryArray or LargeBinaryArray +/// holds at least (offset + length + 1) entries. One more than length is required +/// because value_length(i) = offset[i+1] - offset[i], so the last element needs +/// offset[length]. This must be checked before any call to value_offset(i) or +/// GetView(i) to prevent an over-read of the offsets buffer. +/// When length == 0, no offsets are accessed at all (every caller's iteration loop +/// is skipped), so no bytes are required. This accepts the 0-byte offsets buffers +/// that Apache Arrow Java < 19.0.0 emits for empty String/Binary columns. +template +void checkBinaryOffsetsBuffer(const ArrowBinaryArray & chunk, const String & column_name) +{ + if (unlikely(chunk.length() < 0 || chunk.offset() < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow array has negative length or offset for column '{}': length={}, offset={}", + column_name, chunk.length(), chunk.offset()); + const auto & buffer = chunk.data()->buffers[1]; + const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; + const size_t count_plus_one = chunk.length() > 0 + ? static_cast(chunk.offset()) + static_cast(chunk.length()) + 1 + : 0; + size_t required = 0; + if (unlikely(__builtin_mul_overflow(sizeof(typename ArrowBinaryArray::offset_type), count_plus_one, &required))) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow offsets buffer size overflow for column '{}': {} entries", + column_name, count_plus_one); + if (unlikely(buffer_size < required)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow buffer too small for column '{}': {} bytes available, {} required", + column_name, buffer_size, required); + checkValidityBitmap(chunk, column_name); +} + +/// Cast to a FixedSizeBinaryArray subclass (plain FixedSizeBinaryArray, Decimal128Array, +/// Decimal256Array) and validate the data buffer using the runtime byte_width(). +template +const ArrowFixedSizeBinaryArray & checkedCastFixedSizeBinary(const arrow::Array & array, const String & column_name) +{ + const auto & typed = assert_cast(array); + checkArrowBuffer(typed, static_cast(typed.byte_width()), column_name); + return typed; +} + +/// Cast to BooleanArray and validate the bit-packed data buffer. +const arrow::BooleanArray & checkedCastBool(const arrow::Array & array, const String & column_name) +{ + const auto & typed = assert_cast(array); + checkBooleanBuffer(typed, column_name); + return typed; +} + +/// Recursively validate that every validity bitmap (buffers[0]) in an array and its children / +/// dictionary covers the declared rows, WITHOUT computing null_count. Must run before any Arrow +/// operation that computes an unknown null_count (kUnknownNullCount = -1) by scanning the bitmap +/// over the declared length, which reads out of bounds when the bitmap is truncated. +void checkArrayDataValidityBitmaps(const arrow::ArrayData & data, const String & column_name) +{ + if (unlikely(data.length < 0 || data.offset < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow array has negative length or offset for column '{}': length={}, offset={}", + column_name, data.length, data.offset); + if (!data.buffers.empty() && data.buffers[0]) + { + const size_t buffer_size = static_cast(data.buffers[0]->size()); + const size_t count = static_cast(data.offset) + static_cast(data.length); + const size_t required = count / 8 + (count % 8 != 0 ? 1 : 0); + if (unlikely(buffer_size < required)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow validity bitmap too small for column '{}': {} bytes available, {} required", + column_name, buffer_size, required); + } + for (const auto & child : data.child_data) + if (child) + checkArrayDataValidityBitmaps(*child, column_name); + if (data.dictionary) + checkArrayDataValidityBitmaps(*data.dictionary, column_name); +} + +/// Validate every chunk with `validate` before the caller reserves column memory based on +/// arrow_column->length(). Without this, an inflated or buffer-inconsistent declared length +/// makes reserve() throw CANNOT_ALLOCATE_MEMORY instead of a clean INCORRECT_DATA from the +/// per-chunk validator. Use the same validator the reader's main loop uses. +template +void validateChunksBeforeReserve(const arrow::ChunkedArray & arrow_column, Validator && validate) +{ + for (int chunk_i = 0, num_chunks = arrow_column.num_chunks(); chunk_i < num_chunks; ++chunk_i) + validate(*arrow_column.chunk(chunk_i)); +} + +} + /// Inserts numeric data right into internal column data to reduce an overhead template > static ColumnWithTypeAndName readColumnWithNumericData(const std::shared_ptr & arrow_column, const String & column_name) @@ -87,6 +306,11 @@ static ColumnWithTypeAndName readColumnWithNumericData(const std::shared_ptr>(); auto internal_column = internal_type->createColumn(); auto & column_data = static_cast(*internal_column).getData(); + + /// Validate every chunk's data buffer before reserving column memory: an inflated + /// (or buffer-inconsistent) declared length must surface as INCORRECT_DATA rather than + /// a huge reserve() that throws CANNOT_ALLOCATE_MEMORY. + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkArrowBuffer(chunk, sizeof(NumericType), column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) @@ -96,8 +320,7 @@ static ColumnWithTypeAndName readColumnWithNumericData(const std::shared_ptr buffer = chunk->data()->buffers[1]; - const auto * raw_data = reinterpret_cast(buffer->data()) + chunk->offset(); + const auto * raw_data = getValidatedBuffer(*chunk, column_name); column_data.insert_assume_reserved(raw_data, raw_data + chunk->length()); } return {std::move(internal_column), std::move(internal_type), column_name}; @@ -113,17 +336,66 @@ static ColumnWithTypeAndName readColumnWithStringData(const std::shared_ptr & column_chars = assert_cast(*internal_column).getChars(); PaddedPODArray & column_offsets = assert_cast(*internal_column).getOffsets(); + /// Pre-flight: validate every non-null row's offset+length against the actual buffer and + /// accumulate an exact chars_size. This prevents both the source read overflow and the + /// destination write overflow via insert_assume_reserved. + /// + /// Using buffer->size() as the bound (rather than value_offset(N-1)+value_length(N-1)) + /// is deliberate: corrupted offsets can make intermediate value_length(i) entries much + /// larger than the buffer while keeping the last entry's value look correct. Counting + /// per-row also handles non-monotonic (rewinding) offsets at null rows, which would let + /// later non-null rows re-read the same range and exceed a buffer-size-based reserve. + /// + /// Casting a negative signed offset/length to size_t wraps to a huge value, so the + /// two-part check (safe_offset > buf || safe_length > buf - safe_offset) catches negative + /// values without a separate signed test. size_t chars_size = 0; for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + std::shared_ptr buffer = chunk.value_data(); const size_t chunk_length = chunk.length(); + const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; - if (chunk_length > 0) + /// Validate the offsets buffer before the first value_offset(i) call. + /// The offsets array needs (offset + length + 1) entries because + /// value_length(i) = offset[i+1] - offset[i]. + checkBinaryOffsetsBuffer(chunk, column_name); + + if (chunk.null_count() == 0) + { + for (size_t i = 0; i < chunk_length; ++i) + { + const size_t safe_offset = static_cast(chunk.value_offset(i)); + const size_t safe_length = static_cast(chunk.value_length(i)); + if (unlikely(safe_offset > buffer_size || safe_length > buffer_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray offsets exceed data buffer bounds: " + "row {} has offset {} and length {} but buffer is {} bytes", + i, chunk.value_offset(i), chunk.value_length(i), buffer_size); + chars_size += safe_length; + } + } + else { - chars_size += chunk.value_offset(chunk_length - 1) + chunk.value_length(chunk_length - 1); - chars_size += chunk_length; + for (size_t i = 0; i < chunk_length; ++i) + { + if (!chunk.IsNull(i)) + { + const size_t safe_offset = static_cast(chunk.value_offset(i)); + const size_t safe_length = static_cast(chunk.value_length(i)); + if (unlikely(safe_offset > buffer_size || safe_length > buffer_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray offsets exceed data buffer bounds: " + "row {} has offset {} and length {} but buffer is {} bytes", + i, chunk.value_offset(i), chunk.value_length(i), buffer_size); + chars_size += safe_length; + } + } } + chars_size += chunk_length; // one null terminator per row } column_chars.reserve(chars_size); @@ -131,7 +403,7 @@ static ColumnWithTypeAndName readColumnWithStringData(const std::shared_ptrnum_chunks(); chunk_i < num_chunks; ++chunk_i) { - ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); std::shared_ptr buffer = chunk.value_data(); const size_t chunk_length = chunk.length(); @@ -140,8 +412,12 @@ static ColumnWithTypeAndName readColumnWithStringData(const std::shared_ptrdata() + chunk.value_offset(offset_i); - column_chars.insert_assume_reserved(raw_data, raw_data + chunk.value_length(offset_i)); + const auto value_length = chunk.value_length(offset_i); + if (value_length > 0) + { + const auto * raw_data = buffer->data() + chunk.value_offset(offset_i); + column_chars.insert_assume_reserved(raw_data, raw_data + value_length); + } column_offsets.emplace_back(column_chars.size()); } } @@ -174,16 +450,57 @@ static ColumnWithTypeAndName readColumnWithJSONData( auto internal_column = internal_type->createColumn(); auto & column_object = assert_cast(*internal_column); + /// Validate every chunk's offsets buffer AND each row's data range before reserving column + /// memory, so a forged (or buffer-inconsistent) declared length, or valid offsets metadata + /// over a truncated data buffer, is rejected as INCORRECT_DATA rather than a huge reserve(). + /// The String/Binary reader validates in its first pass for the same reason. + for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) + { + const ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; + const bool has_nulls = chunk.null_count() != 0; + for (size_t row_i = 0, num_rows = chunk.length(); row_i < num_rows; ++row_i) + { + if (has_nulls && chunk.IsNull(row_i)) + continue; + const size_t safe_offset = static_cast(chunk.value_offset(row_i)); + const size_t safe_length = static_cast(chunk.value_length(row_i)); + if (unlikely(safe_offset > data_buf_size || safe_length > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray offsets exceed data buffer bounds for column '{}': " + "row {} has offset {} and length {} but buffer is {} bytes", + column_name, row_i, chunk.value_offset(row_i), chunk.value_length(row_i), data_buf_size); + } + } + column_object.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - const ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); + + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; + + const auto validate_row = [&](size_t row_i) + { + const size_t safe_offset = static_cast(chunk.value_offset(row_i)); + const size_t safe_length = static_cast(chunk.value_length(row_i)); + if (unlikely(safe_offset > data_buf_size || safe_length > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray offsets exceed data buffer bounds for column '{}': " + "row {} has offset {} and length {} but buffer is {} bytes", + column_name, row_i, chunk.value_offset(row_i), chunk.value_length(row_i), data_buf_size); + }; if (chunk.null_count() == 0) { for (size_t row_i = 0, num_rows = chunk.length(); row_i < num_rows; ++row_i) { + validate_row(row_i); auto view = chunk.GetView(row_i); ReadBufferFromMemory rb(view.data(), view.size()); serialization->deserializeTextJSON(column_object, rb, format_settings); @@ -198,6 +515,7 @@ static ColumnWithTypeAndName readColumnWithJSONData( column_object.insertDefault(); continue; } + validate_row(row_i); auto view = chunk.GetView(row_i); ReadBufferFromMemory rb(view.data(), view.size()); serialization->deserializeTextJSON(column_object, rb, format_settings); @@ -215,11 +533,15 @@ static ColumnWithTypeAndName readColumnWithFixedStringData(const std::shared_ptr auto internal_type = std::make_shared(fixed_len); auto internal_column = internal_type->createColumn(); PaddedPODArray & column_chars = assert_cast(*internal_column).getChars(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCastFixedSizeBinary(chunk, column_name); }); column_chars.reserve(arrow_column->length() * fixed_len); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::FixedSizeBinaryArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCastFixedSizeBinary(*(arrow_column->chunk(chunk_i)), column_name); + /// An empty chunk can leave the data buffer null; skip before reading raw_values(). + if (chunk.length() == 0) + continue; const uint8_t * raw_data = chunk.raw_values(); column_chars.insert_assume_reserved(raw_data, raw_data + fixed_len * chunk.length()); } @@ -241,11 +563,15 @@ static ColumnWithTypeAndName readColumnWithBigIntegerFromFixedBinaryData(const s auto internal_column = column_type->createColumn(); auto & data = assert_cast &>(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCastFixedSizeBinary(chunk, column_name); }); data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::FixedSizeBinaryArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCastFixedSizeBinary(*(arrow_column->chunk(chunk_i)), column_name); + /// An empty chunk can leave the data buffer null; skip before reading raw_values(). + if (chunk.length() == 0) + continue; const auto * raw_data = reinterpret_cast(chunk.raw_values()); data.insert_assume_reserved(raw_data, raw_data + chunk.length()); } @@ -259,17 +585,29 @@ static ColumnWithTypeAndName readColumnWithBigNumberFromBinaryData(const std::sh size_t total_size = 0; for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); const size_t chunk_length = chunk.length(); + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; for (size_t i = 0; i != chunk_length; ++i) { + if (chunk.IsNull(i)) + continue; /// If at least one value size is not equal to the size if big integer, fallback to reading String column and further cast to result type. - if (!chunk.IsNull(i) && chunk.value_length(i) != sizeof(ValueType)) + if (chunk.value_length(i) != sizeof(ValueType)) return readColumnWithStringData(arrow_column, column_name); - - total_size += chunk_length; + /// Validate the data range before reserve(total_size): valid sizeof(ValueType) offsets + /// with a truncated data buffer must be rejected here, not after the allocation. + const size_t safe_offset = static_cast(chunk.value_offset(i)); + if (unlikely(safe_offset > data_buf_size || sizeof(ValueType) > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray data buffer too small for column '{}': " + "row {} has offset {} but buffer is {} bytes", + column_name, i, chunk.value_offset(i), data_buf_size); } + total_size += chunk_length; } auto internal_column = column_type->createColumn(); @@ -278,13 +616,27 @@ static ColumnWithTypeAndName readColumnWithBigNumberFromBinaryData(const std::sh for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { if (chunk.IsNull(value_i)) + { integer_column.insertDefault(); + } else - integer_column.insertData(chunk.Value(value_i).data(), chunk.Value(value_i).size()); + { + const size_t safe_offset = static_cast(chunk.value_offset(value_i)); + if (unlikely(safe_offset > data_buf_size || sizeof(ValueType) > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray data buffer too small for column '{}': " + "row {} has offset {} but buffer is {} bytes", + column_name, value_i, chunk.value_offset(value_i), data_buf_size); + const auto * raw_data = reinterpret_cast(chunk.value_data()->data()) + safe_offset; + integer_column.insertData(raw_data, sizeof(ValueType)); + } } } return {std::move(internal_column), column_type, column_name}; @@ -295,14 +647,15 @@ static ColumnWithTypeAndName readColumnWithBooleanData(const std::shared_ptrcreateColumn(); auto & column_data = assert_cast &>(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCastBool(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::BooleanArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); - if (chunk.length() == 0) + if (arrow_column->chunk(chunk_i)->length() == 0) continue; + const auto & chunk = checkedCastBool(*(arrow_column->chunk(chunk_i)), column_name); for (size_t bool_i = 0; bool_i != static_cast(chunk.length()); ++bool_i) column_data.emplace_back(chunk.Value(bool_i)); } @@ -328,13 +681,13 @@ static ColumnWithTypeAndName readColumnWithDate32Data(const std::shared_ptrcreateColumn(); PaddedPODArray & column_data = assert_cast &>(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCast(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::Date32Array & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCast(*(arrow_column->chunk(chunk_i)), column_name); - /// Check date range only when requested type is actually Date32 if (check_date_range) { for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) @@ -362,8 +715,11 @@ static ColumnWithTypeAndName readColumnWithDate32Data(const std::shared_ptr buffer = chunk.data()->buffers[1]; - const auto * raw_data = reinterpret_cast(buffer->data()) + chunk.offset(); + /// getValidatedBuffer returns nullptr for an empty chunk (Arrow may leave buffers[1] + /// null when length == 0); skip it instead of dereferencing a null data buffer. + if (chunk.length() == 0) + continue; + const auto * raw_data = getValidatedBuffer(chunk, column_name); column_data.insert_assume_reserved(raw_data, raw_data + chunk.length()); } } @@ -376,11 +732,12 @@ static ColumnWithTypeAndName readColumnWithDate64Data(const std::shared_ptr(); auto internal_column = internal_type->createColumn(); auto & column_data = assert_cast &>(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCast(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCast(*(arrow_column->chunk(chunk_i)), column_name); for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { auto timestamp = static_cast(chunk.Value(value_i) / 1000); // Always? in ms @@ -397,11 +754,12 @@ static ColumnWithTypeAndName readColumnWithTimestampData(const std::shared_ptr(scale, arrow_type.timezone()); auto internal_column = internal_type->createColumn(); auto & column_data = assert_cast &>(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCast(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCast(*(arrow_column->chunk(chunk_i)), column_name); for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { column_data.emplace_back(chunk.Value(value_i)); @@ -417,14 +775,15 @@ static ColumnWithTypeAndName readColumnWithTimeData(const std::shared_ptr(scale); auto internal_column = internal_type->createColumn(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCast(chunk, column_name); }); internal_column->reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); - if (chunk.length() == 0) + if (arrow_column->chunk(chunk_i)->length() == 0) continue; + const auto & chunk = checkedCast(*(arrow_column->chunk(chunk_i)), column_name); for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { assert_cast(*internal_column).insertValue(chunk.Value(value_i)); @@ -450,11 +809,12 @@ static ColumnWithTypeAndName readColumnWithDecimalDataImpl(const std::shared_ptr auto internal_column = internal_type->createColumn(); auto & column = assert_cast &>(*internal_column); auto & column_data = column.getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCastFixedSizeBinary(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCastFixedSizeBinary(*(arrow_column->chunk(chunk_i)), column_name); for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { column_data.emplace_back(chunk.IsNull(value_i) ? DecimalType(0) : *reinterpret_cast(chunk.Value(value_i))); // TODO: copy column @@ -467,11 +827,12 @@ static ColumnWithTypeAndName readColumnWithFloat16Data(const std::shared_ptrgetData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCast(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCast(*(arrow_column->chunk(chunk_i)), column_name); for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) column_data.emplace_back(chunk.IsNull(value_i) ? 0 : convertFloat16ToFloat32(chunk.Value(value_i))); } @@ -494,8 +855,14 @@ static ColumnWithTypeAndName readColumnWithDecimalData(const std::shared_ptr & arrow_column) +static ColumnPtr readByteMapFromArrowColumn(const std::shared_ptr & arrow_column, const String & column_name) { + /// Validate every chunk's validity bitmap before allocating the null map, so a forged length + /// whose validity bitmap is too small is rejected as INCORRECT_DATA instead of triggering a + /// huge null-map allocation. + for (int chunk_i = 0; chunk_i != arrow_column->num_chunks(); ++chunk_i) + checkValidityBitmap(*arrow_column->chunk(chunk_i), column_name); + if (!arrow_column->null_count()) return ColumnUInt8::create(arrow_column->length(), 0); @@ -519,19 +886,37 @@ static ColumnWithTypeAndName readColumnWithGeoData(const std::shared_ptrcreateColumn(); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::BinaryArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); std::shared_ptr buffer = chunk.value_data(); const size_t chunk_length = chunk.length(); + const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; for (size_t offset_i = 0; offset_i != chunk_length; ++offset_i) { - auto * raw_data = buffer->mutable_data() + chunk.value_offset(offset_i); if (chunk.IsNull(offset_i)) { column->insertDefault(); continue; } - ReadBuffer in_buffer(reinterpret_cast(raw_data), chunk.value_length(offset_i), 0); + + if (!buffer) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray has no data buffer for non-null geo row {}", + offset_i); + + const size_t safe_offset = static_cast(chunk.value_offset(offset_i)); + const size_t safe_length = static_cast(chunk.value_length(offset_i)); + if (unlikely(safe_offset > buffer_size || safe_length > buffer_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray offsets exceed data buffer bounds: " + "row {} has offset {} and length {} but buffer is {} bytes", + offset_i, chunk.value_offset(offset_i), chunk.value_length(offset_i), buffer_size); + + const auto * raw_data = buffer->data() + safe_offset; + ReadBuffer in_buffer(const_cast(reinterpret_cast(raw_data)), safe_length, 0); GeometricObject result_object; switch (geo_metadata.encoding) { @@ -564,8 +949,36 @@ struct ArrowOffsetArray using type = arrow::Int64Array; }; +/// Validate that an Arrow list offsets array is non-negative and monotonically non-decreasing. +/// Must run before arrow's Flatten() slices the values array using offset[0]..offset[length]: +/// a decreasing pair such as [64, 0] otherwise reaches ArrayData::Slice with an out-of-range +/// length and fails deep inside Arrow instead of being rejected here as INCORRECT_DATA. +template +static void checkListOffsetsMonotonic(const OffsetArray & arrow_offsets, const String & column_name) +{ + if (arrow_offsets.length() == 0) + return; + int64_t previous_offset = arrow_offsets.Value(0); + if (unlikely(previous_offset < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow List offsets contain a negative value for column '{}': offset[0]={}", + column_name, previous_offset); + for (int64_t i = 1; i < arrow_offsets.length(); ++i) + { + int64_t offset = arrow_offsets.Value(i); + if (unlikely(offset < previous_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow List offsets are not monotonically non-decreasing for column '{}': " + "offset[{}]={} < offset[{}]={}", + column_name, i, offset, i - 1, previous_offset); + previous_offset = offset; + } +} + template -static ColumnPtr readOffsetsFromArrowListColumn(const std::shared_ptr & arrow_column) +static ColumnPtr readOffsetsFromArrowListColumn(const std::shared_ptr & arrow_column, const String & column_name) { auto offsets_column = ColumnUInt64::create(); ColumnArray::Offsets & offsets_data = assert_cast &>(*offsets_column).getData(); @@ -573,9 +986,11 @@ static ColumnPtr readOffsetsFromArrowListColumn(const std::shared_ptrnum_chunks(); chunk_i < num_chunks; ++chunk_i) { - ArrowListArray & list_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto & list_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); auto arrow_offsets_array = list_chunk.offsets(); - auto & arrow_offsets = dynamic_cast::type &>(*arrow_offsets_array); + /// The offsets array is a numeric Int32/Int64 array, validate its buffer before Value() calls. + using OffsetArray = typename ArrowOffsetArray::type; + const auto & arrow_offsets = checkedCast(*arrow_offsets_array, column_name); /* * CH uses element size as "offsets", while arrow uses actual offsets as offsets. @@ -591,12 +1006,15 @@ static ColumnPtr readOffsetsFromArrowListColumn(const std::shared_ptr(offset - previous_offset); previous_offset = offset; offsets_data.emplace_back(offsets_data.back() + elements); } @@ -632,6 +1050,7 @@ static ColumnWithTypeAndName readColumnWithIndexesDataImpl(std::shared_ptr>(); auto internal_column = internal_type->createColumn(); auto & column_data = static_cast(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkArrowBuffer(chunk, sizeof(NumericType), column_name); }); column_data.reserve(arrow_column->length()); NumericType shift = is_nullable ? 2 : 1; @@ -642,8 +1061,7 @@ static ColumnWithTypeAndName readColumnWithIndexesDataImpl(std::shared_ptr buffer = chunk->data()->buffers[1]; - const auto * data = reinterpret_cast(buffer->data()) + chunk->offset(); + const auto * data = getValidatedBuffer(*chunk, column_name); /// Check that indexes are correct (protection against corrupted files) /// Note that on null values index can be arbitrary value. @@ -743,13 +1161,87 @@ static ColumnPtr readColumnWithIndexesData(std::shared_ptr } template -static std::shared_ptr getNestedArrowColumn(const std::shared_ptr & arrow_column) +static std::shared_ptr getNestedArrowColumn(const std::shared_ptr & arrow_column, const String & column_name) { arrow::ArrayVector array_vector; array_vector.reserve(arrow_column->num_chunks()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - ArrowListArray & list_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto & list_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + + /// Validate the parent list validity bitmap before Flatten(): when null_count > 0, + /// Flatten calls IsValid on the parent list array which reads buffers[0]. + checkValidityBitmap(list_chunk, column_name); + + /// Validate the offsets buffer before Flatten() reads it: Flatten() iterates + /// over offset[0..length] to slice the values array, so it needs (length+1) entries. + /// We also validate monotonicity here, before Flatten(), because Flatten() slices the + /// values array from offset[0] to offset[length]; a decreasing pair would otherwise fail + /// deep inside Arrow's ArrayData::Slice instead of being rejected as INCORRECT_DATA. + /// FixedSizeListArray uses a fixed stride instead of a variable-length offsets array. + if constexpr (!std::is_same_v) + { + /// offsets() returns a temporary shared_ptr; keep it alive in a named local so the + /// reference returned by checkedCast does not dangle while we validate it. + auto arrow_offsets_array = list_chunk.offsets(); + using OffsetArray = typename ArrowOffsetArray::type; + const auto & arrow_offsets = checkedCast(*arrow_offsets_array, column_name); + checkListOffsetsMonotonic(arrow_offsets, column_name); + + /// Flatten() slices the values array over [offset[0], offset[length]]. Monotonic, + /// non-negative offsets can still point past the end of (or a negative-length) values + /// array, which would fail inside Arrow's ArrayData::Slice; reject it here instead. + const auto & values = list_chunk.values(); + const int64_t values_len = values ? values->length() : 0; + if (unlikely(values_len < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow List values array has negative length {} for column '{}'", + values_len, column_name); + if (arrow_offsets.length() > 0) + { + const int64_t last_offset = arrow_offsets.Value(arrow_offsets.length() - 1); + if (unlikely(last_offset > values_len)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow List last offset {} exceeds values array length {} for column '{}'", + last_offset, values_len, column_name); + } + } + else + { + /// FixedSizeList has no offsets array: Flatten() slices the values array over + /// [offset*stride, (offset+length)*stride]. Validate the fixed stride is + /// non-negative and the slice stays within the values array before Flatten() + /// reaches Arrow's ArrayData::Slice (which would otherwise fail with STD_EXCEPTION). + const int64_t stride = list_chunk.value_length(); + if (unlikely(stride < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow FixedSizeList has negative list size {} for column '{}'", + stride, column_name); + const size_t count = static_cast(list_chunk.offset()) + static_cast(list_chunk.length()); + size_t required = 0; + if (unlikely(__builtin_mul_overflow(count, static_cast(stride), &required))) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow FixedSizeList size overflow for column '{}': {} rows × stride {}", + column_name, count, stride); + const auto & values = list_chunk.values(); + const int64_t values_len_signed = values ? values->length() : 0; + if (unlikely(values_len_signed < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow FixedSizeList values array has negative length {} for column '{}'", + values_len_signed, column_name); + const size_t values_len = static_cast(values_len_signed); + if (unlikely(required > values_len)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow FixedSizeList values array too small for column '{}': " + "need {} elements but values array has {}", + column_name, required, values_len); + } /* * It seems like arrow::ListArray::values() (nested column data) might or might not be shared across chunks. @@ -761,7 +1253,12 @@ static std::shared_ptr getNestedArrowColumn(const std::shar auto flatten_result = list_chunk.Flatten(); if (flatten_result.ok()) { - array_vector.emplace_back(flatten_result.ValueOrDie()); + /// Flatten slices the values array, producing a child with kUnknownNullCount. + /// Validate its validity bitmap now, before arrow::ChunkedArray's constructor + /// (below) sums chunk->null_count() and scans a possibly-truncated bitmap. + const auto & flattened = flatten_result.ValueOrDie(); + checkValidityBitmap(*flattened, column_name); + array_vector.emplace_back(flattened); } else { @@ -776,14 +1273,27 @@ static ColumnWithTypeAndName readIPv6ColumnFromBinaryData(const std::shared_ptr< size_t total_size = 0; for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); const size_t chunk_length = chunk.length(); + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; for (size_t i = 0; i != chunk_length; ++i) { + if (chunk.IsNull(i)) + continue; /// If at least one value size is not 16 bytes, fallback to reading String column and further cast to IPv6. - if (!chunk.IsNull(i) && chunk.value_length(i) != sizeof(IPv6)) + if (chunk.value_length(i) != sizeof(IPv6)) return readColumnWithStringData(arrow_column, column_name); + /// Validate the data range before reserve(total_size): valid 16-byte offsets with a + /// truncated data buffer must be rejected here, not after the allocation. + const size_t safe_offset = static_cast(chunk.value_offset(i)); + if (unlikely(safe_offset > data_buf_size || sizeof(IPv6) > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray data buffer too small for column '{}': " + "row {} has offset {} but buffer is {} bytes", + column_name, i, chunk.value_offset(i), data_buf_size); } total_size += chunk_length; } @@ -795,13 +1305,27 @@ static ColumnWithTypeAndName readIPv6ColumnFromBinaryData(const std::shared_ptr< for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { if (chunk.IsNull(value_i)) + { ipv6_column.insertDefault(); + } else - ipv6_column.insertData(chunk.Value(value_i).data(), chunk.Value(value_i).size()); + { + const size_t safe_offset = static_cast(chunk.value_offset(value_i)); + if (unlikely(safe_offset > data_buf_size || sizeof(IPv6) > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray data buffer too small for column '{}': " + "row {} has offset {} but buffer is {} bytes", + column_name, value_i, chunk.value_offset(value_i), data_buf_size); + const auto * raw_data = reinterpret_cast(chunk.value_data()->data()) + safe_offset; + ipv6_column.insertData(raw_data, sizeof(IPv6)); + } } } return {std::move(internal_column), std::move(internal_type), column_name}; @@ -812,6 +1336,7 @@ static ColumnWithTypeAndName readIPv4ColumnWithInt32Data(const std::shared_ptr(); auto internal_column = internal_type->createColumn(); auto & column_data = assert_cast(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkArrowBuffer(chunk, sizeof(IPv4), column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) @@ -821,8 +1346,7 @@ static ColumnWithTypeAndName readIPv4ColumnWithInt32Data(const std::shared_ptr buffer = chunk->data()->buffers[1]; - const auto * raw_data = reinterpret_cast(buffer->data()) + chunk->offset(); + const auto * raw_data = getValidatedBuffer(*chunk, column_name); column_data.insert_assume_reserved(raw_data, raw_data + chunk->length()); } return {std::move(internal_column), std::move(internal_type), column_name}; @@ -1014,7 +1538,7 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( } } - auto arrow_nested_column = getNestedArrowColumn(arrow_column); + auto arrow_nested_column = getNestedArrowColumn(arrow_column, column_name); auto nested_column = readColumnFromArrowColumn(arrow_nested_column, column_name, full_column_name, @@ -1030,7 +1554,7 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( if (!nested_column.column) return {}; - auto offsets_column = readOffsetsFromArrowListColumn(arrow_column); + auto offsets_column = readOffsetsFromArrowListColumn(arrow_column, column_name); const auto * tuple_column = assert_cast(nested_column.column.get()); const auto * tuple_type = assert_cast(nested_column.type.get()); @@ -1047,6 +1571,14 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( key_type = key_type_hint; } + { + const auto & off = assert_cast &>(*offsets_column).getData(); + if (!off.empty() && off.back() != key_column->size()) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow Map column '{}': last offset {} does not match nested column size {}", + column_name, off.back(), key_column->size()); + } auto map_column = ColumnMap::create(key_column, value_column, offsets_column); auto map_type = std::make_shared(key_type, value_type); return {std::move(map_column), std::move(map_type), column_name}; @@ -1111,11 +1643,11 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( switch (list_type) { case ListType::LargeList: - return getNestedArrowColumn(arrow_column); + return getNestedArrowColumn(arrow_column, column_name); case ListType::FixedSizeList: - return getNestedArrowColumn(arrow_column); + return getNestedArrowColumn(arrow_column, column_name); case ListType::List: - return getNestedArrowColumn(arrow_column); + return getNestedArrowColumn(arrow_column, column_name); } }(); @@ -1139,16 +1671,29 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( switch (list_type) { case ListType::LargeList: - return readOffsetsFromArrowListColumn(arrow_column); + return readOffsetsFromArrowListColumn(arrow_column, column_name); case ListType::FixedSizeList: { auto fixed_length = assert_cast(arrow_column->type().get())->list_size(); return readOffsetsFromFixedArrowListColumn(arrow_column, fixed_length); } case ListType::List: - return readOffsetsFromArrowListColumn(arrow_column); + return readOffsetsFromArrowListColumn(arrow_column, column_name); } }(); + /// Validate that the last offset matches the nested column size before constructing + /// ColumnArray. ColumnArray's constructor skips data->size() == last_offset when + /// data->empty() (the && !data->empty() short-circuit), so a crafted Arrow file + /// with an empty child but non-zero offsets would silently produce a column whose + /// interior offsets point past the inner allocation. + { + const auto & off = assert_cast &>(*offsets_column).getData(); + if (!off.empty() && off.back() != nested_column.column->size()) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow List column '{}': last offset {} does not match nested column size {}", + column_name, off.back(), nested_column.column->size()); + } auto array_column = ColumnArray::create(nested_column.column, offsets_column); DataTypePtr array_type; @@ -1172,9 +1717,30 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( std::vector nested_arrow_columns(arrow_struct_type->num_fields()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::StructArray & struct_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto & struct_chunk = assert_cast(*(arrow_column->chunk(chunk_i))); for (int i = 0; i < arrow_struct_type->num_fields(); ++i) - nested_arrow_columns[i].emplace_back(struct_chunk.field(i)); + { + /// field() slices child[struct.offset : struct.offset + struct.length] (the + /// struct may be sliced, e.g. when nested in a list). A child shorter than that + /// range, including the negative-length case, would fail inside Arrow's + /// ArrayData::Slice, so validate the range here first. struct.offset/length are + /// already known non-negative (checked at readColumnFromArrowColumn entry). + const auto & child_data = struct_chunk.data()->child_data[i]; + if (unlikely( + child_data->length < 0 + || struct_chunk.offset() > child_data->length + || struct_chunk.length() > child_data->length - struct_chunk.offset())) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow Struct field {} (length {}) is too small for the struct slice " + "[offset {}, +{}) for column '{}'", + i, child_data->length, struct_chunk.offset(), struct_chunk.length(), column_name); + auto field_chunk = struct_chunk.field(i); + /// field() Slice-clamps children, producing kUnknownNullCount; validate the + /// child bitmap before arrow::ChunkedArray's constructor (below) scans it. + checkValidityBitmap(*field_chunk, column_name); + nested_arrow_columns[i].emplace_back(std::move(field_chunk)); + } } Columns tuple_elements; @@ -1247,6 +1813,27 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( tuple_names.emplace_back(std::move(column_with_type_and_name.name)); } + /// Validate that every field has exactly as many rows as the parent struct + /// declares. arrow::StructArray::field() silently Slices a short child to + /// the parent's reported length, so a crafted Arrow file can patch individual + /// fields' FieldNode.length without triggering an Arrow-level error. Without + /// this check, ColumnTuple would hold fields of unequal size, and any reader + /// that accesses a short field past its allocation triggers an OOB heap read. + /// Note: this also covers the Map case, Map entries are read through this + /// STRUCT branch, so mismatched key vs. value lengths are caught here. + if (!tuple_elements.empty()) + { + const size_t expected_rows = static_cast(arrow_column->length()); + for (size_t i = 0; i < tuple_elements.size(); ++i) + { + if (tuple_elements[i]->size() != expected_rows) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow Struct column '{}': field '{}' has {} rows but parent struct declares {}", + column_name, tuple_names[i], tuple_elements[i]->size(), expected_rows); + } + } + ColumnPtr tuple_column; if (tuple_elements.empty()) tuple_column = ColumnTuple::create(arrow_column->length()); @@ -1266,7 +1853,7 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( arrow::ArrayVector dict_array; for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::DictionaryArray & dict_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto & dict_chunk = assert_cast(*(arrow_column->chunk(chunk_i))); dict_array.emplace_back(dict_chunk.dictionary()); } @@ -1308,7 +1895,7 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( arrow::ArrayVector indexes_array; for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::DictionaryArray & dict_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto & dict_chunk = assert_cast(*(arrow_column->chunk(chunk_i))); indexes_array.emplace_back(dict_chunk.indices()); } @@ -1380,6 +1967,18 @@ static ColumnWithTypeAndName readColumnFromArrowColumn( const std::optional> & parquet_columns_to_clickhouse, const std::optional> & clickhouse_columns_to_parquet) { + /// Validate each chunk up front, before anything reads the declared length: + /// - checkValidityBitmap rejects a negative length/offset and a validity bitmap (buffers[0]) + /// too small for the declared rows. It is scan-free (never calls null_count), so it must + /// run before the arrow_column->null_count() below: Arrow computes an unknown null_count + /// (kUnknownNullCount = -1) by scanning buffers[0] over the declared length, which reads + /// out of bounds when the bitmap is truncated. + /// - rejecting a negative length here also stops a reader reserving a huge column from a + /// wrapped-to-huge size_t length. + /// This runs for every nested level too, since the function recurses for nested types. + for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) + checkValidityBitmap(*arrow_column->chunk(chunk_i), column_name); + bool read_as_nullable_column = (arrow_column->null_count() || is_nullable_column || (type_hint && type_hint->isNullable())) && !geo_metadata && settings.allow_inferring_nullable_columns; if (read_as_nullable_column && arrow_column->type()->id() != arrow::Type::LIST && @@ -1408,7 +2007,7 @@ static ColumnWithTypeAndName readColumnFromArrowColumn( if (!nested_column.column) return {}; - auto nullmap_column = readByteMapFromArrowColumn(arrow_column); + auto nullmap_column = readByteMapFromArrowColumn(arrow_column, column_name); auto nullable_type = std::make_shared(std::move(nested_column.type)); auto nullable_column = ColumnNullable::create(nested_column.column, nullmap_column); @@ -1539,6 +2138,13 @@ ArrowColumnToCHColumn::ArrowColumnToCHColumn( { } +void ArrowColumnToCHColumn::checkRecordBatchValidityBitmaps(const arrow::RecordBatch & batch) +{ + const auto & schema = *batch.schema(); + for (int i = 0, num_columns = batch.num_columns(); i < num_columns; ++i) + checkArrayDataValidityBitmaps(*batch.column(i)->data(), schema.field(i)->name()); +} + Chunk ArrowColumnToCHColumn::arrowTableToCHChunk( const std::shared_ptr & table, size_t num_rows, diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h index f39becac56c1..7335849a47ba 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h @@ -42,6 +42,13 @@ class ArrowColumnToCHColumn std::shared_ptr metadata, BlockMissingValues * block_missing_values = nullptr); + /// Validate that every validity bitmap in the record batch (recursively, including nested + /// children and dictionaries) covers its declared rows. Must be called before building an + /// arrow::Table from the batch: Arrow computes an unknown FieldNode null_count by scanning + /// the bitmap over the declared length, which reads out of bounds when the bitmap is + /// truncated. Throws INCORRECT_DATA on a malformed bitmap. + static void checkRecordBatchValidityBitmaps(const arrow::RecordBatch & batch); + /// Transform arrow schema to ClickHouse header static Block arrowSchemaToCHHeader( const arrow::Schema & schema, diff --git a/src/Processors/Formats/Impl/AvroRowInputFormat.cpp b/src/Processors/Formats/Impl/AvroRowInputFormat.cpp index f9a780b42007..66293a91984b 100644 --- a/src/Processors/Formats/Impl/AvroRowInputFormat.cpp +++ b/src/Processors/Formats/Impl/AvroRowInputFormat.cpp @@ -3,6 +3,7 @@ #include +#include #include #include @@ -251,6 +252,8 @@ static bool canBeDeserializedFromFixed(const DataTypePtr & target_type, size_t f AvroDeserializer::DeserializeFn AvroDeserializer::createDeserializeFn(const avro::NodePtr & root_node, const DataTypePtr & target_type) { + checkStackSize(); + if (target_type->lowCardinality()) { const auto * lc_type = assert_cast(target_type.get()); @@ -712,6 +715,8 @@ AvroDeserializer::DeserializeFn AvroDeserializer::createDeserializeFn(const avro AvroDeserializer::SkipFn AvroDeserializer::createSkipFn(const avro::NodePtr & root_node) { + checkStackSize(); + switch (root_node->type()) { case avro::AVRO_STRING: @@ -854,6 +859,8 @@ static inline std::string concatPath(const std::string & a, const std::string & AvroDeserializer::Action AvroDeserializer::createAction(const Block & header, const avro::NodePtr & node, const std::string & current_path) { + checkStackSize(); + if (node->type() == avro::AVRO_SYMBOLIC) { /// continue traversal only if some column name starts with current_path @@ -1017,7 +1024,8 @@ AvroRowInputFormat::AvroRowInputFormat(SharedHeader header_, ReadBuffer & in_, P void AvroRowInputFormat::readPrefix() { - file_reader_ptr = std::make_unique(std::make_unique(*in)); + file_reader_ptr = std::make_unique( + std::make_unique(*in), MAX_AVRO_SCHEMA_DEPTH); deserializer_ptr = std::make_unique( output.getHeader(), file_reader_ptr->dataSchema(), format_settings.avro.allow_missing_fields, format_settings.null_as_default, format_settings); file_reader_ptr->init(); @@ -1121,7 +1129,7 @@ class AvroConfluentRowInputFormat::SchemaRegistry auto schema = json_body->getValue("schema"); LOG_TRACE((getLogger("AvroConfluentRowInputFormat")), "Successfully fetched schema id = {}\n{}", id, schema); - return avro::compileJsonSchemaFromString(schema); + return avro::compileJsonSchemaFromString(schema, MAX_AVRO_SCHEMA_DEPTH); } catch (const Exception &) { @@ -1242,7 +1250,7 @@ const AvroDeserializer & AvroConfluentRowInputFormat::getOrCreateDeserializer(Sc auto schema = schema_registry->getSchema(schema_id); AvroDeserializer deserializer( output.getHeader(), schema, format_settings.avro.allow_missing_fields, format_settings.null_as_default, format_settings); - it = deserializer_cache.emplace(schema_id, deserializer).first; + it = deserializer_cache.emplace(schema_id, std::move(deserializer)).first; } return it->second; } @@ -1262,7 +1270,8 @@ NamesAndTypesList AvroSchemaReader::readSchema() } else { - auto file_reader_ptr = std::make_unique(std::make_unique(in)); + auto file_reader_ptr = std::make_unique( + std::make_unique(in), MAX_AVRO_SCHEMA_DEPTH); root_node = file_reader_ptr->dataSchema().root(); } @@ -1278,6 +1287,9 @@ NamesAndTypesList AvroSchemaReader::readSchema() DataTypePtr AvroSchemaReader::avroNodeToDataType(avro::NodePtr node) { + checkStackSize(); + + switch (node->type()) { case avro::Type::AVRO_INT: diff --git a/src/Processors/Formats/Impl/AvroRowInputFormat.h b/src/Processors/Formats/Impl/AvroRowInputFormat.h index 81f25c36ca05..520802802cb6 100644 --- a/src/Processors/Formats/Impl/AvroRowInputFormat.h +++ b/src/Processors/Formats/Impl/AvroRowInputFormat.h @@ -29,6 +29,12 @@ namespace ErrorCodes class Block; +/// Maximum nesting depth for Avro schemas. Passed to the Avro library to +/// prevent stack overflow on deeply nested schemas (e.g. crafted inputs with +/// thousands of nested arrays/records). Real-world schemas rarely exceed 10-20 +/// levels, so 256 is more than enough. +static constexpr size_t MAX_AVRO_SCHEMA_DEPTH = 256; + class AvroInputStreamReadBufferAdapter : public avro::InputStream { public: @@ -51,6 +57,12 @@ class AvroDeserializer public: AvroDeserializer(const Block & header, avro::ValidSchema schema, bool allow_missing_fields, bool null_as_default_, const FormatSettings & settings_); AvroDeserializer(DataTypePtr data_type, const std::string & column_name, avro::ValidSchema schema, bool allow_missing_fields, bool null_as_default_, const FormatSettings & settings_); + + AvroDeserializer(const AvroDeserializer &) = delete; + AvroDeserializer & operator=(const AvroDeserializer &) = delete; + AvroDeserializer(AvroDeserializer &&) = default; + AvroDeserializer & operator=(AvroDeserializer &&) = delete; + void deserializeRow(MutableColumns & columns, avro::Decoder & decoder, RowReadExtension & ext) const; using DeserializeFn = std::function; diff --git a/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.cpp b/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.cpp index 3f2750b98d00..fd92182cbf77 100644 --- a/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.cpp +++ b/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.cpp @@ -1,5 +1,7 @@ #include +#include + #include #include #include @@ -39,6 +41,7 @@ namespace ErrorCodes extern const int TOO_LARGE_STRING_SIZE; extern const int UNKNOWN_TYPE; extern const int TYPE_MISMATCH; + extern const int TOO_DEEP_RECURSION; } namespace @@ -357,6 +360,11 @@ static void readAndInsertUUID(ReadBuffer & in, IColumn & column, BSONType bson_t void BSONEachRowRowInputFormat::readArray(IColumn & column, const DataTypePtr & data_type, BSONType bson_type) { + /// Nested Array/Tuple/Map recurse through readField; the depth is bounded by the declared column + /// type, but guard the native stack here (on container entry, not on every primitive field) + /// against a pathologically deep declared type. + checkStackSize(); + if (bson_type != BSONType::ARRAY) throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Cannot insert BSON {} into Array column", getBSONTypeName(bson_type)); @@ -384,6 +392,8 @@ void BSONEachRowRowInputFormat::readArray(IColumn & column, const DataTypePtr & void BSONEachRowRowInputFormat::readTuple(IColumn & column, const DataTypePtr & data_type, BSONType bson_type) { + checkStackSize(); + if (bson_type != BSONType::ARRAY && bson_type != BSONType::DOCUMENT) throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Cannot insert BSON {} into Tuple column", getBSONTypeName(bson_type)); @@ -451,6 +461,8 @@ void BSONEachRowRowInputFormat::readTuple(IColumn & column, const DataTypePtr & void BSONEachRowRowInputFormat::readMap(IColumn & column, const DataTypePtr & data_type, BSONType bson_type) { + checkStackSize(); + if (bson_type != BSONType::DOCUMENT) throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Cannot insert BSON {} into Map column", getBSONTypeName(bson_type)); @@ -866,7 +878,7 @@ BSONEachRowSchemaReader::BSONEachRowSchemaReader(ReadBuffer & in_, const FormatS { } -DataTypePtr BSONEachRowSchemaReader::getDataTypeFromBSONField(BSONType type, bool allow_to_skip_unsupported_types, bool & skip) +DataTypePtr BSONEachRowSchemaReader::getDataTypeFromBSONField(BSONType type, bool allow_to_skip_unsupported_types, bool & skip, size_t depth) { switch (type) { @@ -911,7 +923,7 @@ DataTypePtr BSONEachRowSchemaReader::getDataTypeFromBSONField(BSONType type, boo } case BSONType::DOCUMENT: { - auto nested_names_and_types = getDataTypesFromBSONDocument(false); + auto nested_names_and_types = getDataTypesFromBSONDocument(false, depth + 1); auto nested_types = nested_names_and_types.getTypes(); bool types_are_equal = true; if (nested_types.empty() || !nested_types[0]) @@ -933,7 +945,7 @@ DataTypePtr BSONEachRowSchemaReader::getDataTypeFromBSONField(BSONType type, boo } case BSONType::ARRAY: { - auto nested_types = getDataTypesFromBSONDocument(false).getTypes(); + auto nested_types = getDataTypesFromBSONDocument(false, depth + 1).getTypes(); bool types_are_equal = true; if (nested_types.empty() || !nested_types[0]) return nullptr; @@ -985,8 +997,21 @@ DataTypePtr BSONEachRowSchemaReader::getDataTypeFromBSONField(BSONType type, boo } } -NamesAndTypesList BSONEachRowSchemaReader::getDataTypesFromBSONDocument(bool allow_to_skip_unsupported_types) +NamesAndTypesList BSONEachRowSchemaReader::getDataTypesFromBSONDocument(bool allow_to_skip_unsupported_types, size_t depth) { + /// BSON documents and arrays can be nested arbitrarily deep. Reject deep nesting early (before + /// building the type) with an explicit limit, so inference stays cheap and interruptible instead + /// of overflowing the native stack in this recursive descent. checkStackSize is a last-resort + /// backstop for when max_parser_depth is raised above the default. + /// max_parser_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + if (format_settings.max_parser_depth != 0 && depth > format_settings.max_parser_depth) + throw Exception( + ErrorCodes::TOO_DEEP_RECURSION, + "Too deep recursion while inferring the BSON schema: the nesting depth exceeds the limit ({}). " + "It can be raised with the setting 'max_parser_depth', but a very deep schema is rarely intentional", + format_settings.max_parser_depth); + checkStackSize(); + size_t document_start = in.count(); BSONSizeT document_size; readBinaryLittleEndian(document_size, in); @@ -997,7 +1022,7 @@ NamesAndTypesList BSONEachRowSchemaReader::getDataTypesFromBSONDocument(bool all String name; readNullTerminated(name, in); bool skip = false; - auto type = getDataTypeFromBSONField(bson_type, allow_to_skip_unsupported_types, skip); + auto type = getDataTypeFromBSONField(bson_type, allow_to_skip_unsupported_types, skip, depth); if (!skip) names_and_types.emplace_back(name, type); } @@ -1015,7 +1040,7 @@ NamesAndTypesList BSONEachRowSchemaReader::readRowAndGetNamesAndDataTypes(bool & return {}; } - return getDataTypesFromBSONDocument(format_settings.bson.skip_fields_with_unsupported_types_in_schema_inference); + return getDataTypesFromBSONDocument(format_settings.bson.skip_fields_with_unsupported_types_in_schema_inference, 1); } void BSONEachRowSchemaReader::transformTypesIfNeeded(DataTypePtr & type, DataTypePtr & new_type) diff --git a/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.h b/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.h index 8eacbd47715d..7b67fbf188bc 100644 --- a/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.h +++ b/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.h @@ -108,8 +108,8 @@ class BSONEachRowSchemaReader : public IRowWithNamesSchemaReader NamesAndTypesList readRowAndGetNamesAndDataTypes(bool & eof) override; void transformTypesIfNeeded(DataTypePtr & type, DataTypePtr & new_type) override; - NamesAndTypesList getDataTypesFromBSONDocument(bool skip_unsupported_types); - DataTypePtr getDataTypeFromBSONField(BSONType type, bool skip_unsupported_types, bool & skip); + NamesAndTypesList getDataTypesFromBSONDocument(bool skip_unsupported_types, size_t depth); + DataTypePtr getDataTypeFromBSONField(BSONType type, bool skip_unsupported_types, bool & skip, size_t depth); }; } diff --git a/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp b/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp index 0e25a98a3218..6f5f41f48175 100644 --- a/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp +++ b/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp @@ -586,6 +586,9 @@ bool ConstantExpressionTemplate::parseLiteralAndAssertType( nested_types = map_type->getKeyValueTypes(); } + if (nested_types.size() != type_info.nested_types.size()) + return false; + for (size_t i = 0; i < nested_types.size(); ++i) { const auto & [nested_field_type, is_nullable] = type_info.nested_types[i]; diff --git a/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp b/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp index c82984068b80..80cdee9a8be3 100644 --- a/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp @@ -782,8 +782,18 @@ Chunk DWARFBlockInputFormat::parseEntries(UnitState & unit) cols.push_back(std::exchange(col_linkage_name, nullptr)); break; case COL_DECL_FILE: - cols.push_back(ColumnLowCardinality::create(unit.filename_table, col_decl_file.detachPositions(), /*is_shared*/ true)); + { + /// A unit without DW_AT_stmt_list has no filename table; use a minimal dictionary instead of null. + ColumnPtr filename_table = unit.filename_table; + if (filename_table == nullptr) + { + auto dict = ColumnString::create(); + dict->insertDefault(); + filename_table = ColumnUnique::create(std::move(dict), /*is_nullable*/ false); + } + cols.push_back(ColumnLowCardinality::create(filename_table, col_decl_file.detachPositions(), /*is_shared*/ true)); break; + } case COL_DECL_LINE: cols.push_back(std::exchange(col_decl_line, nullptr)); break; @@ -855,10 +865,11 @@ uint64_t DWARFBlockInputFormat::fetchFromDebugAddr(uint64_t addr_base, uint64_t throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "Missing .debug_addr section."); if (addr_base == UINT64_MAX) throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "Missing DW_AT_addr_base"); + uint64_t section_size = debug_addr_section->size(); + if (addr_base > section_size || idx >= (section_size - addr_base) / 8) + throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, ".debug_addr offset out of bounds: addr_base {}, idx {} vs {}.", addr_base, idx, section_size); uint64_t offset = addr_base + idx * 8; - if (offset + 8 > debug_addr_section->size()) - throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, ".debug_addr offset out of bounds: {} vs {}.", offset, debug_addr_section->size()); - uint64_t res; + uint64_t res = 0; memcpy(&res, debug_addr_section->data() + offset, 8); return res; } @@ -896,14 +907,19 @@ void DWARFBlockInputFormat::parseRanges( if (unit.rnglists_base == UINT64_MAX) throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "Missing DW_AT_rnglists_base"); uint64_t entry_size = unit.dwarf_unit->getFormParams().getDwarfOffsetByteSize(); + uint64_t section_size = debug_rnglists_extractor->size(); + if (entry_size == 0 || unit.rnglists_base > section_size + || offset >= (section_size - unit.rnglists_base) / entry_size) + throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "DW_FORM_rnglistx offset out of bounds: rnglists_base {}, idx {} vs {}", unit.rnglists_base, offset, section_size); uint64_t lists_offset = unit.rnglists_base + offset * entry_size; - if (lists_offset + entry_size > debug_rnglists_extractor->size()) - throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "DW_FORM_rnglistx offset out of bounds: {} vs {}", lists_offset, debug_rnglists_extractor->size()); - offset = 0; - memcpy(&offset, debug_rnglists_extractor->getData().data() + lists_offset, entry_size); + uint64_t list_entry = 0; + memcpy(&list_entry, debug_rnglists_extractor->getData().data() + lists_offset, entry_size); - offset += unit.rnglists_base; + /// The offset read from the table is untrusted; the subtraction also stops rnglists_base + list_entry from wrapping. + if (list_entry > section_size - unit.rnglists_base) + throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "DW_FORM_rnglistx points out of bounds: rnglists_base {}, entry {} vs {}", unit.rnglists_base, list_entry, section_size); + offset = unit.rnglists_base + list_entry; } llvm::DWARFDebugRnglist list; diff --git a/src/Processors/Formats/Impl/MsgPackRowInputFormat.cpp b/src/Processors/Formats/Impl/MsgPackRowInputFormat.cpp index 1f6c09212693..f6baf66463cf 100644 --- a/src/Processors/Formats/Impl/MsgPackRowInputFormat.cpp +++ b/src/Processors/Formats/Impl/MsgPackRowInputFormat.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -46,6 +47,7 @@ namespace ErrorCodes extern const int INCORRECT_DATA; extern const int BAD_ARGUMENTS; extern const int UNEXPECTED_END_OF_FILE; + extern const int TOO_DEEP_RECURSION; } MsgPackRowInputFormat::MsgPackRowInputFormat(SharedHeader header_, ReadBuffer & in_, Params params_, const FormatSettings & settings) @@ -601,8 +603,23 @@ msgpack::object_handle MsgPackSchemaReader::readObject() return object_handle; } -DataTypePtr MsgPackSchemaReader::getDataType(const msgpack::object & object) +DataTypePtr MsgPackSchemaReader::getDataType(const msgpack::object & object, size_t depth) { + /// MsgPack arrays and maps can be nested arbitrarily deep, and msgpack::unpack builds the + /// whole object tree iteratively (heap), so a deeply nested object would overflow the native + /// stack during this recursive descent. Reject deep nesting early (before building the type) + /// with an explicit limit: this keeps inference cheap and interruptible instead of walking and + /// allocating a pathologically deep type that later code (e.g. makeNullableRecursively) would + /// also recurse over. checkStackSize is a last-resort backstop if max_parser_depth is raised. + /// max_parser_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + if (format_settings.max_parser_depth != 0 && depth > format_settings.max_parser_depth) + throw Exception( + ErrorCodes::TOO_DEEP_RECURSION, + "Too deep recursion while inferring the MsgPack schema: the nesting depth exceeds the limit ({}). " + "It can be raised with the setting 'max_parser_depth', but a very deep schema is rarely intentional", + format_settings.max_parser_depth); + checkStackSize(); + switch (object.type) { case msgpack::type::object_type::POSITIVE_INTEGER: [[fallthrough]]; @@ -628,12 +645,16 @@ DataTypePtr MsgPackSchemaReader::getDataType(const msgpack::object & object) bool nested_types_are_equal = true; for (size_t i = 0; i != object_array.size; ++i) { - auto nested_type = getDataType(object_array.ptr[i]); + auto nested_type = getDataType(object_array.ptr[i], depth + 1); if (!nested_type) return nullptr; + /// Compare only against the first element. Comparing the first element to itself is + /// pointless and would recurse through the whole (possibly deeply nested) type via + /// DataTypeArray::equals, which is itself unguarded recursion. + if (!nested_types.empty()) + nested_types_are_equal &= nested_type->equals(*nested_types[0]); nested_types.push_back(nested_type); - nested_types_are_equal &= nested_type->equals(*nested_types[0]); } if (nested_types_are_equal) @@ -646,8 +667,8 @@ DataTypePtr MsgPackSchemaReader::getDataType(const msgpack::object & object) msgpack::object_map object_map = object.via.map; if (object_map.size) { - auto key_type = removeNullable(getDataType(object_map.ptr[0].key)); - auto value_type = getDataType(object_map.ptr[0].val); + auto key_type = removeNullable(getDataType(object_map.ptr[0].key, depth + 1)); + auto value_type = getDataType(object_map.ptr[0].val, depth + 1); if (key_type && value_type) return std::make_shared(key_type, value_type); } @@ -675,7 +696,7 @@ std::optional MsgPackSchemaReader::readRowAndGetDataTypes() for (size_t i = 0; i != number_of_columns; ++i) { auto object_handle = readObject(); - data_types.push_back(getDataType(object_handle.get())); + data_types.push_back(getDataType(object_handle.get(), 1)); } return data_types; diff --git a/src/Processors/Formats/Impl/MsgPackRowInputFormat.h b/src/Processors/Formats/Impl/MsgPackRowInputFormat.h index f96bf336c523..be9dd30d6e8f 100644 --- a/src/Processors/Formats/Impl/MsgPackRowInputFormat.h +++ b/src/Processors/Formats/Impl/MsgPackRowInputFormat.h @@ -94,7 +94,7 @@ class MsgPackSchemaReader : public IRowSchemaReader private: msgpack::object_handle readObject(); - DataTypePtr getDataType(const msgpack::object & object); + DataTypePtr getDataType(const msgpack::object & object, size_t depth); std::optional readRowAndGetDataTypes() override; PeekableReadBuffer buf; diff --git a/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp b/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp index 17e4a9426170..8c20f170f367 100644 --- a/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp @@ -1,6 +1,9 @@ #include #if USE_ORC + +#include +#include #include #include #include @@ -88,6 +91,7 @@ extern const int VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE; extern const int THERE_IS_NO_COLUMN; extern const int INCORRECT_DATA; extern const int ARGUMENT_OUT_OF_BOUND; +extern const int TOO_DEEP_RECURSION; } @@ -209,10 +213,25 @@ static DataTypePtr parseORCType( bool skip_columns_with_unsupported_types, bool dictionary_as_low_cardinality, const orc::StripeInformation * stripe_info, - bool & skipped) + bool & skipped, + size_t max_depth = DBMS_DEFAULT_MAX_PARSER_DEPTH, + size_t depth = 0) { assert(orc_type != nullptr); + /// ORC LIST/MAP/STRUCT types can be nested arbitrarily deep and the ORC library does not bound + /// the nesting, so reject deep nesting early (before building the type) with an explicit limit. + /// This keeps schema inference cheap and interruptible instead of recursing over (and later + /// walking) a pathologically deep type. checkStackSize is a last-resort backstop. + /// max_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + if (max_depth != 0 && depth > max_depth) + throw Exception( + ErrorCodes::TOO_DEEP_RECURSION, + "Too deep recursion while parsing the ORC schema: the nesting depth exceeds the limit ({}). " + "It can be raised with the setting 'max_parser_depth', but a very deep schema is rarely intentional", + max_depth); + checkStackSize(); + const int subtype_count = static_cast(orc_type->getSubtypeCount()); switch (orc_type->getKind()) { @@ -267,7 +286,7 @@ static DataTypePtr parseORCType( throw Exception(ErrorCodes::LOGICAL_ERROR, "Invalid Orc List type {}", orc_type->toString()); DataTypePtr nested_type = parseORCType( - orc_type->getSubtype(0), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped); + orc_type->getSubtype(0), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped, max_depth, depth + 1); if (skipped) return {}; @@ -278,12 +297,12 @@ static DataTypePtr parseORCType( throw Exception(ErrorCodes::LOGICAL_ERROR, "Invalid Orc Map type {}", orc_type->toString()); DataTypePtr key_type = parseORCType( - orc_type->getSubtype(0), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped); + orc_type->getSubtype(0), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped, max_depth, depth + 1); if (skipped) return {}; DataTypePtr value_type = parseORCType( - orc_type->getSubtype(1), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped); + orc_type->getSubtype(1), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped, max_depth, depth + 1); if (skipped) return {}; @@ -298,7 +317,7 @@ static DataTypePtr parseORCType( for (size_t i = 0; i < orc_type->getSubtypeCount(); ++i) { auto parsed_type = parseORCType( - orc_type->getSubtype(i), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped); + orc_type->getSubtype(i), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped, max_depth, depth + 1); if (skipped) return {}; @@ -600,7 +619,7 @@ static void buildORCSearchArgumentImpl( /// For queries with where condition like "a > 10", if a column contains negative values such as "-1", pushing or not pushing /// down filters would result in different outputs. bool skipped = false; - auto expect_type = makeNullableRecursively(parseORCType(orc_type, true, false, nullptr, skipped), format_settings); + auto expect_type = makeNullableRecursively(parseORCType(orc_type, true, false, nullptr, skipped, format_settings.max_parser_depth), format_settings); const ColumnWithTypeAndName * column = header.findByName(column_name, format_settings.orc.case_insensitive_column_matching); if (!expect_type || !column) { @@ -829,6 +848,11 @@ static void getFileReader( static const orc::Type * traverseDownORCTypeByName(const std::string & target, const orc::Type * orc_type, DataTypePtr & type, bool ignore_case) { + /// Recurses the file-controlled ORC type tree. The matching CH type (and the requested column + /// name) bound the depth in practice, but keep a stack backstop here too, since this runs in + /// prepareFileReader before the readColumnFromORCColumn guard is reached. + checkStackSize(); + if (target.empty()) return orc_type; @@ -883,6 +907,11 @@ traverseDownORCTypeByName(const std::string & target, const orc::Type * orc_type static void updateIncludeTypeIds(DataTypePtr type, const orc::Type * orc_type, bool ignore_case, std::unordered_set & include_typeids) { + /// Recurses the file-controlled ORC type tree in lockstep with the (parser-bounded) CH type. + /// Keep a stack backstop here too: this runs in prepareFileReader, before the + /// readColumnFromORCColumn guard is reached, also for explicit-schema reads. + checkStackSize(); + /// For primitive types, directly append column id into result if (orc_type->getSubtypeCount() == 0) { @@ -1198,7 +1227,8 @@ NamesAndTypesList NativeORCSchemaReader::readSchema() format_settings.orc.skip_columns_with_unsupported_types_in_schema_inference, format_settings.orc.dictionary_as_low_cardinality, stripe_info.get(), - skipped); + skipped, + format_settings.max_parser_depth); if (!skipped) header.insert(ColumnWithTypeAndName{type, name}); } @@ -1363,7 +1393,16 @@ static ColumnWithTypeAndName readColumnWithEncodedStringOrFixedStringData( { const auto * buf = orc_dict.dictionaryBlob.data() + orc_dict.dictionaryOffset[i]; size_t buf_size = orc_dict.dictionaryOffset[i + 1] - orc_dict.dictionaryOffset[i]; + if (buf_size > n) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "ORC dictionary entry {} has size {} that exceeds the declared FixedString length {}", + i, buf_size, n); memcpy(&column_chars[curr_offset], buf, buf_size); + /// resize_exact does not zero-initialize, so pad shorter entries to keep FixedString values + /// deterministic and to avoid leaking uninitialized heap memory. + if (buf_size < n) + memset(&column_chars[curr_offset + buf_size], 0, n - buf_size); curr_offset += n; } } @@ -1392,6 +1431,16 @@ static ColumnWithTypeAndName readColumnWithEncodedStringOrFixedStringData( auto index_column = dynamic_cast(dictionary_column.get())->uniqueInsertRangeFrom(*holder_column, 0, holder_column->size()); + auto check_index = [&](Int64 orc_index, size_t row) -> Int64 + { + if (orc_index < 0 || static_cast(orc_index) >= dict_size) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "ORC dictionary index {} at row {} is out of range [0, {})", + orc_index, row, dict_size); + return orc_index; + }; + /// Fill index_column and wrap it with LowCardinality auto call_by_type = [&](auto index_type) -> MutableColumnPtr { @@ -1409,7 +1458,7 @@ static ColumnWithTypeAndName readColumnWithEncodedStringOrFixedStringData( for (size_t i = 0; i < rows; ++i) { /// First map row index to ORC dictionary index, then map ORC dictionary index to CH dictionary index - new_index_data[i] = index_data[orc_str_column.index[i]]; + new_index_data[i] = index_data[check_index(orc_str_column.index[i], i)]; } } else @@ -1418,7 +1467,7 @@ static ColumnWithTypeAndName readColumnWithEncodedStringOrFixedStringData( { /// Set index 0 if we meet null value. If dictionary_column is nullable, 0 represents null value. /// Otherwise 0 represents default string value, it is reasonable because null values are converted to default values when casting nullable column to non-nullable. - new_index_data[i] = orc_str_column.notNull[i] ? index_data[orc_str_column.index[i]] : 0; + new_index_data[i] = orc_str_column.notNull[i] ? index_data[check_index(orc_str_column.index[i], i)] : 0; } } @@ -1499,7 +1548,19 @@ readColumnWithFixedStringData(const orc::ColumnVectorBatch * orc_column, const o for (size_t i = 0; i < orc_str_column->numElements; ++i) { if (!orc_str_column->hasNulls || orc_str_column->notNull[i]) - column_chars.insert_assume_reserved(orc_str_column->data[i], orc_str_column->data[i] + orc_str_column->length[i]); + { + const Int64 length = orc_str_column->length[i]; + if (length < 0 || static_cast(length) > fixed_len) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "ORC string value at row {} has size {} that doesn't fit into FixedString({})", + i, length, fixed_len); + + column_chars.insert_assume_reserved(orc_str_column->data[i], orc_str_column->data[i] + length); + /// Zero-pad shorter values to the fixed width to keep the FixedString layout consistent. + if (static_cast(length) < fixed_len) + column_chars.resize_fill(column_chars.size() + (fixed_len - static_cast(length))); + } else column_chars.resize_fill(column_chars.size() + fixed_len); } @@ -1701,6 +1762,10 @@ ColumnWithTypeAndName ORCColumnToCHColumn::readColumnFromORCColumn( bool inside_nullable, DataTypePtr type_hint) const { + /// Reading a nested LIST/MAP/STRUCT recurses through this function over the ORC type tree, whose + /// depth is attacker-controlled, so guard the native stack on the data-read path as well. + checkStackSize(); + bool skipped = false; if (!inside_nullable && (orc_column->hasNulls || (type_hint && type_hint->isNullable())) && !orc_column->isEncoded diff --git a/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp b/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp index 26fdbfe648c0..15aed8a8754c 100644 --- a/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp @@ -59,6 +59,11 @@ Chunk ORCBlockInputFormat::read() if (!batch) return {}; + /// Validate validity bitmaps before building the table: Table::FromRecordBatches computes + /// each column's null_count, and Arrow derives an unknown FieldNode null_count by scanning + /// the bitmap over the declared length, which reads out of bounds on a truncated bitmap. + ArrowColumnToCHColumn::checkRecordBatchValidityBitmaps(*batch); + auto table_result = arrow::Table::FromRecordBatches({batch}); if (!table_result.ok()) throw Exception( diff --git a/src/Processors/Formats/Impl/Parquet/Reader.cpp b/src/Processors/Formats/Impl/Parquet/Reader.cpp index 2b24648a6d18..3d3bebe07393 100644 --- a/src/Processors/Formats/Impl/Parquet/Reader.cpp +++ b/src/Processors/Formats/Impl/Parquet/Reader.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,25 @@ namespace DB::ErrorCodes namespace DB::Parquet { +/// Thrift deserialization can store an out-of-range value into an unscoped enum field when the +/// input file is malformed. Loading such an enum directly is undefined behavior (caught by +/// -fsanitize=enum); reading the raw underlying integer via memcpy is well-defined. We use it to +/// validate page-header enums up front, so the rest of the reader only ever loads valid values. +template +static int thriftEnumToInt(const E & e) +{ + std::underlying_type_t v; + memcpy(&v, &e, sizeof(v)); + return static_cast(v); +} + +template +static void checkThriftEnum(const E & e, const std::map & valid_values, const char * what) +{ + if (!valid_values.contains(thriftEnumToInt(e))) + throw Exception(ErrorCodes::INCORRECT_DATA, "Invalid {} in Parquet metadata", what); +} + static void decompressLZ4Raw(const char * data, size_t compressed_size, size_t uncompressed_size, char * out) { if (compressed_size > INT32_MAX || uncompressed_size > INT32_MAX) @@ -736,9 +756,12 @@ void Reader::decodeDictionaryPageImpl(const parq::PageHeader & header, std::span throw Exception(ErrorCodes::INCORRECT_DATA, "Dictionary page size out of bounds: {} > {}", header.compressed_page_size, data.size()); data = data.subspan(0, size_t(header.compressed_page_size)); + checkThriftEnum(column.meta->meta_data.codec, parq::_CompressionCodec_VALUES_TO_NAMES, "compression codec"); auto codec = column.meta->meta_data.codec; if (codec != parq::CompressionCodec::UNCOMPRESSED) { + if (header.uncompressed_page_size < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative uncompressed dictionary page size"); size_t uncompressed_size = size_t(header.uncompressed_page_size); auto & buf = column.dictionary.decompressed_buf; buf.resize(uncompressed_size); @@ -746,6 +769,10 @@ void Reader::decodeDictionaryPageImpl(const parq::PageHeader & header, std::span data = std::span(buf.data(), buf.size()); } + /// Signed i32 from the thrift header; a negative count would sign-extend to a huge size_t and + /// drive a huge `reserve`/`resize` inside Dictionary::decode. + if (header.dictionary_page_header.num_values < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative number of values in dictionary page"); column.dictionary.decode(header.dictionary_page_header.encoding, column_info.decoder, size_t(header.dictionary_page_header.num_values), data, *column_info.raw_decoded_type); } @@ -1380,6 +1407,27 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size parq::PageHeader header; data_ptr += deserializeThriftStruct(header, data_ptr, data_end - data_ptr); /// TODO [parquet]: Check checksum. + + /// Validate enum fields before anything loads them (a malformed file can carry out-of-range + /// values, and loading an unscoped enum out of range is undefined behavior). + checkThriftEnum(header.type, parq::_PageType_VALUES_TO_NAMES, "page type"); + switch (header.type) + { + case parq::PageType::DATA_PAGE: + checkThriftEnum(header.data_page_header.encoding, parq::_Encoding_VALUES_TO_NAMES, "encoding"); + checkThriftEnum(header.data_page_header.definition_level_encoding, parq::_Encoding_VALUES_TO_NAMES, "definition level encoding"); + checkThriftEnum(header.data_page_header.repetition_level_encoding, parq::_Encoding_VALUES_TO_NAMES, "repetition level encoding"); + break; + case parq::PageType::DATA_PAGE_V2: + checkThriftEnum(header.data_page_header_v2.encoding, parq::_Encoding_VALUES_TO_NAMES, "encoding"); + break; + case parq::PageType::DICTIONARY_PAGE: + checkThriftEnum(header.dictionary_page_header.encoding, parq::_Encoding_VALUES_TO_NAMES, "encoding"); + break; + default: + break; + } + size_t compressed_page_size = size_t(header.compressed_page_size); if (header.compressed_page_size < 0 || compressed_page_size > size_t(data_end - data_ptr)) throw Exception(ErrorCodes::INCORRECT_DATA, "Page size out of bounds: {} > {}", header.compressed_page_size, data_end - data_ptr); @@ -1388,12 +1436,24 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size /// Check if all rows of the page are filtered out, if we have enough information. + /// These signed i32 row counts are consumed below to compute `page.end_row_idx` (and the + /// row-skip shortcut returns before the later num_values check). A negative value would + /// sign-extend to a huge size_t and wrap `next_row_idx + num_rows`, moving the row cursor + /// backwards or skipping the page instead of failing, so reject it here. std::optional num_rows_in_page; if (header.type == parq::PageType::DATA_PAGE_V2) + { + if (header.data_page_header_v2.num_rows < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative number of rows in DataPageV2"); num_rows_in_page = header.data_page_header_v2.num_rows; + } else if (header.type == parq::PageType::DATA_PAGE && column_info.levels.back().rep == 0) // no arrays => num_values == num_rows + { + if (header.data_page_header.num_values < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative number of values in data page"); num_rows_in_page = header.data_page_header.num_values; + } if (num_rows_in_page.has_value()) { @@ -1411,8 +1471,13 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size /// Get information about page layout and encoding out of page header. + checkThriftEnum(column.meta->meta_data.codec, parq::_CompressionCodec_VALUES_TO_NAMES, "compression codec"); page.codec = column.meta->meta_data.codec; - page.values_uncompressed_size = header.uncompressed_page_size; + /// Signed i32 from the thrift header; a negative value would sign-extend to a huge size_t and + /// later cause a huge allocation in decompressPageIfCompressed. + if (header.uncompressed_page_size < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative uncompressed page size"); + page.values_uncompressed_size = size_t(header.uncompressed_page_size); if (page.codec == parq::CompressionCodec::UNCOMPRESSED && header.uncompressed_page_size != header.compressed_page_size) throw Exception(ErrorCodes::INCORRECT_DATA, "No compression, but compressed and uncompressed page size are different"); @@ -1426,7 +1491,9 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size if (header.type == parq::PageType::DATA_PAGE) { - page.num_values = header.data_page_header.num_values; + if (header.data_page_header.num_values < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative number of values in data page"); + page.num_values = size_t(header.data_page_header.num_values); page.encoding = header.data_page_header.encoding; def_encoding = header.data_page_header.definition_level_encoding; rep_encoding = header.data_page_header.repetition_level_encoding; @@ -1467,10 +1534,20 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size } else if (header.type == parq::PageType::DATA_PAGE_V2) { - page.num_values = header.data_page_header_v2.num_values; + if (header.data_page_header_v2.num_values < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative number of values in data page"); + page.num_values = size_t(header.data_page_header_v2.num_values); page.encoding = header.data_page_header_v2.encoding; - encoded_def_size = header.data_page_header_v2.definition_levels_byte_length; - encoded_rep_size = header.data_page_header_v2.repetition_levels_byte_length; + + /// These come from the thrift header as signed i32. A negative value would sign-extend to a + /// huge size_t, so reject it before assigning to the size_t fields. Otherwise the bounds + /// check below could be bypassed by integer overflow, and a huge std::span would reach the + /// rep/def level decoder, reading far past the page buffer (heap out-of-bounds read). + if (header.data_page_header_v2.definition_levels_byte_length < 0 || + header.data_page_header_v2.repetition_levels_byte_length < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative definition/repetition levels byte length in DataPageV2"); + encoded_def_size = size_t(header.data_page_header_v2.definition_levels_byte_length); + encoded_rep_size = size_t(header.data_page_header_v2.repetition_levels_byte_length); if (header.data_page_header_v2.__isset.is_compressed && !header.data_page_header_v2.is_compressed) @@ -1478,12 +1555,15 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size page.codec = parq::CompressionCodec::UNCOMPRESSED; } - if (encoded_def_size + encoded_rep_size > compressed_page_size) + /// Non-wrapping bounds check: `encoded_def_size + encoded_rep_size` could overflow. + if (encoded_rep_size > page.data.size() || encoded_def_size > page.data.size() - encoded_rep_size) throw Exception(ErrorCodes::INCORRECT_DATA, "Page data is too short (def+rep)"); encoded_rep = page.data.data(); encoded_def = page.data.data() + encoded_rep_size; size_t uncompressed_part = encoded_def_size + encoded_rep_size; page.data = page.data.subspan(uncompressed_part); + if (page.values_uncompressed_size < uncompressed_part) + throw Exception(ErrorCodes::INCORRECT_DATA, "DataPageV2 uncompressed page size is smaller than the rep/def levels"); page.values_uncompressed_size -= uncompressed_part; } else if (header.type == parq::PageType::DICTIONARY_PAGE) @@ -1843,6 +1923,10 @@ void Reader::decompressPageIfCompressed(PageState & page) MutableColumnPtr Reader::formOutputColumn(RowSubgroup & row_subgroup, size_t output_column_idx, size_t num_rows) { + /// Recurses over the nested output column tree, whose depth is bounded by SchemaConverter's + /// recursion limit; guard the native stack here too as defense in depth. + checkStackSize(); + const OutputColumnInfo & output_info = output_columns.at(output_column_idx); TypeIndex kind = output_info.type->getColumnType(); MutableColumnPtr res; diff --git a/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp b/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp index 2232adc7d42e..67ffd2f9b346 100644 --- a/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp +++ b/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -121,6 +122,21 @@ NamesAndTypesList SchemaConverter::inferSchema() std::optional SchemaConverter::processSubtree(String name, bool requested, DataTypePtr type_hint, SchemaContext schema_context) { + /// Reject deeply nested schemas before recursing. The def-level guard below (def == UINT8_MAX) + /// only counts OPTIONAL/REPEATED nodes, so a chain of REQUIRED groups would bypass it and + /// overflow the native stack. Track the real recursion depth unconditionally and reject early; + /// checkStackSize is a last-resort backstop if max_parser_depth is raised. + /// max_parser_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + checkStackSize(); + ++recursion_depth; + SCOPE_EXIT({ --recursion_depth; }); + if (options.format.max_parser_depth != 0 && recursion_depth > options.format.max_parser_depth) + throw Exception( + ErrorCodes::TOO_DEEP_RECURSION, + "Parquet schema is nested deeper than the limit ({}). It can be raised with the setting " + "'max_parser_depth', but a very deeply nested schema is rarely intentional", + options.format.max_parser_depth); + if (type_hint) chassert(requested); if (schema_idx >= file_metadata.schema.size()) diff --git a/src/Processors/Formats/Impl/Parquet/SchemaConverter.h b/src/Processors/Formats/Impl/Parquet/SchemaConverter.h index eb8bf807b350..ef42feb89cca 100644 --- a/src/Processors/Formats/Impl/Parquet/SchemaConverter.h +++ b/src/Processors/Formats/Impl/Parquet/SchemaConverter.h @@ -24,6 +24,9 @@ struct SchemaConverter size_t schema_idx = 1; size_t primitive_column_idx = 0; std::vector levels; + /// Actual recursion depth of processSubtree. Tracked unconditionally because the def-level + /// counter only advances for OPTIONAL/REPEATED nodes, so REQUIRED-group nesting would bypass it. + size_t recursion_depth = 0; std::unordered_map geo_columns; diff --git a/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp b/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp index 6598846d4ae7..6c17eb278579 100644 --- a/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp +++ b/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp @@ -267,33 +267,40 @@ static SummingSortedAlgorithm::ColumnsDefinition defineColumns( /// if nested table name ends with `Map` it is a possible candidate for special handling if (map_name == column.name || !endsWith(map_name, "Map")) { - bool is_agg_func = WhichDataType(column.type).isAggregateFunction(); - - SummingSortedAlgorithm::AggregateDescription desc; - desc.remove_default_values = remove_default_values; - desc.aggregate_all_columns = aggregate_all_columns; - desc.sum_function_map_name = sum_function_map_name; - desc.is_agg_func_type = is_agg_func; - desc.column_numbers = {i}; - - desc.real_type = column.type; - desc.nested_type = recursiveRemoveLowCardinality(desc.real_type); - if (desc.real_type.get() == desc.nested_type.get()) - desc.nested_type = nullptr; - - if (simple) + if (!column_names_to_sum.empty() && !isInNames(column.name, column_names_to_sum)) { - // simple aggregate function - desc.init(simple->getFunction(), true); - if (desc.function->allocatesMemoryInArena()) - def.allocates_memory_in_arena = true; + def.column_numbers_not_to_aggregate.push_back(i); } - else if (!is_agg_func) + else { - desc.init(sum_function_name.c_str(), {column.type}); - } + bool is_agg_func = WhichDataType(column.type).isAggregateFunction(); - def.columns_to_aggregate.emplace_back(std::move(desc)); + SummingSortedAlgorithm::AggregateDescription desc; + desc.remove_default_values = remove_default_values; + desc.aggregate_all_columns = aggregate_all_columns; + desc.sum_function_map_name = sum_function_map_name; + desc.is_agg_func_type = is_agg_func; + desc.column_numbers = {i}; + + desc.real_type = column.type; + desc.nested_type = recursiveRemoveLowCardinality(desc.real_type); + if (desc.real_type.get() == desc.nested_type.get()) + desc.nested_type = nullptr; + + if (simple) + { + // simple aggregate function + desc.init(simple->getFunction(), true); + if (desc.function->allocatesMemoryInArena()) + def.allocates_memory_in_arena = true; + } + else if (!is_agg_func) + { + desc.init(sum_function_name.c_str(), {column.type}); + } + + def.columns_to_aggregate.emplace_back(std::move(desc)); + } } continue; diff --git a/src/Processors/Sources/ArrowFlightSource.cpp b/src/Processors/Sources/ArrowFlightSource.cpp index f1c4acc1344a..8081b4c30741 100644 --- a/src/Processors/Sources/ArrowFlightSource.cpp +++ b/src/Processors/Sources/ArrowFlightSource.cpp @@ -106,6 +106,11 @@ Chunk ArrowFlightSource::generate() FormatSettings::DateTimeOverflowBehavior::Throw, /* allow_geoparquet_parser = */ false); + /// Validate validity bitmaps before building the table: Table::FromRecordBatches computes + /// each column's null_count, and Arrow derives an unknown FieldNode null_count by scanning + /// the bitmap over the declared length, which reads out of bounds on a truncated bitmap. + ArrowColumnToCHColumn::checkRecordBatchValidityBitmaps(*batch); + auto batch_result = arrow::Table::FromRecordBatches({batch}); if (!batch_result.ok()) { diff --git a/src/Server/HTTPHandler.cpp b/src/Server/HTTPHandler.cpp index acb46c38a2d5..6c2daa1dc692 100644 --- a/src/Server/HTTPHandler.cpp +++ b/src/Server/HTTPHandler.cpp @@ -249,7 +249,13 @@ void HTTPHandler::processQuery( setReadOnlyIfHTTPMethodIdempotent(context, request.getMethod()); /// Set the query id supplied by the user, if any, and also update the OpenTelemetry fields. - context->setCurrentQueryId(params.get("query_id", request.get("X-ClickHouse-Query-Id", ""))); + String query_id = params.get("query_id", request.get("X-ClickHouse-Query-Id", "")); + + /// Sanitize query_id: remove ASCII control characters to prevent CRLF injection + /// into HTTP response headers (the query_id is reflected in X-ClickHouse-Query-Id). + std::erase_if(query_id, [](unsigned char c) { return isControlASCII(c) || c == 0x7F; }); + + context->setCurrentQueryId(query_id); bool has_external_data = startsWith(request.getContentType(), "multipart/form-data"); diff --git a/src/Server/PrometheusRequestHandler.cpp b/src/Server/PrometheusRequestHandler.cpp index fc7ccc4430ba..c3ea26edf444 100644 --- a/src/Server/PrometheusRequestHandler.cpp +++ b/src/Server/PrometheusRequestHandler.cpp @@ -181,7 +181,13 @@ class PrometheusRequestHandler::ImplWithContext : public Impl context->applySettingsChanges(settings_changes); /// Set the query id supplied by the user, if any, and also update the OpenTelemetry fields. - context->setCurrentQueryId(params->get("query_id", request.get("X-ClickHouse-Query-Id", ""))); + String query_id = params->get("query_id", request.get("X-ClickHouse-Query-Id", "")); + + /// Sanitize query_id: remove ASCII control characters to prevent CRLF injection + /// into HTTP response headers (the query_id is reflected in X-ClickHouse-Query-Id). + std::erase_if(query_id, [](unsigned char c) { return isControlASCII(c) || c == 0x7F; }); + + context->setCurrentQueryId(query_id); } void onException() override diff --git a/src/Storages/Kafka/KeeperHandlingConsumer.cpp b/src/Storages/Kafka/KeeperHandlingConsumer.cpp index 449e7e56e916..5b3605dccc15 100644 --- a/src/Storages/Kafka/KeeperHandlingConsumer.cpp +++ b/src/Storages/Kafka/KeeperHandlingConsumer.cpp @@ -130,12 +130,14 @@ bool KeeperHandlingConsumer::needsNewKeeper() const void KeeperHandlingConsumer::setKeeper(const std::shared_ptr & keeper_) { - keeper = keeper_; + /// Drop the lock holders before replacing `keeper` -- same use-after-free hazard as + /// `replica_is_active_node` in `StorageKafka2::partialShutdown` (see comment there). { std::lock_guard lock(topic_partition_locks_mutex); permanent_locks.clear(); tmp_locks.clear(); } + keeper = keeper_; tmp_locks_quota = 0; assigned_topic_partitions.clear(); topic_partition_index_to_consume_from = 0; diff --git a/src/Storages/MergeTree/DataPartsExchange.cpp b/src/Storages/MergeTree/DataPartsExchange.cpp index 15df3bfca504..f61bff5d3cdf 100644 --- a/src/Storages/MergeTree/DataPartsExchange.cpp +++ b/src/Storages/MergeTree/DataPartsExchange.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -110,6 +111,15 @@ struct ReplicatedFetchReadCallback } }; +/// Validate a projection name from an untrusted replica before it is used to build a path. +/// It becomes a single directory component (".proj"), so it must be non-empty and contain +/// no '/'. Standalone "." and ".." are safe here ("..proj"/"...proj" are single components). +bool isProjectionNameSafe(const std::string & projection_name) +{ + return !projection_name.empty() + && projection_name.find('/') == std::string::npos; +} + } @@ -709,14 +719,15 @@ void Fetcher::downloadBaseOrProjectionPartToDisk( readStringBinary(file_name, in); readBinary(file_size, in); - /// File must be inside "absolute_part_path" directory. - /// Otherwise malicious ClickHouse replica may force us to write to arbitrary path. - String absolute_file_path = fs::weakly_canonical(fs::path(data_part_storage->getRelativePath()) / file_name); - if (!startsWith(absolute_file_path, fs::weakly_canonical(data_part_storage->getRelativePath()).string())) + /// Guard against a malicious replica writing outside the part directory. + /// Runs for both the base part and projection parts. + const auto absolute_file_path = fs::weakly_canonical(fs::path(data_part_storage->getRelativePath()) / file_name); + if (!pathStartsWith(absolute_file_path, fs::path(data_part_storage->getRelativePath()))) throw Exception(ErrorCodes::INSECURE_PATH, "File path ({}) doesn't appear to be inside part path ({}). " "This may happen if we are trying to download part from malicious replica or logical error.", - absolute_file_path, data_part_storage->getRelativePath()); + absolute_file_path.string(), + data_part_storage->getRelativePath()); written_files.emplace_back(output_buffer_getter(*data_part_storage, file_name, file_size)); HashingWriteBuffer hashing_out(*written_files.back()); @@ -836,6 +847,15 @@ MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToDisk( { String projection_name; readStringBinary(projection_name, in); + + /// Validate before getProjection()/createDirectories() so no attacker-named + /// directory is ever created from an untrusted replica's projection name. + if (!isProjectionNameSafe(projection_name)) + throw Exception(ErrorCodes::INSECURE_PATH, + "Projection name ({}) doesn't appear to be a valid name. " + "This may happen if we are trying to download part from malicious replica or logical error.", + projection_name); + MergeTreeData::DataPart::Checksums projection_checksum; auto projection_part_storage = part_storage_for_loading->getProjection(projection_name + ".proj"); diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index a9aefdbd8822..6b42301e6daa 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -6490,8 +6490,11 @@ void MergeTreeData::restoreDataFromBackup(RestorerFromBackup & restorer, const S class MergeTreeData::RestoredPartsHolder { public: - RestoredPartsHolder(const std::shared_ptr & storage_, const BackupPtr & backup_) - : storage(storage_), backup(backup_) + RestoredPartsHolder( + const std::shared_ptr & storage_, + const BackupPtr & backup_, + const ZooKeeperRetriesInfo & zookeeper_retries_info_) + : storage(storage_), backup(backup_), zookeeper_retries_info(zookeeper_retries_info_) { } @@ -6548,7 +6551,7 @@ class MergeTreeData::RestoredPartsHolder parts.end(), [](const MutableDataPartPtr & lhs, const MutableDataPartPtr & rhs) { return lhs->info.min_block < rhs->info.min_block; }); - storage->attachRestoredParts(std::move(parts)); + storage->attachRestoredParts(std::move(parts), zookeeper_retries_info); parts.clear(); temp_part_dirs.clear(); num_parts = 0; @@ -6556,6 +6559,7 @@ class MergeTreeData::RestoredPartsHolder const std::shared_ptr storage; const BackupPtr backup; + const ZooKeeperRetriesInfo zookeeper_retries_info; size_t num_parts = 0; size_t num_broken_parts = 0; MutableDataPartsVector parts; @@ -6575,7 +6579,8 @@ void MergeTreeData::restorePartsFromBackup(RestorerFromBackup & restorer, const bool restore_broken_parts_as_detached = restorer.getRestoreSettings().restore_broken_parts_as_detached; - auto restored_parts_holder = std::make_shared(std::static_pointer_cast(shared_from_this()), backup); + auto restored_parts_holder = std::make_shared( + std::static_pointer_cast(shared_from_this()), backup, restorer.getZooKeeperRetriesInfo()); fs::path data_path_in_backup_fs = data_path_in_backup; size_t num_parts = 0; diff --git a/src/Storages/MergeTree/MergeTreeData.h b/src/Storages/MergeTree/MergeTreeData.h index 2cd69c086473..e51a5c506d89 100644 --- a/src/Storages/MergeTree/MergeTreeData.h +++ b/src/Storages/MergeTree/MergeTreeData.h @@ -59,6 +59,7 @@ class Context; struct JobAndPool; class MergeTreeTransaction; struct ZeroCopyLock; +struct ZooKeeperRetriesInfo; class IBackupEntry; using BackupEntries = std::vector>>; @@ -1640,7 +1641,7 @@ class MergeTreeData : public IStorage, public WithMutableContext MutableDataPartPtr loadPartRestoredFromBackup(const String & part_name, const DiskPtr & disk, const String & temp_part_dir, bool detach_if_broken) const; /// Attaches restored parts to the storage. - virtual void attachRestoredParts(MutableDataPartsVector && parts) = 0; + virtual void attachRestoredParts(MutableDataPartsVector && parts, const std::optional & zookeeper_retries_info) = 0; void resetObjectColumnsFromActiveParts(const DataPartsLock & lock); void updateObjectColumns(const DataPartPtr & part, const DataPartsLock & lock); diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp index 96f934fc6de1..90439c063f06 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp @@ -52,6 +52,7 @@ namespace FailPoints extern const char replicated_merge_tree_insert_quorum_fail_0[]; extern const char replicated_merge_tree_commit_zk_fail_when_recovering_from_hw_fault[]; extern const char replicated_merge_tree_insert_retry_pause[]; + extern const char replicated_merge_tree_restore_attach_retry[]; extern const char rmt_delay_commit_part[]; } @@ -123,7 +124,8 @@ ReplicatedMergeTreeSinkImpl::ReplicatedMergeTreeSinkImpl( bool majority_quorum, ContextPtr context_, bool is_attach_, - bool allow_attach_while_readonly_) + bool allow_attach_while_readonly_, + std::optional keeper_retries_info_) : SinkToStorage(std::make_shared(metadata_snapshot_->getSampleBlock())) , storage(storage_) , metadata_snapshot(metadata_snapshot_) @@ -137,6 +139,7 @@ ReplicatedMergeTreeSinkImpl::ReplicatedMergeTreeSinkImpl( , log(getLogger(storage.getLogName() + " (Replicated OutputStream)")) , context(context_) , storage_snapshot(storage.getStorageSnapshotWithoutData(metadata_snapshot, context_)) + , keeper_retries_info(std::move(keeper_retries_info_)) { /// The quorum value `1` has the same meaning as if it is disabled. if (required_quorum_size == 1) @@ -549,7 +552,7 @@ void ReplicatedMergeTreeSinkImpl::finishDelayedChunk(const ZooKeeperWithFa } template<> -bool ReplicatedMergeTreeSinkImpl::writeExistingPart(MergeTreeData::MutableDataPartPtr & part) +bool ReplicatedMergeTreeSinkImpl::writeExistingPart(MergeTreeData::MutableDataPartPtr & part, bool deduplicate_part) { /// NOTE: No delay in this case. That's Ok. auto origin_zookeeper = storage.getZooKeeper(); @@ -588,7 +591,7 @@ bool ReplicatedMergeTreeSinkImpl::writeExistingPart(MergeTreeData::Mutabl part->info.mutation = 0; part->version.setCreationTID(Tx::PrehistoricTID, nullptr); - String block_id = deduplicate ? fmt::format("{}_{}", part->info.getPartitionId(), part->checksums.getTotalChecksumHex()) : ""; + String block_id = deduplicate && deduplicate_part ? fmt::format("{}_{}", part->info.getPartitionId(), part->checksums.getTotalChecksumHex()) : ""; bool deduplicated = commitPart(zookeeper, part, block_id, replicas_num).second; int error = 0; @@ -722,13 +725,15 @@ std::pair, bool> ReplicatedMergeTreeSinkImpl:: CommitRetryContext retry_context; const auto & settings = context->getSettingsRef(); + ZooKeeperRetriesInfo retries_info = keeper_retries_info.value_or(ZooKeeperRetriesInfo{ + settings[Setting::insert_keeper_max_retries], + settings[Setting::insert_keeper_retry_initial_backoff_ms], + settings[Setting::insert_keeper_retry_max_backoff_ms], + context->getProcessListElement()}); ZooKeeperRetriesControl retries_ctl( "commitPart", log, - {settings[Setting::insert_keeper_max_retries], - settings[Setting::insert_keeper_retry_initial_backoff_ms], - settings[Setting::insert_keeper_retry_max_backoff_ms], - context->getProcessListElement()}); + retries_info); auto resolve_duplicate_stage = [&] () -> CommitRetryContext::Stages { @@ -854,6 +859,16 @@ std::pair, bool> ReplicatedMergeTreeSinkImpl:: auto commit_new_part_stage = [&]() -> CommitRetryContext::Stages { + if (is_attach) + { + fiu_do_on(FailPoints::replicated_merge_tree_restore_attach_retry, + { + retries_ctl.setUserError( + Exception(ErrorCodes::TABLE_IS_READ_ONLY, "Injected read-only error while attaching restored part")); + return CommitRetryContext::LOCK_AND_COMMIT; + }); + } + if (storage.is_readonly) { /// stop retries if in shutdown diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeSink.h b/src/Storages/MergeTree/ReplicatedMergeTreeSink.h index 598fa1c7d4b6..f100ac8f5c1e 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeSink.h +++ b/src/Storages/MergeTree/ReplicatedMergeTreeSink.h @@ -1,6 +1,8 @@ #pragma once +#include #include + #include #include #include @@ -84,7 +86,8 @@ class ReplicatedMergeTreeSinkImpl : public SinkToStorage // special flag to determine the ALTER TABLE ATTACH PART without the query context, // needed to set the special LogEntryType::ATTACH_PART bool is_attach_ = false, - bool allow_attach_while_readonly_ = false); + bool allow_attach_while_readonly_ = false, + std::optional keeper_retries_info_ = std::nullopt); ~ReplicatedMergeTreeSinkImpl() override; @@ -94,8 +97,9 @@ class ReplicatedMergeTreeSinkImpl : public SinkToStorage String getName() const override { return "ReplicatedMergeTreeSink"; } - /// For ATTACHing existing data on filesystem. - bool writeExistingPart(MergeTreeData::MutableDataPartPtr & part); + /// For `ATTACH`ing existing data on filesystem. `RESTORE` paths use `deduplicate_part = false` + /// to preserve duplicate parts. + bool writeExistingPart(MergeTreeData::MutableDataPartPtr & part, bool deduplicate_part = true); protected: virtual void finishDelayedChunk(const ZooKeeperWithFaultInjectionPtr & zookeeper); @@ -167,6 +171,7 @@ class ReplicatedMergeTreeSinkImpl : public SinkToStorage ContextPtr context; StorageSnapshotPtr storage_snapshot; + std::optional keeper_retries_info; UInt64 chunk_dedup_seqnum = 0; /// input chunk ordinal number in case of dedup token }; diff --git a/src/Storages/ObjectStorage/DataLakes/Iceberg/AvroForIcebergDeserializer.cpp b/src/Storages/ObjectStorage/DataLakes/Iceberg/AvroForIcebergDeserializer.cpp index 5057b5df9d2d..5b62c301d215 100644 --- a/src/Storages/ObjectStorage/DataLakes/Iceberg/AvroForIcebergDeserializer.cpp +++ b/src/Storages/ObjectStorage/DataLakes/Iceberg/AvroForIcebergDeserializer.cpp @@ -31,7 +31,7 @@ try , manifest_file_path(manifest_file_path_) { auto manifest_file_reader - = std::make_unique(std::make_unique(*buffer)); + = std::make_unique(std::make_unique(*buffer), MAX_AVRO_SCHEMA_DEPTH); avro::NodePtr root_node = manifest_file_reader->dataSchema().root(); auto data_type = AvroSchemaReader::avroNodeToDataType(root_node); diff --git a/src/Storages/ObjectStorage/S3/Configuration.cpp b/src/Storages/ObjectStorage/S3/Configuration.cpp index 302c34614f6e..14af723b756f 100644 --- a/src/Storages/ObjectStorage/S3/Configuration.cpp +++ b/src/Storages/ObjectStorage/S3/Configuration.cpp @@ -53,6 +53,7 @@ namespace S3AuthSetting extern const S3AuthSettingsString role_arn; extern const S3AuthSettingsString role_session_name; + extern const S3AuthSettingsString external_id; extern const S3AuthSettingsString http_client; extern const S3AuthSettingsString service_account; extern const S3AuthSettingsString metadata_service; @@ -95,6 +96,7 @@ static const std::unordered_set optional_configuration_keys = /// Private configuration options "role_arn", /// for extra_credentials "role_session_name", /// for extra_credentials + "external_id", /// for extra_credentials "http_client", /// For GCP "metadata_service", /// For GCP "service_account", /// For GCP @@ -211,6 +213,7 @@ void StorageS3Configuration::fromNamedCollection(const NamedCollection & collect partition_columns_in_data_file = collection.getOrDefault("partition_columns_in_data_file", partition_strategy_type != PartitionStrategyFactory::StrategyType::HIVE); s3_settings->auth_settings[S3AuthSetting::role_arn] = collection.getOrDefault("role_arn", ""); s3_settings->auth_settings[S3AuthSetting::role_session_name] = collection.getOrDefault("role_session_name", ""); + s3_settings->auth_settings[S3AuthSetting::external_id] = collection.getOrDefault("external_id", ""); s3_settings->auth_settings[S3AuthSetting::http_client] = collection.getOrDefault("http_client", ""); s3_settings->auth_settings[S3AuthSetting::service_account] = collection.getOrDefault("service_account", ""); @@ -286,6 +289,8 @@ bool StorageS3Configuration::collectCredentials(ASTPtr maybe_credentials, S3::S3 auth_settings_[S3AuthSetting::role_arn] = arg_value.safeGet(); else if (arg_name == "role_session_name") auth_settings_[S3AuthSetting::role_session_name] = arg_value.safeGet(); + else if (arg_name == "external_id") + auth_settings_[S3AuthSetting::external_id] = arg_value.safeGet(); else throw Exception(ErrorCodes::BAD_ARGUMENTS, "Invalid credential argument found: {}", arg_name); } @@ -972,4 +977,3 @@ void StorageS3Configuration::addStructureAndFormatToArgsIfNeeded( } #endif - diff --git a/src/Storages/StorageMergeTree.cpp b/src/Storages/StorageMergeTree.cpp index acfe2905f91d..55e4d21880fe 100644 --- a/src/Storages/StorageMergeTree.cpp +++ b/src/Storages/StorageMergeTree.cpp @@ -2722,7 +2722,7 @@ BackupEntries StorageMergeTree::backupMutations(UInt64 version, const String & d } -void StorageMergeTree::attachRestoredParts(MutableDataPartsVector && parts) +void StorageMergeTree::attachRestoredParts(MutableDataPartsVector && parts, const std::optional &) { for (auto part : parts) { diff --git a/src/Storages/StorageMergeTree.h b/src/Storages/StorageMergeTree.h index 00cbc7acdad8..89533726ff27 100644 --- a/src/Storages/StorageMergeTree.h +++ b/src/Storages/StorageMergeTree.h @@ -291,7 +291,7 @@ class StorageMergeTree final : public MergeTreeData BackupEntries backupMutations(UInt64 version, const String & data_path_in_backup) const; /// Attaches restored parts to the storage. - void attachRestoredParts(MutableDataPartsVector && parts) override; + void attachRestoredParts(MutableDataPartsVector && parts, const std::optional & zookeeper_retries_info) override; std::unique_ptr getDefaultSettings() const override; diff --git a/src/Storages/StorageMongoDB.cpp b/src/Storages/StorageMongoDB.cpp index 42202a230fe0..17a7722af4dd 100644 --- a/src/Storages/StorageMongoDB.cpp +++ b/src/Storages/StorageMongoDB.cpp @@ -49,6 +49,7 @@ namespace DB namespace ErrorCodes { + extern const int BAD_ARGUMENTS; extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; extern const int NOT_IMPLEMENTED; } @@ -68,6 +69,15 @@ void MongoDBConfiguration::checkHosts(const ContextPtr & context) const context->getRemoteHostFilter().checkHostAndPort(host.name, toString(host.port)); } +void MongoDBConfiguration::checkCollection() const +{ + /// The C driver builds the namespace as "." and asserts that the collection part is non-empty. + /// It treats the name as a NUL-terminated C string, so any embedded NUL truncates it and can produce an + /// effectively empty collection name, which aborts the process inside the driver. + if (collection.empty() || collection.find('\0') != String::npos) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "MongoDB collection name must be non-empty and must not contain NUL characters"); +} + StorageMongoDB::StorageMongoDB( const StorageID & table_id_, MongoDBConfiguration configuration_, @@ -223,6 +233,7 @@ static MongoDBConfiguration getConfigurationImpl(const StorageID * table_id, AST } configuration.checkHosts(context); + configuration.checkCollection(); return configuration; } diff --git a/src/Storages/StorageMongoDB.h b/src/Storages/StorageMongoDB.h index 7c8f6a913232..d9287ae6ddb2 100644 --- a/src/Storages/StorageMongoDB.h +++ b/src/Storages/StorageMongoDB.h @@ -46,6 +46,7 @@ struct MongoDBConfiguration std::unordered_set oid_fields = {"_id"}; void checkHosts(const ContextPtr & context) const; + void checkCollection() const; bool isOidColumn(const std::string & name) const { diff --git a/src/Storages/StorageReplicatedMergeTree.cpp b/src/Storages/StorageReplicatedMergeTree.cpp index aadf16191b5d..787b7fca529a 100644 --- a/src/Storages/StorageReplicatedMergeTree.cpp +++ b/src/Storages/StorageReplicatedMergeTree.cpp @@ -6891,8 +6891,18 @@ void StorageReplicatedMergeTree::restoreMetadataInZooKeeper( has_metadata_in_zookeeper = true; if (is_first_replica) - for (const String& part_name : active_parts_names) - attachPartition(std::make_shared(part_name), metadata_snapshot, true, getContext()); + { + for (const auto & part_name : active_parts_names) + { + attachPartitionImpl( + std::make_shared(part_name), + metadata_snapshot, + /* attach_part */ true, + getContext(), + /* allow_attach_while_readonly */ true, + /* deduplicate_part */ false); + } + } if (!is_called_during_attach) { @@ -6994,8 +7004,24 @@ PartitionCommandsResultInfo StorageReplicatedMergeTree::attachPartition( bool attach_part, ContextPtr query_context) { - /// Allow ATTACH PARTITION on readonly replica when restoring it. - if (!are_restoring_replica) + return attachPartitionImpl( + partition, + metadata_snapshot, + attach_part, + query_context, + /* allow_attach_while_readonly */ false, + /* deduplicate_part */ true); +} + +PartitionCommandsResultInfo StorageReplicatedMergeTree::attachPartitionImpl( + const ASTPtr & partition, + const StorageMetadataPtr & metadata_snapshot, + bool attach_part, + ContextPtr query_context, + bool allow_attach_while_readonly, + bool deduplicate_part) +{ + if (!allow_attach_while_readonly) assertNotReadonly(); PartitionCommandsResultInfo results; @@ -7014,7 +7040,7 @@ PartitionCommandsResultInfo StorageReplicatedMergeTree::attachPartition( /* majority_quorum */ false, query_context, /* is_attach */ true, - /* allow_attach_while_readonly */ true); + /* allow_attach_while_readonly */ allow_attach_while_readonly); results.reserve(loaded_parts.size()); @@ -7022,7 +7048,7 @@ PartitionCommandsResultInfo StorageReplicatedMergeTree::attachPartition( { const String old_name = loaded_parts[i]->name; - output.writeExistingPart(loaded_parts[i]); + output.writeExistingPart(loaded_parts[i], deduplicate_part); renamed_parts.old_and_new_names[i].old_name.clear(); @@ -11286,16 +11312,17 @@ void StorageReplicatedMergeTree::restoreDataFromBackup(RestorerFromBackup & rest restorePartsFromBackup(restorer, data_path_in_backup, partitions); } -void StorageReplicatedMergeTree::attachRestoredParts(MutableDataPartsVector && parts) +void StorageReplicatedMergeTree::attachRestoredParts( + MutableDataPartsVector && parts, const std::optional & zookeeper_retries_info) { auto metadata_snapshot = getInMemoryMetadataPtr(); auto sink = std::make_shared( *this, metadata_snapshot, /* quorum */ 0, /* quorum_timeout_ms */ 0, /* max_parts_per_block */ 0, /* quorum_parallel */ false, - /* deduplicate */ false, /* majority_quorum */ false, getContext(), /* is_attach */ true, /* allow_attach_while_readonly */ false); + /* deduplicate */ false, /* majority_quorum */ false, getContext(), /* is_attach */ true, /* allow_attach_while_readonly */ false, zookeeper_retries_info); - for (auto part : parts) - sink->writeExistingPart(part); + for (auto & part : parts) + sink->writeExistingPart(part, /* deduplicate_part */ false); } template std::optional StorageReplicatedMergeTree::allocateBlockNumber( diff --git a/src/Storages/StorageReplicatedMergeTree.h b/src/Storages/StorageReplicatedMergeTree.h index 487c3a3f44c0..ad41fcfdd39b 100644 --- a/src/Storages/StorageReplicatedMergeTree.h +++ b/src/Storages/StorageReplicatedMergeTree.h @@ -912,6 +912,13 @@ class StorageReplicatedMergeTree final : public MergeTreeData // Partition helpers void dropPartition(const ASTPtr & partition, bool detach, ContextPtr query_context) override; PartitionCommandsResultInfo attachPartition(const ASTPtr & partition, const StorageMetadataPtr & metadata_snapshot, bool part, ContextPtr query_context) override; + PartitionCommandsResultInfo attachPartitionImpl( + const ASTPtr & partition, + const StorageMetadataPtr & metadata_snapshot, + bool attach_part, + ContextPtr query_context, + bool allow_attach_while_readonly, + bool deduplicate_part); void replacePartitionFrom(const StoragePtr & source_table, const ASTPtr & partition, bool replace, ContextPtr query_context) override; void movePartitionToTable(const StoragePtr & dest_table, const ASTPtr & partition, ContextPtr query_context) override; void movePartitionToShard(const ASTPtr & partition, bool move_part, const String & to, ContextPtr query_context) override; @@ -958,7 +965,7 @@ class StorageReplicatedMergeTree final : public MergeTreeData void startBackgroundMovesIfNeeded() override; /// Attaches restored parts to the storage. - void attachRestoredParts(MutableDataPartsVector && parts) override; + void attachRestoredParts(MutableDataPartsVector && parts, const std::optional & zookeeper_retries_info) override; std::unique_ptr getDefaultSettings() const override; diff --git a/src/Storages/System/StorageSystemCompletions.cpp b/src/Storages/System/StorageSystemCompletions.cpp index 3664e841c099..53b11837c5ac 100644 --- a/src/Storages/System/StorageSystemCompletions.cpp +++ b/src/Storages/System/StorageSystemCompletions.cpp @@ -274,8 +274,7 @@ void fillDataWithPolicies(MutableColumns & res_columns, const ContextPtr & conte void fillDataWithDictionaries(MutableColumns & res_columns, const ContextPtr & context) { const auto & access = context->getAccess(); - if (access->isGranted(AccessType::SHOW_DICTIONARIES)) - return; + const bool need_to_check_access_for_dictionaries = !access->isGranted(AccessType::SHOW_DICTIONARIES); const auto & external_dictionaries = context->getExternalDictionariesLoader(); for (const auto & load_result : external_dictionaries.getLoadResults()) @@ -291,7 +290,7 @@ void fillDataWithDictionaries(MutableColumns & res_columns, const ContextPtr & c dict_id.table_name = load_result.name; String db_or_tag = dict_id.database_name.empty() ? IDictionary::NO_DATABASE_TAG : dict_id.database_name; - if (!access->isGranted(AccessType::SHOW_DICTIONARIES, db_or_tag, dict_id.table_name)) + if (need_to_check_access_for_dictionaries && !access->isGranted(AccessType::SHOW_DICTIONARIES, db_or_tag, dict_id.table_name)) continue; res_columns[0]->insert(dict_id.table_name); res_columns[1]->insert(DICTIONARY_CONTEXT); diff --git a/src/Storages/System/StorageSystemContributors.generated.cpp b/src/Storages/System/StorageSystemContributors.generated.cpp index d85cb2413c66..f9538d0c4ede 100644 --- a/src/Storages/System/StorageSystemContributors.generated.cpp +++ b/src/Storages/System/StorageSystemContributors.generated.cpp @@ -518,6 +518,7 @@ const char * auto_contributors[] { "GoGoWen2021", "Gosha Letov", "Graham Campbell", + "Grant Holly", "Greg Maher", "Gregory", "Grigorii Sokolik", @@ -525,6 +526,7 @@ const char * auto_contributors[] { "Grigory Buteyko", "Grigory Korolev", "Grigory Pervakov", + "Groene AI", "GruffGemini", "Grégoire Pineau", "Guillaume Tassery", @@ -1090,6 +1092,7 @@ const char * auto_contributors[] { "Rafael David Tinoco", "Rafael Roquetto", "Rahul", + "Rahul Nair", "Rajakavitha Kodhandapani", "Rajkumar", "Rajkumar Varada", @@ -2119,6 +2122,7 @@ const char * auto_contributors[] { "singhksandeep25", "siyuan", "skyoct", + "slach", "slu", "slvrtrn", "snyk-bot", diff --git a/src/Storages/System/StorageSystemDictionaries.cpp b/src/Storages/System/StorageSystemDictionaries.cpp index 1926093f56d3..49a2856be5db 100644 --- a/src/Storages/System/StorageSystemDictionaries.cpp +++ b/src/Storages/System/StorageSystemDictionaries.cpp @@ -104,13 +104,10 @@ ColumnsDescription StorageSystemDictionaries::getColumnsDescription() void StorageSystemDictionaries::fillData(MutableColumns & res_columns, ContextPtr context, const ActionsDAG::Node *, std::vector) const { const auto access = context->getAccess(); - const bool check_access_for_dictionaries = access->isGranted(AccessType::SHOW_DICTIONARIES); + const bool need_to_check_access_for_dictionaries = !access->isGranted(AccessType::SHOW_DICTIONARIES); const auto & external_dictionaries = context->getExternalDictionariesLoader(); - if (!check_access_for_dictionaries) - return; - for (const auto & load_result : external_dictionaries.getLoadResults()) { const auto dict_ptr = std::dynamic_pointer_cast(load_result.object); @@ -121,7 +118,7 @@ void StorageSystemDictionaries::fillData(MutableColumns & res_columns, ContextPt StorageID dict_id = getDictionaryID(load_result, dict_ptr); String db_or_tag = dict_id.database_name.empty() ? IDictionary::NO_DATABASE_TAG : dict_id.database_name; - if (!access->isGranted(AccessType::SHOW_DICTIONARIES, db_or_tag, dict_id.table_name)) + if (need_to_check_access_for_dictionaries && !access->isGranted(AccessType::SHOW_DICTIONARIES, db_or_tag, dict_id.table_name)) continue; size_t i = 0; diff --git a/tests/integration/helpers/cluster.py b/tests/integration/helpers/cluster.py index 3be607ac2c87..563d21c79469 100644 --- a/tests/integration/helpers/cluster.py +++ b/tests/integration/helpers/cluster.py @@ -5125,7 +5125,7 @@ def _create_odbc_config_file(self): f.write(key + "=" + value + "\n") @contextmanager - def with_replace_config(self, path, replacement): + def with_replace_config(self, path, replacement, reload_before=False, reload_after=False): """Create a copy of existing config (if exists) and revert on leaving the context""" _directory, filename = os.path.split(path) basename, extension = os.path.splitext(filename) @@ -5137,12 +5137,16 @@ def with_replace_config(self, path, replacement): self.exec_in_container( ["bash", "-c", "echo '{}' > {}".format(replacement, path)] ) + if reload_before: + self.query("SYSTEM RELOAD CONFIG") try: yield finally: self.exec_in_container( ["bash", "-c", f"test ! -f {backup_path} || mv {backup_path} {path}"] ) + if reload_after: + self.query("SYSTEM RELOAD CONFIG") def replace_config(self, path_to_config, replacement): self.exec_in_container( diff --git a/tests/integration/helpers/port_forward.py b/tests/integration/helpers/port_forward.py index 230f434e04b2..9f29688d4fd4 100644 --- a/tests/integration/helpers/port_forward.py +++ b/tests/integration/helpers/port_forward.py @@ -70,6 +70,10 @@ def termination(connection: socket.socket, idx: int): def start(self, address, listen_port=0): self._address = address self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # Allow rebinding to the same fixed port immediately after stop(): the + # previously accepted connection lingers in TIME_WAIT on this port, so + # without SO_REUSEADDR bind() fails with "Address already in use". + self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._sock.bind(("", listen_port)) self._sock.listen() self._sock.settimeout(1) diff --git a/tests/integration/test_async_load_databases/test.py b/tests/integration/test_async_load_databases/test.py index a44abf25b427..48e1ac749f37 100644 --- a/tests/integration/test_async_load_databases/test.py +++ b/tests/integration/test_async_load_databases/test.py @@ -6,7 +6,7 @@ import pytest -from helpers.client import QueryRuntimeException +from helpers.client import QueryRuntimeException, QueryTimeoutExceedException from helpers.cluster import ClickHouseCluster from helpers.test_tools import assert_eq_with_retry @@ -398,24 +398,30 @@ def reload_node(node, event): ) ) - # start INSERTS when CH is not started yet + # Fire INSERTs while CH is restarting. Stop as soon as the restart finishes + # (event set) or its budget elapses, so repeated half-up-server hangs (each + # bounded by `timeout`) can't accumulate past the 900s pytest session timeout. + insert_phase_deadline = time.monotonic() + 180 for i in range(100, 130): + if disconnect_event.is_set() or time.monotonic() >= insert_phase_deadline: + break try: node1.query( - f"INSERT INTO test_mv.test_table_H VALUES({i})" + f"INSERT INTO test_mv.test_table_H VALUES({i})", timeout=60 ) logging.debug(f"{i} inserted") - except QueryRuntimeException as e: + except (QueryRuntimeException, QueryTimeoutExceedException) as e: # CH is not started yet logging.debug(f"{i} is not inserted - skip") time.sleep(0.2) - - disconnect_event.wait(90) + # restart must finish within budget; assert loudly instead of session-timeout + assert disconnect_event.wait(180), "restart_clickhouse() did not finish within 180s" for i in range(2000, 2100): + # timeout: bound a hung insert so it can't exhaust the 900s session timeout node1.query( - f"INSERT INTO test_mv.test_table_H VALUES({i})" + f"INSERT INTO test_mv.test_table_H VALUES({i})", timeout=60 ) src_rows = node1.query("select count(*) from test_mv.test_table_H Format CSV") diff --git a/tests/integration/test_backup_restore_on_cluster/test.py b/tests/integration/test_backup_restore_on_cluster/test.py index cc0533fd7a33..3b27e6f2d0ee 100644 --- a/tests/integration/test_backup_restore_on_cluster/test.py +++ b/tests/integration/test_backup_restore_on_cluster/test.py @@ -365,6 +365,47 @@ def test_replicated_table_with_uuid_in_zkpath(): ) +def test_replicated_table_restore_keeps_duplicate_parts(): + try: + node1.query( + "CREATE TABLE tbl ON CLUSTER 'cluster' (" + "key UInt64, value String, array Array(String)" + ") ENGINE=ReplicatedMergeTree('/clickhouse/tables/{uuid}', '{replica}')" + "ORDER BY tuple() SETTINGS replicated_deduplication_window = 0, " + "replicated_deduplication_window_for_async_inserts = 0" + ) + + node1.query("SYSTEM STOP MERGES ON CLUSTER 'cluster' tbl") + + node1.query("INSERT INTO tbl VALUES (0, 'same', ['same'])") + node1.query("INSERT INTO tbl VALUES (0, 'same', ['same'])") + node1.query( + "ALTER TABLE tbl ON CLUSTER 'cluster' MODIFY SETTING " + "replicated_deduplication_window = 10000, " + "replicated_deduplication_window_for_async_inserts = 10000" + ) + + assert node1.query("SELECT count() FROM tbl") == "2\n" + assert ( + node1.query("SELECT count() FROM system.parts WHERE table = 'tbl' AND active") + == "2\n" + ) + + backup_name = new_backup_name() + node1.query(f"BACKUP TABLE tbl ON CLUSTER 'cluster' TO {backup_name}") + + node2.query(f"RESTORE TABLE tbl AS tbl2 ON CLUSTER 'cluster' FROM {backup_name}") + node1.query("SYSTEM SYNC REPLICA ON CLUSTER 'cluster' tbl2") + + expected = node1.query("SELECT count(), sum(sipHash64(*)) FROM tbl") + for instance in [node1, node2]: + assert instance.query("SELECT count() FROM tbl2") == "2\n" + assert instance.query("SELECT count(), sum(sipHash64(*)) FROM tbl2") == expected + finally: + node1.query("DROP TABLE IF EXISTS tbl ON CLUSTER 'cluster' SYNC") + node1.query("DROP TABLE IF EXISTS tbl2 ON CLUSTER 'cluster' SYNC") + + def test_replicated_table_with_not_synced_insert(): node1.query( "CREATE TABLE tbl ON CLUSTER 'cluster' (" diff --git a/tests/integration/test_format_avro_confluent/test.py b/tests/integration/test_format_avro_confluent/test.py index b6d49c60c01f..587498fa5dad 100644 --- a/tests/integration/test_format_avro_confluent/test.py +++ b/tests/integration/test_format_avro_confluent/test.py @@ -85,6 +85,47 @@ def test_select(started_cluster): ] +def test_select_skip_symbolic(started_cluster): + # type: (ClickHouseCluster) -> None + + reg_url = "http://localhost:{}".format(started_cluster.schema_registry_port) + schema_registry_client = CachedSchemaRegistryClient({"url": reg_url}) + serializer = MessageSerializer(schema_registry_client) + + schema = avro.schema.make_avsc_object( + { + "name": "Node", + "type": "record", + "fields": [ + {"name": "value", "type": "long"}, + {"name": "next", "type": ["null", "Node"]}, + ], + } + ) + + record = {"value": 0, "next": {"value": 1, "next": {"value": 2, "next": None}}} + data = serializer.encode_record_with_schema( + "test_subject_skip_symbolic", schema, record + ) + + instance = started_cluster.instances["dummy"] # type: ClickHouseInstance + schema_registry_url = "http://{}:{}".format( + started_cluster.schema_registry_host, started_cluster.schema_registry_port + ) + settings = {"format_avro_schema_registry_url": schema_registry_url} + run_query( + instance, + "create table avro_data_skip_symbolic(value Int64) engine = Memory()", + ) + run_query( + instance, + "insert into avro_data_skip_symbolic format AvroConfluent", + data, + settings, + ) + assert run_query(instance, "select value from avro_data_skip_symbolic").strip() == "0" + + def test_select_auth(started_cluster): # type: (ClickHouseCluster) -> None diff --git a/tests/integration/test_index_uncompressed_cache_zero_size/__init__.py b/tests/integration/test_index_uncompressed_cache_zero_size/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/integration/test_index_uncompressed_cache_zero_size/configs/cache_size.xml b/tests/integration/test_index_uncompressed_cache_zero_size/configs/cache_size.xml new file mode 100644 index 000000000000..e05fcc7bc958 --- /dev/null +++ b/tests/integration/test_index_uncompressed_cache_zero_size/configs/cache_size.xml @@ -0,0 +1,3 @@ + + 0 + diff --git a/tests/integration/test_index_uncompressed_cache_zero_size/test.py b/tests/integration/test_index_uncompressed_cache_zero_size/test.py new file mode 100644 index 000000000000..38d60148fb64 --- /dev/null +++ b/tests/integration/test_index_uncompressed_cache_zero_size/test.py @@ -0,0 +1,113 @@ +import pytest + +from helpers.cluster import ClickHouseCluster + +CACHE_CONFIG_PATH = "/etc/clickhouse-server/config.d/cache_size.xml" + +cluster = ClickHouseCluster(__file__) +node = cluster.add_instance( + "node", + main_configs=["configs/cache_size.xml"], + stay_alive=True, +) + + +@pytest.fixture(scope="module", autouse=True) +def start_cluster(): + try: + cluster.start() + node.query( + """ + CREATE TABLE t ( + id UInt64, + s String, + INDEX bf s TYPE bloom_filter GRANULARITY 1 + ) + ENGINE = MergeTree + ORDER BY id + SETTINGS index_granularity = 1024 + """ + ) + # A single part keeps the bloom-filter file deterministic across phases. + node.query( + "INSERT INTO t SELECT number, toString(number) FROM numbers(200000)" + ) + yield + finally: + cluster.shutdown() + + +def run_skip_index_query(query_id): + # Filtering on `s` forces the bloom_filter skip index to be loaded for every + # mark range, which is the path that exhibited the bug. + node.query( + "SELECT count() FROM t WHERE s = '12345'", + query_id=query_id, + settings={"use_skip_indexes": 1}, + ) + + +def get_cache_events(query_id): + node.query("SYSTEM FLUSH LOGS") + row = node.query( + f""" + SELECT + ProfileEvents['UncompressedCacheHits'], + ProfileEvents['UncompressedCacheMisses'], + ProfileEvents['UncompressedCacheWeightLost'] + FROM system.query_log + WHERE query_id = '{query_id}' AND type = 'QueryFinish' + FORMAT TSV + """ + ).strip() + assert row, f"No QueryFinish entry in system.query_log for query_id={query_id}" + hits, misses, weight_lost = row.split("\t") + return int(hits), int(misses), int(weight_lost) + + +def test_index_uncompressed_cache_runtime_toggle(): + # Phase 1: cache disabled (size=0 from initial config). The skip-index read + # path must bypass the cache entirely - no profile events should fire. + run_skip_index_query("phase1_disabled") + hits, misses, weight_lost = get_cache_events("phase1_disabled") + assert (hits, misses, weight_lost) == (0, 0, 0), ( + f"Expected zero index-uncompressed-cache events when the cache is " + f"disabled, got hits={hits}, misses={misses}, weight_lost={weight_lost}" + ) + + # Phase 2: enable the cache via runtime SYSTEM RELOAD CONFIG, verify that + # the cache is now actually used (misses on first query, hits on second). + with node.with_replace_config( + CACHE_CONFIG_PATH, + "10485760", + reload_before=True, + reload_after=True, + ): + node.query("SYSTEM DROP INDEX UNCOMPRESSED CACHE") + + run_skip_index_query("phase2_first") + hits, misses, weight_lost = get_cache_events("phase2_first") + assert misses > 0, ( + f"Expected misses with the cache enabled, " + f"got hits={hits}, misses={misses}, weight_lost={weight_lost}" + ) + assert hits == 0, ( + f"Expected no hits on the first query after dropping the cache, " + f"got hits={hits}" + ) + + run_skip_index_query("phase2_second") + hits, misses, weight_lost = get_cache_events("phase2_second") + assert hits > 0, ( + f"Expected hits on the repeated query, " + f"got hits={hits}, misses={misses}, weight_lost={weight_lost}" + ) + + # Phase 3: original config restored and reloaded by `reload_after=True`. + # Disabling the cache at runtime must again bypass it for new queries. + run_skip_index_query("phase3_redisabled") + hits, misses, weight_lost = get_cache_events("phase3_redisabled") + assert (hits, misses, weight_lost) == (0, 0, 0), ( + f"Expected zero index-uncompressed-cache events after re-disabling at " + f"runtime, got hits={hits}, misses={misses}, weight_lost={weight_lost}" + ) diff --git a/tests/integration/test_keeper_availability_zone_quorum_reads/__init__.py b/tests/integration/test_keeper_availability_zone_quorum_reads/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config.xml b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config.xml new file mode 100644 index 000000000000..24095f39136e --- /dev/null +++ b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config.xml @@ -0,0 +1,36 @@ + + + + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 5000 + 10000 + trace + true + + + + 1 + node + 2888 + + + + + + + node + 9181 + + + diff --git a/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_configured.xml b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_configured.xml new file mode 100644 index 000000000000..cce9700173aa --- /dev/null +++ b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_configured.xml @@ -0,0 +1,41 @@ + + + + + 0 + az-configured + + + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 5000 + 10000 + trace + true + + + + 1 + node_configured + 2888 + + + + + + + node_configured + 9181 + + + diff --git a/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_local_reads.xml b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_local_reads.xml new file mode 100644 index 000000000000..2497feede885 --- /dev/null +++ b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_local_reads.xml @@ -0,0 +1,38 @@ + + + + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 5000 + 10000 + trace + false + + + + 1 + node_local + 2888 + + + + + + + node_local + 9181 + + + diff --git a/tests/integration/test_keeper_availability_zone_quorum_reads/test.py b/tests/integration/test_keeper_availability_zone_quorum_reads/test.py new file mode 100644 index 000000000000..c2ddc1cd0486 --- /dev/null +++ b/tests/integration/test_keeper_availability_zone_quorum_reads/test.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +"""Regression test for keeper termination when `Get /keeper/availability_zone` +is sent to a keeper that was started without `` and runs with +`quorum_reads=true`. + +Before the fix the keeper called `onStorageInconsistency` (=> `std::terminate`) +on commit, and the request entry persisted in the raft log, so log replay +re-triggered the termination on every restart. + +The companion test under `quorum_reads=false` exercises the local read path +(`processLocalRequests` -> `processImpl`), which already returned +`ZNONODE` gracefully before the fix. Running both ensures the two read modes +return the same response for an unconfigured AZ. A third case pins the +configured branch: with `` set, a `quorum_reads=true` `Get` should +return the AZ value normally. +""" + +import pytest + +import helpers.keeper_utils as keeper_utils +from helpers.cluster import ClickHouseCluster +from helpers.keeper_utils import KeeperClient, KeeperException + +cluster = ClickHouseCluster(__file__) + +node = cluster.add_instance( + "node", + main_configs=["configs/keeper_config.xml"], + stay_alive=True, +) + +node_local = cluster.add_instance( + "node_local", + main_configs=["configs/keeper_config_local_reads.xml"], + stay_alive=True, +) + +node_configured = cluster.add_instance( + "node_configured", + main_configs=["configs/keeper_config_configured.xml"], + stay_alive=True, +) + + +@pytest.fixture(scope="module", autouse=True) +def started_cluster(): + try: + cluster.start() + yield cluster + finally: + cluster.shutdown() + + +def _keeper_alive(target) -> bool: + return keeper_utils.send_4lw_cmd(cluster, target, "ruok") == "imok" + + +def _assert_znonode(target, instance_name): + keeper_utils.wait_until_connected(cluster, target) + assert _keeper_alive(target) + + with KeeperClient.from_cluster(cluster, instance_name, port=9181) as client: + with pytest.raises(KeeperException) as ex: + client.get("/keeper/availability_zone") + + error = str(ex.value) + assert "node doesn't exist" in error + assert "/keeper/availability_zone" in error + + # The keeper should still be alive — no SIGABRT, no raft-log poisoning. + assert _keeper_alive(target) + + +def test_get_availability_zone_returns_znonode_under_quorum_reads(): + """Keeper without `` should reply with `ZNONODE` for the AZ + path even when `quorum_reads=true` routes the read through the raft + commit path. The keeper must remain alive afterwards.""" + _assert_znonode(node, "node") + + +def test_get_availability_zone_returns_znonode_under_local_reads(): + """Same path, `quorum_reads=false` (the default). The read goes through + `processLocalRequests` and `processImpl` and should also return + `ZNONODE`, matching the response of the quorum-read path after the fix.""" + _assert_znonode(node_local, "node_local") + + +def test_get_availability_zone_returns_value_when_configured(): + """When `` is configured, a `quorum_reads=true` `Get` must + return the configured AZ value. This pins the configured branch of the + fix: the container lookup still succeeds under the raft commit path.""" + keeper_utils.wait_until_connected(cluster, node_configured) + assert _keeper_alive(node_configured) + + with KeeperClient.from_cluster(cluster, "node_configured", port=9181) as client: + assert client.get("/keeper/availability_zone") == "az-configured" + + assert _keeper_alive(node_configured) diff --git a/tests/integration/test_mask_sensitive_info/test.py b/tests/integration/test_mask_sensitive_info/test.py index 1ca836c0e406..80558f978332 100644 --- a/tests/integration/test_mask_sensitive_info/test.py +++ b/tests/integration/test_mask_sensitive_info/test.py @@ -770,35 +770,74 @@ def test_encryption_functions(): def test_create_dictionary(): password = new_password() + # ClickHouse source. node.query( f"CREATE DICTIONARY dict1 (n int DEFAULT 0, m int DEFAULT 1) PRIMARY KEY n " f"SOURCE(CLICKHOUSE(HOST 'localhost' PORT 9000 USER 'user1' TABLE 'test' PASSWORD '{password}' DB 'default')) " f"LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())" ) + # HTTP source with top-level USER/PASSWORD keys. + node.query( + f"CREATE DICTIONARY dict2 (n int DEFAULT 0) PRIMARY KEY n " + f"SOURCE(HTTP(url 'http://localhost:8123/dict.tsv' format 'TabSeparated' user 'huser' password '{password}')) " + f"LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())" + ) + + # HTTP source with nested CREDENTIALS(USER ... PASSWORD ...). + node.query( + f"CREATE DICTIONARY dict3 (n int DEFAULT 0) PRIMARY KEY n " + f"SOURCE(HTTP(url 'http://localhost:8123/dict.tsv' format 'TabSeparated' credentials(user 'huser' password '{password}'))) " + f"LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())" + ) + for toggle, secret in enumerate(["[HIDDEN]", password]): assert ( node.query(f"SHOW CREATE TABLE dict1 {show_secrets}={toggle}") == f"CREATE DICTIONARY default.dict1\\n(\\n `n` int DEFAULT 0,\\n `m` int DEFAULT 1\\n)\\nPRIMARY KEY n\\nSOURCE(CLICKHOUSE(HOST \\'localhost\\' PORT 9000 USER \\'user1\\' TABLE \\'test\\' PASSWORD \\'{secret}\\' DB \\'default\\'))\\nLIFETIME(MIN 0 MAX 10)\\nLAYOUT(FLAT())\n" ) + assert ( + node.query(f"SHOW CREATE TABLE dict2 {show_secrets}={toggle}") + == f"CREATE DICTIONARY default.dict2\\n(\\n `n` int DEFAULT 0\\n)\\nPRIMARY KEY n\\nSOURCE(HTTP(URL \\'http://localhost:8123/dict.tsv\\' FORMAT \\'TabSeparated\\' USER \\'huser\\' PASSWORD \\'{secret}\\'))\\nLIFETIME(MIN 0 MAX 10)\\nLAYOUT(FLAT())\n" + ) + + assert ( + node.query(f"SHOW CREATE TABLE dict3 {show_secrets}={toggle}") + == f"CREATE DICTIONARY default.dict3\\n(\\n `n` int DEFAULT 0\\n)\\nPRIMARY KEY n\\nSOURCE(HTTP(URL \\'http://localhost:8123/dict.tsv\\' FORMAT \\'TabSeparated\\' CREDENTIALS (USER \\'huser\\' PASSWORD \\'{secret}\\')))\\nLIFETIME(MIN 0 MAX 10)\\nLAYOUT(FLAT())\n" + ) + assert ( node.query( - f"SELECT create_table_query FROM system.tables WHERE name = 'dict1' {show_secrets}={toggle}" + f"SELECT create_table_query FROM system.tables WHERE name IN ['dict1', 'dict2', 'dict3'] ORDER BY name {show_secrets}={toggle}" + ) + == ( + f"CREATE DICTIONARY default.dict1 (`n` int DEFAULT 0, `m` int DEFAULT 1) PRIMARY KEY n SOURCE(CLICKHOUSE(HOST \\'localhost\\' PORT 9000 USER \\'user1\\' TABLE \\'test\\' PASSWORD \\'{secret}\\' DB \\'default\\')) LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())\n" + f"CREATE DICTIONARY default.dict2 (`n` int DEFAULT 0) PRIMARY KEY n SOURCE(HTTP(URL \\'http://localhost:8123/dict.tsv\\' FORMAT \\'TabSeparated\\' USER \\'huser\\' PASSWORD \\'{secret}\\')) LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())\n" + f"CREATE DICTIONARY default.dict3 (`n` int DEFAULT 0) PRIMARY KEY n SOURCE(HTTP(URL \\'http://localhost:8123/dict.tsv\\' FORMAT \\'TabSeparated\\' CREDENTIALS (USER \\'huser\\' PASSWORD \\'{secret}\\'))) LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())\n" ) - == f"CREATE DICTIONARY default.dict1 (`n` int DEFAULT 0, `m` int DEFAULT 1) PRIMARY KEY n SOURCE(CLICKHOUSE(HOST \\'localhost\\' PORT 9000 USER \\'user1\\' TABLE \\'test\\' PASSWORD \\'{secret}\\' DB \\'default\\')) LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())\n" ) check_logs( must_contain=[ "CREATE DICTIONARY dict1 (`n` int DEFAULT 0, `m` int DEFAULT 1) PRIMARY KEY n " "SOURCE(CLICKHOUSE(HOST 'localhost' PORT 9000 USER 'user1' TABLE 'test' PASSWORD '[HIDDEN]' DB 'default')) " - "LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())" + "LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())", + + "CREATE DICTIONARY dict2 (`n` int DEFAULT 0) PRIMARY KEY n " + "SOURCE(HTTP(URL 'http://localhost:8123/dict.tsv' FORMAT 'TabSeparated' USER 'huser' PASSWORD '[HIDDEN]')) " + "LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())", + + "CREATE DICTIONARY dict3 (`n` int DEFAULT 0) PRIMARY KEY n " + "SOURCE(HTTP(URL 'http://localhost:8123/dict.tsv' FORMAT 'TabSeparated' CREDENTIALS (USER 'huser' PASSWORD '[HIDDEN]'))) " + "LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())", ], must_not_contain=[password], ) node.query("DROP DICTIONARY dict1") + node.query("DROP DICTIONARY dict2") + node.query("DROP DICTIONARY dict3") def test_backup_to_s3(): diff --git a/tests/integration/test_mysql_protocol/test.py b/tests/integration/test_mysql_protocol/test.py index d8c371a10819..2b5635be77c1 100644 --- a/tests/integration/test_mysql_protocol/test.py +++ b/tests/integration/test_mysql_protocol/test.py @@ -958,7 +958,7 @@ def test_mysql_dotnet_client(started_cluster): [ "bash", "-c", - f"dotnet run -- --host {node.hostname} --port {server_port} --username default --password 123", + f"cd /testapp && dotnet run -- --host {node.hostname} --port {server_port} --username default --password 123", ], ) # there is some thrash at the beggining of output, so it's better to use `in` instead of `==`` diff --git a/tests/integration/test_restore_replica/test.py b/tests/integration/test_restore_replica/test.py index f62fc3046afc..44059ebb049e 100644 --- a/tests/integration/test_restore_replica/test.py +++ b/tests/integration/test_restore_replica/test.py @@ -237,3 +237,52 @@ def test_fix_metadata_version_on_attach_part_after_restore(start_cluster): for node in [node_1, node_2]: node.query("DROP TABLE IF EXISTS test_ttl SYNC") + + +def test_restore_replica_keeps_duplicate_parts(start_cluster): + zk = cluster.get_kazoo_client("zoo1") + drop_tables() + + try: + for node in nodes: + node.query( + """ + CREATE TABLE test(n UInt32) + ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/', '{replica}') + ORDER BY tuple() + SETTINGS replicated_deduplication_window = 0, + replicated_deduplication_window_for_async_inserts = 0; + """.format( + replica=node.name + ) + ) + + node_1.query("SYSTEM STOP MERGES test") + + node_1.query("INSERT INTO test VALUES (0)") + node_1.query("INSERT INTO test VALUES (0)") + node_1.query( + """ + ALTER TABLE test MODIFY SETTING replicated_deduplication_window = 10000, + replicated_deduplication_window_for_async_inserts = 10000 + """ + ) + + assert node_1.query("SELECT count() FROM test") == "2\n" + assert ( + node_1.query("SELECT count() FROM system.parts WHERE table = 'test' AND active") + == "2\n" + ) + + expected = node_1.query("SELECT count(), sum(sipHash64(*)) FROM test") + + zk_rmr_with_retries(zk, "/clickhouse/tables/test") + assert zk.exists("/clickhouse/tables/test") is None + + node_1.query("SYSTEM RESTART REPLICA test") + node_1.query("SYSTEM RESTORE REPLICA test") + + assert node_1.query("SELECT count() FROM test") == "2\n" + assert node_1.query("SELECT count(), sum(sipHash64(*)) FROM test") == expected + finally: + drop_tables() diff --git a/tests/integration/test_ssl_cert_authentication/certs/ca-cert.srl b/tests/integration/test_ssl_cert_authentication/certs/ca-cert.srl index cf47b0dc79c1..940d9029dd01 100644 --- a/tests/integration/test_ssl_cert_authentication/certs/ca-cert.srl +++ b/tests/integration/test_ssl_cert_authentication/certs/ca-cert.srl @@ -1 +1 @@ -05F10C67567FE30795D77AF2540F6AC8D4CF2470 +05F10C67567FE30795D77AF2540F6AC8D4CF2477 diff --git a/tests/integration/test_ssl_cert_authentication/certs/client10-cert.pem b/tests/integration/test_ssl_cert_authentication/certs/client10-cert.pem new file mode 100644 index 000000000000..dcc4bbf59ce4 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client10-cert.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFoTCCA4mgAwIBAgIUBfEMZ1Z/4weV13ryVA9qyNTPJHUwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDELMAkGA1UEAwwCY2EwHhcNMjYwNjI1 +MTM1NDE0WhcNMzYwNjIyMTM1NDE0WjBhMQswCQYDVQQGEwJSVTETMBEGA1UECAwK +U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRow +GAYDVQQDDBEuY29ycC5leGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAPd0NAs6RPlzUu5qwzcbEQCMz/eXlUSRD4wHEU6HN1QrjXIXcpgV +pO7gq/5/jfD0Lo+QEvi3AjElmlVpmN9ExbU+wUl1cOscPE4uBToylE4qBHQWHToY +bTmQ3xoIqKo6M6XQfoDiIFAKKSXRf3IP88uZs02Y+g2Qz5XfQcy6xKAe4La+W9/z +uXs778vi3l3r/P5FGSiKwIN1C4XoxMxVtg9T96l6LC8tRoIaqtYvrnCzTXRZiJ6k +Kp8Sjq9ySMOgYIrh8yYOqczJyBt7hYKwFZrhNX2OcRIpatLzOG81rwCpWjCykTp6 +zcDcnPljT4p1pfR6+qYSciSJDYNiOl9PzQgsRZ4JaZZ9i8ZK/jIgJiJLXgkRS+uK +AO0KcvbdCfJpgYy6QximI32Yz3ymBDx7udGgZTIuUJ3ctxH/Xsl6nuf2is+tpU7k +UFH2K49CGWMNrF+vthPAECJkE0FuRyVTjFuja1znIoPrRvjcSQLiDd+C3XoRHwUQ +uKfspE5d7iDjB/VQfZpSfZ54pe1XYESSRVk8D+pABCklo4+W+E7MsOoPjZ0SYafk +ZoHOWfHhmRnFtKBJpu3+TiO0V5kx6c832AEdY9sLwm09YDnwT1Z26iPfYoOiU6Q8 +0KoUYgR7DAPYeSzRFTV1czXILMxFr5GRet+ImwwHEYcCDuEKhbaMVMmBAgMBAAGj +YDBeMBwGA1UdEQQVMBOCES5jb3JwLmV4YW1wbGUuY29tMB0GA1UdDgQWBBQv/A3e ++fvcWLmyQu7OrM2fQg1g4TAfBgNVHSMEGDAWgBSJKj1dSYN0jW+Mu0xFQrobZFmQ +pTANBgkqhkiG9w0BAQsFAAOCAgEAk2j8T4U/u6n5MHpX7FKS7Xh1zCVMLtSWGFPZ +z03qLiq3t1VWHJNM9cxMJz69W1Ko0RSmYUPCdAdZLijh9Md3M6bQLsBYmBJLdwpY +tQbDqfFlo8BgDCbuCewA+DMVQMQA6MbwYFPRWnNz9uhXjozB1k304TkuG3LKmTlh +swQPwRmx7yvhW4InBlrYjwE41mEmuzEVH2vFijRg92gxE8SSh/inOwGAjoKtXD+0 +eSXeBeEFm+wgFq1qwJTkzb3sFvdKxAbdAa5uomQp8cBjMuzoJI/Wtyl2CrfcVG7N +tkjqXWP8Yv9D2X8XN7peRavey45/aoXHZ64nCY6nuakX2bazP6wv402NTwDoQK2v +iT89dA6zEAVDkxnlKBDg9VS/ChwTTGmYh0N1zA1C1kS6zLMk+q9gxfQhk8A4xmWH +9hdI5GpZdKE5ScvhM2MjuHcmp9XQHN5x/0Y7ZHaeODjXErIdKk6j317dcZJgaIVB +rumL5h1I+rF9EVLpe6zhE+VBUacT/UVdXgj4P9UlsjdmWvUJqkVmcwwejwRZWhrw +Xic1q8tijkqNYINN97YoTfIg6Ox5zM5O17oI25UnIU3q7LXHRFaPLzX1ZLM5gLeD +RJWQIeskjTvnl86jS8IpNCDPeco9s3Qq4eIcz0UH9TG/cNhoTRZKLfBQZcBAxRvU +eRExSQA= +-----END CERTIFICATE----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client10-ext.cnf b/tests/integration/test_ssl_cert_authentication/certs/client10-ext.cnf new file mode 100644 index 000000000000..e05b6dfe766a --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client10-ext.cnf @@ -0,0 +1 @@ +subjectAltName=DNS:.corp.example.com diff --git a/tests/integration/test_ssl_cert_authentication/certs/client10-key.pem b/tests/integration/test_ssl_cert_authentication/certs/client10-key.pem new file mode 100644 index 000000000000..9bf47dd03f23 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client10-key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQD3dDQLOkT5c1Lu +asM3GxEAjM/3l5VEkQ+MBxFOhzdUK41yF3KYFaTu4Kv+f43w9C6PkBL4twIxJZpV +aZjfRMW1PsFJdXDrHDxOLgU6MpROKgR0Fh06GG05kN8aCKiqOjOl0H6A4iBQCikl +0X9yD/PLmbNNmPoNkM+V30HMusSgHuC2vlvf87l7O+/L4t5d6/z+RRkoisCDdQuF +6MTMVbYPU/epeiwvLUaCGqrWL65ws010WYiepCqfEo6vckjDoGCK4fMmDqnMycgb +e4WCsBWa4TV9jnESKWrS8zhvNa8AqVowspE6es3A3Jz5Y0+KdaX0evqmEnIkiQ2D +YjpfT80ILEWeCWmWfYvGSv4yICYiS14JEUvrigDtCnL23QnyaYGMukMYpiN9mM98 +pgQ8e7nRoGUyLlCd3LcR/17Jep7n9orPraVO5FBR9iuPQhljDaxfr7YTwBAiZBNB +bkclU4xbo2tc5yKD60b43EkC4g3fgt16ER8FELin7KROXe4g4wf1UH2aUn2eeKXt +V2BEkkVZPA/qQAQpJaOPlvhOzLDqD42dEmGn5GaBzlnx4ZkZxbSgSabt/k4jtFeZ +MenPN9gBHWPbC8JtPWA58E9Wduoj32KDolOkPNCqFGIEewwD2Hks0RU1dXM1yCzM +Ra+RkXrfiJsMBxGHAg7hCoW2jFTJgQIDAQABAoICAADUgvHvHSupzxCkZavL4hgd +O3ue9onf83RBSBCPkDBEE43LMw0xmeT7Vpe0XiGtklwqOWERl+7vUOEqA8tLHeoX +rWfxiO+1+kRldRWoKqfoOM16T0OVEO/nRYipovthYHqFJyPSgQr0XMWEZQE+bn9r +laQW5WRZzMjPEoeVJbtB3UK/A4bY3fGnk+HBsiRQz3Tbfsa3D/Ik80U3dfUM8Xmu +eujGniremSi5szfj7y8Fj/baD8pJ86gRf1kVSOCUoLbzOaNyRkWCSghAZzmm8pyb +Vlh0a6VPePefZ/b0taCFa5YOcaGncgTMYf+tbUxyFyIJbqleK5k7Jzh5DMgfR+Pw +4JIWdGmaW1QgC2hn6uEPiUZLVwpTT2lRR9eUUCOE87Ht1CFpZ5EXciRxuZlplI7Y +d9u5XJjK6WxYo8BlI6ZZ1jdUX0qkebYtae5yBNDxJ79qJDVQb+3ecZSyZXr1RCpo +7KylvPYIAbXqgQ9OBv84Db7XapuBATQlm774ruyyWsAnzsnq/IZjUpozXg5nnsJl +wHc5F1QD/4njslwr5uePq+Vo47La+cdWBmS1n36lJntnPI4kTNVBMhW4wWEPtcAk +UeU+6FYF4qE2PFAZM62oviX+IaFx6veU60baMdxOzmQAqSsvv2ZQTb71YLerCiem +9B99YKaxZpBIAfaHFQTRAoIBAQD+9xZqTykDoVec4/ZVQQkMKzOOHVPkvfSR/RjA +x+DgG8lqKncCZMVgCvIwhaqB5Ao2WTvjtmcPbtLzay3IYUfgHEKu1Hor7z/azxkW +PYpDeeKTDXOrraSldb+ZzNcu4HM2V88dGTJd/bWSuQXMD8W8FyBXMsxc8s0vPN62 +Zl0y6Rze6U35syXoxGJXMS59SuKz+D4+FbSwVcK6CZmBycv06DAbvX7qfZnwjOVN +syluZ5qkXRKBM5Cf6ZE05WpIT4RjLoCMicJlDyQtb2JlraMOJljVOcSwgoTkTtzS +v+edPQhs82zzKyjI76g0SjsG52Jp754uhAiqXiTG7KSkyiOxAoIBAQD4dU+5fwiD +oEVYgRlIMqFEDEpgtYs6u8yOsH5gHzwBOjx7FfMuHcTYgSIVYUzMxeEAMBPTHpU0 +tjNgvhPnK0Xo/Yfe+AP68dAlwz0ykJ5JjUFlMbBhuoIpghnopgr/693XZnuTbOz3 +FkOxORMVfuS2cRUnK3WIhVHyVuuTkLv20pbgsxxPWRyU102QnGrzevbMLPOgD8JD +aezmu8XxtnlAd2KvVzGgpvjVW9Qb66SIvLf1PoyM1BBj3oRgv2wiO+4aNE6GNara +qWsdKRFUhcGCcvvsX0jxfidC0lXnK4cv3oI2LlU1ZybKI+wOeViq8vDgWDD7DdYA +QUxfpb2BT4bRAoIBAAq8zSzc+JU2jkIFN7KPcpoYl6s8gPP5K/uZ9RjpUgceJHVc +JHbtV4Kb82cnue6Oc/+l8me8nsp/mFK4CM2Piz9c8VH7kMmY4c+NOTk+jjwZPfmD +b4OjZHOzacZIYiePPErll8tZ7E0ZCjSLpjrZzzIEp1AEy6Z+czWyEo8L8JDcUGLy +4F3LtaT/4ERbxeFw7es2YSisMVfbxL+g994HaZd+z8fbSyUE9R60UFPdX7lOk6yo +XsciLM0PQRZBMyCoeKLUqoVAp/cplBR1xGcT0PIfm04fiLEGTiJvT81wV4i/sUMl +XUlAYA9WSHcrSSEZTYO4m6jJ1rOWE2ZtQOHPwYECggEBALscRbURqQzPh0nWt356 +up4vj1fzgG3z/mI7IoErJJpcDC454pCJVLQj09I8G4VfREpK6rMkpgMzb8/cdcqy ++Qw02r0dFIpIz5OQzCanaL1Fhsk5uXZv6hRuaSqe2UvQipnsEQZ+kpqmBsaRkACx +Nnb7BI4iGXp9xK/3q6PO7O89uuhvmtNa7b5dwok0cwr4QKKU+8g/9fGk9QbyxGh7 +HidhgU1BIhu1g1HSvRNly9w6G2Oy/lAUaF99tT3TCxFhBrhvSe+ivQ+9ZPBp/CYm +MQwXogdp3toXQmP9WTolusJfFLrO+9ai30B9+wkPc6oSGTsqz4BR9CbvBiBGBkg6 +5vECggEAaqf9C9N5KhiCjUOy4EgU+rwGFZJMEIfeqrN7cPOPCwly4V0LvGZQH5pw +tgUljd+Nfis0maOzn4rAoLXmD5F1+Uhu+tgt4hDwfvUAyCGABs8BfJWj3owDuq+n +oXZLuQFemjHp7uPwQMtd1PzWiEr+42xKT5QVQrNleGT0LjTDWi/uf2wMrkzJQymW +4SL+CICzqVi15KE1QZMiTuP9R5znp6LkhUy9dJz3gg8VcOHAht623IF8OUjC3E2z +UkTU0fKhaJRdvX8EKf0XzTaj4/Bk5xYlEoSUXWsIhOUUrGmntRwSVhi3OoGIm6Aq +3RJmi2VS/pmfzWbg9l/Iud2H3EiFaw== +-----END PRIVATE KEY----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client10-req.pem b/tests/integration/test_ssl_cert_authentication/certs/client10-req.pem new file mode 100644 index 000000000000..070d3c980555 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client10-req.pem @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEpjCCAo4CAQAwYTELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUx +ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEaMBgGA1UEAwwRLmNv +cnAuZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQD3 +dDQLOkT5c1LuasM3GxEAjM/3l5VEkQ+MBxFOhzdUK41yF3KYFaTu4Kv+f43w9C6P +kBL4twIxJZpVaZjfRMW1PsFJdXDrHDxOLgU6MpROKgR0Fh06GG05kN8aCKiqOjOl +0H6A4iBQCikl0X9yD/PLmbNNmPoNkM+V30HMusSgHuC2vlvf87l7O+/L4t5d6/z+ +RRkoisCDdQuF6MTMVbYPU/epeiwvLUaCGqrWL65ws010WYiepCqfEo6vckjDoGCK +4fMmDqnMycgbe4WCsBWa4TV9jnESKWrS8zhvNa8AqVowspE6es3A3Jz5Y0+KdaX0 +evqmEnIkiQ2DYjpfT80ILEWeCWmWfYvGSv4yICYiS14JEUvrigDtCnL23QnyaYGM +ukMYpiN9mM98pgQ8e7nRoGUyLlCd3LcR/17Jep7n9orPraVO5FBR9iuPQhljDaxf +r7YTwBAiZBNBbkclU4xbo2tc5yKD60b43EkC4g3fgt16ER8FELin7KROXe4g4wf1 +UH2aUn2eeKXtV2BEkkVZPA/qQAQpJaOPlvhOzLDqD42dEmGn5GaBzlnx4ZkZxbSg +Sabt/k4jtFeZMenPN9gBHWPbC8JtPWA58E9Wduoj32KDolOkPNCqFGIEewwD2Hks +0RU1dXM1yCzMRa+RkXrfiJsMBxGHAg7hCoW2jFTJgQIDAQABoAAwDQYJKoZIhvcN +AQELBQADggIBAL55P1fHgxRYxdokaF8vMiP0dxbGq2uvVKEJpOmNwkpWHNwNghml +vCT8IMgrcH/5G+e4i9VMeGf7PVJGQYPM3WWk8XnOoIK2HqdR6lBO7md6BP0LVThn +QB2Ol1OfmcFv2HKtdT+2ySDStvNpuBTcxYPoLzsyUZg6U1vOSPcpgm/hACqiupl2 +X2E5p5Gq8lW3KEudbrmEXcv5336OV1oiLxrNfKGoAoK8ctdXZ/pLCuI3krBR9DtS +JudlevUHf50ujwUlOYKDX3BkdjMHSBETi/aTf3r9r8Mk6AXg+OMWpmT40D9lRGqe +SYdecyvkbhVXfcKaDR4gqQiwqAvxOcGtXOriYrlV2Hpb1wPyyhRDnDZShO5/wolc +RifXoKfFxhKh7xgTUJmQjSVxLeNULqSXDzvMHmiyHTcQfUK/8Vgsn9U0aHeeyIMB +7cNoT24fUy9wElvPn8kuCIIbf4wOqUh2IUa69+UvBGYPdvd59BTjg26Mp8NtFaLT +wtkNTyVR1SLavQXWPhEXma6+y6grr5RmErLE7wrqeDzHstRt+aMLISP9A4Zr36GY +bqUTd0nMwQc2KNxKFQDNdp6MusIqZMyiza8l09aQg9bYBP6IDrzp15RXv5w2B+BV +kRtSBuyoaCMq4Od2CYmb+Ka6JSUdwIuCOYBgUtXBrn+1USux17TUqNbG +-----END CERTIFICATE REQUEST----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client11-cert.pem b/tests/integration/test_ssl_cert_authentication/certs/client11-cert.pem new file mode 100644 index 000000000000..2ff257fa67b2 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client11-cert.pem @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFlzCCA3+gAwIBAgIUBfEMZ1Z/4weV13ryVA9qyNTPJHYwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDELMAkGA1UEAwwCY2EwHhcNMjYwNjI1 +MTUwMzE5WhcNMzYwNjIyMTUwMzE5WjBYMQswCQYDVQQGEwJSVTETMBEGA1UECAwK +U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMREw +DwYDVQQDDAhjbGllbnQxMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALOF3MVPkjrQ9NBeTvmCSEdgfosvbXA9NYX/qJ3yJGTen3fDsOgyLeIxiqjUYegP ++5vmCUYgoDWeJHc4+UnNiPhADOdY7FLO5Bty7Q/XhoPYUWqBZXcSM7asfCaRN0e1 +9jOCB5OK2INpIAFZZ5AWXAhkieBu/jr3paSRKJSVX293gvSqorgIKvLoLfvgz4Ec +Xkx6o0eMYGtyeWgo/ElP6kSirnwUOVIfQd3GnWjZrvQvLampWnLUlp+V6s8O2h9O +QY1YMJSoRW8ZCBViveptYo/OU4XdU2giU1mSoXkLqR2CTO7beR/tfJqb5iQMUDkt +UhVR+c1bEWJLFUd0k+J/h8nYEauhmo8d1HYnxQUo6W1WRtwp9mwiHyITbd8gqG3O +AYY466q6p7PtcWMAcm6JKEtq2rbtW8ZbEZL+/KaGPD9m2AHW6ga5uWZSNctd9kEL +7N03utoCqSGdWfmteCWNUHNC3O9V3B5anCdX3MAj1Z9TA4Pf1SM91Ovc8kX1DIGo +m+1YyuKtRcsXPhGEINJSlnLeCxym+l6Nsd52MstXCyXn5y2Chv100X38KYac+qIG +I/USPavaw5OD6RJsko3pFOPk5rJh/qQpNJ5KVSL+Qx2JapeRuzBm0UL4TYs0LZvh +4UDv4Cmq9jeNp+Rx8wU4qaINg38FXjwOPsOhc4niZfUtAgMBAAGjXzBdMBsGA1Ud +EQQUMBKGEHNwaWZmZTovL2Zvby9iYXIwHQYDVR0OBBYEFPKPqaZxodaZTuIiRhIQ +1AlOr34pMB8GA1UdIwQYMBaAFIkqPV1Jg3SNb4y7TEVCuhtkWZClMA0GCSqGSIb3 +DQEBCwUAA4ICAQCwfBnGs7ap3SdYWzCKNZ7VDa3z2LASX7UIUURDzqFVkd+yqnkq +o/bA6fsG+kJquq3cKcU1xr8ikeH59A0sE8EnFuCzLz5uwgCNbg50jD73U8BpeUfP +00y10ru5LNCV/Oq6XQerzl4QAADnmMccbDixpRZCAVIXeiZHA6MLNKfSlNFtNw1l +yYjLB57xJmPzzt0wS/V7AVhMx8qC3UTtFZII2w8bEBIKMQ+2Vg5bhjUYTMmTc/m7 +3c/dBjKenIY7uNr3KIG54+uKRzSlqcG08+qrmnzJEYXzRfW4pdbLKgfK/hz450Ae +62Ml7x5KtIeQUsTrXGefPK1LpM8531lvvbcMO3yMjdwvmJjeHOyyZ8eaIoiWjcd0 +RkrCA3BOs8gnCn4XaVS0OmxreV08H4OPKBN5Cu5IKbzVGTGeW6jT38UYpMI/+JUt +VbSvkD6H3DKU95ohI8OydaAH8C222QhaEaNjdnbmffKSyPtJom+/h6kMR41BiqQo +bLY0K24q5dJJVbZmnrEhtFMyfUbr25jn3KdQ7le+oO1bcpwFul3gypRbxZ8bg2L7 +sLGBNuCD9fdQrGasNFxOgp1q6v91fWLtJ6mooAXJuMzhnqJmWUtoQFVV+CvDg17D +eswxL1Ab6apkhi1gw9/N1OVfBFwzpkaLQMvO7gQ5OHCR38DVbxlJe2Jphg== +-----END CERTIFICATE----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client11-ext.cnf b/tests/integration/test_ssl_cert_authentication/certs/client11-ext.cnf new file mode 100644 index 000000000000..c8368c96f1ce --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client11-ext.cnf @@ -0,0 +1 @@ +subjectAltName=URI:spiffe://foo/bar diff --git a/tests/integration/test_ssl_cert_authentication/certs/client11-key.pem b/tests/integration/test_ssl_cert_authentication/certs/client11-key.pem new file mode 100644 index 000000000000..438f33c64bee --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client11-key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCzhdzFT5I60PTQ +Xk75gkhHYH6LL21wPTWF/6id8iRk3p93w7DoMi3iMYqo1GHoD/ub5glGIKA1niR3 +OPlJzYj4QAznWOxSzuQbcu0P14aD2FFqgWV3EjO2rHwmkTdHtfYzggeTitiDaSAB +WWeQFlwIZIngbv4696WkkSiUlV9vd4L0qqK4CCry6C374M+BHF5MeqNHjGBrcnlo +KPxJT+pEoq58FDlSH0Hdxp1o2a70Ly2pqVpy1JaflerPDtofTkGNWDCUqEVvGQgV +Yr3qbWKPzlOF3VNoIlNZkqF5C6kdgkzu23kf7Xyam+YkDFA5LVIVUfnNWxFiSxVH +dJPif4fJ2BGroZqPHdR2J8UFKOltVkbcKfZsIh8iE23fIKhtzgGGOOuquqez7XFj +AHJuiShLatq27VvGWxGS/vymhjw/ZtgB1uoGublmUjXLXfZBC+zdN7raAqkhnVn5 +rXgljVBzQtzvVdweWpwnV9zAI9WfUwOD39UjPdTr3PJF9QyBqJvtWMrirUXLFz4R +hCDSUpZy3gscpvpejbHedjLLVwsl5+ctgob9dNF9/CmGnPqiBiP1Ej2r2sOTg+kS +bJKN6RTj5OayYf6kKTSeSlUi/kMdiWqXkbswZtFC+E2LNC2b4eFA7+ApqvY3jafk +cfMFOKmiDYN/BV48Dj7DoXOJ4mX1LQIDAQABAoICAApOR7l7AyvFtZwlodaAhGo2 +j6UpXJi6JtGxtsoUbcLtpc1wCj6WLNykl+9vu8wg6MKPHt6r/k59rN28Q1FZj4Ci +2qrIR87MKjuqKhJD/uigOTJKSdsfTCEzPzBOm1QOTdswnoM5kArhNNFnAsM6iV+A ++ApOjOExOMzc+W2oMpGZVIb7qbozW9XUftlME1V33bD5xFhV5m4cpPwWCD+kKxB0 +H1yno4/DlBopbf1oK7tAXxhzjKn1as0wA8oNsfdknG5DDwzlqRDC6NwjbkAgNe2H +/HL9nO1oNQ06FfN3OCblxUlcB5TN4x6UDw7oNw3FPIZVTagcj3+rTEYtGtVAmXij +9+K5JDFwcCrzhP1HQMchJcoWvWXawbWjO3pi8PwxsvGOcV2YW0/kBGRUbYRdL+27 +y3hE+eFjTHA70HAUjjWw7hPUJIY2WmPOYHsly7ZDqlSg5VWG9fjhVYJaxEcGAG6Q +OnmyicbEDTk5akqW2lEDSs2Xu/xgHKVQ8F7XBPf9Dtxhpr1Mfd217LNO/5PdgbQ4 +hvaifHRSXQkDMbglP/JxCRnq7mokjLoNe25ymDf3O+vF5ZQ0YpFn99EtzaomIEG8 +PMfZVQCCfkOOTtHdD29xxsrr7pAMwBqcrapHX3q34gGJp0oKGP6Kj1jlLXtBa815 +Y2jFmLo15qINiaqC64cJAoIBAQDlKb3PZ2yEbTMlW6cvZ4LeyDQOaFY4jiSaeA5r +4Nqu6ico41iefd9o79JvUG5tpDvdO+U5e07nLIA0PifIAIWfK7Rz7auaZjtOOqAq +0C7URTW5YdVan6lD/8D9UAshXHuaJfPyghYW6ccv16bTip7WlujcAGWoZTg23puR +nF7bxnT+B/f7yPJyiXXK66MQ0ku0GGPZNdnmDIpm9LjFMwHNYdoxx101YENmqGCe +A9/8uNyl5021gKxITYFHP/UsyZBkuqjTDe38oopUzinXADhpauBi2RrF2WYQ5kl6 +Xgp3vdNGERFF+mwlM3B9tsDDRho9qKxvNGNp8qsYbbgsr8TFAoIBAQDIi+uBeISX +WtExQ6IaxwGFmjuKc4ZcuiWsdkIKIgwo7mzdyXqqliyLbWq/G3LD8JjRSzAvmvfx +PpEMU8ZPKkXFlFVDzCOsrh2TXXll4qbvz4IfLFXUjhl1Ei8BzQpCWM4FoHKEENjM +VKSIEEIC6nkatUAwrxZotnSvVc2Bv3DuJt9SZpV8aznb6Z2zQvkNxo2WxcjZQtax +3LmVSoka6dYo8Xw1OA87C5j7O1+pa7je+72C4xxVAownKYO7m/xZiMM/OPoWbUK4 +WWTGIDKS8C/Oah+dscqN9NPIpTsoLaIYSGHC/0ZMUK//3HqWMIAScsM3/NV6Ymd+ +BBLxqPx8owVJAoIBAQCrdByANagaOD1hAP7H19Exb2aLNQL1U1wNei+IBPZ4kdX0 +oIwoIJLrRysRf4LvY0Yq0upApII3MbNF4w8Oc12F5kQfzD1synoqoHA/N/0hchqs +9YaURAp3Rr2UiLObJT+Q6D5pPWzbfdM6d0Vo1jja4pOcLmvgnsJ9QvXv7qeGFSho ++3tNFV5X1YKc7MnXBw/+0ZS66bB6jv1p5ETtvajmigSe48NX8QrcnrOS5eFKiuEC ++1jHqFq9ycckkLSV6sSuqH0xUyWws8d9hbYGFzMdpAn3yuleB7Z2hGWLORrp1cth +i9l5mtAY0TCjzfzQ3P07DpzcorySgy4Bm+2E+YjlAoIBADkJSlaNPzCIvLxFHwJ8 +nNsxjUOILauLqZFOJOQa4Nh3TvEZD1Ea2tpgqR5nIRHHCL9lofO4IFI1WC1oWhtD +y4ow8LsSgQbokjLKP++RMac8niZdhp+oNmdMX6Akf4l1FksVYdxbqj0ayZyE+zE3 +HHBTIkl2Umo/khoXzhXbq7OfzJ3z3QoAuPjpjVdhcdHQKY66+6+GyebV/tYN18aW +wLjuTUQZiINjfgPd1AwsPez1LeXez70Bt3if3v5pk7CnK9h8TOw58OLbUcTjfV66 +/u220v0XhqMvAVisXZHEwLglReCel5C21gdv3lF+w737c7glqVVgTUzSvcyLIhwU +hTkCggEBAM7QpQeNCVIdLuctyFE5HofGoMUgkp/MA9XT/Lg0l/xIH7xpkZ36I7WO +9T3r2yxGVImqiYhccwojYh2YKgTIWZU5eNTPvwcpvIlf8qjU9GcZY8CVzu2/jWUk +nBAoDfOVN6fmO4V6WqmjXvXOo253+fWMW2eNykWu/7Tp9mPgsNYYKHH8reLKRN0q +s/mPAQO2ZcIBv3Bemrc6dxgavOUF9eLYHLwBDvnMolaiIWmOZz3KvNR9BfJSoyez +oVnyOXOdtLx3IlZhit/4FzbcZrqfK9ZWHLRBunehxjdd+hIMBcxh9pGd3JGv1NxS +YnzXV11Nfuwdw28qPXzJlG2FlMfpeD4= +-----END PRIVATE KEY----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client11-req.pem b/tests/integration/test_ssl_cert_authentication/certs/client11-req.pem new file mode 100644 index 000000000000..ff06c31aec76 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client11-req.pem @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEnTCCAoUCAQAwWDELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUx +ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDERMA8GA1UEAwwIY2xp +ZW50MTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzhdzFT5I60PTQ +Xk75gkhHYH6LL21wPTWF/6id8iRk3p93w7DoMi3iMYqo1GHoD/ub5glGIKA1niR3 +OPlJzYj4QAznWOxSzuQbcu0P14aD2FFqgWV3EjO2rHwmkTdHtfYzggeTitiDaSAB +WWeQFlwIZIngbv4696WkkSiUlV9vd4L0qqK4CCry6C374M+BHF5MeqNHjGBrcnlo +KPxJT+pEoq58FDlSH0Hdxp1o2a70Ly2pqVpy1JaflerPDtofTkGNWDCUqEVvGQgV +Yr3qbWKPzlOF3VNoIlNZkqF5C6kdgkzu23kf7Xyam+YkDFA5LVIVUfnNWxFiSxVH +dJPif4fJ2BGroZqPHdR2J8UFKOltVkbcKfZsIh8iE23fIKhtzgGGOOuquqez7XFj +AHJuiShLatq27VvGWxGS/vymhjw/ZtgB1uoGublmUjXLXfZBC+zdN7raAqkhnVn5 +rXgljVBzQtzvVdweWpwnV9zAI9WfUwOD39UjPdTr3PJF9QyBqJvtWMrirUXLFz4R +hCDSUpZy3gscpvpejbHedjLLVwsl5+ctgob9dNF9/CmGnPqiBiP1Ej2r2sOTg+kS +bJKN6RTj5OayYf6kKTSeSlUi/kMdiWqXkbswZtFC+E2LNC2b4eFA7+ApqvY3jafk +cfMFOKmiDYN/BV48Dj7DoXOJ4mX1LQIDAQABoAAwDQYJKoZIhvcNAQELBQADggIB +AEPp7wCoTzvXPQuZ6ohV2fKValBjhlx0iz/Ij3tIklG6aH9vMgC2HPAuPsPPJkRw +Psly4nI+FznDzwt4e5cjuqILAnC0gj2HgpmHQaIbEM/8gsmpuyFUOKp2Q2eCEaMT +Y+74lkY75MxIJmzoEH8LEF8SvB7Oo7Usmc44sGplGDI336L+WeWnK+1GToP4+XUt +yc3IUF+1tTYrLQcTd3EZUzB4M+qowFnbxal4B2tT8mAOBXBL4nL4MVVsHpOrzwIN +4klzMqVZMCWbMv7Hd8cpneyCrUFd3iUfLelU66qL+RFEdJPKB6vTTRZY4ZE1GYGy +Yfn+xw+w9QZ9T1XV+CzSyTMS6t7a88bMkYi3J9nz9/pOcn6HaqecEC+ZryPH2/Ym +JwZmhiYyKJS/IQ+8j1/4aGRPsPoWmrawtvIK9cr2nxgkH4wmWg4uHikhxUex/YJu +WsohppENjZ9zZfZvLW12GoKp8LCTcqtyNiuO+VTcCbjJMR9OHj+/BtbSmx7aE0vX +8Jx2qb1aO+E7gJuQEa5KtJJEmozuGj33L19nlCYpaOVXXeRs2aK/JlF8ym9q5Z5S +S4lc3V6EVy6S4aIPl//rwby+A1pXBYWp7zWqo2rLbMDkDgfoxIgGd/ssDblbvUsQ +XAE3SA7yuMNQe1sGFskzQPDOwxY0TEoDUqJG2pb3+5xI +-----END CERTIFICATE REQUEST----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client12-cert.pem b/tests/integration/test_ssl_cert_authentication/certs/client12-cert.pem new file mode 100644 index 000000000000..3cdefdaa62b0 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client12-cert.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFrzCCA5egAwIBAgIUBfEMZ1Z/4weV13ryVA9qyNTPJHcwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDELMAkGA1UEAwwCY2EwHhcNMjYwNjI1 +MTU0OTA1WhcNMzYwNjIyMTU0OTA1WjBoMQswCQYDVQQGEwJSVTETMBEGA1UECAwK +U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMSEw +HwYDVQQDDBhmb28vYmFyLmNvcnAuZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCfOOwJdWD8cNcwGzeK4ItsVXBFavj5tjB3t3AJuDtD +E99gFhwOIiakDjtK7/8W95NHs8ui8JG6BbBhIA8ZqhvN3Kws6yccKAXpdTQNMHTo +o6802QmtYDEX+eNKCaVPQylg8NPypFf6I3GqTFKXaPiFPlu5Yjc/xFiqL8U6TonG +03aQ6JHAhPTe003NhSQ9HbFHwx0C6JWCZZOoUGAKSB/PRpMs5mYlqJMeYVKS41tB +7OQ+jP4uy2SgJ3EdhQ1ugBsqMskWqXTo5k9Ck5bq1oDTp/Rd1TH2JWO0Jes52bIR +UORPUqsXKnmvGbeXaDMvOwTuLRgaykBRj42vvoEsnYOFbKqX5B/uiGECdAPmEEP6 +8vlnyRVM6orzQcHBWDKkITvqeL/GCc3PHJjYogRYMUGzvmJv+ELL0Vmwc1tx0TIH +TZx9WamzEgyZVJ/Du+hHe2XUarJ6flWiCFmv7RuR8FT9yGXwxDx+BZaamV8sWMt8 +yGsurow334ANQibvVt8bJS30v19WQ8c2SU7NSeI+l25/6nDHrur45zud8nncBsHU +Hybp+fBATEqjcAztkoUYlF7OhFhT4TE0211sBbAJ1G8Cd50Izt1uDWqHxc+v2tmj +q//ZrwQ1JcBVxpIHOcLs1bUH90vXhvp57yVvK3/Zd739+q1E2RzjKsMc1Qk9HqpM +LQIDAQABo2cwZTAjBgNVHREEHDAaghhmb28vYmFyLmNvcnAuZXhhbXBsZS5jb20w +HQYDVR0OBBYEFBn0cMG6aQMbscqTMQKvfUDqCUBMMB8GA1UdIwQYMBaAFIkqPV1J +g3SNb4y7TEVCuhtkWZClMA0GCSqGSIb3DQEBCwUAA4ICAQBnqY+2rc6P09qTrCle +BzonZy9Bh5lH3k5EU5r8mCSbpM/N8GIV0uqKSZt9Es+utDTVOAzhT8fJ6Yz8Y8xR +XaZhYx7hm3NpdKQSZbkeDXSE0xeDdFDEPtp4rP8Z6K6j7iemB0MSF8Ft4viAj2fO +uxwOhnI64r5VNxp23E9AjKjIrQ1sN/ba0bLb1dmgaRL9OOdhoqsAoXk2LlGyYBlf +ZhcCjsB2btOZOJgi/lZDgkkw5isVbkTKNhriVYt6ZUcZYDaqCYb1lmRV2hGZBHcL ++4IAnJzlYGHvXUhsRMrzCPS5t+s5vANcSw9zDiLaP2EFY1RofaYhqMoWyxCxQilT +bek/KOUT+PexxhGS1UWOYZ1XZmRcKBMJWT3T3NMqGOmHA2Cfu3e+5IEXoTqtq6D+ +yNifBMHf7Xeq/jh4Jq4F1vPdmlQ4TQa8tzn47I1pjXXzsZzAyVk9934lEY3j6I+0 +LGqzv/ARv9cX9gnoogmwAtBTec3ui8WnKOSMZI45pAqyogAIHcTe/MdU2zfdLU7Q +6WIm3d6o3FVg9VOAMWTBe1l6XALlTjYNHqp9JDzIt8Z4sNojFhHGZ6O8NM+a75Io +Dm04E1UMJuY+3O7RoihZ2PneZA5SNmLTzLzSPzK5su8rIEC/1Ok5gIs36gRLmkVp +f/HxEm9IHrBkVygUQN5rQhn/9g== +-----END CERTIFICATE----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client12-ext.cnf b/tests/integration/test_ssl_cert_authentication/certs/client12-ext.cnf new file mode 100644 index 000000000000..b80b2b04f57e --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client12-ext.cnf @@ -0,0 +1 @@ +subjectAltName=DNS:foo/bar.corp.example.com diff --git a/tests/integration/test_ssl_cert_authentication/certs/client12-key.pem b/tests/integration/test_ssl_cert_authentication/certs/client12-key.pem new file mode 100644 index 000000000000..c2049923664d --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client12-key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCfOOwJdWD8cNcw +GzeK4ItsVXBFavj5tjB3t3AJuDtDE99gFhwOIiakDjtK7/8W95NHs8ui8JG6BbBh +IA8ZqhvN3Kws6yccKAXpdTQNMHToo6802QmtYDEX+eNKCaVPQylg8NPypFf6I3Gq +TFKXaPiFPlu5Yjc/xFiqL8U6TonG03aQ6JHAhPTe003NhSQ9HbFHwx0C6JWCZZOo +UGAKSB/PRpMs5mYlqJMeYVKS41tB7OQ+jP4uy2SgJ3EdhQ1ugBsqMskWqXTo5k9C +k5bq1oDTp/Rd1TH2JWO0Jes52bIRUORPUqsXKnmvGbeXaDMvOwTuLRgaykBRj42v +voEsnYOFbKqX5B/uiGECdAPmEEP68vlnyRVM6orzQcHBWDKkITvqeL/GCc3PHJjY +ogRYMUGzvmJv+ELL0Vmwc1tx0TIHTZx9WamzEgyZVJ/Du+hHe2XUarJ6flWiCFmv +7RuR8FT9yGXwxDx+BZaamV8sWMt8yGsurow334ANQibvVt8bJS30v19WQ8c2SU7N +SeI+l25/6nDHrur45zud8nncBsHUHybp+fBATEqjcAztkoUYlF7OhFhT4TE0211s +BbAJ1G8Cd50Izt1uDWqHxc+v2tmjq//ZrwQ1JcBVxpIHOcLs1bUH90vXhvp57yVv +K3/Zd739+q1E2RzjKsMc1Qk9HqpMLQIDAQABAoICABYP9BznZ9Xy6M5gpxSWQptz +R0hHJ1KqnRKpl1uxbHzB7yzIQ4Dt2H7Y/fxHPwh2q7C+yBO+0+J70VHT+GOs/4dJ +8Y2T0+qB3TfZJqpBMaHetHNVM5MThhn1ZTooFgDipIQrOqMfhJVDfgeD5dnXEMCd +wGXypwct9L84OVL3+P1U5dP0deXARpHto5U7wqa5S4xPC+EQS08zNf+Xi4dBMS8u +b0xEbJkBP8lw4Nk7qbR717CXJs1jH4FVlcXqXs8V7y2stdJvDqUK7Kaj/sBxko5B +conh9bdOvP8EVhDBCnx9wfT/1ncySoQpwxe2t4ju26MJGpLzvW/PvWlBs3J0LPoC +2Npiab3XS6006UE4xMQxcNeaU/4Oqma91m/ka0MbIdUDmyLECEO+lW2bY3vYK23n +Z/mkop/dB0hUGb2FwB6r/KqNlvCD8RruidszHE8XnLti+1AJ8ek90dqC+u3J0qDh +cxa03b2WZyWdrbRPxQcjeiTtWeChpzE+nDovjYfLwggxeVJHCAqOJj2dBBDusKaA +h8f5Wsy4kuf+5BXAvQyy68c813/Y/HxKy7Ye0LbhsZIURTwFDmrhssuhCescRpxt +rx36W1SnEjoceCoGiw1Yn+6H9q9f3lWhwNL99G9G07hdTQSttS2vvwYFYFkC44SS +QI8f3SatYvCC3M1GvhFdAoIBAQDZBvCHhPmbIEiNKnBKQ26J84kTIfWiWeHTDiPW +C4IL2fKVnXXID3qZelcK2uC/8ESnsapzY0s3pYKyGewRFtt6bIDEYqt/G+nK5MgI +e+KNIIUsDiHCo7OnwMiQ9DFb3peGBTg39xmaOe1blJK6bobYNtEvsMfiGyOKUF3F +SzaUDfW4hvvJqwUAUyzNULvHcxbnfrgPg1MvKKe0OSoFvff35BC1ccepRvCDaUat +nUB8rZ5r28a/mPNuopEKYq5PBbkN+qofnEWPXzayht1URaIcg6O54bA7DqswBNtw +mlvqU90YDtoOkkJLxNrvXadnurDzNPpDqtgkHdA90qEJjb23AoIBAQC70JyHbGgc +79xrOFim2gqAZF0ynxFoJaOt3zvjUmtXEZ7gc6IeMbFgcJBlUXZwA3wIZraPjL+d +0MhB6p7+1zECUBSmmdKimMMrNn6BvKz9DDH2bQH0ccOI9raRBvbmX30eqTkZUyos +XPx9jL/5CwqA19wrszW0YpqtSBH7zvFNDJoz0rGwbLeGImVV0LAX9vqVVP8K7kGE +xwc4Pu3qC5JoQWgQdht7HXxPnedEVf5roaIMC6rdP4NNnc9JhBmFa0vxBNl/jA+I +QK02EGYVjzBIGTNWuZyqe9YOQ73KsmmHlaAA//xoJSP2k4a4Y04iQ/xTWwwEQWYY +VQPOy+6cDQU7AoIBAQDMi8XXdHTsyBiZNA5xb+yXCHmBFti0E5LLoOAVtPL0yI3i +hW2lCTG7xZqUGIcLYCDVDJZh+ovB/rSXt+bOlIR3dhxG+9g3DM/k8ou1s01rReM+ +CnO3RyLkUMa4F+8Nb1XQcsrxtGrk+QPE9Nr164Yb8k5mbG93o6xziBtY//KIyD93 +k4FsKUular8nI5hX+xjzRnOj61pTcDXfnqEEmG9FrCYzXPGZkcrNkEOVDkjhOaG+ +dn1zx2xoMcAR0cAHqpUnn8EH2fmVj1+2E3Y3HwoTZd7CKvw2LTUbJPjNwC4xRKl1 +K0pJwX/Kedb/E33cPhDYqG3XqQXdxFuoaQRuRLExAoIBAFcQAT+VtT2UwyzA1fei +o7OY0ssgicUpjZKQJQbfsfqOpIOPlttAVeVKyOTuumR6eQi79Gze5gSWP/6ucD3a +K1HTJX+FVusgvXhOrp4dhGNZP9/n8DwMcIQROdhIzjNEmI+aCmn+71HZWQIqOOON +hrTrW5i2XnLcMq+Y9R0xdRIugVz8knoiK4D2eNsq/jZduxN2bzP19lFCocolAcy4 +yImjqEXZOiv8IyAVJpu68VGbf67tyar+QjO8r9Z4cgwzDOURRnGlz51tvd2OBISB +9/O0GuRc7o7pEPVT2asYwWqkpaNRBwSQEve+s3jOL+4abeGGFy/x0Q3+euFmD5ov +PvkCggEBAK1MkZ9mjJqL0+NCb4Bhs3mnjZUBWuS4Q3/zrXSMVRt3XQKCkQTsnO6s +nKZyVgB8d5Fd0mODrROshkXFwRPlNsIX5IauEDZjFki3tle9exgO0wWINzKvd45d +UIh4xTAuiQmEBuuecxL/8aKUE6oW7i8v/fGoqK/2vHrIx7mZ1Fl7bLNbRnYZH7mG +RYkUJTuyecv8XnVmmHzY2UFy1CPm+pMtWq3iDs4a2FivRJcbmDy8KHgoT3zwlVqQ +/Owy2qKgrRJKvITRJpztGC+LdtDr1JaTUB5lISbmCdyYXn6MzFqWaLOJdX0R2ML0 +PKtoyN+AxDHIBnbcLRCAr7Zh0W06xuw= +-----END PRIVATE KEY----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client12-req.pem b/tests/integration/test_ssl_cert_authentication/certs/client12-req.pem new file mode 100644 index 000000000000..b6d9724cc809 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client12-req.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErTCCApUCAQAwaDELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUx +ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEhMB8GA1UEAwwYZm9v +L2Jhci5jb3JwLmV4YW1wbGUuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAnzjsCXVg/HDXMBs3iuCLbFVwRWr4+bYwd7dwCbg7QxPfYBYcDiImpA47 +Su//FveTR7PLovCRugWwYSAPGaobzdysLOsnHCgF6XU0DTB06KOvNNkJrWAxF/nj +SgmlT0MpYPDT8qRX+iNxqkxSl2j4hT5buWI3P8RYqi/FOk6JxtN2kOiRwIT03tNN +zYUkPR2xR8MdAuiVgmWTqFBgCkgfz0aTLOZmJaiTHmFSkuNbQezkPoz+LstkoCdx +HYUNboAbKjLJFql06OZPQpOW6taA06f0XdUx9iVjtCXrOdmyEVDkT1KrFyp5rxm3 +l2gzLzsE7i0YGspAUY+Nr76BLJ2DhWyql+Qf7ohhAnQD5hBD+vL5Z8kVTOqK80HB +wVgypCE76ni/xgnNzxyY2KIEWDFBs75ib/hCy9FZsHNbcdEyB02cfVmpsxIMmVSf +w7voR3tl1Gqyen5VoghZr+0bkfBU/chl8MQ8fgWWmplfLFjLfMhrLq6MN9+ADUIm +71bfGyUt9L9fVkPHNklOzUniPpduf+pwx67q+Oc7nfJ53AbB1B8m6fnwQExKo3AM +7ZKFGJRezoRYU+ExNNtdbAWwCdRvAnedCM7dbg1qh8XPr9rZo6v/2a8ENSXAVcaS +BznC7NW1B/dL14b6ee8lbyt/2Xe9/fqtRNkc4yrDHNUJPR6qTC0CAwEAAaAAMA0G +CSqGSIb3DQEBCwUAA4ICAQBq1OE0uLFei6+lvGfH/k1Y2ZW51OuumHKfsR9bbE6c +AFXsQlujlZ4xcyoGunjljPwgINakyZ0sBRLBAOp2bpj/GQbUqYkfT0/B66a8YNhl +tZoxVGpoDhHFKiuTfiVaUhIM36fvB2IMPTw+Es6WLt3SKo1AJXD5Ug0vXYb7CCmR +NWSAlLWm3lcUccC+a0lyr0JIINfpO86XouGt7mDzFNE6R5QFK5DF3BhTU3oVnRD1 +8JrP1u6kHRcjb9fH/6xYOEj11NyZOUs8OHldPn1BktEB5xtG0x4TOhLOYzZIipCN +uYu33QY+69RsPBjPZhLK34RiO2YgOFFNU2kbBPFWwN0nwuZQ+MAmrGUloxajHCIs +tjik9xfSGkB/FwkMnb1OLhTByih+uMD6nnlvHoO6soCK88/oyV8/HUMCl4gzs9C/ +usJYy5IzkxEF3xT2AOpJJ4bydA2mSZ9M2OQJ8fuT4+xSveiZATeh+Ngnz85Ao5op +Ke3rsduAyhd6vMPez/P5+RChp4ipWl7saRZ5HehqNXsAUIvtdxmbQISZpOJyTUU5 +yzZ47CtyhRMR0rbTw/TlmVY0hGA+7SrggJh0WxFtTtZ0gZJdE26nedvL17BURdkF +7hbMIqAAZN1TYIbtxuEkySojLj1KEGTUoc22YAW1ZMPpqumo7zZrhxk0edwN92al +2Q== +-----END CERTIFICATE REQUEST----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client7-cert.pem b/tests/integration/test_ssl_cert_authentication/certs/client7-cert.pem new file mode 100644 index 000000000000..9d8ef723dc65 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client7-cert.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFrTCCA5WgAwIBAgIUBfEMZ1Z/4weV13ryVA9qyNTPJHIwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDELMAkGA1UEAwwCY2EwHhcNMjYwNjI1 +MTIwMzE2WhcNMzYwNjIyMTIwMzE2WjBnMQswCQYDVQQGEwJSVTETMBEGA1UECAwK +U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMSAw +HgYDVQQDDBdzaW5nbGUuY29ycC5leGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAL0zt/rztZWAfisLMfW8lGC4Snun/48066qFIuj5sErX +l85tyPdaLb2dj2KWQrojb7UiBj3p1JYTBBXwNbJmIV0Mgc3gdOe0OEvkxsrwF9WD +/eDacDDWJI8GoLtt/gKdt6jMrilE01Y97VR4ND9c9zdh4x98ZZsx6/1onVCkhUr0 +ZlgDgWRzUyTunmOKwV4AGIvIPggcUW8FS0fJynTeH6NPL40ROscRTRbIabtEy7PA +MHVtRi0ruvaXuZdVV8en+Xz8wA0z4FsEQ/aUdVs8ZTEvkJNrJRfI228MqaJOVpRW +aL4tYpSXgOK3yST18OdxNVVa4u20FEjlYnP5c6iAJj2d2bbWESBfCVaVtii1uxyM +rI/0H1gsZqR+w9Lg8lsqBoX0+rPT7rzVSWWZCIbdeGs6NMzu6xKg1XeSEX1TTN+G +tfC4Z6ElhkxpCa8BmIqtnHWMNcgdy2GcLOHPFhIdKosek0OQKbItUTNZlnQMoYIR +8uwrVMItygzz+My6K5mGFYCNsg2ukEPdJImxZRfpvFy0SMmyuGW3hnvmB0Pi5www +4/pfmniFdQU+XNtu8F+2Caz7u2UcFc3zAPVdSyR5jLJifAq43VYQwC3YrwQRZ8i9 +jsD/TKH0m8SrZYOEH87PbnqEH7ib4jTlf/78oESs81FPTHurr35e6C1hHkc+5XKt +AgMBAAGjZjBkMCIGA1UdEQQbMBmCF3NpbmdsZS5jb3JwLmV4YW1wbGUuY29tMB0G +A1UdDgQWBBQ0Enm44tkulCOkVG9Vlg1MTFDxujAfBgNVHSMEGDAWgBSJKj1dSYN0 +jW+Mu0xFQrobZFmQpTANBgkqhkiG9w0BAQsFAAOCAgEAXXqOY9Q4b9NCV/34iAL+ +3fk62XD2e7wV9VFNNpTJRIMbuIpm7+w7D1bhpgmVxlHn51QVBf+faMrvhraLl7cv +QOudGkTBTbaBEwKSIdyNH9QW7NYAaSPktVQYdu9zYHwxDkA89kVl9aNd4PAppuRc +gj/d7oRFXR7l/inJgOACVkcmGmF0UvBmEto9M7VsiZTjIoWLUpNn0aHamCNOxd+Q +jZR7Ae/Enb7gZAUjVRoKJh1FhbjJIQUGm7LqpysIIQddMB6zdrfMzMjRZTmBpq2P +5+3jRusnrqPc84CSpf7qre+/iLpmA8EwD5uvQM12R3FWOO7sTO7cPHhG6v94b8f3 +eli1TOzo7ZMxKsdoTZswspuUs/Bb08yXQsxpUd5LagFLtAMck20TtDyVs9XDq3Ij +PVv9KaVLBU09gNNmtHz10GmI90e8PzrvFGpGq5lUnAcx0622tkvd/napUvz9SALQ +/M2xah6ww+5Tt45qU7SVpyFlgfNVAGEPFfBVNmlfmE1FIL6YyFb1F1ww6L0Z7IDP +V0CSWP6WwORbqrJKnhf2iKcoqJnyXyt+ld0Z/PvkYLLFKeh/lh2UQLCrMv1bBI4z ++EArhhSMSCJid5iuXBSQ/um/krh9BqQZ6HCqhk8t+KDu4bVSDp+jER10XRo8robP +ydmRXFTsKg/8NQ2Ev77XbLI= +-----END CERTIFICATE----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client7-ext.cnf b/tests/integration/test_ssl_cert_authentication/certs/client7-ext.cnf new file mode 100644 index 000000000000..3b952b5f96de --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client7-ext.cnf @@ -0,0 +1 @@ +subjectAltName=DNS:single.corp.example.com diff --git a/tests/integration/test_ssl_cert_authentication/certs/client7-key.pem b/tests/integration/test_ssl_cert_authentication/certs/client7-key.pem new file mode 100644 index 000000000000..8af0d65492c3 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client7-key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQC9M7f687WVgH4r +CzH1vJRguEp7p/+PNOuqhSLo+bBK15fObcj3Wi29nY9ilkK6I2+1IgY96dSWEwQV +8DWyZiFdDIHN4HTntDhL5MbK8BfVg/3g2nAw1iSPBqC7bf4CnbeozK4pRNNWPe1U +eDQ/XPc3YeMffGWbMev9aJ1QpIVK9GZYA4Fkc1Mk7p5jisFeABiLyD4IHFFvBUtH +ycp03h+jTy+NETrHEU0WyGm7RMuzwDB1bUYtK7r2l7mXVVfHp/l8/MANM+BbBEP2 +lHVbPGUxL5CTayUXyNtvDKmiTlaUVmi+LWKUl4Dit8kk9fDncTVVWuLttBRI5WJz ++XOogCY9ndm21hEgXwlWlbYotbscjKyP9B9YLGakfsPS4PJbKgaF9Pqz0+681Ull +mQiG3XhrOjTM7usSoNV3khF9U0zfhrXwuGehJYZMaQmvAZiKrZx1jDXIHcthnCzh +zxYSHSqLHpNDkCmyLVEzWZZ0DKGCEfLsK1TCLcoM8/jMuiuZhhWAjbINrpBD3SSJ +sWUX6bxctEjJsrhlt4Z75gdD4ucMMOP6X5p4hXUFPlzbbvBftgms+7tlHBXN8wD1 +XUskeYyyYnwKuN1WEMAt2K8EEWfIvY7A/0yh9JvEq2WDhB/Oz256hB+4m+I05X/+ +/KBErPNRT0x7q69+XugtYR5HPuVyrQIDAQABAoICAFZDdOBZ6pIx5hSJA6vXYc1h +aTBNDhOEnOh/0EVpxmuxNXk8i/LfLli0NFJOUTkd/AoZa8Ah0zfjjqrT/R+MOiz7 +DVnJO3QDMuHDerG/WxaSGhhBcAKMOFnvuywJv9UAhOLVA5k0VKkPDhzDu4qiP+MD +4fKSnJ7wWXkOEB/bCxz8Jod9farHfAKsOxIGixhpMcfVshavlp9oSgT+p6y2M7WZ +XoRSdTqbFEtNcAuel8OqXk3D10m0FQfmcItjsWSKHRHUCVpbqzDEVppf4MwK0tZk +qeXU5bIc9ZOBsfwa/JWgehwvhDFcjDqScgbEjaRwdNEoYavgPZlo4IUhGI8ccpI/ +PiROBojaCyxWiIeRZs5Du5Rwt9a7fwWluo1LnphsbYgwkShb0MauHZORqaRS/ZcF +TMhRYEI7y2P7QLmYjqFg4cw0139z/AQFuoEd1kBGzqQq8HgvfTfOm3yBnFzhzF4V +g7BcDy0Z8eZtL3IWiR9E8qowr2sokDLlCWCYEXHm6Eztec5fG8LKT7iT/NJnBk3Z +s4j+3GFPB1B0tjzj5R0NHV0YDf4BQqc7R1RTBeZ/5xuB9rQgdDXlQjlXa+O5Ou9P +V8sPFbwq0fVp5CXO1oKqLPECKZ4y7TEEGGPG7YdtQoNIRNpC1RKESpF6obgnUHX4 +tJj6g47zNEbBYPckC7hPAoIBAQDq/pwKRZ9KqyqcBFzrBKuxCFV1hIXmy7Dbo65W +1SR9X6ADSeDe8AmRWipdXsH2rMPpc8iVotMamEdRx9dl/m45qo+43/CRoN7Fg9Uh +xfNvIe7Lw7gbmWeUBOo9MB5TrGjIRzptrOOVnhFKqLqG5yLR1qnoD4smJ7f319my +2LSXdSWOi2cBzxafU5nSsgGPpKPrRsJyQJOpt3pms2/wNtUcBNvhbCPqR0macb0T +mrR3LkRRrkvDRNJJsh1X1TSFzchbxkx1Veu4pLb2mGVgC8caMIpGDil3CVpuOjvr +9kpo5B7T+/LdbWi+UUQQCldifVUbgvjchQkRwMZkd88vr9E/AoIBAQDOHTyKt8dY +TI3Gg34K8JC7niCBw4abAgERn2dRLhQIHT+EHCQErS9opwXzMYiUydzltIqwgKn3 +TpheyCOx456oMBgP6veKyg0HrR34R5Hm2NiDvVkX+Xr19eo89RC7Gf12uPak3ejC +xuQFRjCgm0uXf8F/2ZZril1nmLrZE4nEXZuXzLlaRS5E2ZY33cNFMeI1dLByfGcU +12khD/OLLR7hevoAII/kDVbnmdEYwC3tO+RehMS97k+N37tI6iQMwdF05kHenVd3 +Hbp9gpgJOGMc41IOpLUVYBt8AO1x4VDwCBXUsii5/ngjLklgvdg0v/0KXOZS2O9S +OVJMqO6U4VUTAoIBAQCxmT9g3AFpMzd+tiVrURpZL003BbMVHHhLZscJxQhQ4IZU +Ne+HTa5NdfFyo3y/6w4dT24W+PnGrbOo8PmvkbzIRElelZCA3y295MadQbebE/Af +e4mXAjcvvQ8ysz0YS8LdKkfUP8e4eb/jxuVBs0mzgSLjyWuGqJn26+ERs4m4tcZu +lpiA23vjahFlFTbs0qc310B5jKiMqagOGirNRwOEq39qPIpgMwRDfxZAzLj7IbJs +cOe9ajPrkntuuCl7vmxgP9vlCcyevY2xjLeBASW2e1zlWSqpVh5MFCLZUEgoQc+y +skV4Z4mz3EMuREKKouJBapieQMT778+AerPQ/HWNAoIBAQClBlOK3UoGMITzBCTO +rX20Og7c1qfXQ+uHKJGYNcRkGsbYB4/vDpp+t/vTkz0/o7/xSnQgjWOIVq04dhXe +P9iv4JHjbMV1ogB8vObZ+rOemNAB6oCC6YTBmXtKAwy6QTzm6YDQz7uk94lpj6Ev +dic3zVon+xasU8QlReuUEkijqC8Dgy6EUA+ToILdh/joVeA/3IXJpEEENtQ9XIAq +Vp36+nNf1rJebS+/jzATGQusfd+Crdq4Fy4q8Y8J+i2S6TvC1Pi4PFHjVTITe5Qv +Da6NWpRAlS9HRgO7bSKvoy8if9a6zUo+YLffsxedFWMeGPmIaokenAJBWxPBvSAI +o8FxAoIBAQDEVw5F4DzEVqmIvrv+77dm5gK/iAva90wyTvzWO4RjbcfAaSrDJFTl +CiVvMXx0892DY6tJzcWu4xPtFND3BlMXVOXyD6q6Mncq5K0IizE22isB3dhZ96R9 +mCKiY+95ASYxpaMu2GHnNbAhZrSSxDmhI5Q6oSRWmGxHJYj6Ppz7dRn8dczkgTm7 +Of5pOkCctrvXvinQ5OEr7wbFn3EXKtWcycIMPbNhRD5RcG+DN7OhrsnFCnjolmvT +feMITjUh1rkma5+e9F/rqSEcJX3+wYwd4Y2ZXicfP4uEEcFPVvuNuSwhH9Q/CKOa +O07EpYi+Gy19y8QOvaDeGYR1dOHQ0P1S +-----END PRIVATE KEY----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client7-req.pem b/tests/integration/test_ssl_cert_authentication/certs/client7-req.pem new file mode 100644 index 000000000000..81383c17f2af --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client7-req.pem @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErDCCApQCAQAwZzELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUx +ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEgMB4GA1UEAwwXc2lu +Z2xlLmNvcnAuZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQC9M7f687WVgH4rCzH1vJRguEp7p/+PNOuqhSLo+bBK15fObcj3Wi29nY9i +lkK6I2+1IgY96dSWEwQV8DWyZiFdDIHN4HTntDhL5MbK8BfVg/3g2nAw1iSPBqC7 +bf4CnbeozK4pRNNWPe1UeDQ/XPc3YeMffGWbMev9aJ1QpIVK9GZYA4Fkc1Mk7p5j +isFeABiLyD4IHFFvBUtHycp03h+jTy+NETrHEU0WyGm7RMuzwDB1bUYtK7r2l7mX +VVfHp/l8/MANM+BbBEP2lHVbPGUxL5CTayUXyNtvDKmiTlaUVmi+LWKUl4Dit8kk +9fDncTVVWuLttBRI5WJz+XOogCY9ndm21hEgXwlWlbYotbscjKyP9B9YLGakfsPS +4PJbKgaF9Pqz0+681UllmQiG3XhrOjTM7usSoNV3khF9U0zfhrXwuGehJYZMaQmv +AZiKrZx1jDXIHcthnCzhzxYSHSqLHpNDkCmyLVEzWZZ0DKGCEfLsK1TCLcoM8/jM +uiuZhhWAjbINrpBD3SSJsWUX6bxctEjJsrhlt4Z75gdD4ucMMOP6X5p4hXUFPlzb +bvBftgms+7tlHBXN8wD1XUskeYyyYnwKuN1WEMAt2K8EEWfIvY7A/0yh9JvEq2WD +hB/Oz256hB+4m+I05X/+/KBErPNRT0x7q69+XugtYR5HPuVyrQIDAQABoAAwDQYJ +KoZIhvcNAQELBQADggIBALrGmCMA+lkZG6x7nbQcjanQZgWBMeMZ1M3XVfzFfA+m ++eEnDEOx4pUdYLhSn2TbjPIMzNYkspU3ohmVMZSTdN8r7o1IfuKESDv6CLhskGvy +GaKi2cp9OA8iug0XEOd7IuMJ42PbXbORPNkzAPqZoS/bChzUdtE2r06SiBgrWmgy +n62ZeiRIskyJv10Nmehp+KxZGjVze/PYteXKiC2lqUZGuMiBDcX1gZ/BEUa+Th7u +LhuR99V954KD4XgzQPXWZt1gM10li+iGLoXkvsRAPu4yuCZ+3CreEMh4z1nWh1IW +uMF10n0Ee6zUyBuggJcvOEsPoi1QYWSmS/Qixwa/AJbWIvz5FOHkUwgLuXAdRdAi ++HzIQdbS59sHYA96Gk5rarw4GVl5IKLIWq9gRhzUbLUiMxam1KDoAQOhv7OGhSHx +Wa/FJYgovTi6dk41ZF9EW/G8O2OvRKc9bLjulmwvIrkgrHUOxJsyWtX3/PDI6Mm3 ++VgSAF6KoKTOdkcboHBLPECx1KdKJWhw7dpdmlptRG6tHDjXPPyzwaRrQc8ktNZO +QC+B9ivSNaQHlqaEKheRWpVmASTzSd2lUd4I25JAtQo77myUUxHIYjar6lvNUT0s +3vFGRrhAUH4TA81cgdRpjwhED8MfVxXKyhYlSCsGCEH8Lx88TSjajqXB7bnydhCa +-----END CERTIFICATE REQUEST----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client8-cert.pem b/tests/integration/test_ssl_cert_authentication/certs/client8-cert.pem new file mode 100644 index 000000000000..bc6b4cb513c2 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client8-cert.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUBfEMZ1Z/4weV13ryVA9qyNTPJHMwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDELMAkGA1UEAwwCY2EwHhcNMjYwNjI1 +MTIwMzIwWhcNMzYwNjIyMTIwMzIwWjBqMQswCQYDVQQGEwJSVTETMBEGA1UECAwK +U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMSMw +IQYDVQQDDBpldmlsLmRlZXAuY29ycC5leGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAMWMjNngXJ2jG2PSZL5RT6gE6CzGKWjiOaD2sbJ9 +0hWS1B55WSGsTPHWEbIoQs/Nt15Ok9/mWwSFx1lKGuRedZWdy5zwT+uoZybQHSyz +su+oxyw/Gc7qx/vYxgCjF+l2dZqkCr1QujU/gNnaUf6KYyISQkFHjAgb2HndD6Xh +eMb6gWVfER5d6AjeUuGQ0qX5trhyATX7XDAUS4EHH3IHOxJbWtOfB33QmyghSovw +D128//yIBvS09dGHcbndFx5QEMd+s2VsVMpBuyju3MtUtp/tcrnTDwKo3Xq5k68t +7xzKU4olwfUJbgzMMZ2mMXgkBAEy/158Vw1YwXXUuioHbJZCsjhkKJwNOkAbQ/So +/MXK0ZAEZtHGEtWmOAgGtBPHoGLfX4tjxzCubiz2rL+6JnHcU//yQNr7QJf4R3Go +bebb6b7SDmir9C9GtS+OnEPI1uiwZM9zZGnr+Eeh35pGjVUBY8WM5wi8Ar9y66mc +jbX/rzhEaK/K6dct90LlM8NMjgpA0OVvqOpEbcl61kmqdd1niIThmyYOlGnhUQo7 +6KCgz8eMn+rPA8nikL979HsAl50/oiNEky+9yBQE6BCReYGWI9xVacsDlZyeTSZY ++nCWyl98AdOLBzrhMP43BGcYqwANM5kPh0J1rdPG/gkkATNHt/1/qbH/48LopSEb +beXPAgMBAAGjaTBnMCUGA1UdEQQeMByCGmV2aWwuZGVlcC5jb3JwLmV4YW1wbGUu +Y29tMB0GA1UdDgQWBBQUkEMm/VbHTQhyKEBes9h44S/uhTAfBgNVHSMEGDAWgBSJ +Kj1dSYN0jW+Mu0xFQrobZFmQpTANBgkqhkiG9w0BAQsFAAOCAgEAXjA8e3JSJDPX +RI0Rj2CSo03bzCItcPH+9NrBl9y+CObtJ5KC52RLayVJph9sbYp3V/GNwhJUDoFA ++6ViMBTnzT/jOqi0g1pJIBEtHeHhyUCrhJnsOYUNVyVi2z06VIOiLrmpOmSj86HK +7niqgMQBF/Y36nTHXf3Z1CkKANrpCw9WlMCmIakF5FRq98iRmWDU/chkmvf6iAnS +6iSyNswTuXdNWJfnD/lPjX0VK9sGz4EjxwoiHZIuMED9SfLeoLeJ+4fr8t9F1K/W +5E5t0a/zDUa6qIvXRVD5tRKFS1d6u+dVrkhbQQpWbA4VHC8CloqtAJ0qfPuOz3xO +ciFmAvq/l3nUatgT9lFR2oztNiM/vkZ2AdT9UjYPNonbdZvc/MTOUquHiJyL2Gvk +dcMWz1+ntFBMX4x/KhP7keKhP2BlZmSDoabDwKYfcZJ6P4s8kW+7l70G5g+cloW8 +kDTXQKtMJ1Zoz3PKuZV9ipuQOZVCGpP83b2uYjEbaNSFSWkqc+BI0cP51Nod9nok +8CQKj+E+JTYlzv3fOhckZgJ3LxgS/i7C2yT14Qjc2xV1hD8xn6d5C/xsxu3vfgVE +5HF4CdvmkZqQ6PHHBtvEJzgUl0xBuvojRW6gSDmOV/aiTkx0s7M6ygFwU62YcII8 +wUXZOxxZUf/Cg35aQkrqUZiz58U7mGA= +-----END CERTIFICATE----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client8-ext.cnf b/tests/integration/test_ssl_cert_authentication/certs/client8-ext.cnf new file mode 100644 index 000000000000..13d4c7409722 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client8-ext.cnf @@ -0,0 +1 @@ +subjectAltName=DNS:evil.deep.corp.example.com diff --git a/tests/integration/test_ssl_cert_authentication/certs/client8-key.pem b/tests/integration/test_ssl_cert_authentication/certs/client8-key.pem new file mode 100644 index 000000000000..fdc65dccf988 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client8-key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDFjIzZ4Fydoxtj +0mS+UU+oBOgsxilo4jmg9rGyfdIVktQeeVkhrEzx1hGyKELPzbdeTpPf5lsEhcdZ +ShrkXnWVncuc8E/rqGcm0B0ss7LvqMcsPxnO6sf72MYAoxfpdnWapAq9ULo1P4DZ +2lH+imMiEkJBR4wIG9h53Q+l4XjG+oFlXxEeXegI3lLhkNKl+ba4cgE1+1wwFEuB +Bx9yBzsSW1rTnwd90JsoIUqL8A9dvP/8iAb0tPXRh3G53RceUBDHfrNlbFTKQbso +7tzLVLaf7XK50w8CqN16uZOvLe8cylOKJcH1CW4MzDGdpjF4JAQBMv9efFcNWMF1 +1LoqB2yWQrI4ZCicDTpAG0P0qPzFytGQBGbRxhLVpjgIBrQTx6Bi31+LY8cwrm4s +9qy/uiZx3FP/8kDa+0CX+EdxqG3m2+m+0g5oq/QvRrUvjpxDyNbosGTPc2Rp6/hH +od+aRo1VAWPFjOcIvAK/cuupnI21/684RGivyunXLfdC5TPDTI4KQNDlb6jqRG3J +etZJqnXdZ4iE4ZsmDpRp4VEKO+igoM/HjJ/qzwPJ4pC/e/R7AJedP6IjRJMvvcgU +BOgQkXmBliPcVWnLA5Wcnk0mWPpwlspffAHTiwc64TD+NwRnGKsADTOZD4dCda3T +xv4JJAEzR7f9f6mx/+PC6KUhG23lzwIDAQABAoICAAK2XnwNWGgyWZ7CFZpcBnJ2 ++B3JQ2n1FTfQZfnelWMGHD3Q37hBI+Cm1kuybCcV8CsY0W9KZpHbfl8LpUPhHM8x +lp6bLsBnFFzUOwT78KcuvjwCynQXWtM/6N67CTSDk7N3BiNkTNzh+CnFlXOfwHhd +dNBtpDlmRyTL3rpMgWUwrP8l0i0vD+UInG22wyr+kJOGvofYYYMoJtiThEsuAzx0 +yadMhdn54m98yYe+A4//bNUG+cV5Xe4DDzzZ5saGmzxfUSTsMFvYkYfLLnfnkVxa +cm/6ZbiHy1wIg+5spzL81NnO5pNajkrEW6K0/0qNgAqTgdhxGkbiIuyJv7FHtHtz +eIBuK/vocssvH/ItcHZf+UpbgcnacYIwsow+igXJ1wtItQqnk3kz3dvCH36HYq4l +mcsDxKIxfp70alY9P5ww1SASWhVj+d8DyEXQWBzqaYDXRhqbmSpaYkq5OAT10046 +rQv9EZdVF9jWDMKG+nvJW2af5kTxF9STC4G6eUVMndv4jxI0b+Lnt391Uuq8hm+z +MfP8busN6TBKX/7cGaxlo+GGvaEdT8g+mbpsdQSmI12etLXiAVSCQnUXSm6GwonG +g2/GD1wwxvOV2eYgwjSGGVpoB88JTAw/AN+4dCxkJGeJ8WZdDSACBQMJrWx/II3i +p/MKF0CjRnsWuhs08Lc9AoIBAQD5imoAaKCUvyPZGzHor9efg7exhox1Y5uR6E8C +SuqUSb/Q/aVC2PBf1XElMFrJwvsMFbppkk2QAFfOr6/HQ/IGBGoBfX9VST/wFYU2 +1Aq+htlFJ9Pvd1cfxTdUpuNZtKrIlv/KSdSzt7ILJiXlDTnWlPRuKlNqi5JD/n2b +KE1ifdor02lgPGsOnZb6bWex4N4kJG/3O/zRvhl7oyqO+rgivBsloKLkyMSvO5RM +0sy/ALkg1zOGFXdwvh/3wf8tEsi+2ZxAF6RCn8T3CXvFOVmrHDFnNsGoyGCeOie2 +xvIo3LkxnJM0ffdaBLxmA0CLF7c5PIGOMsomuqazDA3Fg/OdAoIBAQDKqZzKVeO7 +/di2q9Pyzm3tMHKULI5FJ3vVm1485wFQsHSQcnyL9cItk9yWkhFUwau+qz+jDOvu +LCkbnezEVI2smeteG0w7VDab0SP6xbsMX+uKdClDB8hXFnDuy1JmTGRuNPJMbiWp +B8n2IpIQQw2VfXcCIj2keazu4UTwba07z6ElPfFpuchkNsGPPTH6hjvrJz4a592Q +B+bIggqzv3DqG064gjz6hhBskmBI8Uk3GzQjcLnFQilEp+RJN/LNOFbFBZrWvard +FcroOp2imHflH+HqoGBT1KzqyIscXUUNKsgcPFLHUH7kjqoH2R2x4subyD4mA237 +E6tY3hW9lnFbAoIBAAFe6UYnTPqEMkY3CAcnMCAIMTIgcxUR/wDGLejtUGyQGyWi +vw2m82sTWRPDODxzfb2LQQLjctmfptvTyztk/CdcTtjDP7fQNzGybJDoiUaSpw7i +MR/Xn/rksnEcmZMckvOXIMCTtz9leuzkwMCJWg/7sXwJb3veWGdXNolrp0ErP8+N +0b5dlpj19KZbg35Opem86YCKK9FbIfiz5L/0UJ6gOeXzA/INyEbOJPpnDgjekCXG +CNprs8RCxxotTqGIwOGLgHg5qQVUq1hQDQYAUqXF+d9/RYEP2LgFycIPRbVDwSCs +o4JeTsWH0SEeU3RwJOmDk5KcZM/hppjFMC4tk2ECggEBALTLJR14C+asaYVkunrU +X0qGuuCm8vCMbbO8nBBWwFycXhByods2DdkdHF+SxTVIZQ9+tBGgOGVMLgv+Ebd/ ++rdsxIU6cwJGeUT+CUvw05IRjA4C3MB4k+flFDBjYAn0wm9yemlmpeAqG6ihZI5v +UxH2UJGtvDIbfgPJIPgfz7gY3RhdLx1zaGrGUlyXahulXpTEeGoGSSjxc5eSMzvx +YCjo3YxKW13e9Y3180F/RyKK+TNYn9Fy2V/vKv+KkuczCG1RN7W0lFYQ1+feSrw/ +qk3T6HWoRubiRrRY3YkbR7ucW9KcmfhHPjxlbRf9P7luqtc5hv/gdV/URzrLPLfa +GxsCggEAenaXk9oZN3tltd25mKuj/Ybtk0o1zBIlhfGkhVOoqZBWjD0HODmyBClw +VKKblBtd395tWQnqyB2k8eD/R5xMICbx93k5xWbHV1+FtJrG2cUGPW6BR9kHsufX +q5QN6NM1eyhi3YzhmLcErFJHEw08w1Fq+z+EFjDXtoP2eP8PNqZiu7HNZXgias8c +1IKFCjv1P9lShJF4NcadWrlrdiApKonTAySEA6OdZVWj4avMiQHpx4xm0Rh5G6mO +4UZOOaEZ2wedbqQEx0Rcy+3we+b2ejgfzuz5RIykuYIUyrJrHpSsgLfp40jIKVUE +xmeoVSu3+dXoaoq54TdIlmj5SvJPHw== +-----END PRIVATE KEY----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client8-req.pem b/tests/integration/test_ssl_cert_authentication/certs/client8-req.pem new file mode 100644 index 000000000000..65d202dac150 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client8-req.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErzCCApcCAQAwajELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUx +ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEjMCEGA1UEAwwaZXZp +bC5kZWVwLmNvcnAuZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDFjIzZ4Fydoxtj0mS+UU+oBOgsxilo4jmg9rGyfdIVktQeeVkhrEzx +1hGyKELPzbdeTpPf5lsEhcdZShrkXnWVncuc8E/rqGcm0B0ss7LvqMcsPxnO6sf7 +2MYAoxfpdnWapAq9ULo1P4DZ2lH+imMiEkJBR4wIG9h53Q+l4XjG+oFlXxEeXegI +3lLhkNKl+ba4cgE1+1wwFEuBBx9yBzsSW1rTnwd90JsoIUqL8A9dvP/8iAb0tPXR +h3G53RceUBDHfrNlbFTKQbso7tzLVLaf7XK50w8CqN16uZOvLe8cylOKJcH1CW4M +zDGdpjF4JAQBMv9efFcNWMF11LoqB2yWQrI4ZCicDTpAG0P0qPzFytGQBGbRxhLV +pjgIBrQTx6Bi31+LY8cwrm4s9qy/uiZx3FP/8kDa+0CX+EdxqG3m2+m+0g5oq/Qv +RrUvjpxDyNbosGTPc2Rp6/hHod+aRo1VAWPFjOcIvAK/cuupnI21/684RGivyunX +LfdC5TPDTI4KQNDlb6jqRG3JetZJqnXdZ4iE4ZsmDpRp4VEKO+igoM/HjJ/qzwPJ +4pC/e/R7AJedP6IjRJMvvcgUBOgQkXmBliPcVWnLA5Wcnk0mWPpwlspffAHTiwc6 +4TD+NwRnGKsADTOZD4dCda3Txv4JJAEzR7f9f6mx/+PC6KUhG23lzwIDAQABoAAw +DQYJKoZIhvcNAQELBQADggIBAJf6O4jSVYkrn0TIFL2qz8B82a47TG6J5AJqDrPV +zDKTOPTUIhvGXW/8tzs2QRbZakFiNmRg+7uABMhKS5qzlIWb1lOQpVHVVFn6cerc +vLs6SRVUMpJlBBjPRf14tkyVZKqv1EQAdYrOUQot99y5Xo3/mFvvIkWsjb9MwzUA +aUiFmua45G3eiIzovGc2pb/pZXAWWo1jkyZoOi38fF49dxSmqwtC2njtnBaNMdkq +PA/npnnzELLp/eGMIgExhJBg310OwjJonl+ydJPhr1l7nOPYwoY6YZBYs7iLsF7R +ws8ccR/U839EAUokvVff4J757CphEIu728Bhkx1Fw6gmHBTWk/APpxStfZTA2soW +A74hM/gqgRE+qYsP4JTdn6EltsQ4mRy3jB9ezGOO1+MVryaRfKmOAES9xP7OxcHK +dgfp02EQFXSJYANaK+MX+mAOBlSy4BsWOUIHubQhhjrvbBu/CUepnGO1mODmDtGM +5Yp0RRyq8EB0nhjqKjL1fNPdT5teG0kUNFGQIX6NhnqfTEEydW/TfrRG3LL7bRms +ibfOdpWTELQyw58AtVzebDcJqRy2LY5rjtn29ef8W2ncwK0n25L8ffV4TQJo/OBu +PZZn7ZgxJZe/XnQbMMDYSdW1tsEj3xNCnNs87rDfdLxIgLxALVXE93Au7Ajp0eyv +QxZy +-----END CERTIFICATE REQUEST----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client9-cert.pem b/tests/integration/test_ssl_cert_authentication/certs/client9-cert.pem new file mode 100644 index 000000000000..1ceb1ca3b81f --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client9-cert.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFpjCCA46gAwIBAgIUBfEMZ1Z/4weV13ryVA9qyNTPJHQwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDELMAkGA1UEAwwCY2EwHhcNMjYwNjI1 +MTIwMzIxWhcNMzYwNjIyMTIwMzIxWjBXMQswCQYDVQQGEwJSVTETMBEGA1UECAwK +U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRAw +DgYDVQQDDAdjbGllbnQ5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +4g/ahkRNCMmFm/VxXzgAaeGuaSU2r3uIGZlVWTkTCqwsowGX4j1d1Cfl51TSMEW4 +JkgjQshjwciQzIaciHJEGiGCpJ0zH3AWZLA3Ch95rC7o+GoKT28bcmG6QzRyIyRz +LyUUF2WOZizEiWK6sIKTdpt+qORFpxdhmeUJW00jtQYVLrDHo1BgKcrf25JsvZnK +ION4KjkGk6pVmGClsQt4DgLpEwN5cTXksoLrRXSKMEPFQOWWXxsoeDFubbOWe1iM +3+B0Mb8HO0seiIQVYUbo0woWHYVD2W/HWgcqQn1SDzqdoeSH4yx2aJPq8egSdjrm +oZJNQCPjc1OhqogeaipjNnQYH70dCmEez7TWoZoJ+y8FZcoYxlJULTTZ+R1Ke9ZO +7GR7Aj/ztKMHxtdTbO/aB8b/116eT74x7QYse2vFzPA664mFLXwcAZLcEGOeBYMZ +Tx7ouXUIL0ewRFP7hB0iqx2Wg7GK8OClPMmebNNwCFPmbQWBOysYz0hU727TjED4 +uDuC0aKYfxph8i8GLUDqYrOG3WXTSvxqAWomrIeHHsIEW7/OlGOOnmlG6q1ca8ax +E/NEWrDjHcXTZF8qJcL5IeZnP3FzzvAWyok5WlZXOJan+hcPsaVj37jdonQSMSGR +bcQpSQUqxytyXvA+ALTDniXBtZjIXbiVfwZq7/z/YEECAwEAAaNvMG0wKwYDVR0R +BCQwIoYgc3BpZmZlOi8vYmFyLmNvbS9mb28vYmF6LnF1eC9mYXIwHQYDVR0OBBYE +FBeYLvnWv6XxKkk0SRVL0BT9cguIMB8GA1UdIwQYMBaAFIkqPV1Jg3SNb4y7TEVC +uhtkWZClMA0GCSqGSIb3DQEBCwUAA4ICAQCm51K27y2Zawy3KeZj8h1UOPiRCnM/ +UTkmpohzR9zDinbUtDu5Lth6TRtyxgZgcLG2XUZtGI1dh44xZgvd0FXJgAGEbI8G +tCvUtYREhjwfAOBc8OxqraHpFSfpJAmgFE+o9Qz9yFXcysnL04MfkN9Y+cn+Bsjq +VAuEGqHViUx+TCOzEGVRZlU+Bs5gyiIgHJAKIzC02gvvIjIsTFX3XRG0X591BneA +zbcl16Z0lg4MeGroYl/XZtozatBtXUzOis8MelkUNQJxfKp310VZD0T3ehpV+i2u +XPyXvAW091jiqxWK+uCGeE6SXrndkntjcT6u23Ct7ecdChgcqxr9xFe21Vlsl+Cd +prsC94TmgyxoxRRSd1hA2ZADUjVEPbg6nZPLrHuxYWC+naMCrzcesl8BM9DVeqpg +I/zdXKblwA208MHVvYs5720ExbvHOGvuGLfSd7q/f2ycgHq8rRnbEsunP2BAT2TN +RvE0QV/auyUCei3GJVOcV6Ks0rGDaLq8A3MxTJ9itrT3DKH1Pdjs8k5Njj2ljtJS +Rs7vjnIt4mQxH9u0T8F3TxUKI0r/R4A5JiYCm2pPs6/o1YfRA3O1Z36HZRr30KjK +lblRn/72f+E7HlRdsOI/DbUWHegfORognKPuITSfC7ghu2UlAw1LtrFRZJPotzuA +ClnaYByuDsQorw== +-----END CERTIFICATE----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client9-ext.cnf b/tests/integration/test_ssl_cert_authentication/certs/client9-ext.cnf new file mode 100644 index 000000000000..49a5d4fb0fef --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client9-ext.cnf @@ -0,0 +1 @@ +subjectAltName=URI:spiffe://bar.com/foo/baz.qux/far diff --git a/tests/integration/test_ssl_cert_authentication/certs/client9-key.pem b/tests/integration/test_ssl_cert_authentication/certs/client9-key.pem new file mode 100644 index 000000000000..8360d734d4a5 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client9-key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDiD9qGRE0IyYWb +9XFfOABp4a5pJTave4gZmVVZORMKrCyjAZfiPV3UJ+XnVNIwRbgmSCNCyGPByJDM +hpyIckQaIYKknTMfcBZksDcKH3msLuj4agpPbxtyYbpDNHIjJHMvJRQXZY5mLMSJ +YrqwgpN2m36o5EWnF2GZ5QlbTSO1BhUusMejUGApyt/bkmy9mcog43gqOQaTqlWY +YKWxC3gOAukTA3lxNeSygutFdIowQ8VA5ZZfGyh4MW5ts5Z7WIzf4HQxvwc7Sx6I +hBVhRujTChYdhUPZb8daBypCfVIPOp2h5IfjLHZok+rx6BJ2Ouahkk1AI+NzU6Gq +iB5qKmM2dBgfvR0KYR7PtNahmgn7LwVlyhjGUlQtNNn5HUp71k7sZHsCP/O0owfG +11Ns79oHxv/XXp5PvjHtBix7a8XM8DrriYUtfBwBktwQY54FgxlPHui5dQgvR7BE +U/uEHSKrHZaDsYrw4KU8yZ5s03AIU+ZtBYE7KxjPSFTvbtOMQPi4O4LRoph/GmHy +LwYtQOpis4bdZdNK/GoBaiash4cewgRbv86UY46eaUbqrVxrxrET80RasOMdxdNk +Xyolwvkh5mc/cXPO8BbKiTlaVlc4lqf6Fw+xpWPfuN2idBIxIZFtxClJBSrHK3Je +8D4AtMOeJcG1mMhduJV/Bmrv/P9gQQIDAQABAoICAAJ/6jjAUp9t/GdGb6cZz0D8 +eGhqI3mFjb5aGH5NLw8D6xX/6Aa12ti8MqTODoFfPDxnwVRvOymH5+Rb0cFRTYQS +JEHZEVUh7Py20Us8UJTwH2pDqIi/Ctk7FAFbNB7T895K2j7hbA2IlblS3jNybG5a +FRiZpnS05a7XIE04MkidqjZUEP9PAbr1EuBUgU1n+Or/5mjFvN8tKcNasFrXrIuP +vhVgSTmAivpzh73OwnJa5bx+VGkxl4MbmXHq/68+Qg+lvY2tM/+YjLBF6P9Mepme +rLKlphPGcnByHE44IOAlU9vb5znyjG4y4mTzmeiI3Xr2a1pZ8j1svJSqUt8l0A87 +RqCbdeYZmgGNZU6xLiqnd71O23X2DBYzfRJ6fjNWZNLQgDj3lW3NuxvzluzFV0et +/mhi7L4yhX1USg4QfFgGEdp/T+B8HNcA5qiz3g1XZu2i1hEZRnlHYUwFE983SqhW +KQylYGNvFc7aP+E+J+RLBuidd8zOMAtdSC3vKfg1G0xICVb2gKga5J8qOn6/3voI +JYaUIaBwjDc72cpJEjnSbpvNlcFTffu+PD4eC/KlZMMmZmYweaoAY82bguzhAewd +uTiDaBoV2Lsvr3PT5LBor5ESDkBbYUvYyIP6YwWjEwCPTzK0p1RK0RJT95pPVdlq +95EQsZshLhBnXgDjQHuBAoIBAQD6Zq97CgtCZbyHraApSMWMCiXFqE/R+yFoVi5E +XXD7TSyhHk/VCkO8+wIG3VnE5R9r4FuDLEq5rKPE6gklMIxbKARWEidhEnqm2N7i +7EYHkSoTP/oCzqjhQ9hvIGlu3tzuThd6a0nSHENwjCVrJey2D2RENSrW6apwiH+m +y9pfPwS07p6bk2sDSvQ1cbHm58WFbmMfO4BjZJzIpYk3HeIFQQ36HXom5ep+Veiy +R45EkFM+kKrU6a40ADpF/aaaZzasTL7vYMS/jeyJQj/eGn3wTKJ2bLpxByrA81Kw +Powql2SZXmurHWOECOsvBZIi7y2HE1KAjb4KxuAbkevTI+OBAoIBAQDnHdlNAbQz +UBAMXJycNNLfySvhWWTRnVeoXQLjapwyDpYOq+C8aK7mjizlZD7pYuL+T5B+c+n0 +bknYrH5fJSjbG4X6gJ/faJ/NeDPtdvMf9qLscfRMXH1wIMf8RpXzUqWYnLpVs66B +t+LeJyyCFHDhjn+wNdxTgjQANEOL2s9CK33a44d8SHmhXKnwq3fiAL/gtIHhtTbR +HOsKZ3YxOeCB5yBrfshm+XCSSGuyj+0O6HxWE4FzEuVCT2z/MR3oaDCrQU4NIvpm +NQhmG9O+mjnf1NiY3fKEGIkGeEOlHWhE0QsEQDbq8x4s0/WqKU3D/2pdWBBDAdlw +/QowsEo2btzBAoIBAG1pSOveK6VLhuFSAFWJsqfKF08SiC4cKTDJ11WP7rofsoyE +DiXsYkTE+NG/DmZ2JxCf69yZEd2njbeQ+4YAfJOoHJzvOb20sVsOD/Xff4n26AeZ +QMjRPAGR/5Qu+WK0hpyqCqA3GP5x0xXuZrs2ywOSHiGfiaR2XT7mpcBf+n77rjbQ +vQUFmRDLQ4HGuBFI3Im8/hq7iRHk+IzDp/0pVYUuM8lB8AnnFFs3doHPul5DIdyI +odx+btvR7aR/fLiiuMT4k8VM5ys7/ErNY9LMiJLjKWnNgHm6w/ejWlIgQmap2A8b +rrgKE12x9/GH4Z7aG26WBsqdJJjY5TumuwB7AgECggEBAL4Ot9Ix4oSIBIqF5mw2 +rGtHvgQVRWlzYNCdnHB0DXrEr/Xktm16EMqchKMnquy2W0ETIRo8LFrMD4JVZ57K +qix1F9qGx/Iq0a9geCOBvDG+2wBiPapGLQl2i78UNN/iSTeVO06a8pjOJYzW3i0i +riluy+aWhFdQLX81e46ZI/OgXGES1yoHV66wyzeVaoK6ZxBcoKqCIVAZ3deyeWnF +1LA+51Q+8IJuAnrpf1daMHIgEY+ffsao9UtwkYvSUmv6sntCuvLmntBKMFv36ktF +/O3q1Svw6SxkGNrvL4GrC0H8PnkCbacMwvXOYKnMSZ0yf7+/WbAg5zWZgTXE42Kc +DIECggEBAKgq5l++ze6RTUZ3wu62bD7gT/SA6IDF9Gb5QG8pOTBK1vtQ3mhbiNko +wsg3VbMvxgEfJ7ExsfE8L6+7/9fJkQu3zoFP6C3dli/jL3hP8HSmFa6GYOVmEKV9 +Kx7WDdmHtO34q1JurB8OPTiMVzYqwMP9n2ZSK2pbWPzW+/d+n2jfx2gJl2iDSSJQ +3YiMrVJCB4rzO3cnemXoKloTV8E7ETzFvrgJmi79Ukt4l4H6W3rjDPjdkhGCKbva +xZKU1AK48i5jB987K7Tcn9q7CRM51Ws5YF9BejVIAYYQNAi/xQgq28PodQgayLrz +p10qDVtVeDfAi4+M12NWY8oxn5UctiA= +-----END PRIVATE KEY----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/client9-req.pem b/tests/integration/test_ssl_cert_authentication/certs/client9-req.pem new file mode 100644 index 000000000000..3dff37ee08e4 --- /dev/null +++ b/tests/integration/test_ssl_cert_authentication/certs/client9-req.pem @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEnDCCAoQCAQAwVzELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUx +ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEQMA4GA1UEAwwHY2xp +ZW50OTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOIP2oZETQjJhZv1 +cV84AGnhrmklNq97iBmZVVk5EwqsLKMBl+I9XdQn5edU0jBFuCZII0LIY8HIkMyG +nIhyRBohgqSdMx9wFmSwNwofeawu6PhqCk9vG3JhukM0ciMkcy8lFBdljmYsxIli +urCCk3abfqjkRacXYZnlCVtNI7UGFS6wx6NQYCnK39uSbL2ZyiDjeCo5BpOqVZhg +pbELeA4C6RMDeXE15LKC60V0ijBDxUDlll8bKHgxbm2zlntYjN/gdDG/BztLHoiE +FWFG6NMKFh2FQ9lvx1oHKkJ9Ug86naHkh+MsdmiT6vHoEnY65qGSTUAj43NToaqI +HmoqYzZ0GB+9HQphHs+01qGaCfsvBWXKGMZSVC002fkdSnvWTuxkewI/87SjB8bX +U2zv2gfG/9denk++Me0GLHtrxczwOuuJhS18HAGS3BBjngWDGU8e6Ll1CC9HsERT ++4QdIqsdloOxivDgpTzJnmzTcAhT5m0FgTsrGM9IVO9u04xA+Lg7gtGimH8aYfIv +Bi1A6mKzht1l00r8agFqJqyHhx7CBFu/zpRjjp5pRuqtXGvGsRPzRFqw4x3F02Rf +KiXC+SHmZz9xc87wFsqJOVpWVziWp/oXD7GlY9+43aJ0EjEhkW3EKUkFKscrcl7w +PgC0w54lwbWYyF24lX8Gau/8/2BBAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAgEA +cND6LRdqriyYPWXmdKbqoN1pW/u6xTkscozhKxA5LtR1oiVDvw+wF8icAMdkMYgK +rQUU3PQpMdDeXegJeklOgjKXTIrfBR3QR/g7mq3+YzL8LHXHxQboJrJjhD1QI53b +JSOqNgpof2y2WSm83mqW5MDzXxygJ5vVikeC8sO57+p1JaWSwPL2pYCywDT7mjxS +q9Ph852GK68v5n9e43Rs5P1LU2+6gQzsNzS8UDFJesm+gnkhP+PYXQwqmABmq6uy +q8NHCo9v+vLU2sfRrmGlbLzt4YOUPK2DoI273e7Oq+IG0V+GZy50yfR+UmJDZ3Zc +XOO0Y/RBsJuWOPd/FX++MbOXd7h1elp0mBohTiMMLs0kOFVWMz1jt4jGvhoPltKk +eWHIKXGEfKtCK9KMQMFGD+dHa11FHUXDzKDldUbaZM8h6XGiiBluiJOdkKaaYTGm +9tobPsVAvIFCaMknHc6ImArfRbBhoI2b/8gwwq8qurYNSTS9KEaKCkOq/yz9RVs2 +8wUbjwZhLjASGA5j9d4OZAhlj4w3FtouxIKI92rwYw2SkCFlVo5htzfjGyQQXB99 ++rsOeh9sBo5SDV9ULZ3rjB5zmA+JqpWmDmEYyu7ffTj1mBt8Wg3tD8Opqu17zbBO +RVcbhbbEsBKkB1U1A6NtHD2DibRcYuCqRPfpuXHyRxU= +-----END CERTIFICATE REQUEST----- diff --git a/tests/integration/test_ssl_cert_authentication/certs/generate_certs.sh b/tests/integration/test_ssl_cert_authentication/certs/generate_certs.sh index e8d649fcff1b..00ea93ae0f86 100755 --- a/tests/integration/test_ssl_cert_authentication/certs/generate_certs.sh +++ b/tests/integration/test_ssl_cert_authentication/certs/generate_certs.sh @@ -16,6 +16,28 @@ openssl req -newkey rsa:4096 -nodes -batch -keyout client3-key.pem -out client3- openssl req -newkey rsa:4096 -nodes -batch -keyout client4-key.pem -out client4-req.pem -subj "/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=client4" openssl req -newkey rsa:4096 -nodes -batch -keyout client5-key.pem -out client5-req.pem -subj "/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=client5" openssl req -newkey rsa:4096 -nodes -batch -keyout client6-key.pem -out client6-req.pem -subj "/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=client6" +# A single-label name under '*.corp.example.com', set as both the CN and a DNS SAN, to test +# that a DNS/CN wildcard matches exactly one label (positive case). +openssl req -newkey rsa:4096 -nodes -batch -keyout client7-key.pem -out client7-req.pem -subj "/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=single.corp.example.com" +# A multi-label name under '*.corp.example.com', set as both the CN and a DNS SAN, to test +# that a DNS/CN wildcard does NOT match more than one label (the authentication-bypass case). +openssl req -newkey rsa:4096 -nodes -batch -keyout client8-key.pem -out client8-req.pem -subj "/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=evil.deep.corp.example.com" +# A URI SAN whose wildcard-matched path segment contains a dot, to lock in that '.' is NOT a +# separator for URI SANs (non-regression of the existing 'URI:spiffe://bar.com/foo/*/far' match). +openssl req -newkey rsa:4096 -nodes -batch -keyout client9-key.pem -out client9-req.pem -subj "/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=client9" +# An empty first label ('.corp.example.com'), set as both the CN and a DNS SAN, to test that a +# DNS/CN wildcard does NOT match an empty label: '*.corp.example.com' must reject this (RFC 6125 +# requires '*' to match exactly one NON-empty label). +openssl req -newkey rsa:4096 -nodes -batch -keyout client10-key.pem -out client10-req.pem -subj "/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=.corp.example.com" +# A URI SAN with no dot in its host ('URI:spiffe://foo/bar'), to test that a SAN wildcard pattern +# configured without a 'DNS:'/'URI:' prefix does NOT widen URI matching: a bare 'SAN *' must NOT +# match this URI certificate (the '/' separator rejects it, exactly as the original guard did). +openssl req -newkey rsa:4096 -nodes -batch -keyout client11-key.pem -out client11-req.pem -subj "/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=client11" +# A name with a '/' in the wildcard-matched span ('foo/bar.corp.example.com'), set as both the CN +# and a DNS SAN, to test that a DNS/CN wildcard does NOT match a span containing '/': the matched +# label must contain neither '.' nor '/', so '*.corp.example.com' must reject this. ('/' in the CN +# is escaped as '\/' because openssl uses '/' as the -subj field separator.) +openssl req -newkey rsa:4096 -nodes -batch -keyout client12-key.pem -out client12-req.pem -subj "/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=foo\/bar.corp.example.com" # 5. Use CA's private key to sign client's CSR and get back the signed certificate openssl x509 -req -days 3650 -in client1-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client1-cert.pem @@ -24,6 +46,12 @@ openssl x509 -req -days 3650 -in client3-req.pem -CA ca-cert.pem -CAkey ca-key.p openssl x509 -req -days 3650 -in client4-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile client4-ext.cnf -out client4-cert.pem openssl x509 -req -days 3650 -in client5-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile client5-ext.cnf -out client5-cert.pem openssl x509 -req -days 3650 -in client6-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile client6-ext.cnf -out client6-cert.pem +openssl x509 -req -days 3650 -in client7-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile client7-ext.cnf -out client7-cert.pem +openssl x509 -req -days 3650 -in client8-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile client8-ext.cnf -out client8-cert.pem +openssl x509 -req -days 3650 -in client9-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile client9-ext.cnf -out client9-cert.pem +openssl x509 -req -days 3650 -in client10-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile client10-ext.cnf -out client10-cert.pem +openssl x509 -req -days 3650 -in client11-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile client11-ext.cnf -out client11-cert.pem +openssl x509 -req -days 3650 -in client12-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile client12-ext.cnf -out client12-cert.pem # 6. Generate one more self-signed certificate and private key for using as wrong certificate (because it's not signed by CA) openssl req -newkey rsa:4096 -x509 -days 3650 -nodes -batch -keyout wrong-key.pem -out wrong-cert.pem -subj "/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=client" diff --git a/tests/integration/test_ssl_cert_authentication/configs/users_with_ssl_auth.xml b/tests/integration/test_ssl_cert_authentication/configs/users_with_ssl_auth.xml index b697c0101958..294a0a4bddc0 100644 --- a/tests/integration/test_ssl_cert_authentication/configs/users_with_ssl_auth.xml +++ b/tests/integration/test_ssl_cert_authentication/configs/users_with_ssl_auth.xml @@ -22,6 +22,31 @@ URI:spiffe://bar.com/foo/*/far + + + DNS:*.corp.example.com + + + + + *.corp.example.com + + + + + + * + + + + + + *.corp.example.com + + diff --git a/tests/integration/test_ssl_cert_authentication/test.py b/tests/integration/test_ssl_cert_authentication/test.py index 5568476cfade..216dd02f9629 100644 --- a/tests/integration/test_ssl_cert_authentication/test.py +++ b/tests/integration/test_ssl_cert_authentication/test.py @@ -416,3 +416,165 @@ def test_x509_san_wildcard_support(): ) instance.query("DROP USER brian") + + +def test_x509_dns_san_wildcard_single_label(): + # A '*' in a DNS SAN must match exactly one DNS label (RFC 6125 6.4.3). + # Positive: a single-label name under the wildcard authenticates, on both interfaces. + assert ( + execute_query_native( + instance, "SELECT currentUser()", user="wildcard_dns", cert_name="client7" + ) + == "wildcard_dns\n" + ) + assert ( + execute_query_https( + "SELECT currentUser()", user="wildcard_dns", cert_name="client7" + ) + == "wildcard_dns\n" + ) + # Negative (authentication bypass): a multi-label name must NOT match a single-label + # wildcard. 'evil.deep.corp.example.com' must be rejected by 'DNS:*.corp.example.com'. + with pytest.raises(Exception) as err: + execute_query_native( + instance, "SELECT currentUser()", user="wildcard_dns", cert_name="client8" + ) + assert "AUTHENTICATION_FAILED" in str(err.value) + with pytest.raises(Exception) as err: + execute_query_https( + "SELECT currentUser()", user="wildcard_dns", cert_name="client8" + ) + assert "403" in str(err.value) + # Negative (empty label): the '*' must match a NON-empty label, so the malformed name + # 'DNS:.corp.example.com' (empty first label) must be rejected by 'DNS:*.corp.example.com'. + with pytest.raises(Exception) as err: + execute_query_native( + instance, "SELECT currentUser()", user="wildcard_dns", cert_name="client10" + ) + assert "AUTHENTICATION_FAILED" in str(err.value) + with pytest.raises(Exception) as err: + execute_query_https( + "SELECT currentUser()", user="wildcard_dns", cert_name="client10" + ) + assert "403" in str(err.value) + # Negative (slash in span): a DNS label contains no '/', so the matched span must reject one. + # 'DNS:foo/bar.corp.example.com' must NOT match 'DNS:*.corp.example.com' (the old slash-count + # guard forbade this; the single-label rule must keep forbidding it). + with pytest.raises(Exception) as err: + execute_query_native( + instance, "SELECT currentUser()", user="wildcard_dns", cert_name="client12" + ) + assert "AUTHENTICATION_FAILED" in str(err.value) + with pytest.raises(Exception) as err: + execute_query_https( + "SELECT currentUser()", user="wildcard_dns", cert_name="client12" + ) + assert "403" in str(err.value) + + +def test_x509_cn_wildcard_single_label(): + # The same single-label rule applies to a wildcard in the certificate CN. + assert ( + execute_query_native( + instance, "SELECT currentUser()", user="wildcard_cn", cert_name="client7" + ) + == "wildcard_cn\n" + ) + assert ( + execute_query_https( + "SELECT currentUser()", user="wildcard_cn", cert_name="client7" + ) + == "wildcard_cn\n" + ) + with pytest.raises(Exception) as err: + execute_query_native( + instance, "SELECT currentUser()", user="wildcard_cn", cert_name="client8" + ) + assert "AUTHENTICATION_FAILED" in str(err.value) + with pytest.raises(Exception) as err: + execute_query_https( + "SELECT currentUser()", user="wildcard_cn", cert_name="client8" + ) + assert "403" in str(err.value) + # Negative (empty label): an empty CN label '.corp.example.com' must be rejected by the + # CN wildcard '*.corp.example.com'. + with pytest.raises(Exception) as err: + execute_query_native( + instance, "SELECT currentUser()", user="wildcard_cn", cert_name="client10" + ) + assert "AUTHENTICATION_FAILED" in str(err.value) + with pytest.raises(Exception) as err: + execute_query_https( + "SELECT currentUser()", user="wildcard_cn", cert_name="client10" + ) + assert "403" in str(err.value) + # Negative (slash in span): a CN label contains no '/', so 'foo/bar.corp.example.com' must NOT + # match the CN wildcard '*.corp.example.com' (the old slash-count guard forbade this). + with pytest.raises(Exception) as err: + execute_query_native( + instance, "SELECT currentUser()", user="wildcard_cn", cert_name="client12" + ) + assert "AUTHENTICATION_FAILED" in str(err.value) + with pytest.raises(Exception) as err: + execute_query_https( + "SELECT currentUser()", user="wildcard_cn", cert_name="client12" + ) + assert "403" in str(err.value) + + +def test_x509_uri_san_wildcard_dot_in_segment(): + # Non-regression: '.' separates labels for DNS/CN but is NOT a separator for URI SANs, + # whose separator is '/'. A wildcard URI path segment may legitimately contain dots, so + # 'URI:spiffe://bar.com/foo/baz.qux/far' must still match 'URI:spiffe://bar.com/foo/*/far'. + assert ( + execute_query_native( + instance, "SELECT currentUser()", user="stewie", cert_name="client9" + ) + == "stewie\n" + ) + + +def test_x509_unprefixed_san_wildcard_does_not_widen_uri(): + # A SAN wildcard configured without a recognized 'DNS:'/'URI:' prefix (here a bare 'SAN *') + # must NOT widen URI matching. The label separator '.' is used only for a CN or a 'DNS:' SAN; + # every other SAN keeps the '/' separator, whose "no '/' in the matched span" rule is identical + # to the original slash-count guard. So 'SAN *' must NOT match the URI certificate + # 'URI:spiffe://foo/bar' (client11), exactly as before this fix. Checked on both interfaces. + with pytest.raises(Exception) as err: + execute_query_native( + instance, + "SELECT currentUser()", + user="wildcard_san_unprefixed", + cert_name="client11", + ) + assert "AUTHENTICATION_FAILED" in str(err.value) + with pytest.raises(Exception) as err: + execute_query_https( + "SELECT currentUser()", user="wildcard_san_unprefixed", cert_name="client11" + ) + assert "403" in str(err.value) + + +def test_x509_unprefixed_san_wildcard_does_not_span_dns_labels(): + # A SAN wildcard configured without a recognized 'DNS:'/'URI:' prefix must match nothing. + # Certificate SAN subjects are always stored prefixed, so a bare 'SAN *.corp.example.com' + # would otherwise let '*' absorb the candidate's 'DNS:' prefix and span DNS labels: against + # 'DNS:evil.deep.corp.example.com' (client8) the matched span 'DNS:evil.deep' has no '/'. + # The unprefixed SAN pattern must be rejected, so neither a single-label (client7) nor a + # multi-label (client8) DNS certificate authenticates. Checked on both interfaces. + for cert in ("client7", "client8"): + with pytest.raises(Exception) as err: + execute_query_native( + instance, + "SELECT currentUser()", + user="wildcard_san_unprefixed_dns", + cert_name=cert, + ) + assert "AUTHENTICATION_FAILED" in str(err.value) + with pytest.raises(Exception) as err: + execute_query_https( + "SELECT currentUser()", + user="wildcard_san_unprefixed_dns", + cert_name=cert, + ) + assert "403" in str(err.value) diff --git a/tests/integration/test_storage_postgresql/test.py b/tests/integration/test_storage_postgresql/test.py index 39679997151e..87d7f410e111 100644 --- a/tests/integration/test_storage_postgresql/test.py +++ b/tests/integration/test_storage_postgresql/test.py @@ -892,6 +892,50 @@ def test_postgres_datetime(started_cluster): assert result == "2025-01-02 03:04:05.678900\n" + +def test_postgres_array_parser_dimension_underflow(started_cluster): + """Regression test for `size_t` underflow in the PostgreSQL array parser. + + When `pqxx::array_parser` emits `row_end` while the parser's `dimension` + counter is 0 (for example, an array text starting with `}`), the previous + code decremented `dimension` past 0 — a `size_t` underflow to `SIZE_MAX` — + and then indexed `dimensions[SIZE_MAX]`, which is out-of-bounds. The fix + throws a `BAD_ARGUMENTS` exception in this case instead. + + PostgreSQL itself validates array literals at INSERT time, so the bug is + unreachable via a column declared as `boolean[]`/`integer[]` on the + PostgreSQL side. The reproducer below stores the malformed payload in a + PostgreSQL `text` column and declares the same column as `Array(Int32)` on + the ClickHouse side via the `PostgreSQL` table engine. ClickHouse then + dispatches the raw `'}'` value through the `vtArray` branch of + `insertPostgreSQLValue`, which calls `pqxx::array_parser` on it and + reproduces the bug. + """ + cursor = started_cluster.postgres_conn.cursor() + cursor.execute("DROP TABLE IF EXISTS test_array_underflow") + cursor.execute( + "CREATE TABLE test_array_underflow (id integer, payload text)" + ) + cursor.execute("INSERT INTO test_array_underflow VALUES (1, '}')") + started_cluster.postgres_conn.commit() + + node1.query("DROP TABLE IF EXISTS pg_array_underflow") + node1.query( + f"CREATE TABLE pg_array_underflow (id Int32, payload Array(Int32)) " + f"ENGINE = PostgreSQL(" + f"'{started_cluster.postgres_ip}:{started_cluster.postgres_port}', " + f"'postgres', 'test_array_underflow', 'postgres', '{pg_pass}')" + ) + + error = node1.query_and_get_error("SELECT id, payload FROM pg_array_underflow") + assert "Unexpected array closing bracket" in error, ( + f"Expected BAD_ARGUMENTS('Unexpected array closing bracket'), got: {error}" + ) + + node1.query("DROP TABLE pg_array_underflow") + cursor.execute("DROP TABLE test_array_underflow") + + if __name__ == "__main__": cluster.start() input("Cluster created, press any key to destroy...") diff --git a/tests/queries/0_stateless/02843_backup_use_same_s3_credentials_for_base_backup.reference b/tests/queries/0_stateless/02843_backup_use_same_s3_credentials_for_base_backup.reference index f9ade26cd0c8..c03ff71b1835 100644 --- a/tests/queries/0_stateless/02843_backup_use_same_s3_credentials_for_base_backup.reference +++ b/tests/queries/0_stateless/02843_backup_use_same_s3_credentials_for_base_backup.reference @@ -10,8 +10,6 @@ The request signature we calculated does not match the signature you provided. C inc_4 BACKUP_CREATED restore inc_1 -The request signature we calculated does not match the signature you provided. Check your key and signing method. (S3_ERROR) -restore inc_1 RESTORED restore inc_2 RESTORED diff --git a/tests/queries/0_stateless/02843_backup_use_same_s3_credentials_for_base_backup.sh b/tests/queries/0_stateless/02843_backup_use_same_s3_credentials_for_base_backup.sh index f24f286852b9..007f7462d934 100755 --- a/tests/queries/0_stateless/02843_backup_use_same_s3_credentials_for_base_backup.sh +++ b/tests/queries/0_stateless/02843_backup_use_same_s3_credentials_for_base_backup.sh @@ -19,14 +19,6 @@ $CLICKHOUSE_CLIENT "${client_opts[@]}" -m -q " insert into data select * from numbers(10); " -function write_invalid_password_to_base_backup() -{ - local name=$1 && shift - local content - content=$($CLICKHOUSE_CLIENT "${client_opts[@]}" -q "select replace(line, 'testtest', 'INVALID_PASSWORD') from s3($(s3_location $name/.backup), 'LineAsString')") || return 1 - $CLICKHOUSE_CLIENT "${client_opts[@]}" --param_content="$content" -q "insert into function s3($(s3_location $name/.backup), 'LineAsString') settings s3_truncate_on_insert=1 values ({content:String})" -} - # Returns the arguments for the BACKUP TO S3() function, i.e. (url, access_key_id, secret_access_key) function s3_location() { echo "'http://localhost:11111/test/backups/$CLICKHOUSE_DATABASE/use_same_s3_credentials_for_base_backup_base_$*', 'test', 'testtest'"; } @@ -38,7 +30,6 @@ $CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location echo "inc_1" $CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location inc_1)) SETTINGS base_backup=S3($(s3_location base))" | cut -f2 -write_invalid_password_to_base_backup inc_1 echo "inc_2" $CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location inc_2)) SETTINGS base_backup=S3($(s3_location inc_1))" | cut -f2 @@ -48,8 +39,6 @@ $CLICKHOUSE_CLIENT "${client_opts[@]}" --format Null -q "BACKUP TABLE data TO S3 echo "inc_4" $CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location inc_4)) SETTINGS base_backup=S3($(s3_location_with_invalid_password inc_1)), use_same_s3_credentials_for_base_backup=1" | cut -f2 -echo "restore inc_1" -$CLICKHOUSE_CLIENT "${client_opts[@]}" --format Null -q "RESTORE TABLE data AS data FROM S3($(s3_location inc_1))" |& grep -m1 -o 'The request signature we calculated does not match the signature you provided. Check your key and signing method. (S3_ERROR)' echo "restore inc_1" $CLICKHOUSE_CLIENT "${client_opts[@]}" -q "RESTORE TABLE data AS data_1 FROM S3($(s3_location inc_1)) SETTINGS use_same_s3_credentials_for_base_backup=1" | cut -f2 echo "restore inc_2" diff --git a/tests/queries/0_stateless/03406_reservoir_sample_self_merging.reference b/tests/queries/0_stateless/03406_reservoir_sample_self_merging.reference index 15e0c9417a7c..1538e93e2abf 100644 --- a/tests/queries/0_stateless/03406_reservoir_sample_self_merging.reference +++ b/tests/queries/0_stateless/03406_reservoir_sample_self_merging.reference @@ -1,3 +1,3 @@ 4.5 -499.5 +495 50501.5 diff --git a/tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.reference b/tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.reference new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.sql b/tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.sql new file mode 100644 index 000000000000..c125347f7e99 --- /dev/null +++ b/tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.sql @@ -0,0 +1,209 @@ + +SET max_query_size=1000000000; + +SELECT + quantileTimingMerge(qt), + sumMapMerge(sm) +FROM +( + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm +) +SETTINGS max_threads = 1 -- { serverError INCORRECT_DATA }; \ No newline at end of file diff --git a/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.reference b/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.reference new file mode 100644 index 000000000000..386d4703f69d --- /dev/null +++ b/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.reference @@ -0,0 +1,2 @@ +Android +Android diff --git a/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.sql b/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.sql new file mode 100644 index 000000000000..60c829843ab5 --- /dev/null +++ b/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.sql @@ -0,0 +1,40 @@ +-- Regression test: dictGetOrDefault with nullable key and short-circuit evaluation +-- caused UBSan error (member call on null pointer) in the `if` function because +-- restoreShortCircuitColumn passed a non-nullable column with a Nullable type to `if`. + +DROP TABLE IF EXISTS regexp_dictionary_source_table; +CREATE TABLE regexp_dictionary_source_table +( + id UInt64, + parent_id UInt64, + regexp String, + keys Array(String), + values Array(String), +) ENGINE=TinyLog; + +INSERT INTO regexp_dictionary_source_table VALUES (1, 0, 'Linux/(\d+[\.\d]*).+tlinux', ['name', 'version'], ['TencentOS', '\1']); +INSERT INTO regexp_dictionary_source_table VALUES (2, 0, '(\d+)/tclwebkit(\d+[\.\d]*)', ['name', 'version', 'comment'], ['Android', '$1', 'test $1 and $2']); +INSERT INTO regexp_dictionary_source_table VALUES (3, 2, '33/tclwebkit', ['version'], ['13']); +INSERT INTO regexp_dictionary_source_table VALUES (4, 2, '3[12]/tclwebkit', ['version'], ['12']); +INSERT INTO regexp_dictionary_source_table VALUES (5, 2, '3[12]/tclwebkit', ['version'], ['11']); +INSERT INTO regexp_dictionary_source_table VALUES (6, 2, '3[12]/tclwebkit', ['version'], ['10']); + +DROP DICTIONARY IF EXISTS regexp_dict; +CREATE DICTIONARY regexp_dict +( + regexp String, + name String, + version Nullable(UInt64), + comment String default 'nothing' +) +PRIMARY KEY(regexp) +SOURCE(CLICKHOUSE(TABLE 'regexp_dictionary_source_table')) +LIFETIME(0) +LAYOUT(regexp_tree); + +-- The toNullable makes the key nullable, which triggers a different code path +-- where result_type is Nullable but the dictionary column is not. +SELECT dictGetOrDefault('regexp_dict', 'name', concat(toString(number), toNullable('/tclwebkit'), toString(number)), intDiv(1, number)) FROM numbers(2); + +DROP DICTIONARY regexp_dict; +DROP TABLE regexp_dictionary_source_table; diff --git a/tests/queries/0_stateless/04055_http_header_crlf_injection.reference b/tests/queries/0_stateless/04055_http_header_crlf_injection.reference new file mode 100644 index 000000000000..3798e8f2fbea --- /dev/null +++ b/tests/queries/0_stateless/04055_http_header_crlf_injection.reference @@ -0,0 +1,5 @@ +--- CRLF in query_id via URL parameter --- +injectLocation: evil.com +no injected headers +--- Normal query_id --- +normal_test_id_04055 diff --git a/tests/queries/0_stateless/04055_http_header_crlf_injection.sh b/tests/queries/0_stateless/04055_http_header_crlf_injection.sh new file mode 100755 index 000000000000..5bc2cdcd1caa --- /dev/null +++ b/tests/queries/0_stateless/04055_http_header_crlf_injection.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# Verify that CRLF characters in user-supplied HTTP parameters (like query_id) +# cannot be used to inject additional HTTP response headers. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +extract_query_id() { + grep '< X-ClickHouse-Query-Id:' | sed 's/\r$//' | sed 's/^< X-ClickHouse-Query-Id: //' +} + +count_injected_headers() { + grep -F -ci "< $1:" | sed 's/^0$/no injected headers/' | sed '/^[1-9]/s/.*/FAIL: injected header detected/' +} + +echo "--- CRLF in query_id via URL parameter ---" +RESPONSE=$(${CLICKHOUSE_CURL} -sS --globoff -v "${CLICKHOUSE_URL}&query=SELECT+1&query_id=inject%0d%0aLocation:%20evil.com" 2>&1) +echo "$RESPONSE" | extract_query_id +echo "$RESPONSE" | count_injected_headers Location + +echo "--- Normal query_id ---" +${CLICKHOUSE_CURL} -sS --globoff -v "${CLICKHOUSE_URL}&query=SELECT+1&query_id=normal_test_id_04055" 2>&1 \ + | extract_query_id diff --git a/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.reference b/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.reference new file mode 100644 index 000000000000..607043c71a00 --- /dev/null +++ b/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.reference @@ -0,0 +1,2 @@ +first ['a','b'] ('hello',42) {'x':1,'y':2} v2 +first ['a','b'] ('hello',42) {'x':1,'y':2} v2 diff --git a/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.sql b/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.sql new file mode 100644 index 000000000000..edb3398a0b87 --- /dev/null +++ b/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.sql @@ -0,0 +1,29 @@ +DROP TABLE IF EXISTS 04060_test; + +CREATE TABLE 04060_test +( + key String, + str_col String, + arr_col Array(String), + tuple_col Tuple(x String, y UInt32), + map_col Map(String, UInt32), + update_column Nullable(String) +) +ENGINE = CoalescingMergeTree(update_column) +ORDER BY key; + +INSERT INTO 04060_test (key, str_col, arr_col, tuple_col, map_col) +VALUES ('k', 'first', ['a', 'b'], ('hello', 42), {'x': 1, 'y': 2}); + +INSERT INTO 04060_test (key, update_column) +VALUES ('k', 'v2'); + +SELECT str_col, arr_col, tuple_col, map_col, update_column +FROM 04060_test FINAL; + +OPTIMIZE TABLE 04060_test FINAL; + +SELECT str_col, arr_col, tuple_col, map_col, update_column +FROM 04060_test; + +DROP TABLE 04060_test; diff --git a/tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.reference b/tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.reference new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.sh b/tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.sh new file mode 100755 index 000000000000..d06e6ec65418 --- /dev/null +++ b/tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Tags: no-fasttest, long + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +# Use a pre-generated deeply nested Avro file (2000 levels of nested arrays) +# that would cause stack overflow without proper recursion depth checks. +AVRO_FILE="${CURDIR}/data_avro/deeply_nested_schema.avro" + +# Should not crash (SIGSEGV). May succeed or fail with TOO_DEEP_RECURSION depending on build type. +${CLICKHOUSE_LOCAL} -q "SELECT * FROM file('${AVRO_FILE}', 'Avro') FORMAT Null" > /dev/null 2>&1 +[ $? -lt 128 ] || echo "CRASHED" + +${CLICKHOUSE_LOCAL} -q "DESC file('${AVRO_FILE}', 'Avro')" > /dev/null 2>&1 +[ $? -lt 128 ] || echo "CRASHED" diff --git a/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference b/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference new file mode 100644 index 000000000000..ac70543519a7 --- /dev/null +++ b/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference @@ -0,0 +1,22 @@ +no_row_policy + (Limit) + Limit + (ReadFromMergeTree) + Concat 4 → 1 + MergeTreeSelect(pool: ReadPoolInOrder, algorithm: InOrder) × 4 0 → 1 +row_policy + (Limit) + Limit 4 → 4 + (ReadFromMergeTree) + MergeTreeSelect(pool: ReadPool, algorithm: Thread) × 4 0 → 1 +row_policy_always_true + (Limit) + Limit + (ReadFromMergeTree) + Concat 4 → 1 + MergeTreeSelect(pool: ReadPoolInOrder, algorithm: InOrder) × 4 0 → 1 +additional_filter + (Limit) + Limit 4 → 4 + (ReadFromMergeTree) + MergeTreeSelect(pool: ReadPool, algorithm: Thread) × 4 0 → 1 diff --git a/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.sql b/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.sql new file mode 100644 index 000000000000..1e139e4d9202 --- /dev/null +++ b/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.sql @@ -0,0 +1,65 @@ +-- Tags: no-parallel-replicas, no-object-storage +-- -no-parallel-replicas - PR changes the EXPLAIN output +-- -no-object-storage - parts on remote FS use MergeTreeSelect(pool: ReadPool) over MergeTreeSelect(pool: ReadPoolInOrder) + +-- The trivial LIMIT optimization reduces max_streams to 1 for simple +-- SELECT ... LIMIT N queries without WHERE. When row policies or +-- additional table filters are active the optimization must not fire +-- because the filter still needs multi-threaded index analysis. + +SET merge_tree_read_split_ranges_into_intersecting_and_non_intersecting_injection_probability=0; + +DROP TABLE IF EXISTS t_row_policy_limit; +CREATE TABLE t_row_policy_limit (id UInt64) ENGINE = MergeTree ORDER BY id +SETTINGS index_granularity = 128; + +SYSTEM STOP MERGES t_row_policy_limit; + +-- Create enough parts so multiple streams are meaningful. +INSERT INTO t_row_policy_limit SELECT number FROM numbers(1000) SETTINGS insert_deduplicate=1; +INSERT INTO t_row_policy_limit SELECT number FROM numbers(1000) SETTINGS insert_deduplicate=1; +INSERT INTO t_row_policy_limit SELECT number FROM numbers(1000) SETTINGS insert_deduplicate=1; +INSERT INTO t_row_policy_limit SELECT number FROM numbers(1000) SETTINGS insert_deduplicate=1; + +SET enable_analyzer = 1; + +-- Case 0: no row policies +SELECT 'no_row_policy'; +SELECT * +FROM (EXPLAIN PIPELINE SELECT id FROM t_row_policy_limit LIMIT 1 + SETTINGS max_threads = 4) +WHERE explain LIKE '%Limit%' OR explain LIKE '%Concat%' OR explain LIKE '%ReadFromMergeTree%' OR explain LIKE '%MergeTreeSelect%'; + +-- Case 1: row policy prevents trivial-limit, keeps multiple streams. +DROP ROW POLICY IF EXISTS 04099_p1 ON t_row_policy_limit; +CREATE ROW POLICY 04099_p1 ON t_row_policy_limit USING id < 500 AS permissive TO ALL; + +SELECT 'row_policy'; +SELECT * +FROM (EXPLAIN PIPELINE SELECT id FROM t_row_policy_limit LIMIT 1 + SETTINGS max_threads = 4) +WHERE explain LIKE '%Limit%' OR explain LIKE '%Concat%' OR explain LIKE '%ReadFromMergeTree%' OR explain LIKE '%MergeTreeSelect%'; +DROP ROW POLICY 04099_p1 ON t_row_policy_limit; + +-- Case 2: always-true row policy adds no effective predicate, so the +-- trivial-limit optimization must still fire (max_streams = 1). +DROP ROW POLICY IF EXISTS 04099_p_true ON t_row_policy_limit; +CREATE ROW POLICY 04099_p_true ON t_row_policy_limit USING 1 AS permissive TO ALL; + +SELECT 'row_policy_always_true'; +SELECT * +FROM (EXPLAIN PIPELINE SELECT id FROM t_row_policy_limit LIMIT 1 + SETTINGS max_threads = 4) +WHERE explain LIKE '%Limit%' OR explain LIKE '%Concat%' OR explain LIKE '%ReadFromMergeTree%' OR explain LIKE '%MergeTreeSelect%'; + +DROP ROW POLICY 04099_p_true ON t_row_policy_limit; + +-- Case 3: additional_table_filters prevents trivial-limit. +SELECT 'additional_filter'; +SELECT * +FROM (EXPLAIN PIPELINE SELECT id FROM t_row_policy_limit LIMIT 1 + SETTINGS max_threads = 4, + additional_table_filters = {'t_row_policy_limit': 'id < 500'}) +WHERE explain LIKE '%Limit%' OR explain LIKE '%Concat%' OR explain LIKE '%ReadFromMergeTree%' OR explain LIKE '%MergeTreeSelect%'; + +DROP TABLE t_row_policy_limit; diff --git a/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.reference b/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.reference new file mode 100644 index 000000000000..f10182ea5bce --- /dev/null +++ b/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.reference @@ -0,0 +1,4 @@ +=== Plain INSERT without MVs === +FEW THREADS +=== Plain INSERT with MV === +MORE THAN 1 THREAD diff --git a/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.sh b/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.sh new file mode 100755 index 000000000000..6f3c71bd9bff --- /dev/null +++ b/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +# Tags: no-parallel, no-replicated-database, no-async-insert, no-parallel-replicas, no-s3-storage +# no-parallel: checks thread count, which can be affected by concurrent queries +# no-replicated-database: query_log lookup assumes single-node execution +# no-async-insert: test measures synchronous INSERT pipeline threading +# no-parallel-replicas: parallel replicas settings alter query execution plans and thread allocation +# no-s3-storage: S3 I/O threads inflate peak_threads_usage beyond the pipeline thread count + +# Verifies that a plain INSERT (no SELECT, no MVs) does not request +# excessive ConcurrencyControl slots or spawn unnecessary threads. +# Regression test for https://github.com/ClickHouse/ClickHouse/issues/102947 + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +$CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS test_insert_threads" +$CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS test_insert_threads_mv" +$CLICKHOUSE_CLIENT -q "CREATE TABLE test_insert_threads (x UInt64) ENGINE = MergeTree ORDER BY x" + +# Test 1: Plain INSERT FORMAT TSV with max_threads=16, no MVs. +# The insert pipeline is a single chain — should use max_insert_threads (1). +echo "=== Plain INSERT without MVs ===" +QUERY_ID1="04102_no_mv_$RANDOM" + +$CLICKHOUSE_CLIENT -q "SELECT number FROM numbers(10000) FORMAT TSV" | \ +$CLICKHOUSE_CLIENT \ + --query_id="$QUERY_ID1" \ + --max_threads=16 \ + --max_insert_threads=1 \ + --input_format_parallel_parsing=0 \ + --log_queries=1 \ + -q "INSERT INTO test_insert_threads FORMAT TSV" + +$CLICKHOUSE_CLIENT -q "SYSTEM FLUSH LOGS query_log" + +$CLICKHOUSE_CLIENT -q " + SELECT + if(peak_threads_usage <= 4, 'FEW THREADS', 'MANY THREADS SPAWNED') + FROM system.query_log + WHERE event_date >= yesterday() + AND event_time >= now() - 600 + AND current_database = currentDatabase() + AND type = 'QueryFinish' + AND query_id = '$QUERY_ID1' + SETTINGS optimize_if_transform_strings_to_enum = 0 +" + +# Test 2: INSERT with a materialized view — should use more threads. +echo "=== Plain INSERT with MV ===" +$CLICKHOUSE_CLIENT -q "CREATE MATERIALIZED VIEW test_insert_threads_mv ENGINE = MergeTree ORDER BY x AS SELECT x FROM test_insert_threads" + +QUERY_ID2="04102_with_mv_$RANDOM" + +$CLICKHOUSE_CLIENT -q "SELECT number FROM numbers(10000) FORMAT TSV" | \ +$CLICKHOUSE_CLIENT \ + --query_id="$QUERY_ID2" \ + --max_threads=16 \ + --max_insert_threads=1 \ + --input_format_parallel_parsing=0 \ + --log_queries=1 \ + -q "INSERT INTO test_insert_threads FORMAT TSV" + +$CLICKHOUSE_CLIENT -q "SYSTEM FLUSH LOGS query_log" + +# With MVs, peak_threads should be higher than without MVs +$CLICKHOUSE_CLIENT -q " + SELECT + if(peak_threads_usage > 1, 'MORE THAN 1 THREAD', 'SINGLE THREAD') + FROM system.query_log + WHERE event_date >= yesterday() + AND event_time >= now() - 600 + AND current_database = currentDatabase() + AND type = 'QueryFinish' + AND query_id = '$QUERY_ID2' + SETTINGS optimize_if_transform_strings_to_enum = 0 +" + +$CLICKHOUSE_CLIENT -q "DROP TABLE test_insert_threads_mv" +$CLICKHOUSE_CLIENT -q "DROP TABLE test_insert_threads" diff --git a/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.reference b/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.reference new file mode 100644 index 000000000000..cb68ed1c2e92 --- /dev/null +++ b/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.reference @@ -0,0 +1,13 @@ +50 +100 +200 +400 +800 +12800 +150 +250 +350 +1 +200 +200 +4900 diff --git a/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.sql b/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.sql new file mode 100644 index 000000000000..49996f0db012 --- /dev/null +++ b/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.sql @@ -0,0 +1,47 @@ +-- Tags: no-fasttest +-- ^ The reproducer needs Address Sanitizer / Memory Sanitizer to surface the +-- bug; release builds happen to read freed memory without aborting, so a +-- fast-test-only run would be silent. + +-- Regression test for STID 0988-40af: heap-use-after-free in +-- FunctionBinaryArithmetic::executeAggregateMultiply, triggered when the +-- exponentiation-by-squaring loop calls func->merge(state, state) on an +-- aggregate function whose merge implementation appends the source's internal +-- storage into the destination's. With src == dst, the source iterators are +-- invalidated by the destination's reallocation, producing a heap-use-after- +-- free. The fix copies the state to an independent column before each +-- squaring step. + +-- groupArrayState's merge appends rhs.value to lhs.value (a PODArray). With +-- src == dst the source iterator points to a buffer that is reallocated mid- +-- merge, which deterministically reproduces the heap-use-after-free under +-- Address Sanitizer. The result length grows linearly with the multiplier: +SELECT length(finalizeAggregation(state * 1)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 2)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 4)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 8)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 16)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 256)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); + +-- Pure-odd and mixed multipliers still exercise the squaring branch (e.g. +-- 7 = 4 + 2 + 1 squares twice). +SELECT length(finalizeAggregation(state * 3)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 5)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 7)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); + +-- quantilesExactState is the variant the production fuzzer caught (its +-- internal PODArray is what the original sanitizer +-- report flagged). The aggregate result is a fixed-length quantiles array, +-- but the squaring path still allocates / merges the underlying buffer the +-- same way. +SELECT length(finalizeAggregation(state * 8)) FROM (SELECT quantilesExactState(0.5)(number) AS state FROM numbers(50)); + +-- Constant column path: a single state value replicated across multiple +-- rows. agg_state_is_const takes the size=1 branch in executeAggregateMultiply. +SELECT length(finalizeAggregation(arrayJoin([state, state]) * 4)) +FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); + +-- Numerical correctness: multiplying the state by N should produce N*size +-- elements; sum-aggregating them gives N * sum([0..49]) = N * 1225. +SELECT sum(arrayJoin(finalizeAggregation(state * 4))) +FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); diff --git a/tests/queries/0_stateless/04143_ub_parsing_datetime.reference b/tests/queries/0_stateless/04143_ub_parsing_datetime.reference new file mode 100644 index 000000000000..dec7d2fabd2e --- /dev/null +++ b/tests/queries/0_stateless/04143_ub_parsing_datetime.reference @@ -0,0 +1 @@ +\N diff --git a/tests/queries/0_stateless/04143_ub_parsing_datetime.sql b/tests/queries/0_stateless/04143_ub_parsing_datetime.sql new file mode 100644 index 000000000000..100ef25a02c2 --- /dev/null +++ b/tests/queries/0_stateless/04143_ub_parsing_datetime.sql @@ -0,0 +1 @@ +SELECT parseDateTime64BestEffortOrNull('1970-01-01 00:00:00.99999999999999999.999999999999', 9); diff --git a/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference new file mode 100644 index 000000000000..fa01aac09eb3 --- /dev/null +++ b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference @@ -0,0 +1,11 @@ +baseline + (ReadFromPreparedSource) + SourceFromSingleChunk 0 → 1 +filtered_this_table + (Filter) + FilterTransform + (ReadFromMergeTree) + MergeTreeSelect(pool: ReadPoolInOrder, algorithm: InOrder) 0 → 1 +filter_other_table + (ReadFromPreparedSource) + SourceFromSingleChunk 0 → 1 diff --git a/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.sql b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.sql new file mode 100644 index 000000000000..19ad0ed66c28 --- /dev/null +++ b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.sql @@ -0,0 +1,55 @@ +-- Tags: no-object-storage +-- no-object-storage since the output of the pipeline depends on the read method. + +-- Verify that the trivial-count optimization correctly handles +-- `additional_table_filters`: +-- - DISABLED when the setting targets THIS table. +-- - STILL FIRES when the setting targets a different table only +-- (previously the pessimistic outer guard disabled the optimization +-- whenever any entry was present, regardless of the table). +-- +-- The fix moved `parseAdditionalFilterAstIfNeeded` earlier in +-- PlannerJoinTree so `applyTrivialCountIfPossible` sees the +-- already-matched per-table AST. +-- +-- Trivial-count signature in the pipeline: +-- (ReadFromPreparedSource) / SourceFromSingleChunk -> fired +-- (ReadFromMergeTree) / MergeTreeSelect -> did not fire + +DROP TABLE IF EXISTS t_trivial_count_filter; +CREATE TABLE t_trivial_count_filter (id UInt64) ENGINE = MergeTree ORDER BY id; +INSERT INTO t_trivial_count_filter SELECT number FROM numbers(100); + +SET enable_analyzer = 1; +SET optimize_trivial_count_query = 1; +SET max_threads = 1; +SET optimize_use_implicit_projections = 0; +SET optimize_use_projections = 0; + +-- Baseline: no filter at all, trivial-count fires. +SELECT 'baseline'; +SELECT explain FROM (EXPLAIN PIPELINE SELECT count() FROM t_trivial_count_filter) +WHERE explain LIKE '%ReadFromPreparedSource%' OR explain LIKE '%ReadFromMergeTree%' + OR explain LIKE '%SourceFromSingleChunk%' OR explain LIKE '%MergeTreeSelect%' + OR explain LIKE '%Resize%' OR explain LIKE '%Filter%' +; + +-- Filter targets THIS table: trivial-count is disabled. +SELECT 'filtered_this_table'; +SELECT explain FROM (EXPLAIN PIPELINE SELECT count() FROM t_trivial_count_filter) +WHERE explain LIKE '%ReadFromPreparedSource%' OR explain LIKE '%ReadFromMergeTree%' + OR explain LIKE '%SourceFromSingleChunk%' OR explain LIKE '%MergeTreeSelect%' + OR explain LIKE '%Resize%' OR explain LIKE '%Filter%' +SETTINGS additional_table_filters = {'t_trivial_count_filter': 'id < 5'}; + +-- Filter targets a DIFFERENT table only: trivial-count must still fire. +-- Without the fix the optimization was disabled whenever any +-- additional_table_filters entry was present. +SELECT 'filter_other_table'; +SELECT explain FROM (EXPLAIN PIPELINE SELECT count() FROM t_trivial_count_filter) +WHERE explain LIKE '%ReadFromPreparedSource%' OR explain LIKE '%ReadFromMergeTree%' + OR explain LIKE '%SourceFromSingleChunk%' OR explain LIKE '%MergeTreeSelect%' + OR explain LIKE '%Resize%' OR explain LIKE '%Filter%' +SETTINGS additional_table_filters = {'some_other_table': 'id < 5'}; + +DROP TABLE t_trivial_count_filter; diff --git a/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.reference b/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.reference new file mode 100644 index 000000000000..0c8995e09979 --- /dev/null +++ b/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.reference @@ -0,0 +1,2 @@ +:: 50 +::ffff:104.30.2.197 50 diff --git a/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.sql b/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.sql new file mode 100644 index 000000000000..7b37931f50b3 --- /dev/null +++ b/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.sql @@ -0,0 +1,6 @@ +-- Verify that IPv6StringToNumOrDefault properly zeroes all 16 bytes on failure. +-- Bug: only one byte was zeroed (vec_res[i] = 0 instead of filling all 16 bytes), +-- causing stale parse data to leak into "default" results. +-- https://github.com/ClickHouse/ClickHouse/pull/93543 + +SELECT IPv6NumToString(IPv6StringToNumOrDefault(if(number % 2 = 0, '::ffff:104.30.2.197', 'invalid'))) AS ip, count() AS c FROM numbers(100) GROUP BY ip ORDER BY ip; diff --git a/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.reference b/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.reference new file mode 100644 index 000000000000..0cfbf08886fc --- /dev/null +++ b/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.reference @@ -0,0 +1 @@ +2 diff --git a/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.sql b/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.sql new file mode 100644 index 000000000000..2699e89a725e --- /dev/null +++ b/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.sql @@ -0,0 +1,45 @@ +-- Tags: no-parallel +-- Uses a global one-shot failpoint in `ReplicatedMergeTreeSink::commitPart`. + +SYSTEM DISABLE FAILPOINT replicated_merge_tree_restore_attach_retry; + +DROP TABLE IF EXISTS src_04218 SYNC; +DROP TABLE IF EXISTS dst_04218_fail SYNC; +DROP TABLE IF EXISTS dst_04218_ok SYNC; + +CREATE TABLE src_04218 (x UInt64) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/04218_restore_retries/src', 'r1') +ORDER BY x; + +INSERT INTO src_04218 VALUES (1), (2); + +BACKUP TABLE src_04218 TO Memory('04218_restore_retries') FORMAT Null; + +CREATE TABLE dst_04218_fail (x UInt64) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/04218_restore_retries/dst_fail', 'r1') +ORDER BY x; + +SYSTEM ENABLE FAILPOINT replicated_merge_tree_restore_attach_retry; + +RESTORE TABLE src_04218 AS dst_04218_fail FROM Memory('04218_restore_retries') +SETTINGS allow_different_table_def = 1, backup_restore_keeper_max_retries = 0; -- { serverError TABLE_IS_READ_ONLY } + +DROP TABLE dst_04218_fail SYNC; + +CREATE TABLE dst_04218_ok (x UInt64) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/04218_restore_retries/dst_ok', 'r1') +ORDER BY x; + +SYSTEM ENABLE FAILPOINT replicated_merge_tree_restore_attach_retry; + +RESTORE TABLE src_04218 AS dst_04218_ok FROM Memory('04218_restore_retries') +SETTINGS allow_different_table_def = 1, + backup_restore_keeper_max_retries = 1, + backup_restore_keeper_retry_initial_backoff_ms = 1, + backup_restore_keeper_retry_max_backoff_ms = 1 +FORMAT Null; + +SELECT count() FROM dst_04218_ok; + +DROP TABLE src_04218 SYNC; +DROP TABLE dst_04218_ok SYNC; diff --git a/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.reference b/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.reference new file mode 100644 index 000000000000..20740609668d --- /dev/null +++ b/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.reference @@ -0,0 +1,11 @@ +50 +100 +150 +200 +400 +800 +200 +200 +200 +200 +200 diff --git a/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.sql b/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.sql new file mode 100644 index 000000000000..a59b7f6a4a21 --- /dev/null +++ b/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.sql @@ -0,0 +1,48 @@ +-- Tags: no-fasttest +-- ^ The reproducer surfaces as a `Segmentation fault` / `use-after-poison` +-- on AddressSanitizer / MemorySanitizer builds, and as a PODArray +-- `insertPrepare` assertion (`assertNotIntersects`) on Debug builds. +-- On Release builds the corruption can be silent, so the no-fasttest tag +-- restricts the test to builds where the regression is observable. + +-- Regression test for STID 0988-2212: `Segmentation fault` inside +-- `DB::MovingImpl::merge` (`AggregateFunctionGroupArrayMoving`) reached via +-- `FunctionBinaryArithmetic::executeAggregateMultiply` during +-- the analyzer dry-run. Same bug class as STID 0988-40af / 0988-3351 — the +-- exponentiation-by-squaring loop in `executeAggregateMultiply` invoked +-- `function->merge(state, state)`, aliasing the source and destination +-- aggregate state. `MovingImpl::merge` then called +-- `cur_elems.value.insert(rhs_elems.value.begin(), rhs_elems.value.end(), arena)` +-- where `rhs_elems` referenced the same `PODArray` as `cur_elems.value`, so +-- the source iterators pointed into the buffer that `insertPrepare` was +-- about to reallocate. The fix removes the self-alias at the call site by +-- copying `vec_from` into an independent column before each squaring step. + +-- Length grows linearly with the multiplier: each squaring concatenates the +-- backing prefix-sum array. For 50 input rows, `state * N` materialises +-- `N * 50` prefix sums. +SELECT length(finalizeAggregation(state * 1)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 2)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 3)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 4)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 8)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 16)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); + +-- groupArrayMovingAvg exercises the same `MovingImpl::merge` code path with +-- a different `Data::Accumulator` (Float64 / Decimal). +SELECT length(finalizeAggregation(state * 4)) FROM (SELECT groupArrayMovingAvgState(number) AS state FROM numbers(50)); + +-- Decimal accumulator path: `MovingImpl<..., MovingSumData>>::merge` +-- — the variant caught on PR #101062 (STID 0988-2212 on amd_debug). The +-- squaring branch exercises the same self-alias hazard. +SELECT length(finalizeAggregation(state * 4)) FROM (SELECT groupArrayMovingSumState(toDecimal64(number, 2)) AS state FROM numbers(50)); + +-- Windowed variant `groupArrayMovingSum(window_size)`: parameterised template +-- (`LimitNumElements::value = true`) exercises the same merge path, with a +-- different `MovingImpl` instantiation. +SELECT length(finalizeAggregation(state * 4)) FROM (SELECT groupArrayMovingSumState(5)(number) AS state FROM numbers(50)); + +-- Constant column path: `executeAggregateMultiply` takes the `size = 1` +-- branch through `agg_state_is_const` and produces a `ColumnConst`. +SELECT length(finalizeAggregation(arrayJoin([state, state]) * 4)) +FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); diff --git a/tests/queries/0_stateless/04259_arrow_corrupted_offsets.reference b/tests/queries/0_stateless/04259_arrow_corrupted_offsets.reference new file mode 100644 index 000000000000..530e25cd51cd --- /dev/null +++ b/tests/queries/0_stateless/04259_arrow_corrupted_offsets.reference @@ -0,0 +1,4 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +3 3 diff --git a/tests/queries/0_stateless/04259_arrow_corrupted_offsets.sh b/tests/queries/0_stateless/04259_arrow_corrupted_offsets.sh new file mode 100755 index 000000000000..9f82bf5fc5e7 --- /dev/null +++ b/tests/queries/0_stateless/04259_arrow_corrupted_offsets.sh @@ -0,0 +1,139 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression test for heap-buffer-overflow in readColumnWithStringData when an +# Arrow file carries corrupted intermediate offsets that make individual +# value_length(i) much larger than the actual values buffer. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +DATA_FILE="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}.arrow" +DATA_FILE_STREAM="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}_stream.arrow" +DATA_FILE_NULLABLE="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}_nullable.arrow" +trap 'rm -f "$DATA_FILE" "$DATA_FILE_STREAM" "$DATA_FILE_NULLABLE"' EXIT + +# Build a well-formed Arrow file with 4 binary rows of 10 bytes each, +# then corrupt offset[1] from 10 to 0x40000000 (1 GiB). +# A vulnerable build would attempt a 1 GiB memcpy into a ~40-byte heap buffer; +# the fixed build must reject the file with INCORRECT_DATA. +python3 - "$DATA_FILE" <<'EOF' +import struct +import sys +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +arr = pa.array([b'A' * 10, b'B' * 10, b'C' * 10, b'D' * 10], type=pa.binary()) +tbl = pa.Table.from_arrays([arr], names=['x']) +with pa.OSFile(path, 'wb') as f: + w = ipc.new_file(f, tbl.schema) + w.write_table(tbl) + w.close() + +# Patch offsets [0, 10, 20, 30, 40] -> [0, 0x40000000, 20, 30, 40]. +# value_length(0) = offset[1] - offset[0] = 1 GiB; the last entry is unchanged +# so the pre-flight reserve stays small, triggering a write overflow on the old code. +data = bytearray(open(path, 'rb').read()) +needle = struct.pack('= 0, "could not locate offsets array" +data[idx + 4 : idx + 8] = struct.pack('&1 \ + | grep -oF 'INCORRECT_DATA' || echo 'FAIL: expected INCORRECT_DATA' + +# Same payload via ArrowStream format. +python3 - "$DATA_FILE_STREAM" <<'EOF' +import struct +import sys +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +arr = pa.array([b'A' * 10, b'B' * 10, b'C' * 10, b'D' * 10], type=pa.binary()) +tbl = pa.Table.from_arrays([arr], names=['x']) +with pa.OSFile(path, 'wb') as f: + w = ipc.new_stream(f, tbl.schema) + w.write_table(tbl) + w.close() + +data = bytearray(open(path, 'rb').read()) +needle = struct.pack('= 0, "could not locate offsets array" +data[idx + 4 : idx + 8] = struct.pack('&1 \ + | grep -oF 'INCORRECT_DATA' || echo 'FAIL: expected INCORRECT_DATA' + +# Nullable column: corrupt the last offset on a non-null row so its value_length +# becomes 1 GiB. The pre-flight must validate non-null rows in the nullable path. +python3 - "$DATA_FILE_NULLABLE" <<'EOF' +import struct +import sys +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +# 3 rows: non-null / null / non-null. Well-formed offsets: [0, 10, 10, 20]. +arr = pa.array([b'A' * 10, None, b'C' * 10], type=pa.binary()) +tbl = pa.Table.from_arrays([arr], names=['x']) +with pa.OSFile(path, 'wb') as f: + w = ipc.new_file(f, tbl.schema) + w.write_table(tbl) + w.close() + +# Corrupt offsets[3]: 20 -> 0x40000000. +# Row 2 (non-null): value_offset = offsets[2] = 10, value_length = 0x40000000 - 10 = 1 GiB. +# Pre-flight must reject this with INCORRECT_DATA. +data = bytearray(open(path, 'rb').read()) +needle = struct.pack('= 0, "could not locate offsets array" +data[idx + 12 : idx + 16] = struct.pack('&1 \ + | grep -oF 'INCORRECT_DATA' || echo 'FAIL: expected INCORRECT_DATA' + +# Write loop path: non-null empty strings with absent values buffer (IPC body offset=-1). +# This exercises the null_count==0 write path when buffer->data() may be null. +# The fixed build must read all rows as empty strings without crashing. +DATA_FILE_EMPTY="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}_empty.arrow" +trap 'rm -f "$DATA_FILE" "$DATA_FILE_STREAM" "$DATA_FILE_NULLABLE" "$DATA_FILE_EMPTY"' EXIT +python3 - "$DATA_FILE_EMPTY" <<'EOF' +import struct +import sys +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +arr = pa.array([b'', b'', b''], type=pa.binary()) +tbl = pa.Table.from_arrays([arr], names=['x']) +with pa.OSFile(path, 'wb') as f: + w = ipc.new_file(f, tbl.schema) + w.write_table(tbl) + w.close() + +# Set values buffer entry offset to -1 to mark it as absent in the IPC body. +# The buffer entry for values is {offset: int64, length: int64}; for 3 empty +# strings the values buffer has length=0. Setting offset=-1 signals absence. +data = bytearray(open(path, 'rb').read()) +target = struct.pack('= 0, "could not locate values buffer entry" +data[idx : idx + 8] = struct.pack('&1 diff --git a/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.reference b/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.reference new file mode 100644 index 000000000000..aadb02b069d8 --- /dev/null +++ b/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.reference @@ -0,0 +1,3 @@ +(1,2) +(1,2) +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.sh b/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.sh new file mode 100755 index 000000000000..b1cba5812e3c --- /dev/null +++ b/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression test for heap-buffer-overflow in readColumnWithGeoData when an +# Arrow file carries corrupted intermediate offsets, and for the crash caused +# by using buffer->mutable_data() (which returns nullptr for read-only IPC +# buffers) instead of buffer->data(). + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +DATA_FILE="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}_geo.arrow" +DATA_FILE_VALID="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}_geo_valid.arrow" +trap 'rm -f "$DATA_FILE" "$DATA_FILE_VALID"' EXIT + +# Build a valid Arrow IPC file with WKB Point rows and geo schema metadata. +# Before the fix, buffer->mutable_data() returned nullptr for read-only IPC +# buffers, causing a null-pointer dereference on any geo-tagged Arrow column. +python3 - "$DATA_FILE_VALID" <<'EOF' +import struct +import sys +import json +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +# WKB Point(1.0, 2.0): byte_order=1(LE), type=1(Point), x=1.0, y=2.0 +wkb_point = struct.pack('metadata()), not to the +# IPC footer (file_reader->metadata()), which is what ArrowBlockInputFormat reads. +meta = tbl.schema.metadata or {} +meta[b'geo'] = geo_meta.encode() +tbl = tbl.replace_schema_metadata(meta) + +with pa.OSFile(path, 'wb') as f: + w = ipc.new_file(f, tbl.schema) + w.write_table(tbl) + w.close() +EOF + +$CLICKHOUSE_LOCAL --input_format_parquet_allow_geoparquet_parser=1 \ + --query "SELECT x FROM file('${DATA_FILE_VALID}', 'Arrow')" 2>&1 + +# Build an Arrow IPC file with WKB binary rows, geo schema metadata, and a +# corrupted offset that makes value_length(0) = 1 GiB. +# Before the fix, this caused a heap-buffer-overflow in parseWKBFormat. +# After the fix, it must be rejected with INCORRECT_DATA. +python3 - "$DATA_FILE" <<'EOF' +import struct +import sys +import json +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +wkb_point = struct.pack(' [0, 0x40000000, 42, 63]. +# value_length(0) = offset[1] - offset[0] = 1 GiB; the read would overflow +# the ~63-byte data buffer. +data = bytearray(open(path, 'rb').read()) +needle = struct.pack('= 0, "could not locate offsets array" +data[idx + 4 : idx + 8] = struct.pack('&1 \ + | grep -oF 'INCORRECT_DATA' || echo 'FAIL: expected INCORRECT_DATA' diff --git a/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.reference b/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.reference new file mode 100644 index 000000000000..9dfcf39f5a78 --- /dev/null +++ b/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.reference @@ -0,0 +1,5 @@ +0 +1 +2 +3 +4 diff --git a/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.sql b/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.sql new file mode 100644 index 000000000000..6010c771dc12 --- /dev/null +++ b/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.sql @@ -0,0 +1,9 @@ +-- Tags: memory-engine +SET allow_experimental_dynamic_type=1; + +DROP TABLE IF EXISTS test_dynamic_compressed; +CREATE TABLE test_dynamic_compressed (d Dynamic) ENGINE=Memory SETTINGS compress=1; +INSERT INTO test_dynamic_compressed SELECT number FROM numbers(5); +ALTER TABLE test_dynamic_compressed MODIFY COLUMN d Dynamic(max_types=0); +SELECT d.UInt64 FROM test_dynamic_compressed ORDER BY d.UInt64; +DROP TABLE test_dynamic_compressed; diff --git a/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.reference b/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.reference new file mode 100644 index 000000000000..f2c122e01968 --- /dev/null +++ b/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.reference @@ -0,0 +1,5 @@ +{"a":1} +{"a":1} +\N +1 \N +2 \N diff --git a/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.sql b/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.sql new file mode 100644 index 000000000000..e92383088c95 --- /dev/null +++ b/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.sql @@ -0,0 +1,27 @@ +-- Tags: no-fasttest + +-- Regression test for https://github.com/ClickHouse/ClickHouse/issues/103630 +-- singleValueOrNull(JSON) crashed with SEGFAULT during deserialization because +-- result_type (Nullable(JSON)) was passed instead of value_type (JSON) to +-- SingleValueDataGenericWithColumn::read, causing a type/serialization mismatch. + +SET enable_json_type = 1; + +-- Test 1: singleValueOrNull with JSON works correctly without MergeTree (no serialize/deserialize cycle). +SELECT singleValueOrNull(j) FROM (SELECT '{"a":1}'::JSON AS j); +SELECT singleValueOrNull(j) FROM (SELECT '{"a":1}'::JSON AS j FROM numbers(3)); +SELECT singleValueOrNull(j) FROM (SELECT if(number % 2, '{"a":1}', '{"b":2}')::JSON AS j FROM numbers(4)); + +-- Test 2: Deserialization from MergeTree must not crash. +-- Note: singleValueOrNull serialize/read methods do not persist first_value/is_null flags (see TODO in source), +-- so the deserialized state always appears empty and returns NULL. This is a known pre-existing limitation. +-- This test verifies the SEGFAULT is fixed (the server does not crash during deserialization). +DROP TABLE IF EXISTS t_single_value_or_null_json; +CREATE TABLE t_single_value_or_null_json (id UInt32, s AggregateFunction(singleValueOrNull, JSON)) ENGINE = MergeTree ORDER BY id; +INSERT INTO t_single_value_or_null_json SELECT 1, singleValueOrNullState(j) FROM (SELECT '{"a":1}'::JSON AS j); +INSERT INTO t_single_value_or_null_json SELECT 2, singleValueOrNullState(j) FROM (SELECT '{"b":"hello"}'::JSON AS j); + +-- This SELECT triggered SEGFAULT before the fix (deserialization of aggregate state). +SELECT id, singleValueOrNullMerge(s) FROM t_single_value_or_null_json GROUP BY id ORDER BY id; + +DROP TABLE t_single_value_or_null_json; diff --git a/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.reference b/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.reference new file mode 100644 index 000000000000..1e6d4f95a01a --- /dev/null +++ b/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.reference @@ -0,0 +1 @@ +Mismatch in flattened Dynamic column: indexes declare 2 rows for type FixedString(8), but only 0 rows were deserialized diff --git a/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.sh b/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.sh new file mode 100755 index 000000000000..e09d325ce352 --- /dev/null +++ b/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Tags: no-fasttest + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +# Test that reading a Native file with a flattened Dynamic column where the +# type data stream has fewer rows than declared by the indexes column produces +# an error instead of reading uninitialized memory. +# +# The file data_native/dynamic_flattened_underfilled.native is a truncated +# Native file with flattened Dynamic serialization for Dynamic(max_types=1) +# declaring 2 rows of FixedString(8) via the indexes column, but providing +# zero bytes of actual FixedString data. + +$CLICKHOUSE_LOCAL --table test --input-format Native -q "SELECT * FROM test" < "${CUR_DIR}/data_native/dynamic_flattened_underfilled.native" 2>&1 | grep -o 'Mismatch in flattened Dynamic column[^.]*' diff --git a/tests/queries/0_stateless/04267_mongodb_empty_collection_crash.reference b/tests/queries/0_stateless/04267_mongodb_empty_collection_crash.reference new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/queries/0_stateless/04267_mongodb_empty_collection_crash.sql b/tests/queries/0_stateless/04267_mongodb_empty_collection_crash.sql new file mode 100644 index 000000000000..fd2d59810dd5 --- /dev/null +++ b/tests/queries/0_stateless/04267_mongodb_empty_collection_crash.sql @@ -0,0 +1,25 @@ +-- Tags: no-fasttest + +-- An empty collection name or a name containing NUL bytes used to abort the server inside the C driver +-- (assertion failure in `_mongoc_cursor_collection`: `collection_len > 0`). +-- See https://github.com/ClickHouse/ClickHouse/issues/105773. + +-- Table function: 6-argument form `mongodb('host:port', database, collection, user, password, structure)`. +SELECT * FROM mongodb('test', 'db', '', 'user', 'pass', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('test', 'db', '\0', 'user', 'pass', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('test', 'db', 'col\0lection', 'user', 'pass', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('test', 'db', '\0col', 'user', 'pass', 'x Int32'); -- { serverError BAD_ARGUMENTS } + +-- Table function: 3-argument form `mongodb(uri, collection, structure)`. +SELECT * FROM mongodb('mongodb://some-cluster:27017/db', '', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('mongodb://some-cluster:27017/db', '\0', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('mongodb://some-cluster:27017/db', 'col\0lection', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('mongodb://some-cluster:27017/db', '\0col', 'x Int32'); -- { serverError BAD_ARGUMENTS } + +-- The same problem reachable via the storage engine: `CREATE TABLE ... ENGINE = MongoDB(...)`. +DROP TABLE IF EXISTS t_mongo_empty_collection; +CREATE TABLE t_mongo_empty_collection (x Int32) ENGINE = MongoDB('some-cluster:27017', 'db', '', 'user', 'pass'); -- { serverError BAD_ARGUMENTS } +CREATE TABLE t_mongo_empty_collection (x Int32) ENGINE = MongoDB('some-cluster:27017', 'db', '\0', 'user', 'pass'); -- { serverError BAD_ARGUMENTS } +CREATE TABLE t_mongo_empty_collection (x Int32) ENGINE = MongoDB('mongodb://some-cluster:27017/db', ''); -- { serverError BAD_ARGUMENTS } +CREATE TABLE t_mongo_empty_collection (x Int32) ENGINE = MongoDB('mongodb://some-cluster:27017/db', '\0'); -- { serverError BAD_ARGUMENTS } +DROP TABLE IF EXISTS t_mongo_empty_collection; diff --git a/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.reference b/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.reference new file mode 100644 index 000000000000..a28d0ccb88ae --- /dev/null +++ b/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.reference @@ -0,0 +1,4 @@ +(1,2) +(1,2) +(1,2,3) +(1,2,3) diff --git a/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.sql b/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.sql new file mode 100644 index 000000000000..5fee3b4c104f --- /dev/null +++ b/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.sql @@ -0,0 +1,10 @@ +-- Regression test for https://github.com/ClickHouse/ClickHouse/issues/101727 +-- Tuples of different sizes in VALUES should not cause OOB access in template parser. +DROP TABLE IF EXISTS t_tuple_size_mismatch; +CREATE TABLE t_tuple_size_mismatch (c0 String) ENGINE = Memory; + +INSERT INTO TABLE t_tuple_size_mismatch (c0) VALUES ((1, 2)), ((1, 2, 3)); +INSERT INTO TABLE t_tuple_size_mismatch (c0) VALUES ((1, 2, 3)), ((1, 2)); + +SELECT * FROM t_tuple_size_mismatch ORDER BY c0; +DROP TABLE t_tuple_size_mismatch; diff --git a/tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.reference b/tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.reference new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.sql b/tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.sql new file mode 100644 index 000000000000..3a20837111dc --- /dev/null +++ b/tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.sql @@ -0,0 +1,22 @@ +-- Tags: no-fasttest + +-- Regression test for the dictionary path of https://github.com/ClickHouse/ClickHouse/issues/105773. +-- An empty collection name (or one containing NUL bytes) used to abort the server inside the C driver +-- when the dictionary source was loaded; now it must fail with BAD_ARGUMENTS. + +DROP DICTIONARY IF EXISTS dict_mongo_empty_collection; +CREATE DICTIONARY dict_mongo_empty_collection (id UInt64, name String) +PRIMARY KEY id +SOURCE(MONGODB(URI 'mongodb://example.test:27017/db' COLLECTION '')) +LIFETIME(0) +LAYOUT(FLAT()); +SELECT * FROM dict_mongo_empty_collection; -- { serverError BAD_ARGUMENTS } +DROP DICTIONARY dict_mongo_empty_collection; + +CREATE DICTIONARY dict_mongo_empty_collection (id UInt64, name String) +PRIMARY KEY id +SOURCE(MONGODB(URI 'mongodb://example.test:27017/db' COLLECTION '\0')) +LIFETIME(0) +LAYOUT(FLAT()); +SELECT * FROM dict_mongo_empty_collection; -- { serverError BAD_ARGUMENTS } +DROP DICTIONARY dict_mongo_empty_collection; diff --git a/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.reference b/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.reference new file mode 100644 index 000000000000..19567e7d2bac --- /dev/null +++ b/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.reference @@ -0,0 +1,2 @@ +test_dict_04268 +1 diff --git a/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.sh b/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.sh new file mode 100755 index 000000000000..974cfcc74a8b --- /dev/null +++ b/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +# Test that system.dictionaries shows dictionaries when SHOW DICTIONARIES +# has a partial revoke on an unrelated table. + +USER="test_user_04268_${CLICKHOUSE_DATABASE}" +ROLE="test_role_04268_${CLICKHOUSE_DATABASE}" +DICT="${CLICKHOUSE_DATABASE}.test_dict_04268" + +${CLICKHOUSE_CLIENT} -q "DROP DICTIONARY IF EXISTS ${DICT}" +${CLICKHOUSE_CLIENT} -q "DROP USER IF EXISTS ${USER}" +${CLICKHOUSE_CLIENT} -q "DROP ROLE IF EXISTS ${ROLE}" + +${CLICKHOUSE_CLIENT} -q " + CREATE DICTIONARY ${DICT} (id UInt64, value String) + PRIMARY KEY id + SOURCE(CLICKHOUSE(TABLE 'numbers' DB 'system')) + LIFETIME(MIN 0 MAX 300) + LAYOUT(FLAT()) +" + +# Create role with SHOW DICTIONARIES and a partial revoke on an unrelated table +${CLICKHOUSE_CLIENT} -q "CREATE ROLE ${ROLE}" +${CLICKHOUSE_CLIENT} -q "GRANT SHOW DICTIONARIES, SELECT ON *.* TO ${ROLE}" +${CLICKHOUSE_CLIENT} -q "REVOKE SHOW DICTIONARIES, SELECT ON system.non_existing_table FROM ${ROLE}" + +${CLICKHOUSE_CLIENT} -q "CREATE USER ${USER} IDENTIFIED WITH no_password" +${CLICKHOUSE_CLIENT} -q "GRANT ${ROLE} TO ${USER}" + +# The dictionary should be visible despite the partial revoke +${CLICKHOUSE_CLIENT} --user "${USER}" -q "SELECT name FROM system.dictionaries WHERE database = '${CLICKHOUSE_DATABASE}' AND name = 'test_dict_04268'" + +# The dictionary should also appear in system.completions +${CLICKHOUSE_CLIENT} --user "${USER}" -q "SELECT count() > 0 FROM system.completions WHERE word = 'test_dict_04268'" + +# Cleanup +${CLICKHOUSE_CLIENT} -q "DROP DICTIONARY IF EXISTS ${DICT}" +${CLICKHOUSE_CLIENT} -q "DROP USER IF EXISTS ${USER}" +${CLICKHOUSE_CLIENT} -q "DROP ROLE IF EXISTS ${ROLE}" diff --git a/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.reference b/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.reference new file mode 100644 index 000000000000..c8fd20ceb261 --- /dev/null +++ b/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.reference @@ -0,0 +1,2 @@ +no engine +wrong engine diff --git a/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.sql b/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.sql new file mode 100644 index 000000000000..d3e9e9b367f4 --- /dev/null +++ b/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.sql @@ -0,0 +1,2 @@ +SELECT 'no engine'; CREATE TABLE t TO INNER UUID '00000000-0000-0000-0000-000000000001' (id UInt32) ORDER BY id; -- { clientError BAD_ARGUMENTS } +SELECT 'wrong engine'; CREATE TABLE t TO INNER UUID '00000000-0000-0000-0000-000000000001' (id UInt32) ENGINE = MergeTree ORDER BY id; -- { clientError BAD_ARGUMENTS } diff --git a/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.reference b/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.reference new file mode 100644 index 000000000000..6ed281c757a9 --- /dev/null +++ b/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.reference @@ -0,0 +1,2 @@ +1 +1 diff --git a/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql b/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql new file mode 100644 index 000000000000..129409c5e2e7 --- /dev/null +++ b/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql @@ -0,0 +1,31 @@ +-- Constraint reduction can collapse a filter into a bare correlated subquery +-- (here `b < d` is always false given the constraint, leaving only the subquery). +-- A correlated subquery used as a whole predicate cannot be decorrelated, so the +-- optimization is skipped for such a filter and the query runs as written. + +DROP TABLE IF EXISTS t_constraint_corr_root; + +CREATE TABLE t_constraint_corr_root +( + a Nullable(String), + b String, + c LowCardinality(String), + d String, + CONSTRAINT c1 ASSUME (a <= b) AND (b <= c) AND (c <= d) AND (d <= a) +) +-- A read step that cannot be cloned (e.g. `TinyLog`) makes correlated-subquery decorrelation +-- fail with `NOT_IMPLEMENTED` on this version, so use `MergeTree`, whose read step is cloneable. +ENGINE = MergeTree ORDER BY tuple(); + +INSERT INTO t_constraint_corr_root VALUES ('1', '2', '3', '4'); + +SELECT count() FROM t_constraint_corr_root +WHERE (b < d) OR (SELECT a < c) +SETTINGS enable_analyzer = 1, convert_query_to_cnf = 1, optimize_substitute_columns = 1, optimize_using_constraints = 1; + +-- The same query with the optimization disabled must return the same value. +SELECT count() FROM t_constraint_corr_root +WHERE (b < d) OR (SELECT a < c) +SETTINGS enable_analyzer = 1, convert_query_to_cnf = 0, optimize_substitute_columns = 0, optimize_using_constraints = 0; + +DROP TABLE t_constraint_corr_root; diff --git a/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.reference b/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.reference new file mode 100644 index 000000000000..6ed281c757a9 --- /dev/null +++ b/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.reference @@ -0,0 +1,2 @@ +1 +1 diff --git a/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.sql b/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.sql new file mode 100644 index 000000000000..402e55ece639 --- /dev/null +++ b/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.sql @@ -0,0 +1,21 @@ +-- Constraint-based constant substitution must not rewrite a correlated column inside a +-- subquery into a constant: correlated columns must stay ColumnNodes for decorrelation. + +DROP TABLE IF EXISTS t_const_outer; +DROP TABLE IF EXISTS t_const_inner; + +CREATE TABLE t_const_outer (a String, CONSTRAINT c1 ASSUME a = 'x') ENGINE = TinyLog; +INSERT INTO t_const_outer VALUES ('x'); + +CREATE TABLE t_const_inner (a String) ENGINE = TinyLog; +INSERT INTO t_const_inner VALUES ('x'); + +SELECT count() FROM t_const_outer WHERE EXISTS (SELECT 1 FROM t_const_inner WHERE t_const_inner.a = t_const_outer.a) +SETTINGS enable_analyzer = 1, optimize_using_constraints = 1, convert_query_to_cnf = 1; + +-- The same query with the optimization disabled must return the same value. +SELECT count() FROM t_const_outer WHERE EXISTS (SELECT 1 FROM t_const_inner WHERE t_const_inner.a = t_const_outer.a) +SETTINGS enable_analyzer = 1, optimize_using_constraints = 0, convert_query_to_cnf = 0; + +DROP TABLE t_const_inner; +DROP TABLE t_const_outer; diff --git a/tests/queries/0_stateless/04307_arrow_oob_reads.reference b/tests/queries/0_stateless/04307_arrow_oob_reads.reference new file mode 100644 index 000000000000..97564127add2 --- /dev/null +++ b/tests/queries/0_stateless/04307_arrow_oob_reads.reference @@ -0,0 +1,7 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04307_arrow_oob_reads.sh b/tests/queries/0_stateless/04307_arrow_oob_reads.sh new file mode 100755 index 000000000000..5e234acd3bbe --- /dev/null +++ b/tests/queries/0_stateless/04307_arrow_oob_reads.sh @@ -0,0 +1,113 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for heap out-of-bounds reads in Arrow IPC format readers +# (bulk memcpy readers — fixed-size buffers[1]). +# +# Each test crafts an Arrow IPC file where the RecordBatch declares many rows +# but the data buffer in the file body holds only a single element. On an +# unpatched build this causes a heap-buffer-overflow caught by ASan. The +# fixed build must reject every such file with INCORRECT_DATA. +# +# 1. readColumnWithNumericData – plain numeric (UInt32 / Int64 / …) +# 2. readColumnWithDurationData – Arrow Duration → Interval +# 3. readColumnWithFixedStringData – FixedSizeBinary → FixedString +# 4. readColumnWithBigIntegerFromFixedBinaryData – FixedSizeBinary → Int128/Int256 +# 5. readColumnWithDate32Data (fast path) – Date32 → numeric (no range check) +# 6. readColumnWithIndexesDataImpl – Dictionary index buffer +# 7. readIPv4ColumnWithInt32Data – Int32 → IPv4 + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] +LARGE_N = 16384 + +def write_arrow(arr, name='x'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def inflate_row_count(data, orig_n, large_n=LARGE_N): + needle = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check numeric $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/numeric.arrow', Arrow)" +check duration $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/duration.arrow', Arrow)" +check fixed_string $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/fixed_string.arrow', Arrow)" +check int128 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/int128.arrow', Arrow)" +# Date32 fast path: numeric type hint skips range checking, hits the raw buffer read +check date32 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/date32.arrow', Arrow, 'x Int32')" +# Dict indexes: integer-valued dictionary isolates the index-buffer read path +check dict_indexes $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/dict_indexes.arrow', Arrow)" +# IPv4: Arrow Int32 with CH IPv4 type hint routes through readIPv4ColumnWithInt32Data +check ipv4 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/ipv4.arrow', Arrow, 'x IPv4')" diff --git a/tests/queries/0_stateless/04308_arrow_oob_reads_value.reference b/tests/queries/0_stateless/04308_arrow_oob_reads_value.reference new file mode 100644 index 000000000000..6e3ef492598f --- /dev/null +++ b/tests/queries/0_stateless/04308_arrow_oob_reads_value.reference @@ -0,0 +1,9 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04308_arrow_oob_reads_value.sh b/tests/queries/0_stateless/04308_arrow_oob_reads_value.sh new file mode 100755 index 000000000000..28088c65c708 --- /dev/null +++ b/tests/queries/0_stateless/04308_arrow_oob_reads_value.sh @@ -0,0 +1,116 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for heap out-of-bounds reads in Arrow IPC format readers +# (per-element Value() readers — checkedCast validates before the loop). +# +# 8. readColumnWithBooleanData – BooleanArray::Value() / bit-packed buffer +# 9. readColumnWithDate32Data (slow)– Date32Array::Value() +# 10. readColumnWithDate64Data – Date64Array::Value() +# 11. readColumnWithTimestampData – TimestampArray::Value() +# 12. readColumnWithTimeData (Time32)– Time32Array::Value() +# 13. readColumnWithTimeData (Time64)– Time64Array::Value() +# 14. readColumnWithFloat16Data – HalfFloatArray::Value() +# 15. readColumnWithDecimalDataImpl – DecimalArray::Value() +# 16. readColumnWithUUIDFromFixedBinaryData – FixedSizeBinaryArray::GetValue() + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import numpy as np +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] +LARGE_N = 16384 + +def write_arrow(arr, name='x'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def inflate_row_count(data, orig_n, large_n=LARGE_N): + needle = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check bool $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/bool.arrow', Arrow)" +# Date32 slow path: no numeric type hint → check_date_range=true → Value() loop +check date32_slow $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/date32_slow.arrow', Arrow)" +check date64 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/date64.arrow', Arrow)" +check timestamp $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/timestamp.arrow', Arrow)" +check time32 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/time32.arrow', Arrow)" +check time64 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/time64.arrow', Arrow)" +check float16 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/float16.arrow', Arrow)" +check decimal $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/decimal.arrow', Arrow)" +# UUID: explicit type hint routes through readColumnWithUUIDFromFixedBinaryData +check uuid $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/uuid.arrow', Arrow, 'x UUID')" diff --git a/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference new file mode 100644 index 000000000000..f9f273e5a142 --- /dev/null +++ b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference @@ -0,0 +1,11 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh new file mode 100755 index 000000000000..37f81177071a --- /dev/null +++ b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh @@ -0,0 +1,183 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for heap out-of-bounds reads in Arrow IPC format readers +# (offsets-buffer readers). +# +# 19. readColumnWithStringData – offsets buffer over-read before per-row data check +# 20. readOffsetsFromArrowListColumn – List offsets Int32Array via Value() +# 21. getNestedArrowColumn (Map) – Map offsets array via ListArray::Flatten() +# 22. readColumnWithJSONData – BinaryArray offsets buffer (same path as 19) +# 24. readColumnWithJSONData – data buffer over-read (value_offset+length > data size) +# 25. readColumnWithBigNumberFromBinaryData – offsets buffer read before size check +# 26. readColumnWithGeoData – offsets buffer read before per-row data-buffer check +# 27. readIPv6ColumnFromBinaryData – offsets buffer read before size check +# 29. readColumnWithBigNumberFromBinaryData – data buffer over-read in copy loop +# 30. readIPv6ColumnFromBinaryData – data buffer over-read in copy loop +# 31. getNestedArrowColumn – nullable List: valid offsets/child but truncated parent bitmap + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] +LARGE_N = 16384 + +def write_arrow(arr, name='x'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def inflate_row_count(data, orig_n, large_n=LARGE_N): + needle = struct.pack('= 8 and 0 <= struct.unpack_from('size(). +# 1 row of 96 'A' bytes: offsets = [0, 96]. Patch the final offset (offset[1]) to +# ~512 MB so offset[0]=0 stays valid but value_length overruns the 96-byte data buffer. +# This exercises the "safe_length > data_buf_size - safe_offset" half of the per-row +# guard (patching offset[0] instead would only test the offset half). +d = write_arrow(pa.array([b'A'*96], type=pa.binary())) +i = d.rfind(struct.pack('= 0 +d[i+4:i+8] = struct.pack(' [0, ~512 MB] +open(f'{out}/json_dlen.arrow', 'wb').write(d) + +# 25. readColumnWithBigNumberFromBinaryData: value_length(i) reads the offsets buffer +# before any offsets-buffer check; checkBinaryOffsetsBuffer must fire first. +d = write_arrow(pa.array([b'\xcc'*16], type=pa.binary())) +open(f'{out}/bignum.arrow', 'wb').write(inflate_row_count(d, 1)) + +# 26. readColumnWithGeoData: value_offset(i) and value_length(i) read the offsets +# buffer before the per-row data check; checkBinaryOffsetsBuffer must fire first. +d = write_arrow(pa.array([b'\x01\x01\x00\x00\x00' + b'\x00'*16], type=pa.binary())) +open(f'{out}/geo.arrow', 'wb').write(inflate_row_count(d, 1)) + +# 27. readIPv6ColumnFromBinaryData: same offsets-buffer gap as case 25 but for IPv6. +d = write_arrow(pa.array([b'\x00'*16], type=pa.binary())) +open(f'{out}/ipv6_binary.arrow', 'wb').write(inflate_row_count(d, 1)) + +# 29. readColumnWithBigNumberFromBinaryData data-buffer: offsets are valid (all value +# lengths = 16) but the data buffer is too small to hold offset[row] + 16 bytes. +# 7 rows, each claiming to be at offset 0 with length 16, but only 8 bytes of data. +d = write_arrow(pa.array([b'\xcc'*16]*7, type=pa.binary())) +# Shrink the data buffer from 112 to 8 bytes +data_len_bytes = struct.pack('= 8 and struct.unpack_from('= 0: + d[idx:idx+8] = struct.pack('= 8 and struct.unpack_from('= 0: + d[idx:idx+8] = struct.pack('= 0, f"bitmap entry (size={bitmap_size}) not found" +d[idx+8:idx+16] = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +# String: offsets buffer over-read before per-row data check +check string $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/string.arrow', Arrow)" +# List: offsets Int32Array read via Value() in readOffsetsFromArrowListColumn +check list $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/list.arrow', Arrow)" +# Map: MapArray subclasses ListArray; offsets read via Flatten() in getNestedArrowColumn +check map $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/map.arrow', Arrow)" +# JSON: BinaryArray with JSON type hint routes through readColumnWithJSONData +check json $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/json.arrow', Arrow, 'x JSON') FORMAT Null" +# JSON data-buffer: data offset+length inflated beyond value_data() buffer +check json_dlen $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/json_dlen.arrow', Arrow, 'x JSON') FORMAT Null" +# BigNum: offsets buffer read via value_length() before checkBinaryOffsetsBuffer +check bignum $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/bignum.arrow', Arrow, 'x Int128')" +# Geo: offsets buffer read via value_offset()/value_length() before checkBinaryOffsetsBuffer +check geo $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/geo.arrow', Arrow, 'x Point')" \ + --input_format_parquet_allow_geoparquet_parser=1 +# IPv6: offsets buffer read via value_length() before checkBinaryOffsetsBuffer +check ipv6_binary $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/ipv6_binary.arrow', Arrow, 'x IPv6')" +# BigNum data-buffer: data buffer too small for value_offset + sizeof(ValueType) +check bignum_dlen $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/bignum_dlen.arrow', Arrow, 'x Int128')" +# IPv6 data-buffer: data buffer too small for value_offset + sizeof(IPv6) +check ipv6_dlen $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/ipv6_dlen.arrow', Arrow, 'x IPv6')" +# Nullable List bitmap: valid offsets + child but truncated parent validity bitmap +check list_bitmap $CLICKHOUSE_LOCAL --query "SELECT sum(length(x)) FROM file('${TMP_DIR}/list_bitmap.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.reference b/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.reference new file mode 100644 index 000000000000..82c9e3f12c06 --- /dev/null +++ b/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.reference @@ -0,0 +1,2 @@ +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.sh b/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.sh new file mode 100755 index 000000000000..6ad98b8b62b9 --- /dev/null +++ b/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for two additional Arrow IPC buffer-validation paths. +# +# Issue A — arithmetic overflow in checkArrowBuffer: a crafted row count near +# 2^62 makes elem_size * (offset + length) wrap to 0 mod 2^64, bypassing the +# buffer-size guard. The fixed build validates the data buffer (with +# __builtin_mul_overflow) before reserving the column, so it rejects the file with +# INCORRECT_DATA ("buffer size overflow") rather than reaching reserve(2^62) (which +# on a build that skipped the checked arithmetic throws CANNOT_ALLOCATE_MEMORY). +# +# Issue B — validity bitmap (buffers[0]) not validated: a file with a valid +# data buffer but a 1-byte bitmap for 64 rows lets IsNull() read past the +# bitmap for rows 8-63. The fixed build calls checkValidityBitmap before any +# IsNull / IsValid loop. +# Note: COUNT(*) bypasses column reads; use SUM to force value materialisation. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(arr, name='x'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +# Issue A: overflow. elem_size=4 (UInt32). 4 * 2^62 ≡ 0 (mod 2^64), so the +# unguarded multiply "elem_size * count" would wrap to 0 and pass the check. +OVERFLOW_N = 1 << 62 +d = write_arrow(pa.array([42], type=pa.uint32())) +needle = struct.pack('= 8 would read past the 1-byte bitmap without the fix. +# The bitmap buffer entry is {offset=0, length=8}; search for that specific pair +# to avoid patching the FieldNode null_count field which also equals 8. +arr = pa.array([None if i % 8 == 0 else i for i in range(64)], type=pa.int32()) +d = write_arrow(arr) +bitmap_entry = struct.pack('= 0, "could not find bitmap buffer entry" +d[idx+8 : idx+16] = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +# Issue A: overflow — checkArrowBuffer validates the data buffer before the column is reserved, +# so __builtin_mul_overflow fires and rejects the file as INCORRECT_DATA ("buffer size overflow") +# rather than reaching reserve(2^62). Asserting INCORRECT_DATA proves the checked-arithmetic path +# (a build that skipped it would instead throw CANNOT_ALLOCATE_MEMORY and fail this assertion). +check_incorrect_data overflow $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/overflow.arrow', Arrow)" + +# Issue B: bitmap — checkValidityBitmap must produce INCORRECT_DATA before IsNull reads. +# Use sum() to force column materialisation; count(*) is optimised away and skips data reads. +check_incorrect_data bitmap $CLICKHOUSE_LOCAL --query "SELECT sum(x) FROM file('${TMP_DIR}/bitmap_shrink.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.reference b/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.reference new file mode 100644 index 000000000000..1cc545929d9b --- /dev/null +++ b/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.reference @@ -0,0 +1,10 @@ +nint_wrap: rejected +nstr_wrap: rejected +arr_wrap: rejected +nint_negdef: rejected +nint_neguncomp: rejected +nint_badtype: rejected +nint_badenc: rejected +nint_negnumvals: rejected +strdict_negnumvals: rejected +multipage_negnrows: rejected diff --git a/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.sh b/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.sh new file mode 100755 index 000000000000..f665fb605e8c --- /dev/null +++ b/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.sh @@ -0,0 +1,174 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# no-fasttest: needs pyarrow to craft the malformed Parquet files. + +# Regression test for a heap out-of-bounds read in the Parquet V3 native reader. +# +# DataPageV2 headers carry definition_levels_byte_length / repetition_levels_byte_length +# as signed i32. A negative value sign-extended to size_t, and the bounds check used +# wrapping addition (`def + rep > page.data.size()`), so a pair like (def=-1, rep=1) +# wrapped the sum to 0 and bypassed the check. A 2^64-sized std::span then reached the +# RLE level decoder, whose raw memcpy read far past the page buffer (heap disclosure). +# +# The reader must reject every crafted file with a clean INCORRECT_DATA exception +# instead of reading out of bounds. On an unpatched ASan/UBSan build each "wrap" case +# triggers a sanitizer error. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +WORK_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR" +trap 'rm -rf "$WORK_DIR"' EXIT + +python3 - "$WORK_DIR" <<'PYEOF' +import io, sys +import pyarrow as pa +import pyarrow.parquet as pq + +work = sys.argv[1] + +# --- minimal Thrift compact protocol walker: record offset of every scalar field --- +CT_INT = {0x03, 0x04, 0x05, 0x06} # byte, i16, i32, i64 + +def zigzag_decode(n): return (n >> 1) ^ -(n & 1) +def zigzag_encode(n, bits=64): + m = (1 << bits) - 1; u = n & m + return ((u << 1) ^ (-(u >> (bits - 1)) & m)) & m +def encode_varint(n): + out = bytearray() + while True: + b = n & 0x7F; n >>= 7 + out.append(b | (0x80 if n else 0)) + if not n: break + return bytes(out) + +class Walker: + def __init__(self, buf, pos): self.buf, self.pos, self.rec = buf, pos, [] + def byte(self): b = self.buf[self.pos]; self.pos += 1; return b + def varint(self): + r = s = 0 + while True: + b = self.byte(); r |= (b & 0x7F) << s + if not (b & 0x80): return r + s += 7 + def zz(self): return zigzag_decode(self.varint()) + def struct(self, path): + last = 0 + while True: + h = self.byte() + if h == 0: return + d = (h & 0xF0) >> 4; ct = h & 0x0F + fid = self.zz() if d == 0 else last + d + last = fid + self.field(ct, path + [fid]) + def field(self, ct, path): + vs = self.pos; val = None + if ct in (0x01, 0x02): val = (ct == 0x01) + elif ct == 0x03: val = self.byte() + elif ct in (0x04, 0x05, 0x06): val = self.zz() + elif ct == 0x07: self.pos += 8 + elif ct == 0x08: self.pos += self.varint() + elif ct in (0x09, 0x0A): self.lst(path) + elif ct == 0x0C: self.struct(path) + else: raise ValueError(f"ctype {ct}") + if ct in CT_INT: self.rec.append((tuple(path), vs, self.pos, val)) + def lst(self, path): + st = self.byte(); n = (st & 0xF0) >> 4; et = st & 0x0F + if n == 0xF: n = self.varint() + for i in range(n): self.field(et, path + [i]) + +def first_page_offset(buf): + col = pq.ParquetFile(io.BytesIO(bytes(buf))).metadata.row_group(0).column(0) + off = col.data_page_offset + if col.has_dictionary_page and col.dictionary_page_offset is not None: + off = min(off, col.dictionary_page_offset) + return off + +def patch(buf, off, field_path, signed_value): + w = Walker(buf, off); w.struct([]) + for pi, vs, ve, val in w.rec: + if pi == tuple(field_path): + nb = encode_varint(zigzag_encode(signed_value)) + assert len(nb) == ve - vs, f"len change for {field_path}: {ve-vs}->{len(nb)} ({val}->{signed_value})" + buf[vs:ve] = nb + return buf + raise KeyError(field_path) + +def make(path, dtype, vals, compression="none", use_dictionary=False, data_page_size=None): + kw = {} if data_page_size is None else {"data_page_size": data_page_size} + pq.write_table(pa.table({"v": pa.array(vals, type=dtype)}), path, + data_page_version="2.0", compression=compression, + use_dictionary=use_dictionary, write_statistics=False, **kw) + +def page_offsets(buf): + """Offsets of every data page header (walks header + compressed_page_size), bounded by the + column chunk's compressed size so we never run into the file footer.""" + col = pq.ParquetFile(io.BytesIO(bytes(buf))).metadata.row_group(0).column(0) + p = col.data_page_offset + end = col.data_page_offset + col.total_compressed_size + offs = [] + while p < end: + w = Walker(buf, p); w.struct([]) + cps = next(v for (pi, vs, ve, v) in w.rec if pi == (3,)) # compressed_page_size + offs.append(p) + p = w.pos + cps + return offs + +# PageHeader field ids: 2=uncompressed_page_size; 8=data_page_header_v2 struct, +# whose 5=definition_levels_byte_length, 6=repetition_levels_byte_length. +NINT = [i if i % 3 else None for i in range(64)] +NSTR = [("x" * ((i % 7) + 1) if i % 3 else None) for i in range(64)] +ARR = [list(range(i % 5)) for i in range(64)] + +def craft(name, dtype, vals, patches, compression="none", use_dictionary=False): + base = f"{work}/{name}.parquet" + make(base, dtype, vals, compression, use_dictionary) + buf = bytearray(open(base, "rb").read()) + off = first_page_offset(buf) + for fp, v in patches: + patch(buf, off, fp, v) + open(f"{work}/{name}_evil.parquet", "wb").write(buf) + +# Wrapping bypass (def + rep wraps to a small value -> huge def/rep span -> OOB read). +craft("nint_wrap", pa.int32(), NINT, [((8, 5), -1), ((8, 6), 1)]) +craft("nstr_wrap", pa.string(), NSTR, [((8, 5), -2), ((8, 6), 2)]) +craft("arr_wrap", pa.list_(pa.int32()), ARR, [((8, 5), 1), ((8, 6), -1)]) +# Negative definition length alone (no wrap, must still be rejected). +craft("nint_negdef", pa.int32(), NINT, [((8, 5), -1)]) +# Negative uncompressed_page_size on a compressed page (sizes the decompression buffer). +craft("nint_neguncomp", pa.int32(), NINT, [((2,), -8192)], compression="snappy") +# Out-of-range enum values (loading an unscoped enum out of range is undefined behavior). +# PageHeader field 1 = type (PageType); data_page_header_v2 field 4 = encoding (Encoding). +craft("nint_badtype", pa.int32(), NINT, [((1,), -64)]) +craft("nint_badenc", pa.int32(), NINT, [((8, 4), -64)]) +# Negative num_values (data_page_header_v2 field 1). +craft("nint_negnumvals", pa.int32(), NINT, [((8, 1), -8192)]) +# Negative num_values in the DICTIONARY page header (dictionary_page_header field 1). The first page +# of a dictionary-encoded column is the DICTIONARY_PAGE, so this patches its header. +DICTSTR = [("v%d" % (i % 5)) for i in range(64)] # few distinct values -> small dict num_values +craft("strdict_negnumvals", pa.string(), DICTSTR, [((7, 1), -64)], use_dictionary=True) +# Negative num_rows in a NON-FIRST DataPageV2. num_rows is consumed early (before the num_values +# check) to compute the row cursor, so a negative value on a later page wraps it backwards. Build a +# multi-page file and patch the second page's num_rows (-1024 keeps the 2-byte varint length of 1024). +make(f"{work}/multipage.parquet", pa.int32(), list(range(4000)), data_page_size=256) +mp = bytearray(open(f"{work}/multipage.parquet", "rb").read()) +offs = page_offsets(mp) +assert len(offs) >= 2, f"expected multiple pages, got {len(offs)}" +patch(mp, offs[1], (8, 3), -1024) +open(f"{work}/multipage_negnrows_evil.parquet", "wb").write(mp) +PYEOF + +# Each crafted file must be rejected with INCORRECT_DATA (code 117), not crash or leak. +for f in nint_wrap nstr_wrap arr_wrap nint_negdef nint_neguncomp nint_badtype nint_badenc nint_negnumvals strdict_negnumvals multipage_negnrows; do + out=$(${CLICKHOUSE_LOCAL} --query " + SELECT * FROM file('${WORK_DIR}/${f}_evil.parquet', Parquet) FORMAT Null + SETTINGS input_format_parquet_use_native_reader_v3 = 1" 2>&1) + if echo "$out" | grep -q "INCORRECT_DATA"; then + echo "$f: rejected" + else + echo "$f: UNEXPECTED: $out" + fi +done diff --git a/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.reference b/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.reference new file mode 100644 index 000000000000..d3f4627737e2 --- /dev/null +++ b/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.reference @@ -0,0 +1,5 @@ +1200000 +1200000 +E289ABE28392 +E289AAE28392 +
Hello & "World"
diff --git a/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.sql b/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.sql new file mode 100644 index 000000000000..1bdf7c9e2f6d --- /dev/null +++ b/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.sql @@ -0,0 +1,14 @@ +-- Regression test for a heap buffer overflow in decodeHTMLComponent. +-- The output buffer was sized to the input length, but the entities `≫⃒` and `≪⃒` are 5 bytes +-- and decode to a 6-byte UTF-8 sequence, so a long run of them overflowed the output buffer. + +-- A large run of the expanding entity must decode without overflowing (6 bytes per 5-byte entity). +SELECT length(decodeHTMLComponent(repeat('≫⃒', 200000))); +SELECT length(decodeHTMLComponent(repeat('≪⃒', 200000))); + +-- Correctness of the expanding entities (U+226B/U+226A + combining U+20D2). +SELECT hex(decodeHTMLComponent('≫⃒')); +SELECT hex(decodeHTMLComponent('≪⃒')); + +-- Ordinary entities still decode correctly. +SELECT decodeHTMLComponent('<div>Hello & "World"</div>'); diff --git a/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.reference b/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.reference new file mode 100644 index 000000000000..29deae098da5 --- /dev/null +++ b/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.reference @@ -0,0 +1,2 @@ +deep: rejected +shallow: ok diff --git a/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.sh b/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.sh new file mode 100755 index 000000000000..c5feaaffc8e3 --- /dev/null +++ b/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# no-fasttest: the Parquet format is not available in the fast test build. + +# Regression test for unbounded recursion in the Parquet V3 native reader's schema converter. +# A chain of nested REQUIRED groups maps to nested Tuples and recurses through +# SchemaConverter::processSubtree per level. The definition-level cap (255) only counts +# OPTIONAL/REPEATED nesting, so a deep REQUIRED chain recursed without bound and overflowed the +# stack -> uncatchable SIGSEGV (server crash / DoS), triggerable even by schema inference (DESC). +# checkStackSize() now turns it into a catchable TOO_DEEP_RECURSION exception. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +WORK_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR" +trap 'rm -rf "$WORK_DIR"' EXIT + +# Hand-build a Parquet file (PAR1 + FileMetaData footer, no row groups) whose schema is a root with +# N nested REQUIRED groups (num_children=1 each) and an INT32 leaf. Pure stdlib, no pyarrow. +python3 - "$WORK_DIR" <<'PYEOF' +import struct, sys +work = sys.argv[1] + +class W: + def __init__(s): s.out = bytearray() + def u8(s, v): s.out.append(v & 0xff) + def varint(s, v): + v &= (1 << 64) - 1 + while True: + b = v & 0x7f; v >>= 7 + s.out.append(b | 0x80) if v else s.out.append(b) + if not v: return + def zz(s, n): s.varint(((n << 1) ^ (n >> 63)) & ((1 << 64) - 1)) + +CT_I32, CT_I64, CT_BIN, CT_LIST, CT_STRUCT = 5, 6, 8, 9, 12 + +def field(w, last, fid, ctype): + d = fid - last + if 1 <= d <= 15: w.u8((d << 4) | ctype) + else: w.u8(ctype); w.zz(fid) + return fid + +def schema_elem(w, name, repetition=None, num_children=None, ptype=None): + last = 0 + if ptype is not None: + last = field(w, last, 1, CT_I32); w.zz(ptype) # type + if repetition is not None: + last = field(w, last, 3, CT_I32); w.zz(repetition) # repetition_type (REQUIRED=0) + last = field(w, last, 4, CT_BIN); w.varint(len(name)); w.out += name.encode() # name + if num_children is not None: + last = field(w, last, 5, CT_I32); w.zz(num_children) # num_children + w.u8(0) + +def build(n): + fmd = W(); last = 0 + last = field(fmd, last, 1, CT_I32); fmd.zz(2) # version + last = field(fmd, last, 2, CT_LIST) # schema list + total = n + 2 # root + n groups + leaf + if total < 15: fmd.u8((total << 4) | CT_STRUCT) + else: fmd.u8((15 << 4) | CT_STRUCT); fmd.varint(total) + schema_elem(fmd, "root", repetition=None, num_children=1) + for _ in range(n): + schema_elem(fmd, "g", repetition=0, num_children=1) # REQUIRED group + schema_elem(fmd, "leaf", repetition=0, ptype=1) # INT32 leaf + last = field(fmd, last, 3, CT_I64); fmd.zz(0) # num_rows + last = field(fmd, last, 4, CT_LIST); fmd.u8((0 << 4) | CT_STRUCT) # row_groups (empty) + fmd.u8(0) + meta = bytes(fmd.out) + return b'PAR1' + meta + struct.pack('&1) +if echo "$out" | grep -q "TOO_DEEP_RECURSION"; then + echo "deep: rejected" +else + echo "deep: UNEXPECTED: $out" +fi + +# A reasonably nested schema must still work. +shallow=$(${CLICKHOUSE_LOCAL} --query " + DESC file('${WORK_DIR}/shallow.parquet', Parquet) + SETTINGS input_format_parquet_use_native_reader_v3 = 1" 2>&1) +if echo "$shallow" | grep -q "Tuple"; then + echo "shallow: ok" +else + echo "shallow: UNEXPECTED: $shallow" +fi diff --git a/tests/queries/0_stateless/04326_arrow_oob_neg_length.reference b/tests/queries/0_stateless/04326_arrow_oob_neg_length.reference new file mode 100644 index 000000000000..d08d3c723e2e --- /dev/null +++ b/tests/queries/0_stateless/04326_arrow_oob_neg_length.reference @@ -0,0 +1 @@ +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04326_arrow_oob_neg_length.sh b/tests/queries/0_stateless/04326_arrow_oob_neg_length.sh new file mode 100755 index 000000000000..214c7a5c0daf --- /dev/null +++ b/tests/queries/0_stateless/04326_arrow_oob_neg_length.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression test: FieldNode.length = -1 bypasses checkBinaryOffsetsBuffer. +# +# When FieldNode.length is set to -1 in an Arrow IPC file, checkBinaryOffsetsBuffer +# computes count_plus_one = static_cast(-1) + 1 = 0, required = 0, and the +# buffer-size check passes trivially. The subsequent per-row validation loop iterates +# as if chunk_length = SIZE_MAX, reaching beyond the actual 5-row offsets buffer and +# reading garbage as an offset entry. The per-row bounds check must throw INCORRECT_DATA +# before that garbage value is used to derive a read pointer. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(arr, name='x'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +# 5 rows of LargeBinaryArray with string lengths [1,2,3,4,6]. +# Cumulative offsets are [0,1,3,6,10,16] — none equals 5, so the only +# int64=5 occurrences in the file are RecordBatch.length and FieldNode.length. +# Patching both to -1 produces a consistent malformed file that Arrow's IPC +# reader accepts (it cross-checks RecordBatch.length == FieldNode.length but +# does not reject negative values) while our code must detect the anomaly. +arr = pa.array([b"a", b"bb", b"ccc", b"dddd", b"ffffff"], type=pa.large_binary()) +d = write_arrow(arr) + +needle = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/neg_length.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.reference b/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.reference new file mode 100644 index 000000000000..d070e1a4f42c --- /dev/null +++ b/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.reference @@ -0,0 +1 @@ +geo_bomb: memory limit enforced diff --git a/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.sh b/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.sh new file mode 100755 index 000000000000..ab20e680abd3 --- /dev/null +++ b/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# no-fasttest: needs pyarrow to write the GeoParquet file. + +# Regression test for an untracked-allocation DoS in the Parquet V3 GeoParquet (WKB) reader. +# The WKB reader took an element count straight off the wire and `reserve`d a std::vector of that +# many points before reading any coordinate bytes. The default container tracking is non-throwing, +# so a 9-byte WKB value claiming 100M points forced a ~1.6 GB allocation that bypassed +# max_memory_usage (the query failed later with CANNOT_READ_ALL_DATA, never MEMORY_LIMIT_EXCEEDED). +# The geometry containers now use AllocatorWithMemoryTracking, so the oversized reserve is charged +# to the memory tracker and rejected with MEMORY_LIMIT_EXCEEDED under a small limit. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +WORK_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR" +trap 'rm -rf "$WORK_DIR"' EXIT + +python3 - "$WORK_DIR" <<'PYEOF' +import sys, struct, json +import pyarrow as pa +import pyarrow.parquet as pq +work = sys.argv[1] +# WKB LineString header: little-endian, type=2 (LineString), num_points=100M, no coordinates. +wkb = struct.pack('&1) +if echo "$out" | grep -q "MEMORY_LIMIT_EXCEEDED"; then + echo "geo_bomb: memory limit enforced" +else + echo "geo_bomb: UNEXPECTED: $out" +fi diff --git a/tests/queries/0_stateless/04327_arrow_oob_list_offsets.reference b/tests/queries/0_stateless/04327_arrow_oob_list_offsets.reference new file mode 100644 index 000000000000..dbce9be2af41 --- /dev/null +++ b/tests/queries/0_stateless/04327_arrow_oob_list_offsets.reference @@ -0,0 +1,5 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04327_arrow_oob_list_offsets.sh b/tests/queries/0_stateless/04327_arrow_oob_list_offsets.sh new file mode 100755 index 000000000000..2d50f2762619 --- /dev/null +++ b/tests/queries/0_stateless/04327_arrow_oob_list_offsets.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for OOB reads from malformed Arrow List/LargeList offsets: +# - non-monotonic offsets that underflow the uint64 element count and bypass the +# ColumnArray consistency check (offsets [0,64,65,64] over a 64-byte child); +# - a decreasing offset pair that reaches arrow::ListArray::Flatten before the +# monotonicity check (offsets [64,0,6], previously STD_EXCEPTION from ArrayData::Slice); +# - monotonic, non-negative offsets that point past the values array (offsets [1,1] over a +# zero-length child). +# Each must be rejected as INCORRECT_DATA. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(arr, name='arr'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +# List(UInt8), int32 offsets. Inner size = 64 bytes (Arrow allocates exactly 64, no padding). +# Valid offsets [0,64,65,66]; patch the last entry 66->64 so they become [0,64,65,64]: row 1 +# starts at inner[64] (OOB) and the uint64 underflow at row 2 wraps last_offset back to 64. +arr = pa.array([[0xAA]*64, [0xBB], [0xCC]], type=pa.list_(pa.uint8())) +d = write_arrow(arr) +idx = d.rfind(struct.pack('= 0 and idx % 4 == 0, f"could not find last offset int32=66 (file={len(d)} bytes)" +d[idx:idx+4] = struct.pack('= 0 and idx64 % 8 == 0, "could not find last offset int64=66" +d64[idx64:idx64+8] = struct.pack(' with a decreasing offset pair that reaches Flatten before the offsets reader runs. +# Valid offsets [0,4,6] are patched to [64,0,6]: Flatten slices values[64..6], which fails inside +# Arrow's ArrayData::Slice when monotonicity is validated only later. The pre-Flatten check rejects it. +arr_decr = pa.array([[1,2,3,4],[5,6]], type=pa.list_(pa.int32())) # offsets [0,4,6] +d_decr = bytearray(write_arrow(arr_decr)) +idx_decr = d_decr.find(struct.pack('<3i', 0, 4, 6)) +assert idx_decr >= 0, "could not find List offsets [0,4,6] in decreasing-offset file" +d_decr[idx_decr:idx_decr+12] = struct.pack('<3i', 64, 0, 6) +open(f'{out}/list_decreasing_offset.arrow', 'wb').write(d_decr) + +# Monotonic, non-negative List/LargeList offsets that point past values.length: an empty list's +# offsets [0,0] are patched to [1,1] while values.length stays 0. Verified via pyarrow round-trip. +def patch_offsets_past_values(arr, packed): + base = bytearray(write_arrow(arr, name='x')) + pos = 0 + while True: + idx = base.find(b'\x00' * len(packed), pos) + assert idx >= 0, "offset buffer of zeros not found" + cand = bytearray(base) + cand[idx:idx+len(packed)] = packed + try: + with ipc.open_file(pa.py_buffer(bytes(cand))) as reader: + a = reader.read_all().column('x').chunks[0] + if a.offsets.to_pylist() == [1, 1] and len(a.values) == 0: + return cand + except Exception: + pass + pos = idx + 1 + +open(f'{out}/list_offset_past_values.arrow', 'wb').write( + patch_offsets_past_values(pa.array([[]], type=pa.list_(pa.int32())), struct.pack('<2i', 1, 1))) +open(f'{out}/largelist_offset_past_values.arrow', 'wb').write( + patch_offsets_past_values(pa.array([[]], type=pa.large_list(pa.int32())), struct.pack('<2q', 1, 1))) +PYEOF + +check_incorrect_data() { + local label="$1"; shift + local actual + actual=$("$@" 2>&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data list_nonmonotonic \ + $CLICKHOUSE_LOCAL --query "SELECT arrayElement(arr, 2) FROM file('${TMP_DIR}/list_nonmonotonic.arrow', Arrow)" + +check_incorrect_data largelist_nonmonotonic \ + $CLICKHOUSE_LOCAL --query "SELECT arrayElement(arr, 2) FROM file('${TMP_DIR}/largelist_nonmonotonic.arrow', Arrow)" + +check_incorrect_data list_decreasing_offset \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_decreasing_offset.arrow', Arrow)" + +check_incorrect_data list_offset_past_values \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_offset_past_values.arrow', Arrow)" + +check_incorrect_data largelist_offset_past_values \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largelist_offset_past_values.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04327_avro_string_length_alloc.reference b/tests/queries/0_stateless/04327_avro_string_length_alloc.reference new file mode 100644 index 000000000000..13cd1855ba1e --- /dev/null +++ b/tests/queries/0_stateless/04327_avro_string_length_alloc.reference @@ -0,0 +1 @@ +strbomb: rejected diff --git a/tests/queries/0_stateless/04327_avro_string_length_alloc.sh b/tests/queries/0_stateless/04327_avro_string_length_alloc.sh new file mode 100755 index 000000000000..c657d8dfa8bb --- /dev/null +++ b/tests/queries/0_stateless/04327_avro_string_length_alloc.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# no-fasttest: Avro format is not available in the fast test build. + +# Regression test for an untracked-allocation DoS in the Avro reader. +# BinaryDecoder::decodeString / decodeBytes read a length prefix and resized a std::string/vector to +# that length BEFORE reading any bytes. A ~70-byte Avro file declaring a ~2 GB string length (with no +# data) forced a ~2 GB allocation that bypassed max_memory_usage (peak RSS ~2.9 GB; the query then +# failed with an Avro EOF error). The decoder now reads incrementally, so a truncated/over-declared +# value only allocates the bytes actually present (RSS stays bounded) and is rejected cleanly. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +WORK_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR" +trap 'rm -rf "$WORK_DIR"' EXIT + +# Hand-build a minimal Avro OCF whose single string value declares a ~2 GB length with no data bytes. +python3 - "$WORK_DIR" <<'PYEOF' +import json, sys +work = sys.argv[1] + +def vlong(n): # Avro zigzag varint long + u = ((n << 1) ^ (n >> 63)) & ((1 << 64) - 1) + out = bytearray() + while True: + b = u & 0x7f; u >>= 7 + out.append(b | 0x80) if u else out.append(b) + if not u: break + return bytes(out) + +def avstr(b): return vlong(len(b)) + b + +schema = json.dumps({"type": "record", "name": "r", + "fields": [{"name": "s", "type": "string"}]}).encode() +meta = (vlong(2) + avstr(b'avro.schema') + avstr(schema) + + avstr(b'avro.codec') + avstr(b'null') + vlong(0)) +sync = b'\x00' * 16 +header = b'Obj\x01' + meta + sync +payload = vlong(2_000_000_000) # string length prefix ~2 GB, no bytes follow +block = vlong(1) + vlong(len(payload)) + payload + sync +open(f"{work}/strbomb.avro", "wb").write(header + block) +PYEOF + +# The over-declared string must be rejected cleanly (and with bounded memory) instead of allocating +# ~2 GB up front. The data genuinely ends after the length prefix, so this surfaces as an Avro +# EOF / INCORRECT_DATA error. +out=$(${CLICKHOUSE_LOCAL} --input-format Avro -S "s String" \ + --query "SELECT s FROM table FORMAT Null SETTINGS max_memory_usage = 104857600" \ + < "${WORK_DIR}/strbomb.avro" 2>&1) +if echo "$out" | grep -qE "AVRO_EXCEPTION|EOF reached|INCORRECT_DATA|CANNOT_READ_ALL_DATA"; then + echo "strbomb: rejected" +else + echo "strbomb: UNEXPECTED: $out" +fi diff --git a/tests/queries/0_stateless/04327_backup_s3_base_credentials_metadata.reference b/tests/queries/0_stateless/04327_backup_s3_base_credentials_metadata.reference new file mode 100644 index 000000000000..2a6f9ac7ad7f --- /dev/null +++ b/tests/queries/0_stateless/04327_backup_s3_base_credentials_metadata.reference @@ -0,0 +1,57 @@ +base +BACKUP_CREATED +0 +0 +0 +0 +inc_1: use_same_s3_credentials_for_base_backup +BACKUP_CREATED +1 +1 +0 +0 +RESTORED +10 +RESTORE_FAILED +RESTORED +10 +inc_2: explicit base backup credentials without the setting +BACKUP_CREATED +1 +1 +0 +0 +RESTORED +10 +inc_3: different inline base credentials without the setting +BACKUP_CREATED +1 +0 +0 +0 +RESTORED +10 +inc_4: distinct base credentials and extra auth arguments +BACKUP_CREATED +1 +0 +0 +0 +RESTORED +10 +inc_5: use_same_s3_credentials with extra auth arguments +BACKUP_CREATED +1 +0 +0 +0 +RESTORED +10 +inc_6: backward compatibility with credentials embedded in metadata +BACKUP_CREATED +1 +0 +0 +1 +RESTORED +10 diff --git a/tests/queries/0_stateless/04327_backup_s3_base_credentials_metadata.sh b/tests/queries/0_stateless/04327_backup_s3_base_credentials_metadata.sh new file mode 100755 index 000000000000..4727d083c3d6 --- /dev/null +++ b/tests/queries/0_stateless/04327_backup_s3_base_credentials_metadata.sh @@ -0,0 +1,106 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Tag: no-fasttest - requires S3 + +# The `base_backup` locator in `.backup` metadata must not store `S3` credentials. +# Old metadata with embedded credentials remains readable. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +client_opts=( + --allow_repeated_settings + --send_logs_level 'error' +) + +function s3_url() { echo "http://localhost:11111/test/backups/$CLICKHOUSE_DATABASE/base_credentials_metadata_$*"; } + +function s3_location() { echo "'$(s3_url "$*")', 'test', 'testtest'"; } + +function s3_location_root() { echo "'$(s3_url "$*")', 'clickhouse', 'clickhouse'"; } + +function check_base_backup_in_metadata() +{ + local name=$1 && shift + local metadata + # Match only credential arguments, not the `/test/` URL path segment. + metadata=$($CLICKHOUSE_CLIENT "${client_opts[@]}" -q "SELECT line FROM s3($(s3_location $name/.backup), 'LineAsString') FORMAT TSVRaw") + grep -c '' <<< "$metadata" || true + grep -c '' <<< "$metadata" || true + grep -c '' <<< "$metadata" || true + grep -cE ", 'test'|, 'testtest'|, 'clickhouse'|SECRET" <<< "$metadata" || true +} + +function expect_restore_failure() +{ + local query=$1 && shift + if $CLICKHOUSE_CLIENT "${client_opts[@]}" -q "$query" > /dev/null 2>&1; then + echo 'RESTORE_UNEXPECTEDLY_SUCCEEDED' + else + echo 'RESTORE_FAILED' + fi +} + +function rewrite_backup_metadata() +{ + local name=$1 && shift + local from=$1 && shift + local to=$1 && shift + local content + content=$($CLICKHOUSE_CLIENT "${client_opts[@]}" --param_from="$from" --param_to="$to" -q "SELECT replace(line, {from:String}, {to:String}) FROM s3($(s3_location $name/.backup), 'LineAsString') FORMAT LineAsString") || return 1 + $CLICKHOUSE_CLIENT "${client_opts[@]}" -q "INSERT INTO FUNCTION s3($(s3_location $name/.backup), 'LineAsString') SETTINGS s3_truncate_on_insert=1 FORMAT LineAsString" <<< "$content" +} + +$CLICKHOUSE_CLIENT "${client_opts[@]}" -m -q " + DROP TABLE IF EXISTS data; + CREATE TABLE data (key Int) ENGINE=MergeTree() ORDER BY tuple(); + INSERT INTO data SELECT * FROM numbers(10); +" + +echo 'base' +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location base))" | cut -f2 +check_base_backup_in_metadata base + +echo 'inc_1: use_same_s3_credentials_for_base_backup' +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location inc_1)) SETTINGS base_backup=S3($(s3_location base)), use_same_s3_credentials_for_base_backup=1" | cut -f2 +check_base_backup_in_metadata inc_1 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "RESTORE TABLE data AS data_1 FROM S3($(s3_location inc_1))" | cut -f2 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "SELECT count() FROM data_1" +expect_restore_failure "RESTORE TABLE data AS data_1_wrong_base FROM S3($(s3_location inc_1)) SETTINGS base_backup=S3('$(s3_url base)', 'WRONG', 'WRONG')" +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "RESTORE TABLE data AS data_1_explicit_base FROM S3($(s3_location inc_1)) SETTINGS base_backup=S3($(s3_location base))" | cut -f2 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "SELECT count() FROM data_1_explicit_base" + +echo 'inc_2: explicit base backup credentials without the setting' +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location inc_2)) SETTINGS base_backup=S3($(s3_location base)), use_same_s3_credentials_for_base_backup=0" | cut -f2 +check_base_backup_in_metadata inc_2 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "RESTORE TABLE data AS data_2 FROM S3($(s3_location inc_2))" | cut -f2 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "SELECT count() FROM data_2" + +echo 'inc_3: different inline base credentials without the setting' +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location inc_3)) SETTINGS base_backup=S3($(s3_location_root base))" | cut -f2 +check_base_backup_in_metadata inc_3 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "RESTORE TABLE data AS data_3 FROM S3($(s3_location inc_3)) SETTINGS base_backup=S3($(s3_location_root base))" | cut -f2 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "SELECT count() FROM data_3" + +echo 'inc_4: distinct base credentials and extra auth arguments' +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location inc_4)) SETTINGS base_backup=S3($(s3_location_root base), role_arn = 'SECRET_ROLE_ARN', external_id = 'SECRET_EXTERNAL_ID')" | cut -f2 +check_base_backup_in_metadata inc_4 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "RESTORE TABLE data AS data_4 FROM S3($(s3_location inc_4)) SETTINGS base_backup=S3($(s3_location_root base))" | cut -f2 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "SELECT count() FROM data_4" + +echo 'inc_5: use_same_s3_credentials with extra auth arguments' +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location inc_5)) SETTINGS base_backup=S3('$(s3_url base)', extra_credentials(external_id = 'SECRET_EXTERNAL_ID')), use_same_s3_credentials_for_base_backup=1" | cut -f2 +check_base_backup_in_metadata inc_5 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "RESTORE TABLE data AS data_5 FROM S3($(s3_location inc_5)) SETTINGS base_backup=S3($(s3_location base))" | cut -f2 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "SELECT count() FROM data_5" + +echo 'inc_6: backward compatibility with credentials embedded in metadata' +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "BACKUP TABLE data TO S3($(s3_location inc_6)) SETTINGS base_backup=S3($(s3_location base))" | cut -f2 +# Imitate old metadata with embedded credentials and no marker. +rewrite_backup_metadata inc_6 'true' '' +rewrite_backup_metadata inc_6 'true' '' +rewrite_backup_metadata inc_6 "S3('$(s3_url base)')" "S3('$(s3_url base)', 'test', 'testtest')" +check_base_backup_in_metadata inc_6 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "RESTORE TABLE data AS data_6 FROM S3($(s3_location inc_6))" | cut -f2 +$CLICKHOUSE_CLIENT "${client_opts[@]}" -q "SELECT count() FROM data_6" diff --git a/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.reference b/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.reference new file mode 100644 index 000000000000..97564127add2 --- /dev/null +++ b/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.reference @@ -0,0 +1,7 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.sh b/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.sh new file mode 100755 index 000000000000..a0a55577c3d1 --- /dev/null +++ b/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for OOB reads from a List/LargeList/FixedSizeList child whose declared length +# is inconsistent with the parent: +# - an empty child with non-zero parent offsets (child length patched to 0) that bypassed the +# ColumnArray empty-child consistency check; +# - a non-empty child shorter than length*stride for a FixedSizeList (child 21 -> 10); +# - a negative child FieldNode.length (-1) that reaches arrow's ArrayData::Slice. +# Each must be rejected as INCORRECT_DATA. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(arr, name='arr'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def patch_all_int64(data, old_val, new_val): + """Patch all 8-byte-aligned occurrences of old_val (int64) to new_val.""" + needle = struct.pack('[7] and List with 3 parent rows; child FieldNode.length patched +# 21 -> 0. The declared last offset (21) exceeds the empty child allocation; the ColumnArray +# empty-child short-circuit on unpatched code silently produced offsets past the allocation. +arr_fsl = pa.array([[i]*7 for i in range(3)], type=pa.list_(pa.int32(), 7)) +d_fsl = bytearray(write_arrow(arr_fsl)) +assert patch_all_int64(d_fsl, 21, 0) >= 1, f"no int64=21 found in FSL file ({len(d_fsl)} bytes)" +open(f'{out}/fsl_empty_child.arrow', 'wb').write(d_fsl) + +arr_list = pa.array([[i]*7 for i in range(3)], type=pa.list_(pa.int32())) +d_list = bytearray(write_arrow(arr_list)) +assert patch_all_int64(d_list, 21, 0) >= 1, f"no int64=21 found in List file ({len(d_list)} bytes)" +open(f'{out}/list_empty_child.arrow', 'wb').write(d_list) + +# FixedSizeList[7] with a non-empty child shorter than length*stride: child 21 -> 10. +# Flatten would slice values[0,21] out of a 10-element child; the pre-Flatten stride/size check +# rejects it before Arrow's ArrayData::Slice fails. +arr_f = pa.array([[i]*7 for i in range(3)], type=pa.list_(pa.int32(), 7)) +d_f = bytearray(write_arrow(arr_f, name='x')) +assert patch_all_int64(d_f, 21, 10) >= 1, "no int64=21 found in FSL-short-child file" +open(f'{out}/fsl_short_child.arrow', 'wb').write(d_f) + +# Negative child FieldNode.length (-1): Struct / List / LargeList / FixedSizeList would slice a +# negative-length array inside StructArray::field()/Flatten(). +def patch_fieldnode_length(data, pattern_qs, q_index, value): + pat = struct.pack('<' + 'q'*len(pattern_qs), *pattern_qs) + idx = data.find(pat) + assert idx >= 0, f"FieldNode pattern {pattern_qs} not found" + data[idx + 8*q_index : idx + 8*(q_index+1)] = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data fsl_empty_child \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/fsl_empty_child.arrow', Arrow)" + +check_incorrect_data list_empty_child \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_empty_child.arrow', Arrow)" + +check_incorrect_data fsl_short_child \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/fsl_short_child.arrow', Arrow)" + +check_incorrect_data struct_child_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/struct_child_neg_length.arrow', Arrow)" + +check_incorrect_data list_child_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_child_neg_length.arrow', Arrow)" + +check_incorrect_data largelist_child_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largelist_child_neg_length.arrow', Arrow)" + +check_incorrect_data fixedlist_child_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/fixedlist_child_neg_length.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04329_arrow_oob_struct_fields.reference b/tests/queries/0_stateless/04329_arrow_oob_struct_fields.reference new file mode 100644 index 000000000000..3b5cc179cd0b --- /dev/null +++ b/tests/queries/0_stateless/04329_arrow_oob_struct_fields.reference @@ -0,0 +1,6 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04329_arrow_oob_struct_fields.sh b/tests/queries/0_stateless/04329_arrow_oob_struct_fields.sh new file mode 100755 index 000000000000..8aa7d33ba4a8 --- /dev/null +++ b/tests/queries/0_stateless/04329_arrow_oob_struct_fields.sh @@ -0,0 +1,140 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for OOB reads from malformed Arrow Struct/Map columns: +# - a struct field shorter than the parent struct (field length 5 -> 3), which arrow's +# StructArray::field() silently Slice-clamps, leaving ColumnTuple fields of unequal size +# (also covers Map value vs key length mismatch); +# - a sliced struct whose child field is too short for the slice range (parent offsets [1,2] +# over a 0-length field) and would slice child[1:2] inside ArrayData::Slice; +# - a fields-less (zero-field) struct that declares a forged-huge length while carrying a +# validity bitmap too small for it (the bitmap is validated before the null map is built). +# Each must be rejected as INCORRECT_DATA. +# A fields-less struct with no bitmap is a legitimate empty Tuple() and is not rejected here; a +# forged huge length in that case has no backing buffer and is bounded by max_memory_usage. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] +HUGE = 1 << 62 + +def write_arrow(arr, name='arr'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def write_struct_schema(arr, name, nullable=True): + sch = pa.schema([pa.field(name, arr.type, nullable=nullable)]) + buf = io.BytesIO() + with ipc.new_file(buf, sch) as w: + w.write_table(pa.Table.from_arrays([arr], schema=sch)) + return bytearray(buf.getvalue()) + +# Struct with 5 rows; field b FieldNode.length patched 5 -> 3. The FieldNode +# vector is [struct(5,0), a(5,0), b(5,0)]; b's length is the 5th int64 (+32 from the vector start). +a_col = pa.array([1,2,3,4,5], type=pa.int32()) +b_col = pa.array([10,20,30,40,50], type=pa.int32()) +d_struct = write_arrow(pa.StructArray.from_arrays([a_col, b_col], names=['a','b']), name='s') +idx_struct = d_struct.find(struct.pack('<6q', 5,0, 5,0, 5,0)) +assert idx_struct >= 0, "could not find Struct FieldNode pattern in struct file" +d_struct[idx_struct+32:idx_struct+40] = struct.pack(' with 1 row / 5 entries; value FieldNode.length patched 5 -> 3. The FieldNode +# vector is [map(1,0), entries(5,0), key(5,0), value(5,0)]; value's length is the 7th int64 (+48). +arr_map = pa.array([list(zip([1,2,3,4,5], [10,20,30,40,50]))], type=pa.map_(pa.int32(), pa.int32())) +d_map = write_arrow(arr_map, name='m') +idx_map = d_map.find(struct.pack('<8q', 1,0, 5,0, 5,0, 5,0)) +assert idx_map >= 0, "could not find Map FieldNode pattern in map file" +d_map[idx_map+48:idx_map+56] = struct.pack('= 0, f"FieldNode pattern {pattern_qs} not found" + data[idx + 8*struct_len_idx : idx + 8*(struct_len_idx+1)] = struct.pack(' 2 + data[idx + 8*child_len_idx : idx + 8*(child_len_idx+1)] = struct.pack(' 0 + old = struct.pack(off_fmt, 0, 1) + new = struct.pack(off_fmt, 1, 2) + pos = 0 + while True: + oi = data.find(old, pos) + assert oi >= 0, "list offsets [0,1] not found" + cand = bytearray(data) + cand[oi:oi+len(old)] = new + try: + with ipc.open_file(pa.py_buffer(bytes(cand))) as reader: + a = reader.read_all().column(name).chunks[0] + if a.offsets.to_pylist() == [1, 2]: + return cand + except Exception: + pass + pos = oi + 1 + +open(f'{out}/list_struct_offset_child_zero.arrow', 'wb').write( + patch_struct_slice(pa.array([[{'a': 20}]], type=pa.list_(pa.struct([('a', pa.int32())]))), 'x', [1,0,1,0,1,0], 2, 4, '<2i')) +open(f'{out}/largelist_struct_offset_child_zero.arrow', 'wb').write( + patch_struct_slice(pa.array([[{'a': 20}]], type=pa.large_list(pa.struct([('a', pa.int32())]))), 'x', [1,0,1,0,1,0], 2, 4, '<2q')) +open(f'{out}/map_offset_key_zero.arrow', 'wb').write( + patch_struct_slice(pa.array([[(1, 10)]], type=pa.map_(pa.int32(), pa.int32())), 'm', [1,0,1,0,1,0,1,0], 2, 4, '<2i')) + +# Fields-less Struct WITH a validity bitmap (null_count>0) but a forged-huge length; the null-map +# allocation must be rejected by validating the bitmap (too small) before allocating. +# (A fields-less struct with no bitmap is a legitimate empty Tuple() and is not rejected; a forged +# huge length there has no backing buffer and is bounded by max_memory_usage, like the null type.) +d = write_struct_schema(pa.array([{}, None, {}, None, {}], type=pa.struct([])), 's') +pos = [i for i in range(0, len(d) - 7, 8) if struct.unpack_from('= 2 +for p in pos: + d[p:p+8] = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data struct_short_b \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/struct_short_b.arrow', Arrow)" + +check_incorrect_data map_value_short \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/map_value_short.arrow', Arrow)" + +check_incorrect_data list_struct_offset_child_zero \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_struct_offset_child_zero.arrow', Arrow)" + +check_incorrect_data largelist_struct_offset_child_zero \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largelist_struct_offset_child_zero.arrow', Arrow)" + +check_incorrect_data map_offset_key_zero \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/map_offset_key_zero.arrow', Arrow)" + +check_incorrect_data empty_struct_huge_nullcount \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/empty_struct_huge_nullcount.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04330_arrow_oob_declared_length.reference b/tests/queries/0_stateless/04330_arrow_oob_declared_length.reference new file mode 100644 index 000000000000..087d52f65d62 --- /dev/null +++ b/tests/queries/0_stateless/04330_arrow_oob_declared_length.reference @@ -0,0 +1,8 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04330_arrow_oob_declared_length.sh b/tests/queries/0_stateless/04330_arrow_oob_declared_length.sh new file mode 100755 index 000000000000..276d72cb1c5b --- /dev/null +++ b/tests/queries/0_stateless/04330_arrow_oob_declared_length.sh @@ -0,0 +1,132 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for forged top-level Arrow lengths that made a reader reserve column memory +# before validating buffers (previously CANNOT_ALLOCATE_MEMORY instead of INCORRECT_DATA): +# - fixed-width columns (Int32, Bool, Decimal) and an empty Struct whose RecordBatch/FieldNode +# length is patched negative or to 2^62; +# - a LargeList deriving a 2^62 flattened child length from 64-bit offsets over a one-element child; +# - the JSON reader (Binary/LargeBinary with JSON logical type) reserving from the declared +# length before validating the offsets buffer. +# Each must be rejected as INCORRECT_DATA before the reserve. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] +NEG = -1 +HUGE = 1 << 62 + +def write_arrow(arr, name='arr'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +# Fixed-width / empty-struct columns: patch every aligned int64 equal to the 5-row count +# (RecordBatch.length and FieldNode.length; the data values avoid 5) to a negative or huge value. +def patch_row_count(arr, new, name, count=5): + data = bytearray(write_arrow(arr, name=name)) + pos = [i for i in range(0, len(data) - 7, 8) if struct.unpack_from('= 2, f"expected >=2 aligned int64={count}, got {len(pos)}" + for p in pos: + data[p:p+8] = struct.pack(' [0,2^62] and child FieldNode.length -> 2^62. +ll = bytearray(write_arrow(pa.array([[123]], type=pa.large_list(pa.int32())), name='x')) +fn = ll.find(struct.pack('<4q', 1, 0, 1, 0)) +assert fn >= 0, "LargeList FieldNode pattern not found" +ll[fn+16:fn+24] = struct.pack('= 0, "LargeList offset buffer [0,1] not found" +ll[ob:ob+16] = struct.pack('<2q', 0, HUGE) +open(f'{out}/largelist_huge_child_length.arrow', 'wb').write(ll) + +# JSON reader: Binary/LargeBinary with JSON logical type and a 1-row file whose RecordBatch and +# FieldNode length are forged to 2^30. +def write_json_binary(binary_type): + field = pa.field('x', binary_type, metadata={b'PARQUET:logical_type': b'JSON'}) + sch = pa.schema([field]) + buf = io.BytesIO() + with ipc.new_file(buf, sch) as w: + w.write_table(pa.Table.from_arrays([pa.array([b'{"a":1}'], type=binary_type)], schema=sch)) + return bytearray(buf.getvalue()) + +def forge_one_row_to_huge(data, new_length): + positions = [i for i in range(0, len(data) - 7, 8) if struct.unpack_from('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data int32_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/int32_neg_length.arrow', Arrow)" + +check_incorrect_data int32_huge_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/int32_huge_length.arrow', Arrow)" + +check_incorrect_data bool_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/bool_neg_length.arrow', Arrow)" + +check_incorrect_data decimal_huge_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/decimal_huge_length.arrow', Arrow)" + +check_incorrect_data empty_struct_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/empty_struct_neg_length.arrow', Arrow)" + +check_incorrect_data largelist_huge_child_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largelist_huge_child_length.arrow', Arrow)" + +check_incorrect_data binary_json_huge_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/binary_json_huge_length.arrow', Arrow) FORMAT Null SETTINGS allow_experimental_json_type=1" + +check_incorrect_data largebinary_json_huge_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largebinary_json_huge_length.arrow', Arrow) FORMAT Null SETTINGS allow_experimental_json_type=1" diff --git a/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.reference b/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.reference new file mode 100644 index 000000000000..35233a580cac --- /dev/null +++ b/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.reference @@ -0,0 +1,4 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.sh b/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.sh new file mode 100755 index 000000000000..dfe9108c8a7c --- /dev/null +++ b/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for OOB reads of an Arrow validity bitmap: +# - a truncated child bitmap after Flatten/Slice: a sliced child has an unknown null_count, and +# arrow::ChunkedArray's constructor scans the (shrunk) bitmap (List(Nullable(int32)) child +# bitmap 16 -> 1 byte; Struct field b sliced with bitmap 9 -> 1 byte); +# - an unknown FieldNode.null_count (-1) over a forged-huge length with a 1-byte bitmap, where +# building the arrow Table scans the bitmap over the declared length (heap OOB in CountSetBits). +# Each must be rejected as INCORRECT_DATA before any null_count scan. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(arr, name='arr'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def shrink_buffer_len(data, old_len, new_len): + """Shrink the first buffer-length field equal to old_len (a Buffer in the IPC metadata is + {offset:int64, length:int64}, so the length is preceded by a valid offset).""" + needle = struct.pack('= 8: + prev = struct.unpack_from('= 8 and 0 <= struct.unpack_from(' with 65 rows: field b's FieldNode.length is patched 65 -> 70 +# so StructArray::field() Slice-clamps it (unknown null_count), and b's 9-byte bitmap is shrunk to 1. +a_e = pa.array(list(range(65)), type=pa.int32()) +b_e = pa.array([None if i % 7 == 0 else i for i in range(65)], type=pa.int32()) +d_e2 = bytearray(write_arrow(pa.StructArray.from_arrays([a_e, b_e], names=['a', 'b']), name='s')) +bnc = sum(1 for i in range(65) if i % 7 == 0) +idx_e2 = d_e2.find(struct.pack('<6q', 65,0, 65,0, 65,bnc)) +assert idx_e2 >= 0, "could not find Struct FieldNode pattern in struct-bitmap file" +d_e2[idx_e2+32:idx_e2+40] = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data list_child_bitmap \ + $CLICKHOUSE_LOCAL --query "SELECT sum(length(x)) FROM file('${TMP_DIR}/list_child_bitmap.arrow', Arrow)" + +check_incorrect_data struct_child_bitmap \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/struct_child_bitmap.arrow', Arrow)" + +check_incorrect_data int32_unknown_nullcount \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/int32_unknown_nullcount.arrow', Arrow)" + +check_incorrect_data list_unknown_nullcount \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_unknown_nullcount.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.reference b/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.reference new file mode 100644 index 000000000000..292b253eee30 --- /dev/null +++ b/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.reference @@ -0,0 +1,4 @@ +explicit_limit: TOO_DEEP_RECURSION +stack_backstop: TOO_DEEP_RECURSION +multirow_merge: TOO_DEEP_RECURSION +unlimited_depth: accepted diff --git a/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.sh b/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.sh new file mode 100755 index 000000000000..baf0909870d4 --- /dev/null +++ b/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression test: MsgPack schema inference recursed over nested arrays/maps without a depth limit. +# msgpack::unpack builds the whole object tree iteratively (on the heap), so a tiny, deeply nested +# object overflowed the native stack and crashed the process - both in MsgPackSchemaReader::getDataType +# and, for moderate depths that slipped past it, in the shared makeNullableRecursively walk over the +# inferred type. Nesting must now be rejected as TOO_DEEP_RECURSION, never crash. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +# Reads a query's combined output from stdin. If it contains $2, print a stable "